/* return the list of exclusions from the file */ void GromacsTopFile::getExclusions(int* atomi, int* atomj) const { for(int i =0; i < exclusions_atom_i.size(); i++) { atomi[i] = exclusions_atom_i[i]; atomj[i] = exclusions_atom_j[i]; } return; }
void ComputeDPMEMaster::recvData(ComputeDPMEDataMsg *msg) { DebugM(4,"ComputeDPMEMaster::recvData() " << msg->numParticles << " particles from node " << msg->node << "\n"); { homeNode.add(msg->node); Pme2Particle *data_ptr = localData + numLocalAtoms; for ( int j = 0; j < msg->numParticles; ++j, ++data_ptr ) { *data_ptr = msg->particles[j]; } numLocalAtoms += msg->numParticles; endForNode.add(numLocalAtoms); delete msg; } if ( homeNode.size() < numWorkingPes ) return; // messages outstanding DebugM(4,"ComputeDPMEMaster::recvData() running serial code.\n"); // single processor version Lattice lattice = host->getFlags()->lattice; SimParameters * simParams = Node::Object()->simParameters; int i; AtomInfo atom_info; atom_info.numatoms = numLocalAtoms; atom_info.atompnt = 0; // not used atom_info.freepnt = 0; // not used atom_info.nlocal = numLocalAtoms; atom_info.nother = 0; if ( ! lattice.orthogonal() ) { NAMD_die("DPME only supports orthogonal PBC's."); } BoxInfo box_info; box_info.box.x = lattice.a().x; box_info.box.y = lattice.b().y; box_info.box.z = lattice.c().z; box_info.box.origin = 0.; // why only one number? box_info.prd.x = box_info.box.x; box_info.prd.y = box_info.box.y; box_info.prd.z = box_info.box.z; box_info.prd2.x = 0.5 * box_info.box.x; box_info.prd2.y = 0.5 * box_info.box.y; box_info.prd2.z = 0.5 * box_info.box.z; box_info.cutoff = simParams->cutoff; box_info.rs = simParams->cutoff; box_info.mc2.x = 2. * ( box_info.prd.x - box_info.cutoff ); box_info.mc2.y = 2. * ( box_info.prd.y - box_info.cutoff ); box_info.mc2.z = 2. * ( box_info.prd.z - box_info.cutoff ); box_info.ewaldcof = ComputeNonbondedUtil::ewaldcof; box_info.dtol = simParams->PMETolerance; for (i = 0; i <= 8; i++) { box_info.recip[i] = 0.; /* assume orthogonal box */ } box_info.recip[0] = 1.0/box_info.box.x; box_info.recip[4] = 1.0/box_info.box.y; box_info.recip[8] = 1.0/box_info.box.z; GridInfo grid_info; grid_info.order = simParams->PMEInterpOrder; grid_info.nfftgrd.x = simParams->PMEGridSizeX; grid_info.nfftgrd.y = simParams->PMEGridSizeY; grid_info.nfftgrd.z = simParams->PMEGridSizeZ; grid_info.nfft = 0; grid_info.volume = lattice.volume(); PeInfo pe_info; // hopefully this isn't used for anything pe_info.myproc.node = 0; pe_info.myproc.nprocs = 1; pe_info.myproc.ncube = 0; pe_info.inst_node[0] = 0; pe_info.igrid = 0; PmeVector *localResults; double recip_vir[6]; int time_count = 0; int tsteps = 1; double mytime = 0.; // perform calculations BigReal electEnergy = 0; // calculate self energy Pme2Particle *data_ptr = localData; for(i=0; i<numLocalAtoms; ++i) { electEnergy += data_ptr->cg * data_ptr->cg; ++data_ptr; } electEnergy *= -1. * box_info.ewaldcof / SQRT_PI; DebugM(4,"Ewald self energy: " << electEnergy << "\n"); DebugM(4,"Calling dpme_eval_recip().\n"); double pme_start_time = 0; if ( runcount == 1 ) pme_start_time = CmiTimer(); electEnergy += dpme_eval_recip( atom_info, localData - 1, &localResults, recip_vir, grid_info, box_info, pe_info, time_count, tsteps, &mytime ); if ( runcount == 1 ) { iout << iINFO << "PME reciprocal sum CPU time per evaluation: " << (CmiTimer() - pme_start_time) << "\n" << endi; } DebugM(4,"Returned from dpme_eval_recip().\n"); // REVERSE SIGN OF VIRIAL RETURNED BY DPME for(i=0; i<6; ++i) recip_vir[i] *= -1.; // send out reductions DebugM(4,"Timestep : " << host->getFlags()->step << "\n"); DebugM(4,"Reciprocal sum energy: " << electEnergy << "\n"); DebugM(4,"Reciprocal sum virial: " << recip_vir[0] << " " << recip_vir[1] << " " << recip_vir[2] << " " << recip_vir[3] << " " << recip_vir[4] << " " << recip_vir[5] << "\n"); reduction->item(REDUCTION_ELECT_ENERGY_SLOW) += electEnergy; reduction->item(REDUCTION_VIRIAL_SLOW_XX) += (BigReal)(recip_vir[0]); reduction->item(REDUCTION_VIRIAL_SLOW_XY) += (BigReal)(recip_vir[1]); reduction->item(REDUCTION_VIRIAL_SLOW_XZ) += (BigReal)(recip_vir[2]); reduction->item(REDUCTION_VIRIAL_SLOW_YX) += (BigReal)(recip_vir[1]); reduction->item(REDUCTION_VIRIAL_SLOW_YY) += (BigReal)(recip_vir[3]); reduction->item(REDUCTION_VIRIAL_SLOW_YZ) += (BigReal)(recip_vir[4]); reduction->item(REDUCTION_VIRIAL_SLOW_ZX) += (BigReal)(recip_vir[2]); reduction->item(REDUCTION_VIRIAL_SLOW_ZY) += (BigReal)(recip_vir[4]); reduction->item(REDUCTION_VIRIAL_SLOW_ZZ) += (BigReal)(recip_vir[5]); reduction->submit(); PmeVector *results_ptr = localResults + 1; numLocalAtoms = 0; for ( i = 0; i < homeNode.size(); ++i ) { ComputeDPMEResultsMsg *msg = new ComputeDPMEResultsMsg; msg->node = homeNode[i]; msg->numParticles = endForNode[i] - numLocalAtoms; msg->forces = new PmeVector[msg->numParticles]; for ( int j = 0; j < msg->numParticles; ++j, ++results_ptr ) { msg->forces[j] = *results_ptr; } numLocalAtoms = endForNode[i]; host->comm->sendComputeDPMEResults(msg,homeNode[i]); } // reset runcount += 1; numLocalAtoms = 0; homeNode.resize(0); endForNode.resize(0); }