NAMD
CollectionMgr.C
Go to the documentation of this file.
1 
7 #include "CollectionMgr.decl.h"
8 #include "CollectionMgr.h"
9 #include "CollectionMaster.decl.h"
10 #include "CollectionMaster.h"
11 #include "Node.h"
12 #include "SimParameters.h"
13 
14 #include "PatchData.h"
15 
16 #include "ParallelIOMgr.decl.h"
17 #include "ParallelIOMgr.h"
18 #define MIN_DEBUG_LEVEL 3
19 //#define DEBUGM
20 #include "Debug.h"
21 
23 {
24  delete msg;
25  if (CkpvAccess(CollectionMgr_instance) == 0) {
26  CkpvAccess(CollectionMgr_instance) = this;
27  } else {
28  DebugM(1, "CollectionMgr::CollectionMgr() - another instance of CollectionMgr exists!\n");
29  }
30 }
31 
32 
34 {
35 }
36 
37 #ifdef MEM_OPT_VERSION
38 //1. record the dest output rank of each atom
39 //2. distribute the atoms to the corresponding output procs
40 //1 and 2 are both needed for positions and velocities
41 
43  Lattice l, int prec, int dcdSelectiontag)
44 {
45  int numAtoms = a.size();
46  int dcdSelectionindex=dcdSelectiontag-1;
47  AtomIDList aid(numAtoms);
48  ResizeArray<int> oRank(numAtoms);
49  PositionList d(numAtoms);
50  CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
51  ParallelIOMgr *ioMgr = io.ckLocalBranch();
52  int numOutputProcs = ioMgr->numOutputProcs;
53  for ( int i=0; i<numAtoms; ++i ) {
54  aid[i] = a[i].id;
55  oRank[i] = a[i].outputRank;
56  if(oRank[i]>numOutputProcs || oRank[i]<0)
57  {
58  std::cout << "pos resetting oRank of atom "<<i<<" to 0, how did it become "<< oRank[i] <<"\n";
59  oRank[i]=0;
60  }
61  d[i] = l.reverse_transform(a[i].position,a[i].transform);
62  }
63  CollectVectorInstance *c;
64  if ( ( c = positions.submitData(seq,aid,oRank,d,prec) ) )
65  {
66  //construct per output proc atoms list
67  AtomIDList *perOList = new AtomIDList[ioMgr->numOutputProcs];
68  for(int i=0; i<c->aid.size(); i++){
69  perOList[c->outRank[i]].add(i);
70  }
72  if(prec==1 || prec==4 || prec==5 ){
74  }else if(prec==2){
76  }else{
78  }
79  //send msg to output proc if there's one
80  for(int i=0; i<ioMgr->numOutputProcs; i++){
81  int numAtoms = perOList[i].size();
82  if(!numAtoms && ioMgr->numProxiesPerOutputProc == 0) continue;
84  if( vstatus == CollectVectorVarMsg::VectorValid){
85  msg = new(numAtoms, numAtoms, 0)CollectVectorVarMsg;
86  for(int j=0; j<numAtoms; j++){
87  int lIdx = perOList[i][j];
88  msg->aid[j] = c->aid[lIdx];
89  msg->data[j] = c->data[lIdx];
90  }
91  }else if(vstatus == CollectVectorVarMsg::FloatVectorValid){
92  msg = new(numAtoms, 0, numAtoms)CollectVectorVarMsg;
93  for(int j=0; j<numAtoms; j++){
94  int lIdx = perOList[i][j];
95  msg->aid[j] = c->aid[lIdx];
96  msg->fdata[j] = c->fdata[lIdx];
97  }
98  }else{
99  msg = new(numAtoms, numAtoms, numAtoms)CollectVectorVarMsg;
100  for(int j=0; j<numAtoms; j++){
101  int lIdx = perOList[i][j];
102  msg->aid[j] = c->aid[lIdx];
103  msg->data[j] = c->data[lIdx];
104  msg->fdata[j] = c->fdata[lIdx];
105  }
106  }
107  msg->seq = c->seq;
108  msg->size = numAtoms;
109  msg->status = vstatus;
110  msg->index = dcdSelectionindex;
111  io[ioMgr->myOutputProxies[i]].receivePositions(msg);
112  }
113  c->free();
114  delete [] perOList;
115  }
116 }
117 
118 void CollectionMgr::submitVelocities(int seq, int zero, FullAtomList &a, int prec)
119 {
120  int numAtoms = a.size();
121  AtomIDList aid(numAtoms);
122  ResizeArray<int> oRank(numAtoms);
123  PositionList d(numAtoms);
124  for ( int i=0; i<numAtoms; ++i ) {
125  aid[i] = a[i].id;
126  oRank[i] = a[i].outputRank;
127  if ( zero ) d[i] = 0.;
128  else d[i] = a[i].velocity;
129  }
130  CollectVectorInstance *c;
131  if ( ( c = velocities.submitData(seq,aid,oRank,d,prec) ) )
132  {
133  CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
134  ParallelIOMgr *ioMgr = io.ckLocalBranch();
135 
136  //construct per output proc atoms list
137  AtomIDList *perOList = new AtomIDList[ioMgr->numOutputProcs];
138  for(int i=0; i<c->aid.size(); i++){
139  perOList[c->outRank[i]].add(i);
140  }
142  if(prec==1){
144  }else if(prec==2){
146  }else{
148  }
149  //send msg to output proc if there's one
150  for(int i=0; i<ioMgr->numOutputProcs; i++){
151  int numAtoms = perOList[i].size();
152  if(!numAtoms && ioMgr->numProxiesPerOutputProc == 0) continue;
153  CollectVectorVarMsg *msg;
154  if( vstatus == CollectVectorVarMsg::VectorValid){
155  msg = new(numAtoms, numAtoms, 0, 0)CollectVectorVarMsg;
156  for(int j=0; j<numAtoms; j++){
157  int lIdx = perOList[i][j];
158  msg->aid[j] = c->aid[lIdx];
159  msg->data[j] = c->data[lIdx];
160  }
161  }else if(vstatus == CollectVectorVarMsg::FloatVectorValid){
162  msg = new(numAtoms, 0, numAtoms, 0)CollectVectorVarMsg;
163  for(int j=0; j<numAtoms; j++){
164  int lIdx = perOList[i][j];
165  msg->aid[j] = c->aid[lIdx];
166  msg->fdata[j] = c->fdata[lIdx];
167  }
168  }else{
169  msg = new(numAtoms, numAtoms, numAtoms, 0)CollectVectorVarMsg;
170  for(int j=0; j<numAtoms; j++){
171  int lIdx = perOList[i][j];
172  msg->aid[j] = c->aid[lIdx];
173  msg->data[j] = c->data[lIdx];
174  msg->fdata[j] = c->fdata[lIdx];
175  }
176  }
177  msg->seq = c->seq;
178  msg->size = numAtoms;
179  msg->status = vstatus;
180  io[ioMgr->myOutputProxies[i]].receiveVelocities(msg);
181  }
182  c->free();
183  delete [] perOList;
184  }
185 }
186 
187 void CollectionMgr::submitForces(int seq, FullAtomList &a, int maxForceUsed, ForceList *f, int prec)
188 {
189  int numAtoms = a.size();
190  AtomIDList aid(numAtoms);
191  ResizeArray<int> oRank(numAtoms);
192  ForceList d(numAtoms);
193  for ( int i=0; i<numAtoms; ++i ) {
194  aid[i] = a[i].id;
195  oRank[i] = a[i].outputRank;
196  d[i] = 0.;
197  }
198  for ( int j=0; j<=maxForceUsed; ++j ) {
199  Force *fptr = f[j].begin();
200  for ( int i=0; i<numAtoms; ++i ) {
201  d[i] += fptr[i];
202  }
203  }
204  if ( Node::Object()->simParameters->fixedAtomsOn && !Node::Object()->simParameters->fixedAtomsForceOutput) {
205  for ( int i=0; i<numAtoms; ++i ) {
206  if ( a[i].atomFixed ) d[i] = 0.;
207  }
208  }
209  CollectVectorInstance *c;
210  if ( ( c = forces.submitData(seq,aid,oRank,d,prec) ) )
211  {
212  CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
213  ParallelIOMgr *ioMgr = io.ckLocalBranch();
214 
215  //construct per output proc atoms list
216  AtomIDList *perOList = new AtomIDList[ioMgr->numOutputProcs];
217  for(int i=0; i<c->aid.size(); i++){
218  perOList[c->outRank[i]].add(i);
219  }
221  if(prec==1){
223  }else if(prec==2){
225  }else{
227  }
228  //send msg to output proc if there's one
229  for(int i=0; i<ioMgr->numOutputProcs; i++){
230  int numAtoms = perOList[i].size();
231  if(!numAtoms && ioMgr->numProxiesPerOutputProc == 0) continue;
232  CollectVectorVarMsg *msg;
233  if( vstatus == CollectVectorVarMsg::VectorValid){
234  msg = new(numAtoms, numAtoms, 0, 0)CollectVectorVarMsg;
235  for(int j=0; j<numAtoms; j++){
236  int lIdx = perOList[i][j];
237  msg->aid[j] = c->aid[lIdx];
238  msg->data[j] = c->data[lIdx];
239  }
240  }else if(vstatus == CollectVectorVarMsg::FloatVectorValid){
241  msg = new(numAtoms, 0, numAtoms, 0)CollectVectorVarMsg;
242  for(int j=0; j<numAtoms; j++){
243  int lIdx = perOList[i][j];
244  msg->aid[j] = c->aid[lIdx];
245  msg->fdata[j] = c->fdata[lIdx];
246  }
247  }else{
248  msg = new(numAtoms, numAtoms, numAtoms, 0)CollectVectorVarMsg;
249  for(int j=0; j<numAtoms; j++){
250  int lIdx = perOList[i][j];
251  msg->aid[j] = c->aid[lIdx];
252  msg->data[j] = c->data[lIdx];
253  msg->fdata[j] = c->fdata[lIdx];
254  }
255  }
256  msg->seq = c->seq;
257  msg->size = numAtoms;
258  msg->status = vstatus;
259  io[ioMgr->myOutputProxies[i]].receiveForces(msg);
260  }
261  c->free();
262  delete [] perOList;
263  }
264 }
265 
266 
267 #else
269  Lattice l, int prec, int dcdSelectiontag)
270 {
271  int numAtomsTotal = a.size();
272  int numAtomsDcdSelection = 0;
273  int numAtoms;
274  int dcdSelectionindex=dcdSelectiontag-1;
275  if(prec == 4) // count up the selection intersection in this atomlist
276  {
277  int bitmask = 1 << dcdSelectionindex;
278  for ( int i=0; i<numAtomsTotal; ++i ) {
279  if(a[i].flags.dcdSelection & bitmask)
280  numAtomsDcdSelection++;
281  }
282  numAtoms = numAtomsDcdSelection;
283  }
284  else
285  {
286  numAtoms = numAtomsTotal;
287  }
288  AtomIDList aid(numAtoms);
289  PositionList d(numAtoms);
290  if(prec == 4)
291  {
292  // only load atoms in the selection list
293  int selectionCounter=0;
294  int bitmask = 1 << dcdSelectionindex;
295  DebugM(3,"seq " << seq << " prec " << prec <<" numAtomsTotal " << numAtomsTotal<< " dcdSelectionIndex "<< dcdSelectionindex <<" bitmask "<< bitmask <<"\n");
296  for (int i=0; i<numAtomsTotal; ++i ) {
297  if(a[i].flags.dcdSelection & bitmask)
298  {
299  aid[selectionCounter] = a[i].id;
300  d[selectionCounter] = l.reverse_transform(a[i].position,a[i].transform);
301  ++selectionCounter;
302  }
303  }
304  DebugM(3, "["<<CkMyPe()<<"]"<< " selection count "<<selectionCounter<<"\n");
305  }
306  else
307  {
308  for ( int i=0; i<numAtoms; ++i ) {
309  aid[i] = a[i].id;
310  d[i] = l.reverse_transform(a[i].position,a[i].transform);
311  }
312  }
313  auto c= positions.submitData(seq,aid,d,prec) ;
314  if ( c )
315  {
316  int aid_size = c->aid.size();
317  int data_size = c->data.size();
318  int fdata_size = c->fdata.size();
319  CollectVectorMsg *msg
320  = new (aid_size, data_size, fdata_size,0) CollectVectorMsg;
321  msg->index=dcdSelectionindex;
322 
323  msg->seq = c->seq;
324  msg->aid_size = aid_size;
325  msg->data_size = data_size;
326  msg->fdata_size = fdata_size;
327  DebugM(3, "["<<CkMyPe()<<"]"<< " msg index "<<msg->index<< " fdata_size " << msg->fdata_size<<"\n");
328  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
329  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
330  memcpy(msg->fdata,c->fdata.begin(),fdata_size*sizeof(FloatVector));
331 #ifdef NODEGROUP_FORCE_REGISTER
333  if (simParams->CUDASOAintegrate && simParams->GPUresidentSingleProcessMode) {
334  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
335  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
336  pcm->lock();
337  if(prec == 4)
339  else
340  pcm->receivePositions(msg);
341  pcm->unlock();
342  }
343  else
344 #endif
345  {
346  CProxy_CollectionMaster cm(master);
347  if(prec == 4)
348  cm.receivePositionsDcdSelection(msg);
349  else
350  cm.receivePositions(msg);
351  }
352  c->free();
353  }
354 }
355 
356 void CollectionMgr::submitVelocities(int seq, int zero, FullAtomList &a, int prec)
357 {
358  int numAtoms = a.size();
359  AtomIDList aid(numAtoms);
360  PositionList d(numAtoms);
361  for ( int i=0; i<numAtoms; ++i ) {
362  aid[i] = a[i].id;
363  if ( zero ) d[i] = 0.;
364  else d[i] = a[i].velocity;
365  }
367  if ( ( c = velocities.submitData(seq,aid,d,prec) ) )
368  {
369  int aid_size = c->aid.size();
370  int data_size = c->data.size();
371  int fdata_size = c->fdata.size();
372  CollectVectorMsg *msg = new (aid_size, data_size, fdata_size, 0) CollectVectorMsg;
373  msg->seq = c->seq;
374  msg->aid_size = aid_size;
375  msg->data_size = data_size;
376  msg->fdata_size = fdata_size;
377  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
378  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
379  memcpy(msg->fdata,c->fdata.begin(),fdata_size*sizeof(FloatVector));
380 #ifdef NODEGROUP_FORCE_REGISTER
382  if (simParams->CUDASOAintegrate && simParams->GPUresidentSingleProcessMode) {
383  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
384  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
385  pcm->lock();
386  pcm->receiveVelocities(msg);
387  pcm->unlock();
388  }
389  else
390 #endif
391  {
392  CProxy_CollectionMaster cm(master);
393  cm.receiveVelocities(msg);
394  }
395  c->free();
396  }
397 }
398 
399 void CollectionMgr::submitForces(int seq, FullAtomList &a, int maxForceUsed, ForceList *f, int prec)
400 {
401  int numAtoms = a.size();
402  AtomIDList aid(numAtoms);
403  ForceList d(numAtoms);
404  for ( int i=0; i<numAtoms; ++i ) {
405  aid[i] = a[i].id;
406  d[i] = 0.;
407  }
408  for ( int j=0; j<=maxForceUsed; ++j ) {
409  Force *fptr = f[j].begin();
410  for ( int i=0; i<numAtoms; ++i ) {
411  d[i] += fptr[i];
412  }
413  }
414  if ( Node::Object()->simParameters->fixedAtomsOn && !Node::Object()->simParameters->fixedAtomsForceOutput) {
415  for ( int i=0; i<numAtoms; ++i ) {
416  if ( a[i].atomFixed ) d[i] = 0.;
417  }
418  }
420  if ( ( c = forces.submitData(seq,aid,d,prec) ) )
421  {
422  int aid_size = c->aid.size();
423  int data_size = c->data.size();
424  int fdata_size = c->fdata.size();
425  CollectVectorMsg *msg = new (aid_size, data_size, fdata_size, 0) CollectVectorMsg;
426  msg->seq = c->seq;
427  msg->aid_size = aid_size;
428  msg->data_size = data_size;
429  msg->fdata_size = fdata_size;
430  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
431  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
432  memcpy(msg->fdata,c->fdata.begin(),fdata_size*sizeof(FloatVector));
433 #ifdef NODEGROUP_FORCE_REGISTER
434  if (Node::Object()->simParameters->CUDASOAintegrate) {
435  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
436  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
437  pcm->lock();
438  pcm->receiveForces(msg);
439  pcm->unlock();
440  }
441  else
442 #endif
443  {
444  CProxy_CollectionMaster cm(master);
445  cm.receiveForces(msg);
446  }
447  c->free();
448  }
449 }
450 #endif
451 
452 void CollectionMgr::sendDataStream(const char *data) {
453  DataStreamMsg *msg = new DataStreamMsg;
454  msg->data.resize(strlen(data)+1);
455  strcpy(msg->data.begin(),data);
456  CProxy_CollectionMaster cm(master);
457  cm.receiveDataStream(msg);
458 }
459 
460 #include "CollectionMgr.def.h"
461 
static Node * Object()
Definition: Node.h:86
void submitForces(int seq, FullAtomList &a, int maxForceUsed, ForceList *f, int prec)
Bool fixedAtomsForceOutput
int size(void) const
Definition: ResizeArray.h:131
NAMD_HOST_DEVICE Position reverse_transform(Position data, const Transform &t) const
Definition: Lattice.h:143
void receiveVelocities(CollectVectorMsg *msg)
Definition: Vector.h:72
SimParameters * simParameters
Definition: Node.h:181
void receivePositions(CollectVectorMsg *msg)
void receivePositionsDcdSelection(CollectVectorMsg *msg)
#define DebugM(x, y)
Definition: Debug.h:75
int add(const Elem &elem)
Definition: ResizeArray.h:101
CollectVectorInstance * submitData(int seq, AtomIDList &i, ResizeArray< Vector > &d, int prec=2)
void resize(int i)
Definition: ResizeArray.h:84
void receiveForces(CollectVectorMsg *msg)
~CollectionMgr(void)
Definition: CollectionMgr.C:33
ResizeArray< char > data
#define simParams
Definition: Output.C:131
iterator begin(void)
Definition: ResizeArray.h:36
int32 AtomID
Definition: NamdTypes.h:35
void submitVelocities(int seq, int zero, FullAtomList &a, int prec)
void submitPositions(int seq, FullAtomList &a, Lattice l, int prec, int dcdSelectionIndex)
ResizeArray< FloatVector > fdata
Definition: CollectionMgr.h:96
CollectionMgr(SlaveInitMsg *msg)
Definition: CollectionMgr.C:22
void sendDataStream(const char *)
FloatVector * fdata