20 #define MIN_DEBUG_LEVEL 1
32 DebugM(3,
"Adding client\n");
33 clientList.add(newClient);
39 DebugM(3,
"Storing data (" << msg->
aid.
size() <<
" positions) on master\n");
41 if ( msg->
step != -1 ) step = msg->
step;
52 for ( ; a_i != a_e; ++a_i, ++p_i ) {
53 receivedAtomIDs.add(*a_i);
54 receivedAtomPositions.add(*p_i);
60 for (a_i=msg->
fid.
begin() ; a_i!=a_e; ++a_i,++f_i) {
61 receivedForceIDs.add(*a_i);
62 receivedTotalForces.add(*f_i);
67 for ( ; g_i != g_e; ++g_i, ++gm_i ) {
68 DebugM(1,
"Received center of mass "<<*g_i<<
"\n");
69 if(i >= totalGroupsRequested)
NAMD_bug(
"Received too many groups.");
70 receivedGroupPositions[i] += (*g_i);
71 receivedGroupMasses[i] += (*gm_i);
74 if(i!=totalGroupsRequested)
NAMD_bug(
"Received too few groups.");
78 if ( ntf && ntf != receivedGroupTotalForces.size() )
NAMD_bug(
"Received wrong number of group forces.");
81 for ( i=0 ; gf_i != gf_e; ++gf_i, ++i ) {
82 receivedGroupTotalForces[i] += (*gf_i);
90 for ( i=0 ; gov_i != gov_e; gov_i++, goi_i++, i++ ) {
91 receivedGridObjIndices[i] = (*goi_i);
92 receivedGridObjValues[i] += (*gov_i);
94 if (ngov && ngov != receivedGridObjValues.size()) {
95 NAMD_bug(
"Received wrong number of grid objects.");
100 NAMD_bug(
"GlobalMasterServer::recvData received lattice twice.");
102 lattice = msg->
lat[0];
106 recvCount += msg->
count;
115 DebugM(3,
"received " << recvCount <<
" atom messages and "
116 << recvPatchesCount <<
" patch messages (out of " << numPatches
117 <<
" patches) from the ComputeGlobals\n" <<
endi);
119 int numNeededPatches = totalGridObjsRequested ? numPatches : 0;
120 if (firstTime) numNeededPatches = 0;
122 if (recvCount > numDataSenders + numForceSenders + 1) {
123 NAMD_bug(
"GlobalMasterServer::recvData recvCount too high.");
126 if (recvPatchesCount > numPatches) {
127 NAMD_bug(
"GlobalMasterServer::recvData too many patches received.");
130 if ((recvCount == numDataSenders + numForceSenders + 1) &&
131 (recvPatchesCount == numNeededPatches)) {
133 if ( ! latticeCount ) {
134 NAMD_bug(
"GlobalMasterServer::recvData did not receive lattice.");
137 DebugM(3,
"Received all needed data\n" <<
endi);
140 for (
size_t ig = 0; ig < receivedGroupMasses.size(); ig++) {
142 DebugM(3,
"Group mass " << ig <<
" = "
143 << receivedGroupMasses[ig] <<
"\n" <<
endi);
145 for (
size_t ig = 0; ig < receivedGridObjValues.size(); ig++) {
146 DebugM(3,
"Grid object " << receivedGridObjIndices[ig] <<
" = "
147 << receivedGridObjValues[ig] <<
"\n" <<
endi);
151 int oldTotalGroupsRequested = totalGroupsRequested;
153 int resendCoordinates = callClients();
155 if (resendCoordinates) {
161 receivedAtomIDs.resize(0);
162 receivedAtomPositions.resize(0);
163 receivedGroupPositions.resize(totalGroupsRequested);
164 receivedGroupPositions.setall(
Vector(0,0,0));
165 receivedGroupMasses.resize(totalGroupsRequested);
166 receivedGroupMasses.setall(0);
167 receivedGridObjIndices.resize(totalGridObjsRequested);
168 receivedGridObjIndices.setall(-1);
169 receivedGridObjValues.resize(totalGridObjsRequested);
170 receivedGridObjValues.setall(0);
173 recvPatchesCount = 0;
174 if ( resendCoordinates ) {
175 recvCount += numForceSenders;
177 receivedGroupTotalForces.resize(totalGroupsRequested);
178 receivedGroupTotalForces.setall(0);
179 receivedForceIDs.resize(0);
180 receivedTotalForces.resize(0);
185 void GlobalMasterServer::resetAtomList(
AtomIDList &atomsRequested) {
194 for(i=0;i<(*m_i)->requestedAtoms().size();i++) {
195 atomsRequested.
add((*m_i)->requestedAtoms()[i]);
205 atomsRequested.
resize( distance(atomsRequested.
begin(), it) );
208 void GlobalMasterServer::resetGroupList(
AtomIDList &groupsRequested,
210 DebugM(3,
"Rebuilding the group list\n");
211 groupsRequested.
resize(0);
227 DebugM(1,
"adding group "<<*numGroups<<
"\n");
228 for(j=0;j<atoms_in_group.
size();j++) {
229 groupsRequested.
add(atoms_in_group[j]);
232 groupsRequested.
add(-1);
240 void GlobalMasterServer::resetForceList(
AtomIDList &atomsForced,
243 DebugM(1,
"Restting forces\n");
247 lastAtomsForced.resize(0);
248 lastForces.resize(0);
258 DebugM(1,
"Adding atom forces\n");
259 for(i=0;i<(*m_i)->forcedAtoms().size();i++) {
260 atomsForced.
add((*m_i)->forcedAtoms()[i]);
261 forces.
add((*m_i)->appliedForces()[i]);
262 lastAtomsForced.add((*m_i)->forcedAtoms()[i]);
263 lastForces.add((*m_i)->appliedForces()[i]);
267 DebugM(1,
"Adding "<<(*m_i)->requestedGroups().size()<<
" group forces\n");
268 for(i=0;i<(*m_i)->groupForces().size();i++) {
269 groupForces.
add((*m_i)->groupForces()[i]);
273 DebugM(1,
"Next master...\n");
276 DebugM(1,
"Done restting forces\n");
279 void GlobalMasterServer::resetGridObjList(
IntList &gridObjsRequested) {
280 gridObjsRequested.
resize(0);
282 for (
GlobalMaster **m_i = clientList.begin(); m_i != clientList.end();
292 sort(gridObjsRequested.
begin(), gridObjsRequested.
end());
294 gridObjsRequested.
resize( distance(gridObjsRequested.
begin(), it) );
295 totalGridObjsRequested = gridObjsRequested.
size();
298 void GlobalMasterServer::resetGridObjForceList(
BigRealList &gridObjForces)
300 gridObjForces.
resize(totalGridObjsRequested);
301 gridObjForces.
setall(0.0);
305 bool have_forces =
false;
329 int GlobalMasterServer::callClients() {
330 DebugM(3,
"Calling clients\n");
331 bool forceSendActive =
false;
335 for ( ; m_i != m_e; ++m_i ) {
336 if ( (*m_i)->changedAtoms() ) firstTime = 1;
337 if ( (*m_i)->changedGroups() ) firstTime = 1;
338 if ( (*m_i)->requestedTotalForces() ) forceSendActive =
true;
349 DebugM(1,
"first time.\n");
351 resetAtomList(msg->
newaid);
353 resetGroupList(msg->
newgdef,&totalGroupsRequested);
359 numDataSenders = totalAtomsRequested;
363 for ( ; g_i != g_e; ++g_i ) {
366 iout <<
iWARN <<
"Atom " << (*g_i+1) <<
" has a near-zero mass, "
367 <<
"but it was requested for center-of-mass calculation.\n"
376 DebugM(3,
"Sending configure ("<<totalAtomsRequested<<
" atoms, "
377 <<totalGroupsRequested<<
" groups, " << totalGridObjsRequested <<
" grids)\n");
378 myComputeManager->sendComputeGlobalResults(msg);
385 if(receivedAtomIDs.size() != totalAtomsRequested) {
386 DebugM(3,
"Requested " << totalAtomsRequested <<
" atoms.\n");
387 NAMD_bug(
"Got the wrong number of atoms");
389 if(receivedGroupPositions.size() != totalGroupsRequested) {
390 DebugM(3,
"Requested " << totalGroupsRequested <<
" groups.\n");
391 DebugM(3,
"Got " << receivedGroupPositions.size() <<
" group positions.\n");
392 NAMD_bug(
"Got the wrong number of groups");
394 if(receivedGroupMasses.size() != totalGroupsRequested) {
395 DebugM(3,
"Requested " << totalGroupsRequested <<
" groups.\n");
396 DebugM(3,
"Got " << receivedGroupMasses.size() <<
" group masses.\n");
397 NAMD_bug(
"Got the wrong number of group masses");
399 if(receivedGridObjValues.size() != totalGridObjsRequested) {
400 DebugM(3,
"Requested " << totalGridObjsRequested <<
" grid objects.\n");
401 DebugM(3,
"Got " << receivedGridObjValues.size() <<
" grid object values.\n");
402 NAMD_bug(
"Got the wrong number of grid object values");
427 for ( ; g_i < g_e; ++g_i, ++gm_i ) { *g_i /= *gm_i; }
428 g_i = receivedGroupPositions.
begin();
429 gm_i = receivedGroupMasses.
begin();
432 bool requested_atoms_changed=
false;
433 bool requested_forces_changed=
false;
434 bool requested_groups_changed=
false;
435 bool requested_grids_changed=
false;
436 forceSendActive =
false;
438 vector <position_index> positions;
439 for (
int j = 0; a_i != a_e; ++a_i, ++j) {
443 positions.push_back(temp);
449 int num_atoms_requested, num_groups_requested, num_gridobjs_requested;
462 if (num_atoms_requested) {
463 vector <int> rqAtoms;
467 sort(rqAtoms.begin(), rqAtoms.end());
469 for (
int i = 0; i < positions.size(); i++){
470 if (positions[i].atomID == rqAtoms[j]){
471 clientAtomPositions.
add(receivedAtomPositions[positions[i].index]);
472 clientAtomIDs.
add(rqAtoms[j]);
474 if ( ++j == num_atoms_requested )
break;
477 if ( j != num_atoms_requested )
NAMD_bug(
478 "GlobalMasterServer::callClients() did not find all requested atoms");
496 mp_i,g_i,g_i+num_groups_requested,
497 gm_i,gm_i+num_groups_requested,
499 goi_i, goi_e, gov_i, gov_e,
500 forced_atoms_i,forced_atoms_e,forces_i,
501 receivedForceIDs.
begin(),receivedForceIDs.end(),receivedTotalForces.begin());
503 a_i = receivedAtomIDs.begin();
504 p_i = receivedAtomPositions.begin();
509 requested_atoms_changed =
true;
512 requested_forces_changed =
true;
515 requested_groups_changed =
true;
518 requested_grids_changed =
true;
526 g_i += num_groups_requested;
527 gm_i += num_groups_requested;
532 if ( numForceSenders && gtf_i != gtf_e )
NAMD_bug(
"GlobalMasterServer::callClients bad group total force count");
538 if(requested_atoms_changed || requested_groups_changed || requested_grids_changed) {
539 resetAtomList(msg->
newaid);
542 resetGroupList(msg->
newgdef,&totalGroupsRequested);
543 numDataSenders = totalAtomsRequested;
547 for ( ; g_i != g_e; ++g_i ) {
550 iout <<
iWARN <<
"Atom " << (*g_i+1) <<
" has a near-zero mass, "
551 <<
"but it was requested for center-of-mass calculation.\n"
561 numForceSenders = (forceSendActive ? numDataSenders : 0);
568 gm_i = receivedGroupMasses.
begin();
569 for ( ; gf_i < gf_e; ++gf_i, ++gm_i ) { *gf_i /= *gm_i; }
572 DebugM(3,
"Sending results ("<<totalAtomsRequested<<
" atoms requested, "
573 <<totalGroupsRequested<<
" groups requested, "
574 <<msg->
f.
size()<<
" forces set)\n");
575 myComputeManager->sendComputeGlobalResults(msg);
581 int theNumDataSenders) {
582 DebugM(3,
"Constructing GlobalMasterServer\n");
583 myComputeManager = m;
589 recvPatchesCount = 0;
592 totalAtomsRequested = 0;
593 totalGroupsRequested = 0;
594 forceSendEnabled = 0;
595 if (
Node::Object()->simParameters->tclForcesOn ) forceSendEnabled = 1;
596 if (
Node::Object()->simParameters->colvarsOn ) forceSendEnabled = 1;
597 DebugM(3,
"done constructing\n");
int old_num_groups_requested
static PatchMap * Object()
BigRealList gridobjvalue
Partial values of the GridForce objects from this message.
SimParameters * simParameters
static __thread float4 * forces
std::ostream & endi(std::ostream &s)
bool requestedTotalForces()
std::ostream & iWARN(std::ostream &s)
const ResizeArray< AtomIDList > & requestedGroups()
void processData(AtomIDList::iterator a_i, AtomIDList::iterator a_e, PositionList::iterator p_i, PositionList::iterator g_i, PositionList::iterator g_e, BigRealList::iterator gm_i, BigRealList::iterator gm_e, ForceList::iterator gtf_i, ForceList::iterator gtf_e, IntList::iterator goi_i, IntList::iterator goi_e, BigRealList::iterator gov_i, BigRealList::iterator gov_e, AtomIDList::iterator last_atoms_forced_i, AtomIDList::iterator last_atoms_forced_e, ForceList::iterator last_forces_i, AtomIDList::iterator, AtomIDList::iterator, ForceList::iterator)
void setLattice(const Lattice *lat)
void NAMD_bug(const char *err_msg)
ResizeArray< Lattice > lat
IntList gridobjindex
Indices of the GridForce objects contained in this message.
void setall(const Elem &elem)
__global__ void const int const TileList *__restrict__ TileExcl *__restrict__ const int *__restrict__ const int const float2 *__restrict__ cudaTextureObject_t const int *__restrict__ const float3 const float3 const float3 const float4 *__restrict__ const float cudaTextureObject_t cudaTextureObject_t float const PatchPairRecord *__restrict__ const int *__restrict__ const int2 *__restrict__ const unsigned int *__restrict__ unsigned int *__restrict__ int *__restrict__ int *__restrict__ TileListStat *__restrict__ const BoundingBox *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ const int numPatches
void recvData(ComputeGlobalDataMsg *)
int add(const Elem &elem)
void addClient(GlobalMaster *newClient)
BlockRadixSort::TempStorage sort
int numPatches(void) const
const BigRealList & gridObjForces()
int count
Numer of atoms processed for this message.
Real atommass(int anum) const
GlobalMasterServer(ComputeMgr *m, int theNumDataSenders)
const IntList & requestedGridObjs()
int patchcount
Number of patches processed for this message.
virtual ~GlobalMasterServer()
const AtomIDList & requestedAtoms()