File: py_nve.py

package info (click to toggle)
lammps 20220106.git7586adbb6a%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 348,064 kB
  • sloc: cpp: 831,421; python: 24,896; xml: 14,949; f90: 10,845; ansic: 7,967; sh: 4,226; perl: 4,064; fortran: 2,424; makefile: 1,501; objc: 238; lisp: 163; csh: 16; awk: 14; tcl: 6
file content (104 lines) | stat: -rw-r--r-- 3,156 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from __future__ import print_function
from lammps import lammps

class LAMMPSFix(object):
    def __init__(self, ptr, group_name="all"):
        self.lmp = lammps(ptr=ptr)
        self.group_name = group_name

class LAMMPSFixMove(LAMMPSFix):
    def __init__(self, ptr, group_name="all"):
        super(LAMMPSFixMove, self).__init__(ptr, group_name)

    def init(self):
        pass

    def initial_integrate(self, vflag):
        pass

    def final_integrate(self):
        pass

    def initial_integrate_respa(self, vflag, ilevel, iloop):
        pass

    def final_integrate_respa(self, ilevel, iloop):
        pass

    def reset_dt(self):
        pass


class NVE(LAMMPSFixMove):
    """ Python implementation of fix/nve """
    def __init__(self, ptr, group_name="all"):
        super(NVE, self).__init__(ptr)
        assert(self.group_name == "all")
        self._step_respa = None

    def init(self):
        dt = self.lmp.extract_global("dt")
        ftm2v = self.lmp.extract_global("ftm2v")
        self.ntypes = self.lmp.extract_global("ntypes")
        self.dtv = dt
        self.dtf = 0.5 * dt * ftm2v

    @property
    def step_respa(self):
        if not self._step_respa:
            self._step_respa = self.lmp.extract_global("respa_dt")
        return self._step_respa

    def initial_integrate(self, vflag):
        nlocal = self.lmp.extract_global("nlocal")
        mass = self.lmp.extract_atom("mass")
        atype = self.lmp.extract_atom("type")
        x = self.lmp.extract_atom("x")
        v = self.lmp.extract_atom("v")
        f = self.lmp.extract_atom("f")

        for i in range(nlocal):
            dtfm = self.dtf / mass[int(atype[i])]
            v[i][0] += dtfm * f[i][0]
            v[i][1] += dtfm * f[i][1]
            v[i][2] += dtfm * f[i][2]
            x[i][0] += self.dtv * v[i][0]
            x[i][1] += self.dtv * v[i][1]
            x[i][2] += self.dtv * v[i][2]

    def final_integrate(self):
        nlocal = self.lmp.extract_global("nlocal")
        mass = self.lmp.extract_atom("mass")
        atype = self.lmp.extract_atom("type")
        v = self.lmp.extract_atom("v")
        f = self.lmp.extract_atom("f")

        for i in range(nlocal):
            dtfm = self.dtf / mass[int(atype[i])]
            v[i][0] += dtfm * f[i][0]
            v[i][1] += dtfm * f[i][1]
            v[i][2] += dtfm * f[i][2]

    def initial_integrate_respa(self, vflag, ilevel, iloop):
        ftm2v = self.lmp.extract_global("ftm2v")
        self.dtv = self.step_respa[ilevel]
        self.dtf = 0.5 * self.step_respa[ilevel] * ftm2v

        # innermost level - NVE update of v and x
        # all other levels - NVE update of v

        if ilevel == 0:
            self.initial_integrate(vflag)
        else:
            self.final_integrate()

    def final_integrate_respa(self, ilevel, iloop):
        ftm2v = self.lmp.extract_global("ftm2v")
        self.dtf = 0.5 * self.step_respa[ilevel] * ftm2v
        self.final_integrate()

    def reset_dt(self):
        dt = self.lmp.extract_global("dt")
        ftm2v = self.lmp.extract_global("ftm2v")
        self.dtv = dt;
        self.dtf = 0.5 * dt * ftm2v;