// calculator void CoordinationBase::calculate() { double ncoord=0.; Tensor virial; vector<Vector> deriv(getNumberOfAtoms()); // deriv.resize(getPositions().size()); if(nl->getStride()>0 && invalidateList){ nl->update(getPositions()); } unsigned stride=comm.Get_size(); unsigned rank=comm.Get_rank(); if(serial){ stride=1; rank=0; }else{ stride=comm.Get_size(); rank=comm.Get_rank(); } for(unsigned int i=rank;i<nl->size();i+=stride) { // sum over close pairs Vector distance; unsigned i0=nl->getClosePair(i).first; unsigned i1=nl->getClosePair(i).second; if(getAbsoluteIndex(i0)==getAbsoluteIndex(i1)) continue; if(pbc){ distance=pbcDistance(getPosition(i0),getPosition(i1)); } else { distance=delta(getPosition(i0),getPosition(i1)); } double dfunc=0.; ncoord += pairing(distance.modulo2(), dfunc,i0,i1); deriv[i0] = deriv[i0] + (-dfunc)*distance ; deriv[i1] = deriv[i1] + dfunc*distance ; virial=virial+(-dfunc)*Tensor(distance,distance); } if(!serial){ comm.Sum(ncoord); if(!deriv.empty()) comm.Sum(&deriv[0][0],3*deriv.size()); comm.Sum(virial); } for(unsigned i=0;i<deriv.size();++i) setAtomsDerivatives(i,deriv[i]); setValue (ncoord); setBoxDerivatives (virial); }
std::string Mapping::getArgumentName( unsigned& iarg ){ if( iarg < getNumberOfArguments() ) return getPntrToArgument(iarg)->getName(); unsigned iatom=iarg - getNumberOfArguments(); std::string atnum; Tools::convert( getAbsoluteIndex(iatom).serial(),atnum); unsigned icomp=iatom%3; if(icomp==0) return "pos" + atnum + "x"; if(icomp==1) return "pos" + atnum + "y"; return "pos" + atnum + "z"; }
void VectorPortBit::getConnectedNets(std::vector<NetSharedPtr>& outNets, bool inSkipChildConnections) const throw (Error) { //First get connections exclusive to me Port::getConnectedNets(outNets); //Append cousins from nets that have been connected to my //parent if(!inSkipChildConnections) { VectorBit<Net>::List parentConnections; Composite<Port>::Pointer parent = getParentCollection(); if(!parent) { Error e(eMessageIdErrorPointerToItemDoesNotExist, __FUNCTION__, __FILE__, __LINE__); e.saveContextData("Pointer to parent collection does not exist", parent); throw e; } if(eCompositionTypeVector != parent->getCompositionType()) { Error e(eMessageIdErrorCompositionTypeMismatch, __FUNCTION__, __FILE__, __LINE__); e.saveContextData("Composition type mismatch", parent->getCompositionType()); throw e; } parent->getConnectedNets(parentConnections, true); VectorBit<Net>::List::iterator connNet = parentConnections.begin(); VectorBit<Net>::List::iterator connNetEnd = parentConnections.end(); const std::vector<VectorBit<Net>::SizeType>& myIndex = getIndices(); for(; connNet != connNetEnd; ++connNet) { Composite<Net>::Pointer cousin; if(eCompositionTypeVector == (*connNet)->getCompositionType()) { cousin = (*connNet)->get(myIndex); //We don't want to mess up preservervation //by calling getChildren() } else //Must be a bundle { VectorBit<Net>::List bChildren; (*connNet)->getChildren(bChildren); cousin = bChildren[getAbsoluteIndex()]; //We assume list is a vector } if(!cousin) { Error e(eMessageIdErrorPointerToItemDoesNotExist, __FUNCTION__, __FILE__, __LINE__); e.saveContextData("Pointer to item does not exist", cousin); throw e; } outNets.push_back(cousin); } } return; }
// calculator void CoordinationBase::calculate() { double ncoord=0.; Tensor virial; vector<Vector> deriv(getNumberOfAtoms()); // deriv.resize(getPositions().size()); if(nl->getStride()>0 && invalidateList) { nl->update(getPositions()); } unsigned stride=comm.Get_size(); unsigned rank=comm.Get_rank(); if(serial) { stride=1; rank=0; } else { stride=comm.Get_size(); rank=comm.Get_rank(); } unsigned nt=OpenMP::getNumThreads(); const unsigned nn=nl->size(); if(nt*stride*10>nn) nt=nn/stride/10; if(nt==0)nt=1; #pragma omp parallel num_threads(nt) { std::vector<Vector> omp_deriv(getPositions().size()); Tensor omp_virial; #pragma omp for reduction(+:ncoord) nowait for(unsigned int i=rank; i<nn; i+=stride) { Vector distance; unsigned i0=nl->getClosePair(i).first; unsigned i1=nl->getClosePair(i).second; if(getAbsoluteIndex(i0)==getAbsoluteIndex(i1)) continue; if(pbc) { distance=pbcDistance(getPosition(i0),getPosition(i1)); } else { distance=delta(getPosition(i0),getPosition(i1)); } double dfunc=0.; ncoord += pairing(distance.modulo2(), dfunc,i0,i1); Vector dd(dfunc*distance); Tensor vv(dd,distance); if(nt>1) { omp_deriv[i0]-=dd; omp_deriv[i1]+=dd; omp_virial-=vv; } else { deriv[i0]-=dd; deriv[i1]+=dd; virial-=vv; } } #pragma omp critical if(nt>1) { for(int i=0; i<getPositions().size(); i++) deriv[i]+=omp_deriv[i]; virial+=omp_virial; } } if(!serial) { comm.Sum(ncoord); if(!deriv.empty()) comm.Sum(&deriv[0][0],3*deriv.size()); comm.Sum(virial); } for(unsigned i=0; i<deriv.size(); ++i) setAtomsDerivatives(i,deriv[i]); setValue (ncoord); setBoxDerivatives (virial); }