*/
class DensityFittingForce::Impl
{
- public:
- /*! \brief Construct densityfitting force implementation from
- * spread of function used to generate the density and spread range.
- * \param[in] kernelShapeParameters determine the shape of the spreading kernel
- */
- explicit Impl(const GaussianSpreadKernelParameters::Shape &kernelShapeParameters);
- //! \copydoc DensityFittingForce::evaluateForce(const DensitySpreadKernelParameters::PositionAndAmplitude & localParameters, basic_mdspan<const float, dynamicExtents3D> densityDerivative)
- RVec evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude &localParameters, basic_mdspan<const float, dynamicExtents3D> densityDerivative);
- //! The width of the Gaussian in lattice spacing units
- DVec sigma_;
- //! The spread range in lattice points
- IVec latticeSpreadRange_;
- //! The three one-dimensional Gaussians that are used in the force calculation
- std::array<GaussianOn1DLattice, DIM> gauss1d_;
- //! The outer product of a Gaussian along the z and y dimension
- OuterProductEvaluator outerProductZY_;
+public:
+ /*! \brief Construct densityfitting force implementation from
+ * spread of function used to generate the density and spread range.
+ * \param[in] kernelShapeParameters determine the shape of the spreading kernel
+ */
+ explicit Impl(const GaussianSpreadKernelParameters::Shape& kernelShapeParameters);
+ //! \copydoc DensityFittingForce::evaluateForce(const DensitySpreadKernelParameters::PositionAndAmplitude & localParameters, basic_mdspan<const float, dynamicExtents3D> densityDerivative)
+ RVec evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude& localParameters,
+ basic_mdspan<const float, dynamicExtents3D> densityDerivative);
+ //! The width of the Gaussian in lattice spacing units
+ DVec sigma_;
+ //! The spread range in lattice points
+ IVec latticeSpreadRange_;
+ //! The three one-dimensional Gaussians that are used in the force calculation
+ std::array<GaussianOn1DLattice, DIM> gauss1d_;
+ //! The outer product of a Gaussian along the z and y dimension
+ OuterProductEvaluator outerProductZY_;
};
-DensityFittingForce::Impl::Impl(const GaussianSpreadKernelParameters::Shape &kernelShapeParameters)
- : sigma_ {kernelShapeParameters.sigma_},
-latticeSpreadRange_ {
- kernelShapeParameters.latticeSpreadRange()
-},
-gauss1d_({GaussianOn1DLattice(latticeSpreadRange_[XX], sigma_[XX]),
- GaussianOn1DLattice(latticeSpreadRange_[YY], sigma_[YY]),
- GaussianOn1DLattice(latticeSpreadRange_[ZZ], sigma_[ZZ])})
+DensityFittingForce::Impl::Impl(const GaussianSpreadKernelParameters::Shape& kernelShapeParameters) :
+ sigma_{ kernelShapeParameters.sigma_ },
+ latticeSpreadRange_{ kernelShapeParameters.latticeSpreadRange() },
+ gauss1d_({ GaussianOn1DLattice(latticeSpreadRange_[XX], sigma_[XX]),
+ GaussianOn1DLattice(latticeSpreadRange_[YY], sigma_[YY]),
+ GaussianOn1DLattice(latticeSpreadRange_[ZZ], sigma_[ZZ]) })
{
}
-RVec DensityFittingForce::Impl::evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude &localParameters,
+RVec DensityFittingForce::Impl::evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude& localParameters,
basic_mdspan<const float, dynamicExtents3D> densityDerivative)
{
- const IVec closestLatticePoint(
- roundToInt(localParameters.coordinate_[XX]),
- roundToInt(localParameters.coordinate_[YY]),
- roundToInt(localParameters.coordinate_[ZZ]));
- const auto spreadRange = spreadRangeWithinLattice(closestLatticePoint, densityDerivative.extents(), latticeSpreadRange_);
+ const IVec closestLatticePoint(roundToInt(localParameters.coordinate_[XX]),
+ roundToInt(localParameters.coordinate_[YY]),
+ roundToInt(localParameters.coordinate_[ZZ]));
+ const auto spreadRange = spreadRangeWithinLattice(
+ closestLatticePoint, densityDerivative.extents(), latticeSpreadRange_);
// do nothing if the added Gaussian will never reach the lattice
if (spreadRange.empty())
{
// multiply with amplitude so that Gauss3D = (amplitude * Gauss_x) * Gauss_y * Gauss_z
const float gauss1DAmplitude = dimension > XX ? 1.0 : localParameters.amplitude_;
- gauss1d_[dimension].spread(gauss1DAmplitude, localParameters.coordinate_[dimension] - closestLatticePoint[dimension]);
+ gauss1d_[dimension].spread(gauss1DAmplitude, localParameters.coordinate_[dimension]
+ - closestLatticePoint[dimension]);
}
- const auto spreadZY = outerProductZY_(gauss1d_[ZZ].view(), gauss1d_[YY].view());
- const auto spreadX = gauss1d_[XX].view();
- const IVec spreadGridOffset(latticeSpreadRange_[XX] - closestLatticePoint[XX],
- latticeSpreadRange_[YY] - closestLatticePoint[YY],
- latticeSpreadRange_[ZZ] - closestLatticePoint[ZZ]);
+ const auto spreadZY = outerProductZY_(gauss1d_[ZZ].view(), gauss1d_[YY].view());
+ const auto spreadX = gauss1d_[XX].view();
+ const IVec spreadGridOffset(latticeSpreadRange_[XX] - closestLatticePoint[XX],
+ latticeSpreadRange_[YY] - closestLatticePoint[YY],
+ latticeSpreadRange_[ZZ] - closestLatticePoint[ZZ]);
- const DVec differenceVectorScale =
- {1. / (square(sigma_[XX])), 1. / (square(sigma_[YY])), 1. / (square(sigma_[ZZ]))};
- const DVec differenceVectorOffset =
- scaleByVector(spreadRange.begin().toDVec() - localParameters.coordinate_.toDVec(), differenceVectorScale);
+ const DVec differenceVectorScale = { 1. / (square(sigma_[XX])), 1. / (square(sigma_[YY])),
+ 1. / (square(sigma_[ZZ])) };
+ const DVec differenceVectorOffset = scaleByVector(
+ spreadRange.begin().toDVec() - localParameters.coordinate_.toDVec(), differenceVectorScale);
- DVec differenceVector = differenceVectorOffset;
+ DVec differenceVector = differenceVectorOffset;
- DVec force = {0., 0., 0.};
+ DVec force = { 0., 0., 0. };
for (int zLatticeIndex = spreadRange.begin()[ZZ]; zLatticeIndex < spreadRange.end()[ZZ];
++zLatticeIndex, differenceVector[ZZ] += differenceVectorScale[ZZ])
{
auto ySliceOfDerivative = zSliceOfDerivative[yLatticeIndex];
const auto zyPrefactor = spreadZY(zLatticeIndex + spreadGridOffset[ZZ],
- yLatticeIndex + spreadGridOffset[YY]);
+ yLatticeIndex + spreadGridOffset[YY]);
differenceVector[XX] = differenceVectorOffset[XX];
for (int xLatticeIndex = spreadRange.begin()[XX]; xLatticeIndex < spreadRange.end()[XX];
++xLatticeIndex, differenceVector[XX] += differenceVectorScale[XX])
{
- const double preFactor = zyPrefactor *
- spreadX[xLatticeIndex + spreadGridOffset[XX]] * ySliceOfDerivative[xLatticeIndex];
+ const double preFactor = zyPrefactor * spreadX[xLatticeIndex + spreadGridOffset[XX]]
+ * ySliceOfDerivative[xLatticeIndex];
force += preFactor * differenceVector;
}
}
}
- return localParameters.amplitude_*force.toRVec();
+ return localParameters.amplitude_ * force.toRVec();
}
/********************************************************************
* DensityFittingForce
*/
-DensityFittingForce::DensityFittingForce(const GaussianSpreadKernelParameters::Shape &kernelShapeParameters) :
+DensityFittingForce::DensityFittingForce(const GaussianSpreadKernelParameters::Shape& kernelShapeParameters) :
impl_(new Impl(kernelShapeParameters))
{
}
-RVec DensityFittingForce::evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude &localParameters,
+RVec DensityFittingForce::evaluateForce(const GaussianSpreadKernelParameters::PositionAndAmplitude& localParameters,
basic_mdspan<const float, dynamicExtents3D> densityDerivative)
{
return impl_->evaluateForce(localParameters, densityDerivative);
}
-DensityFittingForce::~DensityFittingForce()
-{
-}
+DensityFittingForce::~DensityFittingForce() {}
-DensityFittingForce::DensityFittingForce(const DensityFittingForce &other)
- : impl_(new Impl(*other.impl_))
+DensityFittingForce::DensityFittingForce(const DensityFittingForce& other) :
+ impl_(new Impl(*other.impl_))
{
}
-DensityFittingForce &DensityFittingForce::operator=(const DensityFittingForce &other)
+DensityFittingForce& DensityFittingForce::operator=(const DensityFittingForce& other)
{
*impl_ = *other.impl_;
return *this;
}
-DensityFittingForce::DensityFittingForce(DensityFittingForce &&) noexcept = default;
+DensityFittingForce::DensityFittingForce(DensityFittingForce&&) noexcept = default;
-DensityFittingForce &DensityFittingForce::operator=(DensityFittingForce &&) noexcept = default;
+DensityFittingForce& DensityFittingForce::operator=(DensityFittingForce&&) noexcept = default;
} // namespace gmx