NAMD
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
PmePencilXYZ Class Reference

#include <PmeSolver.h>

Inheritance diagram for PmePencilXYZ:

Public Member Functions

PmePencilXYZ_SDAG_CODE PmePencilXYZ ()
 
 PmePencilXYZ (CkMigrateMessage *m)
 
virtual ~PmePencilXYZ ()
 
void skip ()
 

Protected Member Functions

virtual void backwardDone ()
 
void submitReductions (unsigned int iGrid)
 

Protected Attributes

PmeGrid pmeGrid
 
bool doEnergy
 
bool doVirial
 
int simulationStep
 
std::array< FFTCompute *, NUM_GRID_MAXfftComputes
 
std::array< PmeKSpaceCompute *, NUM_GRID_MAXpmeKSpaceComputes
 
std::array< int, NUM_GRID_MAXenergyReady
 
Lattice lattice
 
int numStrayAtoms
 

Detailed Description

Definition at line 137 of file PmeSolver.h.

Constructor & Destructor Documentation

◆ PmePencilXYZ() [1/2]

PmePencilXYZ::PmePencilXYZ ( )

Definition at line 22 of file PmeSolver.C.

References doEnergy, doVirial, fftComputes, NUM_GRID_MAX, ReductionMgr::Object(), pmeKSpaceComputes, PatchData::reduction, REDUCTIONS_BASIC, simulationStep, and ReductionMgr::willSubmit().

22  {
23  __sdag_init();
24  setMigratable(false);
25  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
26  pmeKSpaceComputes[iGrid] = NULL;
27  fftComputes[iGrid] = NULL;
28  }
30 #ifdef NODEGROUP_FORCE_REGISTER
31 // #if false
32  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
33  PatchData *patchData = cpdata.ckLocalBranch();
34  nodeReduction = patchData->reduction;
35 #endif
36 // multipleGridLock = CmiCreateLock();
37  doEnergy = false;
38  doVirial = false;
39  simulationStep = 0;
40 }
SubmitReduction * willSubmit(int setID, int size=-1)
Definition: ReductionMgr.C:366
static ReductionMgr * Object(void)
Definition: ReductionMgr.h:279
NodeReduction * reduction
Definition: PatchData.h:133
const unsigned int NUM_GRID_MAX
Definition: PmeSolverUtil.h:9
bool doVirial
Definition: PmeSolver.h:146
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:150
bool doEnergy
Definition: PmeSolver.h:146
int simulationStep
Definition: PmeSolver.h:148
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:149

◆ PmePencilXYZ() [2/2]

PmePencilXYZ::PmePencilXYZ ( CkMigrateMessage *  m)

Definition at line 42 of file PmeSolver.C.

References NAMD_bug().

42  {
43  NAMD_bug("PmePencilXYZ cannot be migrated");
44  //__sdag_init();
45  // setMigratable(false);
46  // fftCompute = NULL;
47  // pmeKSpaceCompute = NULL;
48  // reduction = ReductionMgr::Object()->willSubmit(REDUCTIONS_BASIC);
49 }
void NAMD_bug(const char *err_msg)
Definition: common.C:195

◆ ~PmePencilXYZ()

PmePencilXYZ::~PmePencilXYZ ( )
virtual

Definition at line 51 of file PmeSolver.C.

References fftComputes, NUM_GRID_MAX, and pmeKSpaceComputes.

51  {
52  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
53  if (pmeKSpaceComputes[iGrid] != NULL) delete pmeKSpaceComputes[iGrid];
54  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
55  }
56  delete reduction;
57 // CmiDestroyLock(multipleGridLock);
58 }
const unsigned int NUM_GRID_MAX
Definition: PmeSolverUtil.h:9
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:150
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:149

Member Function Documentation

◆ backwardDone()

void PmePencilXYZ::backwardDone ( )
protectedvirtual

Definition at line 97 of file PmeSolver.C.

References NAMD_bug().

97  {
98  NAMD_bug("PmePencilXYZ::backwardDone(), base class method called");
99 }
void NAMD_bug(const char *err_msg)
Definition: common.C:195

◆ skip()

void PmePencilXYZ::skip ( void  )

Definition at line 273 of file PmeSolver.C.

References SubmitReduction::submit().

273  {
274  reduction->submit();
275 }
void submit(void)
Definition: ReductionMgr.h:324

◆ submitReductions()

void PmePencilXYZ::submitReductions ( unsigned int  iGrid)
protected

Definition at line 101 of file PmeSolver.C.

References energyReady, SubmitReduction::item(), NAMD_bug(), NUM_GRID_MAX, numStrayAtoms, Node::Object(), pmeKSpaceComputes, REDUCTION_ELECT_ENERGY_SLOW, REDUCTION_ELECT_ENERGY_SLOW_F, REDUCTION_ELECT_ENERGY_SLOW_TI_1, REDUCTION_ELECT_ENERGY_SLOW_TI_2, REDUCTION_STRAY_CHARGE_ERRORS, Node::simParameters, simParams, simulationStep, and SubmitReduction::submit().

101  {
102 // fprintf(stderr, "PmePencilXYZ::submitReductions\n");
103  if (pmeKSpaceComputes[iGrid] == NULL)
104  NAMD_bug("PmePencilXYZ::submitReductions, pmeKSpaceCompute not initialized");
106  double virial[9];
107  double energy = pmeKSpaceComputes[iGrid]->getEnergy();
108  pmeKSpaceComputes[iGrid]->getVirial(virial);
109  if (simParams->alchOn) {
110  if (simParams->alchFepOn) {
111  double energy_F = energy;
112  double scale1 = 1.0; // energy scaling factor for λ_1
113  double scale2 = 1.0; // energy scaling factor for λ_2
114  switch (iGrid) {
115  case 0: {
116  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
117  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
118  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
119  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
120  scale1 = elecLambdaUp;
121  scale2 = elecLambda2Up;
122  break;
123  }
124  case 1: {
125  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
126  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
127  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
128  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
129  scale1 = elecLambdaDown;
130  scale2 = elecLambda2Down;
131  break;
132  }
133  case 2: {
134  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
135  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
136  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
137  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
138  scale1 = 1.0 - elecLambdaUp;
139  scale2 = 1.0 - elecLambda2Up;
140  break;
141  }
142  case 3: {
143  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
144  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
145  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
146  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
147  scale1 = 1.0 - elecLambdaDown;
148  scale2 = 1.0 - elecLambda2Down;
149  break;
150  }
151  case 4: {
152  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
153  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
154  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
155  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
156  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
157  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
158  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
159  scale2 = -1.0 * (elecLambda2Up + elecLambda2Down - 1.0);
160  break;
161  }
162  }
163  energy *= scale1;
164  energy_F *= scale2;
165 // fprintf(stdout, "KSpace Grid %u ; E1 = %lf ; E2 = %lf ; scale1 = %lf ; scale2 = %lf\n", iGrid, energy, energy_F, scale1, scale2);
166  for (size_t i = 0; i < 9; ++i) {
167  virial[i] *= scale1;
168  }
169 #if NODEGROUP_FORCE_REGISTER
170  nodeReduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += energy_F;
171 #endif
172  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += energy_F;
173  }
174  if (simParams->alchThermIntOn) {
175  double energy_TI_1 = 0.0;
176  double energy_TI_2 = 0.0;
177  double scale1 = 1.0;
178  switch (iGrid) {
179  case 0: {
180  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
181  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
182  scale1 = elecLambdaUp;
183  energy_TI_1 = energy;
184  break;
185  }
186  case 1: {
187  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
188  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
189  scale1 = elecLambdaDown;
190  energy_TI_2 = energy;
191  break;
192  }
193  case 2: {
194  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
195  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
196  scale1 = 1.0 - elecLambdaUp;
197  energy_TI_1 = -1.0 * energy;
198  break;
199  }
200  case 3: {
201  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
202  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
203  scale1 = 1.0 - elecLambdaDown;
204  energy_TI_2 = -1.0 * energy;
205  break;
206  }
207  case 4: {
208  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
209  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
210  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
211  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
212  energy_TI_1 = -1.0 * energy;
213  energy_TI_2 = -1.0 * energy;
214  break;
215  }
216  }
217  for (size_t i = 0; i < 9; ++i) {
218  virial[i] *= scale1;
219  }
220  energy *= scale1;
221 // fprintf(stdout, "Grid %u : energy_TI_1 = %lf ; energy_TI_2 = %lf\n", iGrid, energy_TI_1, energy_TI_2);
222 #if NODEGROUP_FORCE_REGISTER
223  nodeReduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_1) += energy_TI_1;
224  nodeReduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_2) += energy_TI_2;
225 #endif
226  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_1) += energy_TI_1;
227  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_2) += energy_TI_2;
228  }
229  }
230 #ifdef NODEGROUP_FORCE_REGISTER
231  // #if false
232  // XXX Expect a race condition, need atomic access to nodeReduction
233  nodeReduction->item(REDUCTION_ELECT_ENERGY_SLOW) += energy;
234  nodeReduction->item(REDUCTION_VIRIAL_SLOW_XX) += virial[0];
235  nodeReduction->item(REDUCTION_VIRIAL_SLOW_XY) += virial[1];
236  nodeReduction->item(REDUCTION_VIRIAL_SLOW_XZ) += virial[2];
237  nodeReduction->item(REDUCTION_VIRIAL_SLOW_YX) += virial[3];
238  nodeReduction->item(REDUCTION_VIRIAL_SLOW_YY) += virial[4];
239  nodeReduction->item(REDUCTION_VIRIAL_SLOW_YZ) += virial[5];
240  nodeReduction->item(REDUCTION_VIRIAL_SLOW_ZX) += virial[6];
241  nodeReduction->item(REDUCTION_VIRIAL_SLOW_ZY) += virial[7];
242  nodeReduction->item(REDUCTION_VIRIAL_SLOW_ZZ) += virial[8];
243 #endif
244  reduction->item(REDUCTION_ELECT_ENERGY_SLOW) += energy;
245  reduction->item(REDUCTION_VIRIAL_SLOW_XX) += virial[0];
246  reduction->item(REDUCTION_VIRIAL_SLOW_XY) += virial[1];
247  reduction->item(REDUCTION_VIRIAL_SLOW_XZ) += virial[2];
248  reduction->item(REDUCTION_VIRIAL_SLOW_YX) += virial[3];
249  reduction->item(REDUCTION_VIRIAL_SLOW_YY) += virial[4];
250  reduction->item(REDUCTION_VIRIAL_SLOW_YZ) += virial[5];
251  reduction->item(REDUCTION_VIRIAL_SLOW_ZX) += virial[6];
252  reduction->item(REDUCTION_VIRIAL_SLOW_ZY) += virial[7];
253  reduction->item(REDUCTION_VIRIAL_SLOW_ZZ) += virial[8];
255  energyReady[iGrid] = 1;
256 // CmiLock(multipleGridLock);
257  bool ready_to_submit = true;
258  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
259  if (energyReady[i] == -1) continue;
260  if (energyReady[i] == 0) ready_to_submit = false;
261  }
262  if (ready_to_submit) {
263 // fprintf(stdout, "all energy ready\n");
264  reduction->submit();
265  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
266  if (energyReady[i] == -1) continue;
267  if (energyReady[i] == 1) energyReady[i] = 0;
268  }
269  }
270 // CmiUnlock(multipleGridLock);
271 }
static Node * Object()
Definition: Node.h:86
SimParameters * simParameters
Definition: Node.h:181
BigReal & item(int i)
Definition: ReductionMgr.h:313
int numStrayAtoms
Definition: PmeSolver.h:156
const unsigned int NUM_GRID_MAX
Definition: PmeSolverUtil.h:9
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:153
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:150
void NAMD_bug(const char *err_msg)
Definition: common.C:195
int simulationStep
Definition: PmeSolver.h:148
#define simParams
Definition: Output.C:129
void submit(void)
Definition: ReductionMgr.h:324
double BigReal
Definition: common.h:123

Member Data Documentation

◆ doEnergy

bool PmePencilXYZ::doEnergy
protected

Definition at line 146 of file PmeSolver.h.

Referenced by PmePencilXYZ().

◆ doVirial

bool PmePencilXYZ::doVirial
protected

Definition at line 146 of file PmeSolver.h.

Referenced by PmePencilXYZ().

◆ energyReady

std::array<int, NUM_GRID_MAX> PmePencilXYZ::energyReady
protected

Definition at line 153 of file PmeSolver.h.

Referenced by submitReductions().

◆ fftComputes

std::array<FFTCompute*, NUM_GRID_MAX> PmePencilXYZ::fftComputes
protected

Definition at line 149 of file PmeSolver.h.

Referenced by PmePencilXYZ(), and ~PmePencilXYZ().

◆ lattice

Lattice PmePencilXYZ::lattice
protected

Definition at line 155 of file PmeSolver.h.

◆ numStrayAtoms

int PmePencilXYZ::numStrayAtoms
protected

Definition at line 156 of file PmeSolver.h.

Referenced by submitReductions().

◆ pmeGrid

PmeGrid PmePencilXYZ::pmeGrid
protected

Definition at line 145 of file PmeSolver.h.

◆ pmeKSpaceComputes

std::array<PmeKSpaceCompute*, NUM_GRID_MAX> PmePencilXYZ::pmeKSpaceComputes
protected

Definition at line 150 of file PmeSolver.h.

Referenced by PmePencilXYZ(), submitReductions(), and ~PmePencilXYZ().

◆ simulationStep

int PmePencilXYZ::simulationStep
protected

Definition at line 148 of file PmeSolver.h.

Referenced by PmePencilXYZ(), and submitReductions().


The documentation for this class was generated from the following files: