Ejemplo n.º 1
0
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] );
}
Ejemplo n.º 2
0
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)  );
  }
}