From 090024f8de19697b2a7ccd2461c8d454f8921755 Mon Sep 17 00:00:00 2001 From: julianhille Date: Thu, 23 Jan 2025 14:48:40 +0100 Subject: [PATCH 1/3] implemented abrupt hy/cg interface, Ref. #029 --- mrmd/weighting_function/Slab.hpp | 131 ++++++++++++++++++++++++------- 1 file changed, 102 insertions(+), 29 deletions(-) diff --git a/mrmd/weighting_function/Slab.hpp b/mrmd/weighting_function/Slab.hpp index ec8dba5..3bc08ad 100644 --- a/mrmd/weighting_function/Slab.hpp +++ b/mrmd/weighting_function/Slab.hpp @@ -30,6 +30,7 @@ class Slab const real_t atomisticRegionHalfDiameter_; const real_t hybridRegionDiameter_; const idx_t exponent_; + const idx_t interfaceType_; public: KOKKOS_INLINE_FUNCTION @@ -62,37 +63,37 @@ class Slab } KOKKOS_INLINE_FUNCTION - void operator()(const real_t x, - const real_t /*y*/, - const real_t /*z*/, - real_t& lambda, - real_t& modulatedLambda, - real_t& gradLambdaX, - real_t& gradLambdaY, - real_t& gradLambdaZ) const + void setWeightInHY(real_t& dx, + real_t& absDx, + real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const { - auto dx = x - center_[0]; - auto absDx = std::abs(dx); - - if (absDx < atomisticRegionHalfDiameter_) - { - lambda = 1_r; - modulatedLambda = 1_r; - gradLambdaX = 0_r; - gradLambdaY = 0_r; - gradLambdaZ = 0_r; - return; - } - if (absDx > atomisticRegionHalfDiameter_ + hybridRegionDiameter_) + switch (interfaceType_) { - lambda = 0_r; - modulatedLambda = 0_r; - gradLambdaX = 0_r; - gradLambdaY = 0_r; - gradLambdaZ = 0_r; - return; + case 0: + // smooth interface + setSmoothWeightInHY( + dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + break; + case 1: + // abrupt interface + setAbruptWeightInHY(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + break; } + } + KOKKOS_INLINE_FUNCTION + void setSmoothWeightInHY(real_t& dx, + real_t& absDx, + real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const + { const real_t arg = pi / (2_r * hybridRegionDiameter_) * (absDx - atomisticRegionHalfDiameter_); auto base = std::cos(arg); @@ -104,19 +105,91 @@ class Slab util::powInt(base, exponent_ - 1) / absDx; MRMD_DEVICE_ASSERT(!std::isnan(factor)); MRMD_DEVICE_ASSERT(!std::isnan(dx)); + gradLambdaX = factor * dx; gradLambdaY = 0_r; gradLambdaZ = 0_r; } + KOKKOS_INLINE_FUNCTION + void setAbruptWeightInHY(real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const + { + // abrupt interface sets weight to the same value as in AT region + setWeightInAT(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + } + + KOKKOS_INLINE_FUNCTION + void setWeightInAT(real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const + { + lambda = 1_r; + modulatedLambda = 1_r; + gradLambdaX = 0_r; + gradLambdaY = 0_r; + gradLambdaZ = 0_r; + } + + KOKKOS_INLINE_FUNCTION + void setWeightInCG(real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const + { + lambda = 0_r; + modulatedLambda = 0_r; + gradLambdaX = 0_r; + gradLambdaY = 0_r; + gradLambdaZ = 0_r; + } + + KOKKOS_INLINE_FUNCTION + void operator()(const real_t x, + const real_t /*y*/, + const real_t /*z*/, + real_t& lambda, + real_t& modulatedLambda, + real_t& gradLambdaX, + real_t& gradLambdaY, + real_t& gradLambdaZ) const + { + real_t dx = x - center_[0]; + real_t absDx = std::abs(dx); + + if (absDx < atomisticRegionHalfDiameter_) + { + setWeightInAT(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + return; + } + else if (absDx > atomisticRegionHalfDiameter_ + hybridRegionDiameter_) + { + setWeightInCG(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + return; + } + else + { + setWeightInHY(dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + return; + } + } + Slab(const Point3D& center, const real_t atomisticRegionDiameter, const real_t hybridRegionDiameter, - const idx_t nu) + const idx_t nu, + const idx_t interfaceType = 0) : center_(center), atomisticRegionHalfDiameter_(0.5_r * atomisticRegionDiameter), hybridRegionDiameter_(hybridRegionDiameter), - exponent_(2 * nu) + exponent_(2 * nu), + interfaceType_(interfaceType) { } }; From ca285c3c834aa9f4357f08ac78df12e116e624a4 Mon Sep 17 00:00:00 2001 From: julianhille Date: Mon, 27 Jan 2025 12:02:22 +0100 Subject: [PATCH 2/3] make abrupt interface implementation conformant with clang-format, Ref. #029 --- mrmd/weighting_function/Slab.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mrmd/weighting_function/Slab.hpp b/mrmd/weighting_function/Slab.hpp index 3bc08ad..3ecdcb2 100644 --- a/mrmd/weighting_function/Slab.hpp +++ b/mrmd/weighting_function/Slab.hpp @@ -175,7 +175,8 @@ class Slab } else { - setWeightInHY(dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); + setWeightInHY( + dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); return; } } From 029ae483e90b207453b77bac4b7d7d890ca125ac Mon Sep 17 00:00:00 2001 From: Sebastian Eibl Date: Fri, 31 Jan 2025 09:50:22 +0100 Subject: [PATCH 3/3] make interface type an enum class --- mrmd/weighting_function/Slab.hpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mrmd/weighting_function/Slab.hpp b/mrmd/weighting_function/Slab.hpp index 3ecdcb2..708c322 100644 --- a/mrmd/weighting_function/Slab.hpp +++ b/mrmd/weighting_function/Slab.hpp @@ -25,12 +25,19 @@ namespace weighting_function { class Slab { +public: + enum class InterfaceType + { + SMOOTH, + ABRUPT + }; + private: const Point3D center_; const real_t atomisticRegionHalfDiameter_; const real_t hybridRegionDiameter_; const idx_t exponent_; - const idx_t interfaceType_; + const InterfaceType interfaceType_; public: KOKKOS_INLINE_FUNCTION @@ -73,12 +80,12 @@ class Slab { switch (interfaceType_) { - case 0: + case InterfaceType::SMOOTH: // smooth interface setSmoothWeightInHY( dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); break; - case 1: + case InterfaceType::ABRUPT: // abrupt interface setAbruptWeightInHY(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); break; @@ -166,18 +173,15 @@ class Slab if (absDx < atomisticRegionHalfDiameter_) { setWeightInAT(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); - return; } else if (absDx > atomisticRegionHalfDiameter_ + hybridRegionDiameter_) { setWeightInCG(lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); - return; } else { setWeightInHY( dx, absDx, lambda, modulatedLambda, gradLambdaX, gradLambdaY, gradLambdaZ); - return; } } @@ -185,7 +189,7 @@ class Slab const real_t atomisticRegionDiameter, const real_t hybridRegionDiameter, const idx_t nu, - const idx_t interfaceType = 0) + const InterfaceType interfaceType = InterfaceType::SMOOTH) : center_(center), atomisticRegionHalfDiameter_(0.5_r * atomisticRegionDiameter), hybridRegionDiameter_(hybridRegionDiameter),