bool MultiColvarBase::setupCurrentAtomList( const unsigned& taskCode, AtomValuePack& myatoms ) const { if( usespecies ){ if( isDensity() ) return true; unsigned natomsper=myatoms.setupAtomsFromLinkCells( taskCode, getPositionOfAtomForLinkCells(taskCode), linkcells ); return natomsper>1; } else if( ablocks.size()<4 ){ std::vector<unsigned> atoms( ablocks.size() ); decodeIndexToAtoms( taskCode, atoms ); myatoms.setNumberOfAtoms( ablocks.size() ); for(unsigned i=0;i<ablocks.size();++i) myatoms.setAtom( i, atoms[i] ); } else { myatoms.setNumberOfAtoms( ablocks.size() ); for(unsigned i=0;i<ablocks.size();++i) myatoms.setAtom( i, ablocks[i][taskCode] ); } return true; }
bool MultiColvarBase::setupCurrentAtomList( const unsigned& taskCode ){ if( usespecies ){ natomsper=1; if( isDensity() ) return true; current_atoms[0]=taskCode; linkcells.retrieveNeighboringAtoms( getPositionOfAtomForLinkCells(current_atoms[0]), natomsper, current_atoms ); return natomsper>1; } else if( current_atoms.size()<4 ){ natomsper=current_atoms.size(); unsigned scode = taskCode; for(unsigned i=0;i<ablocks.size();++i){ unsigned ind=( scode / decoder[i] ); current_atoms[i]=ablocks[i][ind]; scode -= ind*decoder[i]; } } else { natomsper=current_atoms.size(); for(unsigned i=0;i<ablocks.size();++i) current_atoms[i]=ablocks[i][taskCode]; } return true; }
Vector MultiColvarBase::getCentralAtomPos( const unsigned& taskIndex ){ unsigned curr=getTaskCode( taskIndex ); if( usespecies || isDensity() ){ return getPositionOfAtomForLinkCells(curr); } else if( ablocks.size()<4 ){ // double factor=1.0/static_cast<double>( ablocks.size() ); Vector mypos; mypos.zero(); std::vector<unsigned> atoms( ablocks.size() ); decodeIndexToAtoms( curr, atoms ); for(unsigned i=0;i<ablocks.size();++i){ if( use_for_central_atom[i] ) mypos+=numberForCentralAtom*getPositionOfAtomForLinkCells(atoms[i]); } return mypos; } else { Vector mypos; mypos.zero(); for(unsigned i=0;i<ablocks.size();++i){ if( use_for_central_atom[i] ) mypos+=numberForCentralAtom*getPositionOfAtomForLinkCells(ablocks[i][curr]); } return mypos; } }