// ----------------------------------------------------------------------------- // COPY STATE BACK TO CPU FROM OPENMM // ----------------------------------------------------------------------------- static void myGetOpenMMState(MyOpenMMData* omm, bool wantEnergy, double& timeInPs, double& energyInKcal, MyAtomInfo atoms[]) { int infoMask = 0; infoMask = OpenMM::State::Positions; if (wantEnergy) { infoMask += OpenMM::State::Velocities; // for kinetic energy (cheap) infoMask += OpenMM::State::Energy; // for pot. energy (expensive) } // Forces are also available (and cheap). const OpenMM::State state = omm->context->getState(infoMask); timeInPs = state.getTime(); // OpenMM time is in ps already // Copy OpenMM positions into atoms array and change units from nm to Angstroms. const std::vector<Vec3>& positionsInNm = state.getPositions(); for (int i=0; i < (int)positionsInNm.size(); ++i) for (int j=0; j < 3; ++j) atoms[i].posInAng[j] = positionsInNm[i][j] * OpenMM::AngstromsPerNm; // If energy has been requested, obtain it and convert from kJ to kcal. energyInKcal = 0; if (wantEnergy) energyInKcal = (state.getPotentialEnergy() + state.getKineticEnergy()) * OpenMM::KcalPerKJ; }
// ----------------------------------------------------------------------------- // COPY STATE BACK TO CPU FROM OPENMM // ----------------------------------------------------------------------------- static void myGetOpenMMState(MyOpenMMData* omm, double& timeInPs, std::vector<double>& atomPositionsInAng) { const OpenMM::State state = omm->context->getState(OpenMM::State::Positions, true); timeInPs = state.getTime(); // OpenMM time is in ps already // Copy OpenMM positions into output array and change units from nm to Angstroms. const std::vector<Vec3>& positionsInNm = state.getPositions(); atomPositionsInAng.resize(3*positionsInNm.size()); for (int i=0; i < (int)positionsInNm.size(); ++i) for (int j=0; j < 3; ++j) atomPositionsInAng[3*i+j] = positionsInNm[i][j] * OpenMM::AngstromsPerNm; }