"examples/hello/HelloEthane.cpp" did not exist on "b6f21610206511fb4a79a5759af0088f7e9b4cb2"
HelloArgon.cpp 2.5 KB
Newer Older
1
2
3
4
5
#include "OpenMM.h"
#include <cstdio>

using namespace OpenMM;

6
7
8
9
10
11
12
13
// forward declaration of subroutine defined later in this file.
void writePdb(const OpenMMContext& context);

void simulateArgon() 
{
    // Load any shared libraries containing GPU implementations
    Platform::loadPluginsFromDirectory(
        Platform::getDefaultPluginsDirectory());
14
15

    System system;
Michael Sherman's avatar
Michael Sherman committed
16
    NonbondedForce* nonbond = new NonbondedForce(); 
17
18
    system.addForce(nonbond);

19
20
21
22
    // Create three atoms
    std::vector<Vec3> initialPositions(3);
    for (int a = 0; a < 3; ++a) 
    {
23
        system.addParticle(39.95); // mass
24
25
        nonbond->addParticle(0.0, 0.3350, 0.001603); // charge, sigma, well depth
        initialPositions[a] = Vec3(0.5*a,0,0); // location
26
27
    }

Michael Sherman's avatar
Michael Sherman committed
28
    VerletIntegrator integrator(0.020); // step size in picoseconds
29

30
31
    // Let OpenMM Context choose best platform.
    OpenMMContext context(system, integrator);
32
33
    printf( "REMARK  Using OpenMM platform %s\n", 
        context.getPlatform().getName().c_str() );
34

35
36
    // Set the starting positions of the atoms. Velocities will be zero.
    context.setPositions(initialPositions);
37

38
    // Simulate
39
    while(context.getTime() < 500.0) { // picoseconds
40
41
42
43
44
45
46
47
48
49
50
51
        writePdb(context); // output coordinates
        // Run 100 steps at a time, for efficient use of OpenMM
        integrator.step(100);
    }
    writePdb(context); // output final coordinates
}

int main() 
{
    try {
        simulateArgon();
        return 0; // success!
52
    }
53
54
55
56
57
58
59
60
61
62
63
64
65
    // Catch and report usage and runtime errors detected by OpenMM and fail.
    catch(const std::exception& e) {
        printf("EXCEPTION: %s\n", e.what());
        return 1; // failure!
    }
}

// writePdb() subroutine for quick-and-dirty trajectory output.
void writePdb(const OpenMMContext& context) 
{
    // Request atomic positions from OpenMM
    const State state = context.getState(State::Positions);
    const std::vector<Vec3>& pos = state.getPositions();
66

67
68
69
70
71
72
73
74
75
76
77
78
79
80
    // write out in PDB format

    // Use PDB MODEL cards to number trajectory frames
    static int modelFrameNumber = 0; 
    modelFrameNumber++;
    printf("MODEL     %d\n", modelFrameNumber); // start of frame
    for (int a = 0; a < context.getSystem().getNumParticles(); ++a)
    {
        printf("ATOM  %5d AR    AR     1    ", a+1); // atom number
        printf("%8.3f%8.3f%8.3f  1.00  0.00          AR\n",
            // notice "*10" converts nanometers to Angstroms
            pos[a][0]*10, pos[a][1]*10, pos[a][2]*10);
    }
    printf("ENDMDL\n"); // end of frame
81
}