Coverage for gpaw/lcaotddft/logger.py: 100%
29 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
1from time import localtime
2from math import log as ln
4from gpaw.lcaotddft.observer import TDDFTObserver
5from gpaw.tddft.units import autime_to_attosec
8class TDDFTLogger(TDDFTObserver):
10 def __init__(self, paw, flush_interval=10, interval=1):
11 super().__init__(paw, interval)
12 assert flush_interval > 0
13 self.flush_interval = flush_interval
14 self.flush_next = paw.niter + self.flush_interval - 1
16 def _update(self, paw):
17 if paw.action == 'init':
18 self._write_header(paw)
19 self._write_data(paw)
21 def _write_header(self, paw):
22 paw.log('Logging time propagation')
23 paw.log('------------------------')
24 line = (' %4s %9s %11s %9s' %
25 ('iter', 'realtime', 'calctime', 'log(norm)'))
26 paw.log(line)
27 paw.log.flush()
29 def _write_data(self, paw):
30 density = paw.density
31 norm = density.finegd.integrate(density.rhot_g)
32 T = localtime()
33 paw.log('iter: %4d %02d:%02d:%02d %11.2f %9.1f' %
34 (paw.niter, T[3], T[4], T[5],
35 paw.time * autime_to_attosec,
36 ln(abs(norm) + 1e-16) / ln(10)))
37 if paw.niter > self.flush_next:
38 paw.log.flush()
39 while paw.niter > self.flush_next:
40 self.flush_next += self.flush_interval