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] ); } } } }