diff --git a/src/mesa_pd/domain/InfiniteDomain.h b/src/mesa_pd/domain/InfiniteDomain.h index b9dc4f322f35ef0a25a91346e1fe76662703f2b2..591da890243262b958645ada984b690caac31722 100644 --- a/src/mesa_pd/domain/InfiniteDomain.h +++ b/src/mesa_pd/domain/InfiniteDomain.h @@ -20,22 +20,34 @@ #pragma once +#include <core/mpi/MPIManager.h> #include <mesa_pd/domain/IDomain.h> namespace walberla { namespace mesa_pd { namespace domain { +/** + * Every process assumes the whole simulation space belongs to its subdomain. + */ class InfiniteDomain : public IDomain { public: - bool isContainedInProcessSubdomain(const uint_t /*rank*/, const Vec3& /*pt*/) const override {return true;} - int findContainingProcessRank(const Vec3& /*pt*/) const override {return walberla::mpi::MPIManager::instance()->rank();} + ///Everything belongs to the calling process. + bool isContainedInProcessSubdomain(const uint_t rank, const Vec3& /*pt*/) const override {return rank==rank_;} + ///Everything belongs to the calling process. + int findContainingProcessRank(const Vec3& /*pt*/) const override {return static_cast<int>(rank_);} + ///Nothing to do here since domain is infinite. void periodicallyMapToDomain(Vec3& /*pt*/) const override {} + ///If I own everything I do not have neighbors. std::vector<uint_t> getNeighborProcesses() const override {return {};} + ///Everything belongs to my subdomain. bool intersectsWithProcessSubdomain(const uint_t rank, const Vec3& /*pt*/, const real_t& /*radius*/) const override - { return int_c(rank)==walberla::mpi::MPIManager::instance()->rank() ? true : false;} + { return rank==rank_;} + ///Nothing to do here. void correctParticlePosition(Vec3& /*pt*/) const override {} +private: + const uint_t rank_ = static_cast<uint_t>(MPIManager::instance()->rank()); }; } //namespace domain diff --git a/tests/mesa_pd/CMakeLists.txt b/tests/mesa_pd/CMakeLists.txt index ad034a098c25011fb9a54971dfa080e8a0647487..0c3e69f272a5f0a137bef03b0c1accdbae87cc11 100644 --- a/tests/mesa_pd/CMakeLists.txt +++ b/tests/mesa_pd/CMakeLists.txt @@ -37,6 +37,9 @@ waLBerla_execute_test( NAME MESA_PD_COMMON_IntersectionRatio ) waLBerla_compile_test( NAME MESA_PD_ContactDetection FILES ContactDetection.cpp DEPENDS blockforest core pe) waLBerla_execute_test( NAME MESA_PD_ContactDetection PROCESSES 8 ) +waLBerla_compile_test( NAME MESA_PD_Data_ContactHistory FILES data/ContactHistory.cpp DEPENDS core ) +waLBerla_execute_test( NAME MESA_PD_Data_ContactHistory ) + waLBerla_compile_test( NAME MESA_PD_Data_Flags FILES data/Flags.cpp DEPENDS core ) waLBerla_execute_test( NAME MESA_PD_Data_Flags ) @@ -66,6 +69,9 @@ waLBerla_execute_test( NAME MESA_PD_Domain_DistanceCalculation ) waLBerla_compile_test( NAME MESA_PD_Domain_DynamicRefinement FILES domain/DynamicRefinement.cpp DEPENDS blockforest core pe ) waLBerla_execute_test( NAME MESA_PD_Domain_DynamicRefinement PROCESSES 8) +waLBerla_compile_test( NAME MESA_PD_Domain_InfiniteDomain FILES domain/InfiniteDomain.cpp DEPENDS core ) +waLBerla_execute_test( NAME MESA_PD_Domain_InfiniteDomain ) + waLBerla_compile_test( NAME MESA_PD_Domain_SerializeDeserialize FILES domain/SerializeDeserialize.cpp DEPENDS blockforest core pe) waLBerla_execute_test( NAME MESA_PD_Domain_SerializeDeserialize PROCESSES 8 ) diff --git a/tests/mesa_pd/data/ContactHistory.cpp b/tests/mesa_pd/data/ContactHistory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fbc237eda29482c5072ff03eaafdbf4fee5f8078 --- /dev/null +++ b/tests/mesa_pd/data/ContactHistory.cpp @@ -0,0 +1,72 @@ +//====================================================================================================================== +// +// This file is part of waLBerla. waLBerla is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// waLBerla is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file ContactHistory.cpp +//! \author Sebastian Eibl <sebastian.eibl@fau.de> +// +//====================================================================================================================== + +#include <mesa_pd/data/ContactHistory.h> + +#include <core/Environment.h> +#include <core/logging/Logging.h> + +#include <algorithm> +#include <iostream> + +namespace walberla { + +using namespace walberla::mesa_pd; + +void basic_test() +{ + //init data structures + data::ContactHistory cs; + + cs.setImpactVelocityMagnitude(1.23456_r); + cs.setIsSticking(true); + cs.setTangentialSpringDisplacement(Vec3(1.23_r,2.345_r,3.56_r)); + + mpi::SendBuffer sb; + sb << cs; + mpi::RecvBuffer rb(sb); + + data::ContactHistory cs_recv; + rb >> cs_recv; + + WALBERLA_CHECK_IDENTICAL(cs.getImpactVelocityMagnitude(), cs_recv.getImpactVelocityMagnitude()); + WALBERLA_CHECK_IDENTICAL(cs.getIsSticking(), cs_recv.getIsSticking()); + WALBERLA_CHECK_IDENTICAL(cs.getTangentialSpringDisplacement(), cs_recv.getTangentialSpringDisplacement()); + + WALBERLA_LOG_DEVEL( cs ); +} + +int main( int argc, char ** argv ) +{ + Environment env(argc, argv); + WALBERLA_UNUSED(env); + mpi::MPIManager::instance()->useWorldComm(); + + basic_test(); + + return EXIT_SUCCESS; +} + +} //namespace walberla + +int main( int argc, char ** argv ) +{ + return walberla::main(argc, argv); +} diff --git a/tests/mesa_pd/domain/InfiniteDomain.cpp b/tests/mesa_pd/domain/InfiniteDomain.cpp new file mode 100644 index 0000000000000000000000000000000000000000..74dee98a9fd58c57e9697085ecc2b6d4731171f5 --- /dev/null +++ b/tests/mesa_pd/domain/InfiniteDomain.cpp @@ -0,0 +1,60 @@ +//====================================================================================================================== +// +// This file is part of waLBerla. waLBerla is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// waLBerla is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file InfiniteDomain.cpp +//! \author Sebastian Eibl <sebastian.eibl@fau.de> +// +//====================================================================================================================== + +#include <mesa_pd/domain/InfiniteDomain.h> + +#include <core/Environment.h> +#include <core/logging/Logging.h> + +#include <iostream> + +namespace walberla { + +using namespace walberla::mesa_pd; + +void main( int argc, char ** argv ) +{ + Environment env(argc, argv); + WALBERLA_UNUSED(env); + mpi::MPIManager::instance()->useWorldComm(); + auto rank = mpi::MPIManager::instance()->rank(); + + auto randomPoint = Vec3(1.23_r,2.34_r,3.45_r); + domain::InfiniteDomain domain; + WALBERLA_CHECK(domain.isContainedInProcessSubdomain(static_cast<uint_t>(rank), randomPoint)); + WALBERLA_CHECK(!domain.isContainedInProcessSubdomain(static_cast<uint_t>(rank + 1), randomPoint)); + WALBERLA_CHECK_EQUAL(domain.findContainingProcessRank(randomPoint), rank); + auto pt = randomPoint; + domain.periodicallyMapToDomain(pt); + WALBERLA_CHECK_IDENTICAL(pt, randomPoint); + WALBERLA_CHECK_EQUAL(domain.getNeighborProcesses().size(), 0); + WALBERLA_CHECK(domain.intersectsWithProcessSubdomain(static_cast<uint_t>(rank), randomPoint, 1_r)); + WALBERLA_CHECK(!domain.intersectsWithProcessSubdomain(static_cast<uint_t>(rank + 1), randomPoint, 1_r)); + domain.correctParticlePosition(pt); + WALBERLA_CHECK_IDENTICAL(pt, randomPoint); +} + +} + +int main( int argc, char ** argv ) +{ + walberla::main(argc, argv); + return EXIT_SUCCESS; +}