double AverageOnGrid::getGridElement( const unsigned& ipoint, const unsigned& jelement ) const { if( noAverage() ) return getDataElement( nper*ipoint + jelement); if( jelement>=(nper-(dimension+1)) ) return getDataElement( nper*ipoint + jelement ); if( noderiv ) return getDataElement( nper*ipoint+jelement ) / getDataElement( nper*(1+ipoint) - 1); double rdenom = 1.0; if( fabs(getDataElement( nper*(ipoint+1) -(dimension+1) ))>epsilon ) rdenom = 1. / getDataElement( nper*(ipoint+1) - (dimension+1) ); unsigned jderiv = jelement%(1+dimension); if( jderiv==0 ) return rdenom*getDataElement( nper*ipoint+jelement ); unsigned jfloor = std::floor( jelement / (1+dimension) ); return rdenom*getDataElement( nper*ipoint+jelement ) - rdenom*rdenom*getDataElement(nper*ipoint+jfloor)*getDataElement(nper*(ipoint+1) - (dimension+1) + jderiv); }
void HistogramOnGrid::getFinalForces( const std::vector<double>& buffer, std::vector<double>& finalForces ) { if( finalForces.size()!=getAction()->getNumberOfDerivatives() ) finalForces.resize( getAction()->getNumberOfDerivatives() ); // And the final force unsigned nder = getAction()->getNumberOfDerivatives(); // Derivatives due to normalization unsigned gridbuf = getNumberOfBufferPoints()*getNumberOfQuantities(); for(unsigned i=0; i<finalForces.size(); ++i) finalForces[i] = buffer[ bufstart + gridbuf + i ]; // Derivatives due to normalization if( !noAverage() ) { unsigned wderstart = bufstart + gridbuf + nder; double pref=0; for(unsigned ipoint=0; ipoint<getNumberOfPoints(); ++ipoint) { pref += forces[ipoint]*buffer[ bufstart + ipoint*nper ] / buffer[wderstart]; } for(unsigned j=0; j<finalForces.size(); ++j) finalForces[j] -= pref*buffer[ wderstart + 1 + j ]; } }