Account for reference density origin shift in pbc correction
authorChristian Blau <cblau@gwdg.de>
Mon, 9 Sep 2019 13:41:48 +0000 (15:41 +0200)
committerChristian Blau <cblau@gwdg.de>
Tue, 10 Sep 2019 12:07:39 +0000 (14:07 +0200)
When the refernce density is shifted from the origin, this shift has to
be added to the reference density center. This patch fixes incorrect pbc
correction behaviour, due to not taking this shift into account.

refs #2282

Change-Id: I953f717ecf6ab53985a59195eab896d50965039e

src/gromacs/applied_forces/densityfittingforceprovider.cpp

index 7621e51155ca120ab95756d3301e06781e139174..b96dd0285056f11b0274d422baef055498717844 100644 (file)
@@ -64,7 +64,7 @@ namespace gmx
 namespace
 {
 
-/*! \internal \brief Generate the spread kernal from Gaussian parameters.
+/*! \internal \brief Generate the spread kernel from Gaussian parameters.
  *
  * \param[in] sigma the width of the Gaussian to be spread
  * \param[in] nSigma the range of the Gaussian in multiples of sigma
@@ -156,6 +156,13 @@ DensityFittingForceProvider::Impl::Impl(const DensityFittingParameters &paramete
     };
     transformationToDensityLattice_.scaleOperationOnly().inverseIgnoringZeroScale(
             { &referenceDensityCenter_, &referenceDensityCenter_ + 1 });
+    // correct the reference density center for a shift
+    // if the reference density does not have its origin at (0,0,0)
+    RVec referenceDensityOriginShift(0, 0, 0);
+    transformationToDensityLattice_({ &referenceDensityOriginShift, &referenceDensityOriginShift + 1 });
+    transformationToDensityLattice_.scaleOperationOnly().inverseIgnoringZeroScale(
+            { &referenceDensityOriginShift, &referenceDensityOriginShift + 1 });
+    referenceDensityCenter_ -= referenceDensityOriginShift;
 }
 
 void DensityFittingForceProvider::Impl::calculateForces(const ForceProviderInput &forceProviderInput,