/usr/share/pyshared/ase/md/logger.py is in python-ase 3.6.0.2515-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | """Logging for molecular dynamics."""
import weakref
import sys
import ase.units as units
# ase.parallel imported in __init__
class MDLogger:
"""Class for logging molecular dynamics simulations.
Parameters:
dyn: The dynamics. Only a weak reference is kept.
atoms: The atoms.
logfile: File name or open file, "-" meaning standart output.
stress=False: Include stress in log.
peratom=False: Write energies per atom.
mode="a": How the file is opened if logfile is a filename.
"""
def __init__(self, dyn, atoms, logfile, header=True, stress=False,
peratom=False, mode="a"):
import ase.parallel
if ase.parallel.rank > 0:
logfile="/dev/null" # Only log on master
if hasattr(dyn, "get_time"):
self.dyn = weakref.proxy(dyn)
else:
self.dyn = None
self.atoms = atoms
self.natoms = atoms.get_number_of_atoms()
if logfile == "-":
self.logfile = sys.stdout
self.ownlogfile = False
elif hasattr(logfile, "write"):
self.logfile = logfile
self.ownlogfile = False
else:
self.logfile = open(logfile, mode)
self.ownlogfile = True
self.stress = stress
self.peratom = peratom
if self.dyn is not None:
self.hdr = "%-8s " % ("Time[ps]",)
self.fmt = "%-8.2f "
else:
self.hdr = ""
self.fmt = ""
if self.peratom:
self.hdr += "%12s %12s %12s %6s" % ("Etot/N[eV]", "Epot/N[eV]",
"Ekin/N[eV]", "T[K]")
self.fmt += "%12.4f %12.4f %12.4f %6.1f"
else:
self.hdr += "%12s %12s %12s %6s" % ("Etot[eV]", "Epot[eV]",
"Ekin[eV]", "T[K]")
# Choose a sensible number of decimals
if self.natoms <= 10:
digits = 4
elif self.natoms <= 100:
digits = 3
elif self.natoms <= 1000:
digits = 2
else:
digits = 1
self.fmt += 3*("%%12.%df " % (digits,)) + " %6.1f"
if self.stress:
self.hdr += " ---------------- stress [GPa] -----------------"
self.fmt += 6*" %10.3f"
self.fmt += "\n"
if header:
self.logfile.write(self.hdr+"\n")
def __del__(self):
self.close()
def close(self):
if self.ownlogfile:
self.logfile.close()
def __call__(self):
epot = self.atoms.get_potential_energy()
ekin = self.atoms.get_kinetic_energy()
temp = ekin / (1.5 * units.kB * self.natoms)
if self.peratom:
epot /= self.natoms
ekin /= self.natoms
if self.dyn is not None:
t = self.dyn.get_time() / (1000*units.fs)
dat = (t,)
else:
dat = ()
dat += (epot+ekin, epot, ekin, temp)
if self.stress:
dat += tuple(self.atoms.get_stress() / units.GPa)
self.logfile.write(self.fmt % dat)
self.logfile.flush()
|