void MultiColvarFilter::completeTask( const unsigned& curr, MultiValue& invals, MultiValue& outvals ) const { invals.copyValues( outvals ); if( derivativesAreRequired() ) invals.copyDerivatives( outvals ); // Retrive the value of the multicolvar and apply filter double val=invals.get(1), df, weight=applyFilter( val, df ); // Now propegate derivatives if( !getPntrToMultiColvar()->weightHasDerivatives ){ outvals.setValue( 0, weight ); if( derivativesAreRequired() ){ for(unsigned i=0;i<invals.getNumberActive();++i){ unsigned jder=invals.getActiveIndex(i); outvals.addDerivative( 0, jder, df*invals.getDerivative(1, jder ) ); } } } else { double ww=outvals.get(0); outvals.setValue( 0, ww*weight ); if( derivativesAreRequired() ){ for(unsigned i=0;i<outvals.getNumberActive();++i){ unsigned ider=outvals.getActiveIndex(i); outvals.setDerivative( 0, ider, weight*outvals.getDerivative(1,ider) + ww*df*outvals.getDerivative(0,ider) ); } } } }
void BridgedMultiColvarFunction::clearDerivativesAfterTask( const unsigned& ider ){ unsigned vstart=getNumberOfDerivatives()*ider; if( derivativesAreRequired() ){ // Clear atom derivatives for(unsigned i=0;i<atoms_with_derivatives.getNumberActive();++i){ unsigned iatom=vstart+3*atoms_with_derivatives[i]; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); } // Clear virial contribution unsigned nvir=vstart+3*mycolv->getNumberOfAtoms(); for(unsigned j=0;j<9;++j){ setElementDerivative( nvir, 0.0 ); nvir++; } // Clear derivatives of local atoms for(unsigned j=0;j<getNumberOfAtoms();++j){ setElementDerivative( nvir, 0.0 ); nvir++; setElementDerivative( nvir, 0.0 ); nvir++; setElementDerivative( nvir, 0.0 ); nvir++; } plumed_dbg_assert( (nvir-vstart)==getNumberOfDerivatives() ); } // Clear values thisval_wasset[ider]=false; setElementValue( ider, 0.0 ); thisval_wasset[ider]=false; }
void VolumeGradientBase::completeTask( const unsigned& curr, MultiValue& invals, MultiValue& outvals ) const { if( getPntrToMultiColvar()->isDensity() ) { outvals.setValue(0, 1.0); outvals.setValue(1, 1.0); } else { // Copy derivatives of the colvar and the value of the colvar invals.copyValues( outvals ); if( derivativesAreRequired() ) invals.copyDerivatives( outvals ); } calculateAllVolumes( curr, outvals ); }
void MultiColvarBase::clearDerivativesAfterTask( const unsigned& ider ){ unsigned vstart=getNumberOfDerivatives()*ider; thisval_wasset[ider]=false; setElementValue( ider, 0.0 ); thisval_wasset[ider]=false; if( ider>1 && ider<5 && derivativesAreRequired() ){ for(unsigned i=0;i<atomsWithCatomDer.getNumberActive();++i){ unsigned iatom=vstart+3*atomsWithCatomDer[i]; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); } } else if( derivativesAreRequired() ) { for(unsigned i=0;i<atoms_with_derivatives.getNumberActive();++i){ unsigned iatom=vstart+3*atoms_with_derivatives[i]; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); iatom++; setElementDerivative( iatom, 0.0 ); } unsigned nvir=vstart+3*getNumberOfAtoms(); for(unsigned j=0;j<9;++j){ setElementDerivative( nvir, 0.0 ); nvir++; } } }
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] ); } } } }