CatomPack MultiColvarBase::getCentralAtomPack( const unsigned& basn, const unsigned& taskIndex ){ unsigned curr=getTaskCode( taskIndex ); CatomPack mypack; if(usespecies){ mypack.resize(1); mypack.setIndex( 0, basn + curr ); mypack.setDerivative( 0, Tensor::identity() ); } else if( ablocks.size()<4 ){ mypack.resize(ablocks.size()); unsigned k=0; std::vector<unsigned> atoms( ablocks.size() ); decodeIndexToAtoms( curr, atoms ); for(unsigned i=0;i<ablocks.size();++i){ if( use_for_central_atom[i] ){ mypack.setIndex( k, basn + atoms[i] ); mypack.setDerivative( k, numberForCentralAtom*Tensor::identity() ); k++; } } } else { unsigned k=0; for(unsigned i=0;i<ablocks.size();++i){ if( use_for_central_atom[i] ){ mypack.setIndex( k, basn + ablocks[i][curr] ); mypack.setDerivative( k, numberForCentralAtom*Tensor::identity() ); k++; } } } return mypack; }
void AtomValuePack::addComDerivatives( const int& ind, const Vector& der, CatomPack& catom_der ){ if( ind<0 ){ for(unsigned ider=0;ider<catom_der.getNumberOfAtomsWithDerivatives();++ider){ unsigned jder=3*catom_der.getIndex(ider); myvals.addTemporyDerivative( jder+0, catom_der.getDerivative(ider,0,der) ); myvals.addTemporyDerivative( jder+1, catom_der.getDerivative(ider,1,der) ); myvals.addTemporyDerivative( jder+2, catom_der.getDerivative(ider,2,der) ); } } else { for(unsigned ider=0;ider<catom_der.getNumberOfAtomsWithDerivatives();++ider){ unsigned jder=3*catom_der.getIndex(ider); myvals.addDerivative( ind, jder+0, catom_der.getDerivative(ider,0,der) ); myvals.addDerivative( ind, jder+1, catom_der.getDerivative(ider,1,der) ); myvals.addDerivative( ind, jder+2, catom_der.getDerivative(ider,2,der) ); } } }
void VolumeGradientBase::setNumberInVolume( const unsigned& ivol, const unsigned& curr, const double& weight, const Vector& wdf, const Tensor& virial, const std::vector<Vector>& refders, MultiValue& outvals ) const { MultiColvarBase* mcolv=getPntrToMultiColvar(); if( !mcolv->weightHasDerivatives ) { outvals.setValue(ivol, weight ); if( derivativesAreRequired() ) { CatomPack catom; mcolv->getCentralAtomPack( 0, curr, catom ); for(unsigned i=0; i<catom.getNumberOfAtomsWithDerivatives(); ++i) { unsigned jatom=3*catom.getIndex(i); outvals.addDerivative( ivol, jatom+0, catom.getDerivative(i,0,wdf) ); outvals.addDerivative( ivol, jatom+1, catom.getDerivative(i,1,wdf) ); outvals.addDerivative( ivol, jatom+2, catom.getDerivative(i,2,wdf) ); } unsigned nmder=getPntrToMultiColvar()->getNumberOfDerivatives(); for(unsigned i=0; i<3; ++i) for(unsigned j=0; j<3; ++j) outvals.addDerivative( ivol, nmder-9+3*i+j, virial(i,j) ); for(unsigned i=0; i<refders.size(); ++i) { unsigned iatom=nmder+3*i; outvals.addDerivative( ivol, iatom+0, refders[i][0] ); outvals.addDerivative( ivol, iatom+1, refders[i][1] ); outvals.addDerivative( ivol, iatom+2, refders[i][2] ); } } } else if(ivol==0) { double ww=outvals.get(0); outvals.setValue(ivol,ww*weight); if( derivativesAreRequired() ) { plumed_merror("This needs testing"); CatomPack catom; mcolv->getCentralAtomPack( 0, curr, catom ); for(unsigned i=0; i<catom.getNumberOfAtomsWithDerivatives(); ++i) { unsigned jatom=3*catom.getIndex(i); outvals.addDerivative( ivol, jatom+0, weight*outvals.getDerivative(ivol,jatom+0) + ww*catom.getDerivative(i,0,wdf) ); outvals.addDerivative( ivol, jatom+1, weight*outvals.getDerivative(ivol,jatom+1) + ww*catom.getDerivative(i,1,wdf) ); outvals.addDerivative( ivol, jatom+2, weight*outvals.getDerivative(ivol,jatom+2) + ww*catom.getDerivative(i,2,wdf) ); } unsigned nmder=getPntrToMultiColvar()->getNumberOfDerivatives(); for(unsigned i=0; i<3; ++i) for(unsigned j=0; j<3; ++j) outvals.addDerivative( ivol, nmder-9+3*i+j, ww*virial(i,j) ); for(unsigned i=0; i<refders.size(); ++i) { unsigned iatom=nmder+3*i; outvals.addDerivative( ivol, iatom+0, ww*refders[i][0] ); outvals.addDerivative( ivol, iatom+1, ww*refders[i][1] ); outvals.addDerivative( ivol, iatom+2, ww*refders[i][2] ); } } } else { double ww=outvals.get(0); outvals.setValue(ivol,ww*weight); if( derivativesAreRequired() ) { plumed_merror("This needs testing"); CatomPack catom; mcolv->getCentralAtomPack( 0, curr, catom ); for(unsigned i=0; i<catom.getNumberOfAtomsWithDerivatives(); ++i) { unsigned jatom=3*catom.getIndex(i); outvals.addDerivative( ivol, jatom+0, ww*catom.getDerivative(i,0,wdf) ); outvals.addDerivative( ivol, jatom+1, ww*catom.getDerivative(i,1,wdf) ); outvals.addDerivative( ivol, jatom+2, ww*catom.getDerivative(i,2,wdf) ); } unsigned nmder=getPntrToMultiColvar()->getNumberOfDerivatives(); for(unsigned i=0; i<3; ++i) for(unsigned j=0; j<3; ++j) outvals.addDerivative( ivol, nmder-9+3*i+j, ww*virial(i,j) ); for(unsigned i=0; i<refders.size(); ++i) { unsigned iatom=nmder+3*i; outvals.addDerivative( ivol, iatom+0, ww*refders[i][0] ); outvals.addDerivative( ivol, iatom+1, ww*refders[i][1] ); outvals.addDerivative( ivol, iatom+2, ww*refders[i][2] ); } } } }