void MultiColvarBase::mergeDerivatives( const unsigned& ider, const double& df ){ unsigned vstart=getNumberOfDerivatives()*ider; for(unsigned i=0;i<atoms_with_derivatives.getNumberActive();++i){ unsigned iatom=3*atoms_with_derivatives[i]; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); iatom++; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); iatom++; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); } unsigned nvir=3*getNumberOfAtoms(); for(unsigned j=0;j<9;++j){ accumulateDerivative( nvir, df*getElementDerivative(vstart+nvir) ); nvir++; } }
void ParticleManager::derivativeEvaluate( Eigen::Matrix< double, Eigen::Dynamic, 1 >& derivative ) { clearForceAccumulators(); for (std::vector<IForce*>::iterator iter = m_pForces.begin(); iter != m_pForces.end(); iter++) { (*iter)->calculate(); } if ( m_pConstraintManager != NULL ) { m_pConstraintManager->computeConstraintForces(); m_pConstraintManager->applyConstraintForces(); } derivative.resize( m_particles.size() * 6 ); accumulateDerivative( derivative ); }
void BridgedMultiColvarFunction::mergeDerivatives( const unsigned& ider, const double& df ){ unsigned vstart=getNumberOfDerivatives()*ider; // Merge atom derivatives for(unsigned i=0;i<atoms_with_derivatives.getNumberActive();++i){ unsigned iatom=3*atoms_with_derivatives[i]; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); iatom++; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); iatom++; accumulateDerivative( iatom, df*getElementDerivative(vstart+iatom) ); } // Merge virial derivatives unsigned nvir=3*mycolv->getNumberOfAtoms(); for(unsigned j=0;j<9;++j){ accumulateDerivative( nvir, df*getElementDerivative(vstart+nvir) ); nvir++; } // Merge local atom derivatives for(unsigned j=0;j<getNumberOfAtoms();++j){ accumulateDerivative( nvir, df*getElementDerivative(vstart+nvir) ); nvir++; accumulateDerivative( nvir, df*getElementDerivative(vstart+nvir) ); nvir++; accumulateDerivative( nvir, df*getElementDerivative(vstart+nvir) ); nvir++; } plumed_dbg_assert( nvir==getNumberOfDerivatives() ); }
void Mapping::mergeDerivatives( const unsigned& ider, const double& df ){ unsigned cur = getCurrentTask(), frameno=ider*getNumberOfReferencePoints() + cur; for(unsigned i=0;i<getNumberOfArguments();++i){ accumulateDerivative( i, df*dfframes[frameno]*mymap->getArgumentDerivative(cur,i) ); } if( getNumberOfAtoms()>0 ){ Vector ader; Tensor tmpvir; tmpvir.zero(); unsigned n=getNumberOfArguments(); for(unsigned i=0;i<getNumberOfAtoms();++i){ ader=mymap->getAtomDerivatives( cur, i ); accumulateDerivative( n, df*dfframes[frameno]*ader[0] ); n++; accumulateDerivative( n, df*dfframes[frameno]*ader[1] ); n++; accumulateDerivative( n, df*dfframes[frameno]*ader[2] ); n++; tmpvir += -1.0*Tensor( getPosition(i), ader ); } Tensor vir; if( !mymap->getVirial( cur, vir ) ) vir=tmpvir; accumulateDerivative( n, df*dfframes[frameno]*vir(0,0) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(0,1) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(0,2) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(1,0) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(1,1) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(1,2) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(2,0) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(2,1) ); n++; accumulateDerivative( n, df*dfframes[frameno]*vir(2,2) ); } }
void ActionWithVessel::mergeDerivatives( const unsigned& ider, const double& df ){ unsigned nder=getNumberOfDerivatives(), vstart=nder*ider; for(unsigned i=0;i<getNumberOfDerivatives();++i){ accumulateDerivative( i, df*derivatives[vstart+i] ); } }