35 KOKKOS_INLINE_FUNCTION
48struct reduction_identity<
mrmd::action::impl::Energy>
69 data::Molecules::force_t::atomic_access_slice moleculesForce_;
77 data::Atoms::force_t::atomic_access_slice atomsForce_;
89 bool isDriftCompensationSamplingRun_ =
false;
93 idx_t runCounter_ = 0;
95 data::BondView::host_mirror_type bonds_;
146 const auto numNeighbors =
idx_c(HalfNeighborList::numNeighbor(verletList_,
alpha));
147 for (
idx_t n = 0; n < numNeighbors; ++n)
150 const idx_t beta =
idx_c(HalfNeighborList::getNeighbor(verletList_,
alpha, n));
154 const auto startAtomsAlpha = moleculesAtomsOffset_(
alpha);
156 const auto endAtomsAlpha = startAtomsAlpha + moleculesNumAtoms_(
alpha);
157 assert(0 <= startAtomsAlpha);
158 assert(startAtomsAlpha < endAtomsAlpha);
161 const auto startAtomsBeta = moleculesAtomsOffset_(beta);
163 const auto endAtomsBeta = startAtomsBeta + moleculesNumAtoms_(beta);
164 assert(0 <= startAtomsBeta);
165 assert(startAtomsBeta < endAtomsBeta);
169 posTmp[0] = atomsPos_(startAtomsAlpha, 0);
170 posTmp[1] = atomsPos_(startAtomsAlpha, 1);
171 posTmp[2] = atomsPos_(startAtomsAlpha, 2);
174 dx[0] = posTmp[0] - atomsPos_(startAtomsBeta, 0);
175 dx[1] = posTmp[1] - atomsPos_(startAtomsBeta, 1);
176 dx[2] = posTmp[2] - atomsPos_(startAtomsBeta, 2);
180 if (distSqr < rcSqr_)
183 sumEnergy.
LJ += forceAndVirial.energy;
185 atomsForce_(startAtomsBeta, 0) -= dx[0] * forceAndVirial.forceFactor;
186 atomsForce_(startAtomsBeta, 1) -= dx[1] * forceAndVirial.forceFactor;
187 atomsForce_(startAtomsBeta, 2) -= dx[2] * forceAndVirial.forceFactor;
189 atomsForce_(startAtomsAlpha, 0) += dx[0] * forceAndVirial.forceFactor;
190 atomsForce_(startAtomsAlpha, 1) += dx[1] * forceAndVirial.forceFactor;
191 atomsForce_(startAtomsAlpha, 2) += dx[2] * forceAndVirial.forceFactor;
195 for (
idx_t idx = startAtomsAlpha; idx < endAtomsAlpha; ++idx)
198 posTmp[0] = atomsPos_(idx, 0);
199 posTmp[1] = atomsPos_(idx, 1);
200 posTmp[2] = atomsPos_(idx, 2);
202 auto q1 = atomsCharge_(idx);
205 real_t forceTmpIdx[3] = {0_r, 0_r, 0_r};
207 for (
idx_t jdx = startAtomsBeta; jdx < endAtomsBeta; ++jdx)
209 auto q2 = atomsCharge_(jdx);
212 dx[0] = posTmp[0] - atomsPos_(jdx, 0);
213 dx[1] = posTmp[1] - atomsPos_(jdx, 1);
214 dx[2] = posTmp[2] - atomsPos_(jdx, 2);
218 if (distSqr > rcSqr_)
continue;
223 forceTmpIdx[0] += dx[0] * ffactor;
224 forceTmpIdx[1] += dx[1] * ffactor;
225 forceTmpIdx[2] += dx[2] * ffactor;
227 atomsForce_(jdx, 0) -= dx[0] * ffactor;
228 atomsForce_(jdx, 1) -= dx[1] * ffactor;
229 atomsForce_(jdx, 2) -= dx[2] * ffactor;
232 atomsForce_(idx, 0) += forceTmpIdx[0];
233 atomsForce_(idx, 1) += forceTmpIdx[1];
234 atomsForce_(idx, 2) += forceTmpIdx[2];
255 moleculesPos_ = molecules.
getPos();
256 moleculesForce_ = molecules.
getForce();
257 moleculesLambda_ = molecules.
getLambda();
262 atomsPos_ = atoms.
getPos();
265 verletList_ = verletList;
272 auto policy = Kokkos::RangePolicy<CalcInteractions>(0, molecules.
numLocalMolecules);
273 Kokkos::parallel_reduce(
274 "SPC::applyForces", policy, *
this, Kokkos::Sum<impl::Energy>(energy));
295 const auto startAtomsAlpha = moleculesAtomsOffset_(
alpha);
296 assert(0 <= startAtomsAlpha);
298 auto idxO = startAtomsAlpha;
299 auto idxH0 = startAtomsAlpha + 1;
300 auto idxH1 = startAtomsAlpha + 2;
305 dx[0] = atomsPos_(idxO, 0) - atomsPos_(idxH0, 0);
306 dx[1] = atomsPos_(idxO, 1) - atomsPos_(idxH0, 1);
307 dx[2] = atomsPos_(idxO, 2) - atomsPos_(idxH0, 2);
311 dx[0] = atomsPos_(idxO, 0) - atomsPos_(idxH1, 0);
312 dx[1] = atomsPos_(idxO, 1) - atomsPos_(idxH1, 1);
313 dx[2] = atomsPos_(idxO, 2) - atomsPos_(idxH1, 2);
317 dx[0] = atomsPos_(idxH0, 0) - atomsPos_(idxH1, 0);
318 dx[1] = atomsPos_(idxH0, 1) - atomsPos_(idxH1, 1);
319 dx[2] = atomsPos_(idxH0, 2) - atomsPos_(idxH1, 2);
326 const real_t& harmonicPreFactor)
328 moleculesPos_ = molecules.
getPos();
329 moleculesForce_ = molecules.
getForce();
330 moleculesLambda_ = molecules.
getLambda();
335 atomsPos_ = atoms.
getPos();
340 auto policy = Kokkos::RangePolicy<BondEnergy>(
342 Kokkos::parallel_reduce(
"SPC::calcHarmonicPotential", policy, *
this, energy);
void enforceVelocityConstraints(data::Molecules &molecules, data::Atoms &atoms, const real_t dt)
Definition Shake.hpp:212
void enforcePositionalConstraints(data::Molecules &molecules, data::Atoms &atoms, const real_t dt)
Definition Shake.hpp:171
void setConstraints(const data::BondView &bonds)
Definition Shake.hpp:240
static constexpr idx_t COMPENSATION_ENERGY_SAMPLING_INTERVAL
Definition SPC.hpp:124
SPC()
Definition SPC.hpp:349
static constexpr real_t massH
unit: g/mol
Definition SPC.hpp:107
static constexpr real_t rc
unit: nm
Definition SPC.hpp:114
void applyForces(data::Molecules &molecules, HalfVerletList &verletList, data::Atoms &atoms)
Definition SPC.hpp:253
void enforceVelocityConstraints(data::Molecules &molecules, data::Atoms &atoms, real_t dt)
Definition SPC.hpp:246
auto getEnergyLJ() const
Definition SPC.hpp:101
auto getEnergyCoulomb() const
Definition SPC.hpp:102
static constexpr real_t chargeH
Definition SPC.hpp:108
const real_t eqDistanceHH
Definition SPC.hpp:122
real_t sumEnergyLJ_
Definition SPC.hpp:98
static constexpr idx_t COMPENSATION_ENERGY_UPDATE_INTERVAL
Definition SPC.hpp:125
KOKKOS_INLINE_FUNCTION void operator()(CalcInteractions, const idx_t &alpha, impl::Energy &sumEnergy) const
Loop over molecules.
Definition SPC.hpp:142
void enforcePositionalConstraints(data::Molecules &molecules, data::Atoms &atoms, real_t dt)
Definition SPC.hpp:239
real_t calcBondEnergy(data::Molecules &molecules, data::Atoms &atoms, const real_t &harmonicPreFactor)
Definition SPC.hpp:324
static constexpr real_t sigma
unit: nm
Definition SPC.hpp:112
static constexpr real_t angleHOH
unit: radians
Definition SPC.hpp:121
static constexpr real_t chargeO
Definition SPC.hpp:105
static constexpr real_t epsilon
unit: kJ / mol
Definition SPC.hpp:113
static constexpr real_t massO
unit: g/mol
Definition SPC.hpp:104
const auto & getMeanCompensationEnergy() const
Definition SPC.hpp:127
static constexpr real_t alpha
unit: 1/nm
Definition SPC.hpp:117
static constexpr real_t eqDistanceHO
unit: nm, equilibirum distance between hydrogen and oxygen
Definition SPC.hpp:120
real_t sumEnergyCoulomb_
Definition SPC.hpp:99
KOKKOS_INLINE_FUNCTION void operator()(BondEnergy, const idx_t &alpha, real_t &sumEnergy) const
Definition SPC.hpp:292
Definition LennardJones.hpp:25
KOKKOS_INLINE_FUNCTION ForceAndEnergy computeForceAndEnergy(const real_t &distSqr, const idx_t &typeIdx) const
Definition LennardJones.hpp:53
Definition Coulomb.hpp:28
KOKKOS_INLINE_FUNCTION real_t computeEnergy(const real_t &distSqr, const real_t q1, const real_t q2) const
Definition Coulomb.hpp:38
KOKKOS_INLINE_FUNCTION real_t computeForce(const real_t &distSqr, const real_t q1, const real_t q2) const
Definition Coulomb.hpp:31
Data structure for storing information about atoms on the host and the device.
Definition Atoms.hpp:35
idx_t numLocalAtoms
Definition Atoms.hpp:120
idx_t numGhostAtoms
Definition Atoms.hpp:121
KOKKOS_FORCEINLINE_FUNCTION charge_t getCharge() const
Definition Atoms.hpp:69
KOKKOS_FORCEINLINE_FUNCTION pos_t getPos() const
Definition Atoms.hpp:64
KOKKOS_FORCEINLINE_FUNCTION force_t getForce() const
Definition Atoms.hpp:66
typename AtomsT::template member_slice_type< CHARGE > charge_t
Definition Atoms.hpp:61
typename AtomsT::template member_slice_type< POS > pos_t
Definition Atoms.hpp:56
Definition Molecules.hpp:29
typename MoleculesT::template member_slice_type< GRAD_LAMBDA > grad_lambda_t
Definition Molecules.hpp:54
KOKKOS_FORCEINLINE_FUNCTION atoms_offset_t getAtomsOffset() const
Definition Molecules.hpp:67
KOKKOS_FORCEINLINE_FUNCTION num_atoms_t getNumAtoms() const
Definition Molecules.hpp:68
typename MoleculesT::template member_slice_type< MODULATED_LAMBDA > modulated_lambda_t
Definition Molecules.hpp:53
KOKKOS_FORCEINLINE_FUNCTION force_t getForce() const
Definition Molecules.hpp:59
KOKKOS_FORCEINLINE_FUNCTION pos_t getPos() const
Definition Molecules.hpp:58
typename MoleculesT::template member_slice_type< LAMBDA > lambda_t
Definition Molecules.hpp:52
KOKKOS_FORCEINLINE_FUNCTION modulated_lambda_t getModulatedLambda() const
Definition Molecules.hpp:62
typename MoleculesT::template member_slice_type< NUM_ATOMS > num_atoms_t
Definition Molecules.hpp:56
idx_t numGhostMolecules
Definition Molecules.hpp:121
KOKKOS_FORCEINLINE_FUNCTION lambda_t getLambda() const
Definition Molecules.hpp:61
typename MoleculesT::template member_slice_type< ATOMS_OFFSET > atoms_offset_t
Definition Molecules.hpp:55
idx_t numLocalMolecules
Definition Molecules.hpp:120
KOKKOS_FORCEINLINE_FUNCTION grad_lambda_t getGradLambda() const
Definition Molecules.hpp:66
typename MoleculesT::template member_slice_type< POS > pos_t
Definition Molecules.hpp:50
Definition Coulomb.hpp:26
KOKKOS_INLINE_FUNCTION constexpr real_t degToRad(const real_t &grd)
converts degree to radians
Definition angle.hpp:28
KOKKOS_INLINE_FUNCTION real_t sqr(const real_t &sqr)
Definition math.hpp:29
KOKKOS_INLINE_FUNCTION real_t dot3(real_t const *const a, real_t const *const b)
Definition math.hpp:24
Definition BerendsenBarostat.cpp:18
KOKKOS_INLINE_FUNCTION constexpr idx_t idx_c(const T &val)
Definition datatypes.hpp:93
Cabana::VerletList< Kokkos::DefaultExecutionSpace::memory_space, Cabana::HalfNeighborTag, Cabana::VerletLayout2D, Cabana::TeamOpTag > HalfVerletList
Definition datatypes.hpp:187
int64_t idx_t
Definition datatypes.hpp:91
Kokkos::Experimental::ScatterView< real_t * > ScalarScatterView
Definition datatypes.hpp:160
double real_t
Definition datatypes.hpp:99
KOKKOS_INLINE_FUNCTION constexpr real_t real_c(T t)
Definition datatypes.hpp:114
static KOKKOS_FORCEINLINE_FUNCTION mrmd::action::impl::Energy sum()
Definition SPC.hpp:50
real_t coulomb
Definition SPC.hpp:30
Energy(const Energy &rhs)=default
KOKKOS_INLINE_FUNCTION Energy & operator+=(const Energy &src)
Definition SPC.hpp:36
real_t LJ
Definition SPC.hpp:29
Definition Histogram.hpp:26