void testManyParameters() {
    System system;
    system.addParticle(1.0);
    system.addParticle(1.0);
    VerletIntegrator integrator(0.01);
    CustomBondForce* forceField = new CustomBondForce("(a+b+c+d+e+f+g+h+i)*r");
    forceField->addPerBondParameter("a");
    forceField->addPerBondParameter("b");
    forceField->addPerBondParameter("c");
    forceField->addPerBondParameter("d");
    forceField->addPerBondParameter("e");
    forceField->addPerBondParameter("f");
    forceField->addPerBondParameter("g");
    forceField->addPerBondParameter("h");
    forceField->addPerBondParameter("i");
    vector<double> parameters(forceField->getNumPerBondParameters());
    for (int i = 0; i < (int) parameters.size(); i++)
        parameters[i] = i;
    forceField->addBond(0, 1, parameters);
    system.addForce(forceField);
    Context context(system, integrator, platform);
    vector<Vec3> positions(2);
    positions[0] = Vec3(0, 0, 0);
    positions[1] = Vec3(0, 2.5, 0);
    context.setPositions(positions);
    State state = context.getState(State::Forces | State::Energy);
    const vector<Vec3>& forces = state.getForces();
    double f = 1+2+3+4+5+6+7+8;
    ASSERT_EQUAL_VEC(Vec3(0, f, 0), forces[0], TOL);
    ASSERT_EQUAL_VEC(Vec3(0, -f, 0), forces[1], TOL);
    ASSERT_EQUAL_TOL(f*2.5, state.getPotentialEnergy(), TOL);
}
Esempio n. 2
0
void* CustomBondForceProxy::deserialize(const SerializationNode& node) const {
    int version = node.getIntProperty("version");
    if (version < 1 || version > 3)
        throw OpenMMException("Unsupported version number");
    CustomBondForce* force = NULL;
    try {
        CustomBondForce* force = new CustomBondForce(node.getStringProperty("energy"));
        force->setForceGroup(node.getIntProperty("forceGroup", 0));
        if (version > 1)
            force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic"));
        const SerializationNode& perBondParams = node.getChildNode("PerBondParameters");
        for (auto& parameter : perBondParams.getChildren())
            force->addPerBondParameter(parameter.getStringProperty("name"));
        const SerializationNode& globalParams = node.getChildNode("GlobalParameters");
        for (auto& parameter : globalParams.getChildren())
            force->addGlobalParameter(parameter.getStringProperty("name"), parameter.getDoubleProperty("default"));
        if (version > 2) {
            const SerializationNode& energyDerivs = node.getChildNode("EnergyParameterDerivatives");
            for (auto& parameter : energyDerivs.getChildren())
                force->addEnergyParameterDerivative(parameter.getStringProperty("name"));
        }
        const SerializationNode& bonds = node.getChildNode("Bonds");
        vector<double> params(force->getNumPerBondParameters());
        for (auto& bond : bonds.getChildren()) {
            for (int j = 0; j < (int) params.size(); j++) {
                stringstream key;
                key << "param";
                key << j+1;
                params[j] = bond.getDoubleProperty(key.str());
            }
            force->addBond(bond.getIntProperty("p1"), bond.getIntProperty("p2"), params);
        }
        return force;
    }
    catch (...) {
        if (force != NULL)
            delete force;
        throw;
    }
}
void* CustomBondForceProxy::deserialize(const SerializationNode& node) const {
    if (node.getIntProperty("version") != 1)
        throw OpenMMException("Unsupported version number");
    CustomBondForce* force = NULL;
    try {
        CustomBondForce* force = new CustomBondForce(node.getStringProperty("energy"));
        const SerializationNode& perBondParams = node.getChildNode("PerBondParameters");
        for (int i = 0; i < (int) perBondParams.getChildren().size(); i++) {
            const SerializationNode& parameter = perBondParams.getChildren()[i];
            force->addPerBondParameter(parameter.getStringProperty("name"));
        }
        const SerializationNode& globalParams = node.getChildNode("GlobalParameters");
        for (int i = 0; i < (int) globalParams.getChildren().size(); i++) {
            const SerializationNode& parameter = globalParams.getChildren()[i];
            force->addGlobalParameter(parameter.getStringProperty("name"), parameter.getDoubleProperty("default"));
        }
        const SerializationNode& bonds = node.getChildNode("Bonds");
        vector<double> params(force->getNumPerBondParameters());
        for (int i = 0; i < (int) bonds.getChildren().size(); i++) {
            const SerializationNode& bond = bonds.getChildren()[i];
            for (int j = 0; j < (int) params.size(); j++) {
                stringstream key;
                key << "param";
                key << j+1;
                params[j] = bond.getDoubleProperty(key.str());
            }
            force->addBond(bond.getIntProperty("p1"), bond.getIntProperty("p2"), params);
        }
        return force;
    }
    catch (...) {
        if (force != NULL)
            delete force;
        throw;
    }
}