void InterpolateBicubic::set_table( const std::vector<Value>& ff ){ plumed_assert( getNumberOfSplinePoints()==ff.size() ); plumed_assert( ff[0].getNumberOfDerivatives()==2 ); dcross=0.0; unsigned iplus, iminus; for(unsigned i=1;i<np[0]-1;++i){ iplus=(i+1)*stride[0]; iminus=(i-1)*stride[0]; for(unsigned j=1;j<np[1]-1;++j){ dcross(i,j) = ( ff[iplus+j+1].get() + ff[iminus+j-1].get() - ff[iplus+j-1].get() - ff[iminus+j+1].get() ) / getCrossTermDenominator( i, j ); } } double d1, d2; Matrix<double> tc(4,4); std::vector<double> y(4), dy1(4), dy2(4), d2y12(4); unsigned pij=0; unsigned ipos; for (unsigned i=0;i<np[0]-1;++i){ ipos=i*stride[0]; d1 = getPointSpacing( 0, i ); for (unsigned j=0; j<np[1]-1;++j){ d2 = getPointSpacing( 1, j ); y[0] = ff[ipos+j].get(); y[1] = ff[ipos+stride[0]+j].get(); y[2] = ff[ipos+stride[0]+j+1].get(); y[3] = ff[ipos+j+1].get(); dy1[0] = ff[ipos+j].getDerivative(0); dy1[1] = ff[ipos+stride[0]+j].getDerivative(0); dy1[2] = ff[ipos+stride[0]+j+1].getDerivative(0); dy1[3] = ff[ipos+j+1].getDerivative(0); dy2[0] = ff[ipos+j].getDerivative(1); dy2[1] = ff[ipos+stride[0]+j].getDerivative(1); dy2[2] = ff[ipos+stride[0]+j+1].getDerivative(1); dy2[3] = ff[ipos+j+1].getDerivative(1); d2y12[0] = dcross( i, j ); d2y12[1] = dcross( i+1, j ); d2y12[2] = dcross( i+1, j+1 ); d2y12[3] = dcross( i, j+1 ); IBicCoeff( y, dy1, dy2, d2y12, d1, d2, tc); pij=( ipos+j )*16; for(unsigned k=0; k<4; ++k){ for(unsigned n=0; n<4; ++n){ clist[pij++]=tc(k,n); } } } } }
void dpolynorm( LWDVector v1, LWDVector v2, LWDVector vlast, LWDVector norm ) { LWDVector a, b; dsub( v2, v1, a ); dsub( vlast, v1, b ); dcross( a, b, norm ); dnormalize( norm ); }