37 idx_t densityProfileSamples_ = 0;
39 const std::vector<real_t> targetDensity_;
40 const std::vector<real_t> thermodynamicForceModulation_;
44 bool enforceSymmetry_ =
false;
45 bool usePeriodicity_ =
false;
48 inline auto getForce()
const {
return force_; }
51 assert(typeId < numTypes_);
53 return Kokkos::subview(force_.
data, Kokkos::ALL(), typeId);
59 assert(typeId < numTypes_);
61 return Kokkos::subview(densityProfile_.
data, Kokkos::ALL(), typeId);
69 template <OnePositionPredicate Pred>
72 template <OneCoordinatePredicate Pred>
74 const real_t& smoothingIntensity,
77 template <OnePositionPredicate Pred>
85 const real_t& requestedDensityBinWidth,
86 const std::vector<real_t>& thermodynamicForceModulation,
87 const bool enforceSymmetry =
false,
88 const bool usePeriodicity =
false);
92 const real_t& requestedDensityBinWidth,
93 const real_t thermodynamicForceModulation,
94 const bool enforceSymmetry =
false,
95 const bool usePeriodicity =
false);
98template <OnePositionPredicate Pred>
101 auto atomsPos = atoms.
getPos();
103 auto atomsType = atoms.
getType();
105 auto forceHistogram = force_;
108 auto kernel = KOKKOS_LAMBDA(
const idx_t idx)
110 auto xPos = atomsPos(idx, 0);
111 if (!pred(atomsPos(idx, 0), atomsPos(idx, 1), atomsPos(idx, 2)))
return;
112 auto bin = forceHistogram.getBin(xPos);
117 atomsForce(idx, 0) += forceHistogram.data(bin, atomsType(idx));
120 Kokkos::parallel_for(
"ThermodynamicForce::apply_if", policy, kernel);
124template <OneCoordinatePredicate Pred>
126 const real_t& smoothingIntensity,
131 if (enforceSymmetry_)
136 auto normalizationFactor = 1_r / (binVolume_ *
real_c(densityProfileSamples_));
137 densityProfile_.
scale(normalizationFactor);
139 auto smoothedDensityProfile =
140 data::smoothen(densityProfile_, smoothingSigma, smoothingIntensity, usePeriodicity_);
141 auto smoothedDensityGradient =
data::gradient(smoothedDensityProfile, usePeriodicity_);
142 smoothedDensityGradient.scale(forceFactor_);
145 smoothedDensityGradient, KOKKOS_LAMBDA(
const real_t x) {
return !pred(x); }, 0_r);
147 force_ -= smoothedDensityGradient;
150 Kokkos::deep_copy(densityProfile_.
data, 0_r);
151 densityProfileSamples_ = 0;
154template <OnePositionPredicate Pred>
157 auto atomsPos = atoms.
getPos();
159 auto atomsType = atoms.
getType();
161 auto forceHistogram = force_;
164 auto kernel = KOKKOS_LAMBDA(
const idx_t idx)
166 auto xPos = atomsPos(idx, 0);
167 if (!pred(atomsPos(idx, 0), atomsPos(idx, 1), atomsPos(idx, 2)))
return;
168 auto bin = forceHistogram.getBin(xPos);
172 auto atomType = atomsType(idx);
176 auto binStart = forceHistogram.min +
real_c(bin) * forceHistogram.binSize;
177 auto fracInBin = (xPos - binStart) * forceHistogram.inverseBinSize;
183 if (fracInBin < 0.5_r)
185 leftBinIdx = bin - 1;
187 factor = fracInBin + 0.5_r;
192 rightBinIdx = bin + 1;
193 factor = fracInBin - 0.5_r;
197 if (leftBinIdx >= 0 && rightBinIdx < forceHistogram.numBins)
199 auto inputLeft = forceHistogram.data(leftBinIdx, atomType);
200 auto inputRight = forceHistogram.data(rightBinIdx, atomType);
204 atomsForce(idx, 0) +=
util::lerp(inputLeft, inputRight, factor);
208 auto input = forceHistogram.data(bin, atomType);
210 atomsForce(idx, 0) += input;
214 Kokkos::parallel_for(
"ThermodynamicForce::applyInterpolated_if", policy, kernel);
Definition ThermodynamicForce.hpp:33
auto getDensityProfile(const idx_t &typeId) const
Definition ThermodynamicForce.hpp:57
void apply(const data::Atoms &atoms) const
Definition ThermodynamicForce.cpp:93
void update_if(const real_t &smoothingSigma, const real_t &smoothingIntensity, const Pred &pred)
Definition ThermodynamicForce.hpp:125
std::vector< real_t > getMuLeft() const
Definition ThermodynamicForce.cpp:98
void applyInterpolated_if(const data::Atoms &atoms, const Pred &pred) const
Definition ThermodynamicForce.hpp:155
auto getForce(const idx_t &typeId) const
Definition ThermodynamicForce.hpp:49
void sample(data::Atoms &atoms)
Definition ThermodynamicForce.cpp:74
auto getForce() const
Definition ThermodynamicForce.hpp:48
void setForce(const MultiView &forces) const
Definition ThermodynamicForce.hpp:55
std::vector< real_t > getMuRight() const
Definition ThermodynamicForce.cpp:115
const auto & getNumberOfDensityProfileSamples() const
Definition ThermodynamicForce.hpp:63
void update(const real_t &smoothingSigma, const real_t &smoothingIntensity)
Definition ThermodynamicForce.cpp:88
auto getDensityProfile() const
Definition ThermodynamicForce.hpp:56
void apply_if(const data::Atoms &atoms, const Pred &pred) const
Definition ThermodynamicForce.hpp:99
Data structure for storing information about atoms on the host and the device.
Definition Atoms.hpp:35
idx_t numLocalAtoms
Definition Atoms.hpp:120
KOKKOS_FORCEINLINE_FUNCTION pos_t getPos() const
Definition Atoms.hpp:64
KOKKOS_FORCEINLINE_FUNCTION force_t getForce() const
Definition Atoms.hpp:66
KOKKOS_FORCEINLINE_FUNCTION type_t getType() const
Definition Atoms.hpp:67
#define MRMD_DEVICE_ASSERT_LESS(...)
Definition device.hpp:472
#define MRMD_DEVICE_ASSERT(...)
Definition device.hpp:465
#define MRMD_HOST_CHECK_GREATER(...)
Definition host.hpp:116
data::MultiHistogram smoothen(data::MultiHistogram &input, const real_t &sigma, const real_t &range, const bool periodic)
Smoothen a histogram using gaussian convolution.
Definition MultiHistogram.cpp:163
data::Histogram gradient(const data::Histogram &input)
Definition Histogram.cpp:37
void replace_if_bin_position(MultiHistogram &hist, const Pred &pred, real_t newValue)
Replaces histogram values with a new value if the bin position satisfies a predicate.
Definition MultiHistogram.hpp:181
KOKKOS_INLINE_FUNCTION real_t lerp(const real_t &left, const real_t &right, const real_t &factor)
Linear interpolation between two values.
Definition interpolation.hpp:35
Definition BerendsenBarostat.cpp:18
Kokkos::View< real_t * > ScalarView
Definition datatypes.hpp:159
Kokkos::View< real_t ** > MultiView
Definition datatypes.hpp:161
int64_t idx_t
Definition datatypes.hpp:91
double real_t
Definition datatypes.hpp:99
KOKKOS_INLINE_FUNCTION constexpr real_t real_c(T t)
Definition datatypes.hpp:114
Definition MultiHistogram.hpp:30
MultiView data
Definition MultiHistogram.hpp:82
void makeSymmetric()
Definition MultiHistogram.cpp:76
void scale(const real_t &scalingFactor)
Definition MultiHistogram.cpp:48
|X|O|OOOOOOOOOO |X|O|OOOOOOOOOO |X|O+-------— <– minInnerCorner |X|OOOOOOOOOOOO |X+---------— <– minC...
Definition Subdomain.hpp:38