1818from ase .md .velocitydistribution import MaxwellBoltzmannDistribution
1919from ase .md .langevin import Langevin
2020from ase .md .npt import NPT
21+ from ase .md import MDLogger
2122from asimtools .calculators import load_calc
2223from asimtools .utils import (
2324 get_atoms ,
@@ -31,6 +32,9 @@ def langevin_nvt(
3132 traj_file : str = None ,
3233 friction : float = 1e-2 ,
3334 timestep : float = 1 * fs ,
35+ properties : Optional [Sequence ] = ('energy' , 'forces' , 'stress' ),
36+ log_interval : int = 1 ,
37+ traj_interval : Optional [int ] = 1 ,
3438):
3539 """Does Langevin dynamics
3640
@@ -64,7 +68,19 @@ def langevin_nvt(
6468 mode = 'w' ,
6569 properties = ['energy' , 'forces' ]
6670 )
67- dyn .attach (traj .write )
71+ dyn .attach (traj .write , interval = traj_interval )
72+ stress = False
73+ if 'stress' in properties :
74+ stress = True
75+ dyn .attach (MDLogger (
76+ dyn ,
77+ atoms ,
78+ 'md.log' ,
79+ header = True ,
80+ stress = stress ,
81+ peratom = True ,
82+ mode = "a"
83+ ), interval = log_interval )
6884 dyn .run (nsteps )
6985 return atoms , traj
7086
@@ -78,6 +94,8 @@ def npt(
7894 ttime : float = 25 * fs ,
7995 pfactor : Optional [float ] = None , # (75*fs)**2 * 14*GPa, #Replace 14 with bulk modulus of material
8096 properties : Optional [Sequence ] = ('energy' , 'forces' , 'stress' ),
97+ log_interval : int = 1 ,
98+ traj_interval : Optional [int ] = 1 ,
8199):
82100 """Does NPT dynamics
83101
@@ -116,7 +134,20 @@ def npt(
116134 mode = 'w' ,
117135 properties = properties ,
118136 )
119- dyn .attach (traj .write )
137+ dyn .attach (traj .write , interval = traj_interval )
138+
139+ stress = False
140+ if 'stress' in properties :
141+ stress = True
142+ dyn .attach (MDLogger (
143+ dyn ,
144+ atoms ,
145+ 'md.log' ,
146+ header = True ,
147+ stress = stress ,
148+ peratom = True ,
149+ mode = "a"
150+ ), interval = log_interval )
120151 dyn .run (nsteps )
121152 traj = Trajectory (traj_file , 'r' )
122153 return atoms , traj
@@ -176,6 +207,9 @@ def ase_md(
176207 plot : Optional [bool ] = True ,
177208 time_unit : Optional [str ] = 'ase' ,
178209 plot_args : Optional [dict ] = None ,
210+ properties : Optional [Sequence ] = ('energy' , 'forces' , 'stress' ),
211+ log_interval : Optional [int ] = 1 ,
212+ traj_interval : Optional [int ] = 1 ,
179213) -> Dict :
180214 """Runs ASE MD simulations. This is only recommended for small systems and
181215 for testing. For larger systems, use LAMMPS or more purpose-built code
@@ -209,7 +243,7 @@ def ase_md(
209243
210244 calc = load_calc (** calc_spec )
211245 atoms = get_atoms (** image )
212- atoms .set_calculator ( calc )
246+ atoms .calc = calc
213247
214248 if time_unit == 'fs' :
215249 timestep *= fs
@@ -224,6 +258,8 @@ def ase_md(
224258 traj_file = 'output.traj' ,
225259 timestep = timestep ,
226260 friction = friction ,
261+ log_interval = log_interval ,
262+ traj_interval = traj_interval ,
227263 )
228264 elif dynamics == 'npt' :
229265 atoms , _ = npt (
@@ -235,6 +271,9 @@ def ase_md(
235271 pfactor = pfactor ,
236272 externalstress = externalstress ,
237273 ttime = ttime ,
274+ properties = properties ,
275+ log_interval = log_interval ,
276+ traj_interval = traj_interval ,
238277 )
239278 elif dynamics == 'nvt' :
240279 atoms , _ = npt (
@@ -245,7 +284,9 @@ def ase_md(
245284 timestep = timestep ,
246285 pfactor = None ,
247286 ttime = ttime ,
248- properties = ['energy' , 'forces' ],
287+ properties = properties ,
288+ log_interval = log_interval ,
289+ traj_interval = traj_interval ,
249290 )
250291
251292
0 commit comments