void StoreDataVessel::chainRule( const unsigned& ival, const std::vector<double>& df, Value* val ){ plumed_dbg_assert( getAction()->derivativesAreRequired() && val->getNumberOfDerivatives()==final_derivatives.size() ); chainRule( ival, df ); unsigned kder; if( getAction()->lowmem ) kder = max_lowmem_stash + ival*getAction()->getNumberOfDerivatives(); else kder = getAction()->getFullNumberOfTasks() + ival*(nspace-1); for(unsigned i=0;i<active_der[ival];++i) val->addDerivative( active_der[kder+i] , final_derivatives[i] ); }
void VectorExpressionNode<D>::evaluateJacobiansImplementationWithDifferential(JacobianContainer & outJacobians, const differential_t & chainRuleDifferentail) const { Eigen::MatrixXd chainRule(outJacobians.rows(), D); chainRuleDifferentail.convertIntoMatrix(outJacobians.rows(), D, chainRule); evaluateJacobiansImplementation(outJacobians, chainRule); }
void StoreCentralAtomsVessel::addAtomsDerivatives( const unsigned& iatom, const unsigned& jout, const unsigned& base_cv_no, const Vector& df, MultiColvarFunction* funcout ){ plumed_dbg_assert( mycolv->derivativesAreRequired() ); for(unsigned ider=0;ider<getNumberOfDerivatives(iatom);ider+=3){ for(unsigned i=0;i<3;++i) tmpdf[i]=df[0]; funcout->addStoredDerivative( jout, base_cv_no, getStoredIndex( iatom, ider+0 ), chainRule(iatom, ider+0, tmpdf) ); for(unsigned i=0;i<3;++i) tmpdf[i]=df[1]; funcout->addStoredDerivative( jout, base_cv_no, getStoredIndex( iatom, ider+1 ), chainRule(iatom, ider+1, tmpdf) ); for(unsigned i=0;i<3;++i) tmpdf[i]=df[2]; funcout->addStoredDerivative( jout, base_cv_no, getStoredIndex( iatom, ider+2 ), chainRule(iatom, ider+2, tmpdf) ); } }