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