# -*- coding: utf-8 -*-
"""
Created on 2020-06-16
@author: Vincent Michaud-Rioux
"""
import attr
from nanotools.base import Base
[docs]
@attr.s
class Restart(Base):
"""``Restart`` class.
The ``restart`` class gathers the paths of files containing previously calculated results,
which can be used for restart.
By default, the density is saved upon completing a ground state calculation. The ``densityPath``
field is then updated to point to the results. Any kind of restart will then automatically
import the density given in ``densityPath``. If the ground state density is not found in ``densityPath``
then the code ignores it and proceeds without restart.
If ``DMkPath`` or ``DMRPath`` is set, then the k-space or real space density matrix is saved
to the specified path. Next, a calculation can be restarted from either density matrix.
If the ground state density matrix is not found then the code ignores it and proceeds without restart.
Attention: if ``DMkPath`` or ``DMRPath`` is set, the ground state density is no longer saved in the output file.
If several attributes have valid restart data, then the precedence goes as follows: ``densityPath``,
``DMkPath``, ``DMRPath``.
Example::
from nanotools import Atoms, Cell, Kpoint, System, TotalEnergy
a = 2.818 # lattice constant (ang)
cell = Cell(avec=[[0.,a,a],[a,0.,a],[a,a,0.]], resolution=0.12)
fxyz = [[0.00,0.00,0.00],[0.25,0.25,0.25]]
atoms = Atoms(fractional_positions=fxyz, formula="GaAs")
sys = System(cell=cell, atoms=atoms)
sys.kpoint.set_grid([5,5,5])
calc = TotalEnergy(sys)
calc.solver.set_mpi_command(mpi="mpiexec -n 4")
calccpy = calc.copy()
# SCF
calc.solve()
# Restart from density (and save density automatically)
calc = calccpy.copy()
calc.solver.mix.maxit = 1
calc.solver.restart.densityPath = "nano_scf_out.h5"
calc.solve()
# Restart from density and save k-space density matrix
calc = calccpy.copy()
calc.solver.mix.maxit = 1
calc.solver.restart.densityPath = "nano_scf_out.h5"
calc.solver.restart.DMkPath = "nano_scf_out.h5"
calc.solve()
# Restart from k-space density matrix and save real space density matrix
calc = calccpy.copy()
calc.solver.mix.maxit = 1
calc.solver.restart.DMkPath = "nano_scf_out.h5"
calc.solver.restart.DMRPath = "nano_scf_out.h5"
calc.solve()
# Restart from real space density matrix
calc = calccpy.copy()
calc.solver.mix.maxit = 1
calc.solver.restart.DMRPath = "nano_scf_out.h5"
calc.solve()
Attributes:
densityPath (string):
Path to an HDF5 file. The group ``/density/groundstate`` will be read and used as an initial guess.
Examples::
restart.densityPath = "/path/to/hdf5/file"
DMkPath (string):
Path to an HDF5 file. The group ``/aomtrx/DMk``, containing the k-space density matrix, will be read and used as an initial guess.
Examples::
restart.DMkPath = "/path/to/hdf5/file"
DMRPath (string):
Path to an HDF5 file. The group ``/aomtrx/DMR``, containing the real space density matrix, will be read and used as an initial guess.
Examples::
restart.DMRPath = "/path/to/hdf5/file"
HkPath (string):
Path to an HDF5 file. The group ``/hamiltonian``, containing the \Gamma - point hamiltonian and orbital-overlap matrix.
Examples::
restart.HkPath = "/path/to/hdf5/file"
HRPath (string):
Path to an HDF5 file. The group ``/hamiltonian``, containing the real space hamiltonian and orbital-overlap matrix.
Examples::
restart.HRPath = "/path/to/hdf5/file"
ground_state_density_return (bool):
Save the ground state density to ``densityPath`` if True, and do not save otherwise.
partial_core_density_return (bool):
Save the partial core density to ``densityPath`` if True, and do not save otherwise.
neutral_atom_density_return (bool):
Save the neutral atom density to ``densityPath`` if True, and do not save otherwise.
potential_return (bool):
Save the potential to ``densityPath`` if True, and do not save otherwise.
"""
densityPath: str = attr.ib(
default="",
validator=attr.validators.instance_of(str),
)
DMkPath: str = attr.ib(
default="",
validator=attr.validators.instance_of(str),
)
DMRPath: str = attr.ib(
default="",
validator=attr.validators.instance_of(str),
)
HkPath: str = attr.ib(
default="",
validator=attr.validators.instance_of(str),
)
HRPath: str = attr.ib(
default="",
validator=attr.validators.instance_of(str),
)
ground_state_density_return: bool = attr.ib(
default=True,
validator=attr.validators.instance_of(bool),
)
partial_core_density_return: bool = attr.ib(
default=True,
validator=attr.validators.instance_of(bool),
)
neutral_atom_density_return: bool = attr.ib(
default=True,
validator=attr.validators.instance_of(bool),
)
potential_return: bool = attr.ib(
default=True,
validator=attr.validators.instance_of(bool),
)
def clear_paths(self):
self.densityPath = ""
self.DMkPath = ""
self.DMRPath = ""
def set_densityPath(self, path: str):
self.densityPath = path
def set_DMkPath(self, path: str):
self.DMkPath = path
def set_DMRPath(self, path: str):
self.DMRPath = path