144 verletList_ = verletList;
152 auto verletListLocal = verletList_;
155 auto numTypes = numTypes_;
156 auto predLocal = pred;
161 posTmp[0] = pos(idx, 0);
162 posTmp[1] = pos(idx, 1);
163 posTmp[2] = pos(idx, 2);
165 real_t forceTmp[3] = {0_r, 0_r, 0_r};
167 const auto numNeighbors =
idx_c(HalfNeighborList::numNeighbor(verletListLocal, idx));
168 for (
idx_t n = 0; n < numNeighbors; ++n)
170 idx_t jdx =
idx_c(HalfNeighborList::getNeighbor(verletListLocal, idx, n));
173 if (!predLocal(posTmp[0], posTmp[1], posTmp[2], pos(jdx, 0), pos(jdx, 1), pos(jdx, 2)))
176 auto dx = posTmp[0] - pos(jdx, 0);
177 auto dy = posTmp[1] - pos(jdx, 1);
178 auto dz = posTmp[2] - pos(jdx, 2);
180 auto distSqr = dx * dx + dy * dy + dz * dz;
182 if (distSqr > rcSqr)
continue;
184 auto typeIdx = type(idx) * numTypes + type(jdx);
185 auto forceAndEnergy = LJ.computeForceAndEnergy(distSqr, typeIdx);
186 assert(!std::isnan(forceAndEnergy.forceFactor));
187 energyAndVirial.
energy += forceAndEnergy.energy;
188 energyAndVirial.
virial -= 0.5_r * forceAndEnergy.forceFactor * distSqr;
190 forceTmp[0] += dx * forceAndEnergy.forceFactor;
191 forceTmp[1] += dy * forceAndEnergy.forceFactor;
192 forceTmp[2] += dz * forceAndEnergy.forceFactor;
194 force(jdx, 0) -= dx * forceAndEnergy.forceFactor;
195 force(jdx, 1) -= dy * forceAndEnergy.forceFactor;
196 force(jdx, 2) -= dz * forceAndEnergy.forceFactor;
199 force(idx, 0) += forceTmp[0];
200 force(idx, 1) += forceTmp[1];
201 force(idx, 2) += forceTmp[2];
204 Kokkos::parallel_reduce(
"LennardJones::apply_if", policy, kernel, energyAndVirial_);
Cabana::VerletList< Kokkos::DefaultExecutionSpace::memory_space, Cabana::HalfNeighborTag, Cabana::VerletLayout2D, Cabana::TeamOpTag > HalfVerletList
Definition datatypes.hpp:187