NAMD
Classes | Public Member Functions | Static Public Member Functions | List of all members
CollectionMgr Class Reference

#include <CollectionMgr.h>

Inheritance diagram for CollectionMgr:

Classes

class  CollectVectorInstance
 
class  CollectVectorSequence
 

Public Member Functions

 CollectionMgr (SlaveInitMsg *msg)
 
 ~CollectionMgr (void)
 
void submitPositions (int seq, FullAtomList &a, Lattice l, int prec, int dcdSelectionIndex)
 
void submitVelocities (int seq, int zero, FullAtomList &a)
 
void submitForces (int seq, FullAtomList &a, int maxForceUsed, ForceList *f)
 
void sendDataStream (const char *)
 
CkChareID getMasterChareID ()
 

Static Public Member Functions

static CollectionMgrObject ()
 

Detailed Description

Definition at line 26 of file CollectionMgr.h.

Constructor & Destructor Documentation

◆ CollectionMgr()

CollectionMgr::CollectionMgr ( SlaveInitMsg msg)

Definition at line 22 of file CollectionMgr.C.

References DebugM.

22  : master(msg->master)
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 }
CkChareID master
Definition: CollectionMgr.h:23
#define DebugM(x, y)
Definition: Debug.h:75

◆ ~CollectionMgr()

CollectionMgr::~CollectionMgr ( void  )

Definition at line 33 of file CollectionMgr.C.

34 {
35 }

Member Function Documentation

◆ getMasterChareID()

CkChareID CollectionMgr::getMasterChareID ( )
inline

Definition at line 47 of file CollectionMgr.h.

Referenced by ParallelIOMgr::initialize().

47 { return master; }

◆ Object()

static CollectionMgr* CollectionMgr::Object ( )
inlinestatic

Definition at line 30 of file CollectionMgr.h.

Referenced by ComputeStir::doForce(), datastream::endd(), and ParallelIOMgr::initialize().

30  {
31  return CkpvAccess(CollectionMgr_instance);
32  }

◆ sendDataStream()

void CollectionMgr::sendDataStream ( const char *  data)

Definition at line 390 of file CollectionMgr.C.

References ResizeArray< Elem >::begin(), DataStreamMsg::data, and ResizeArray< Elem >::resize().

Referenced by ComputeStir::doForce(), and datastream::endd().

390  {
391  DataStreamMsg *msg = new DataStreamMsg;
392  msg->data.resize(strlen(data)+1);
393  strcpy(msg->data.begin(),data);
394  CProxy_CollectionMaster cm(master);
395  cm.receiveDataStream(msg);
396 }
void resize(int i)
Definition: ResizeArray.h:84
ResizeArray< char > data
iterator begin(void)
Definition: ResizeArray.h:36

◆ submitForces()

void CollectionMgr::submitForces ( int  seq,
FullAtomList a,
int  maxForceUsed,
ForceList f 
)

Definition at line 339 of file CollectionMgr.C.

References CollectVectorMsg::aid, CollectionMgr::CollectVectorInstance::aid, CollectVectorMsg::aid_size, ResizeArray< Elem >::begin(), CollectVectorMsg::data, CollectionMgr::CollectVectorInstance::data, CollectVectorMsg::data_size, CollectVectorMsg::fdata_size, SimParameters::fixedAtomsForceOutput, CollectionMgr::CollectVectorInstance::free(), Node::Object(), CollectionMaster::receiveForces(), CollectVectorMsg::seq, CollectionMgr::CollectVectorInstance::seq, Node::simParameters, ResizeArray< Elem >::size(), and CollectionMgr::CollectVectorSequence::submitData().

Referenced by Sequencer::submitCollections(), and Sequencer::submitCollections_SOA().

340 {
341  int numAtoms = a.size();
342  AtomIDList aid(numAtoms);
343  ForceList d(numAtoms);
344  for ( int i=0; i<numAtoms; ++i ) {
345  aid[i] = a[i].id;
346  d[i] = 0.;
347  }
348  for ( int j=0; j<=maxForceUsed; ++j ) {
349  Force *fptr = f[j].begin();
350  for ( int i=0; i<numAtoms; ++i ) {
351  d[i] += fptr[i];
352  }
353  }
354  if ( Node::Object()->simParameters->fixedAtomsOn && !Node::Object()->simParameters->fixedAtomsForceOutput) {
355  for ( int i=0; i<numAtoms; ++i ) {
356  if ( a[i].atomFixed ) d[i] = 0.;
357  }
358  }
359  CollectVectorInstance *c;
360  if ( ( c = forces.submitData(seq,aid,d) ) )
361  {
362  int aid_size = c->aid.size();
363  int data_size = c->data.size();
364  CollectVectorMsg *msg = new (aid_size, data_size, 0, 0) CollectVectorMsg;
365  msg->seq = c->seq;
366  msg->aid_size = aid_size;
367  msg->data_size = data_size;
368  msg->fdata_size = 0;
369  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
370  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
371 #ifdef NODEGROUP_FORCE_REGISTER
372  if (Node::Object()->simParameters->CUDASOAintegrate) {
373  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
374  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
375  pcm->lock();
376  pcm->receiveForces(msg);
377  pcm->unlock();
378  }
379  else
380 #endif
381  {
382  CProxy_CollectionMaster cm(master);
383  cm.receiveForces(msg);
384  }
385  c->free();
386  }
387 }
static Node * Object()
Definition: Node.h:86
Bool fixedAtomsForceOutput
int size(void) const
Definition: ResizeArray.h:131
Definition: Vector.h:72
SimParameters * simParameters
Definition: Node.h:181
CollectVectorInstance * submitData(int seq, AtomIDList &i, ResizeArray< Vector > &d, int prec=2)
void receiveForces(CollectVectorMsg *msg)
iterator begin(void)
Definition: ResizeArray.h:36
int32 AtomID
Definition: NamdTypes.h:35

◆ submitPositions()

void CollectionMgr::submitPositions ( int  seq,
FullAtomList a,
Lattice  l,
int  prec,
int  dcdSelectionIndex 
)

Definition at line 212 of file CollectionMgr.C.

References CollectVectorMsg::aid, CollectionMgr::CollectVectorInstance::aid, CollectVectorMsg::aid_size, CollectVectorMsg::data, CollectVectorMsg::data_size, DebugM, CollectVectorMsg::fdata, CollectVectorMsg::fdata_size, CollectVectorMsg::index, Node::Object(), CollectionMaster::receivePositions(), CollectionMaster::receivePositionsDcdSelection(), Lattice::reverse_transform(), CollectVectorMsg::seq, ResizeArray< Elem >::size(), and CollectionMgr::CollectVectorSequence::submitData().

Referenced by Sequencer::submitCollections(), and Sequencer::submitCollections_SOA().

214 {
215  int numAtomsTotal = a.size();
216  int numAtomsDcdSelection = 0;
217  int numAtoms;
218  int dcdSelectionindex=dcdSelectiontag-1;
219  if(prec == 4) // count up the selection intersection in this atomlist
220  {
221  int bitmask = 1 << dcdSelectionindex;
222  for ( int i=0; i<numAtomsTotal; ++i ) {
223  if(a[i].flags.dcdSelection & bitmask)
224  numAtomsDcdSelection++;
225  }
226  numAtoms = numAtomsDcdSelection;
227  }
228  else
229  {
230  numAtoms = numAtomsTotal;
231  }
232  AtomIDList aid(numAtoms);
233  PositionList d(numAtoms);
234  if(prec == 4)
235  {
236  // only load atoms in the selection list
237  int selectionCounter=0;
238  int bitmask = 1 << dcdSelectionindex;
239  DebugM(3,"seq " << seq << " prec " << prec <<" numAtomsTotal " << numAtomsTotal<< " dcdSelectionIndex "<< dcdSelectionindex <<" bitmask "<< bitmask <<"\n");
240  for (int i=0; i<numAtomsTotal; ++i ) {
241  if(a[i].flags.dcdSelection & bitmask)
242  {
243  aid[selectionCounter] = a[i].id;
244  d[selectionCounter] = l.reverse_transform(a[i].position,a[i].transform);
245  ++selectionCounter;
246  }
247  }
248  DebugM(3, "["<<CkMyPe()<<"]"<< " selection count "<<selectionCounter<<"\n");
249  }
250  else
251  {
252  for ( int i=0; i<numAtoms; ++i ) {
253  aid[i] = a[i].id;
254  d[i] = l.reverse_transform(a[i].position,a[i].transform);
255  }
256  }
257  auto c= positions.submitData(seq,aid,d,prec) ;
258  if ( c )
259  {
260  int aid_size = c->aid.size();
261  int data_size = c->data.size();
262  int fdata_size = c->fdata.size();
263  CollectVectorMsg *msg
264  = new (aid_size, data_size, fdata_size,0) CollectVectorMsg;
265  msg->index=dcdSelectionindex;
266 
267  msg->seq = c->seq;
268  msg->aid_size = aid_size;
269  msg->data_size = data_size;
270  msg->fdata_size = fdata_size;
271  DebugM(3, "["<<CkMyPe()<<"]"<< " msg index "<<msg->index<< " fdata_size " << msg->fdata_size<<"\n");
272  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
273  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
274  memcpy(msg->fdata,c->fdata.begin(),fdata_size*sizeof(FloatVector));
275 #ifdef NODEGROUP_FORCE_REGISTER
276  if (Node::Object()->simParameters->CUDASOAintegrate) {
277  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
278  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
279  pcm->lock();
280  if(prec == 4)
282  else
283  pcm->receivePositions(msg);
284  pcm->unlock();
285  }
286  else
287 #endif
288  {
289  CProxy_CollectionMaster cm(master);
290  if(prec == 4)
291  cm.receivePositionsDcdSelection(msg);
292  else
293  cm.receivePositions(msg);
294  }
295  c->free();
296  }
297 }
static Node * Object()
Definition: Node.h:86
int size(void) const
Definition: ResizeArray.h:131
NAMD_HOST_DEVICE Position reverse_transform(Position data, const Transform &t) const
Definition: Lattice.h:143
Definition: Vector.h:72
void receivePositions(CollectVectorMsg *msg)
void receivePositionsDcdSelection(CollectVectorMsg *msg)
#define DebugM(x, y)
Definition: Debug.h:75
CollectVectorInstance * submitData(int seq, AtomIDList &i, ResizeArray< Vector > &d, int prec=2)
int32 AtomID
Definition: NamdTypes.h:35
FloatVector * fdata

◆ submitVelocities()

void CollectionMgr::submitVelocities ( int  seq,
int  zero,
FullAtomList a 
)

Definition at line 299 of file CollectionMgr.C.

References CollectVectorMsg::aid, CollectionMgr::CollectVectorInstance::aid, CollectVectorMsg::aid_size, ResizeArray< Elem >::begin(), CollectVectorMsg::data, CollectionMgr::CollectVectorInstance::data, CollectVectorMsg::data_size, CollectVectorMsg::fdata_size, CollectionMgr::CollectVectorInstance::free(), Node::Object(), CollectionMaster::receiveVelocities(), CollectVectorMsg::seq, CollectionMgr::CollectVectorInstance::seq, ResizeArray< Elem >::size(), and CollectionMgr::CollectVectorSequence::submitData().

Referenced by Sequencer::submitCollections(), and Sequencer::submitCollections_SOA().

300 {
301  int numAtoms = a.size();
302  AtomIDList aid(numAtoms);
303  PositionList d(numAtoms);
304  for ( int i=0; i<numAtoms; ++i ) {
305  aid[i] = a[i].id;
306  if ( zero ) d[i] = 0.;
307  else d[i] = a[i].velocity;
308  }
309  CollectVectorInstance *c;
310  if ( ( c = velocities.submitData(seq,aid,d) ) )
311  {
312  int aid_size = c->aid.size();
313  int data_size = c->data.size();
314  CollectVectorMsg *msg = new (aid_size, data_size, 0, 0) CollectVectorMsg;
315  msg->seq = c->seq;
316  msg->aid_size = aid_size;
317  msg->data_size = data_size;
318  msg->fdata_size = 0;
319  memcpy(msg->aid,c->aid.begin(),aid_size*sizeof(AtomID));
320  memcpy(msg->data,c->data.begin(),data_size*sizeof(Vector));
321 #ifdef NODEGROUP_FORCE_REGISTER
322  if (Node::Object()->simParameters->CUDASOAintegrate) {
323  CProxy_PatchData cpdata(CkpvAccess(BOCclass_group).patchData);
324  CollectionMaster *pcm = cpdata.ckLocalBranch()->ptrCollectionMaster;
325  pcm->lock();
326  pcm->receiveVelocities(msg);
327  pcm->unlock();
328  }
329  else
330 #endif
331  {
332  CProxy_CollectionMaster cm(master);
333  cm.receiveVelocities(msg);
334  }
335  c->free();
336  }
337 }
static Node * Object()
Definition: Node.h:86
int size(void) const
Definition: ResizeArray.h:131
void receiveVelocities(CollectVectorMsg *msg)
Definition: Vector.h:72
CollectVectorInstance * submitData(int seq, AtomIDList &i, ResizeArray< Vector > &d, int prec=2)
int32 AtomID
Definition: NamdTypes.h:35

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