static void computeAmoebaStretchBendForces( Context& context, AmoebaStretchBendForce& amoebaStretchBendForce, std::vector<Vec3>& expectedForces, double* expectedEnergy, FILE* log ) { // get positions and zero forces State state = context.getState(State::Positions); std::vector<Vec3> positions = state.getPositions(); expectedForces.resize( positions.size() ); for( unsigned int ii = 0; ii < expectedForces.size(); ii++ ){ expectedForces[ii][0] = expectedForces[ii][1] = expectedForces[ii][2] = 0.0; } // calculates forces/energy *expectedEnergy = 0.0; for( int ii = 0; ii < amoebaStretchBendForce.getNumStretchBends(); ii++ ){ computeAmoebaStretchBendForce(ii, positions, amoebaStretchBendForce, expectedForces, expectedEnergy, log ); } #ifdef AMOEBA_DEBUG if( log ){ (void) fprintf( log, "computeAmoebaStretchBendForces: expected energy=%14.7e\n", *expectedEnergy ); for( unsigned int ii = 0; ii < positions.size(); ii++ ){ (void) fprintf( log, "%6u [%14.7e %14.7e %14.7e]\n", ii, expectedForces[ii][0], expectedForces[ii][1], expectedForces[ii][2] ); } (void) fflush( log ); } #endif return; }
static void computeAmoebaStretchBendForces(Context& context, AmoebaStretchBendForce& amoebaStretchBendForce, std::vector<Vec3>& expectedForces, double* expectedEnergy) { // get positions and zero forces State state = context.getState(State::Positions); std::vector<Vec3> positions = state.getPositions(); expectedForces.resize(positions.size()); for (unsigned int ii = 0; ii < expectedForces.size(); ii++) { expectedForces[ii][0] = expectedForces[ii][1] = expectedForces[ii][2] = 0.0; } // calculates forces/energy *expectedEnergy = 0.0; for (int ii = 0; ii < amoebaStretchBendForce.getNumStretchBends(); ii++) { computeAmoebaStretchBendForce(ii, positions, amoebaStretchBendForce, expectedForces, expectedEnergy); } }