Source code for pyiron_atomistics.gpaw.gpaw
# coding: utf-8
# Copyright (c) Max-Planck-Institut für Eisenforschung GmbH - Computational Materials Design (CM) Department
# Distributed under the terms of "New BSD License", see the LICENSE file.
from pyiron_base import GenericParameters
from pyiron_snippets.import_alarm import ImportAlarm
from pyiron_atomistics.dft.job.generic import GenericDFTJob
from pyiron_atomistics.gpaw.pyiron_ase import AseJob
__author__ = "Jan Janssen"
__copyright__ = (
"Copyright 2021, Max-Planck-Institut für Eisenforschung GmbH - "
"Computational Materials Design (CM) Department"
)
__version__ = "1.0"
__maintainer__ = "Jan Janssen"
__email__ = "janssen@mpie.de"
__status__ = "development"
__date__ = "Sep 1, 2018"
with ImportAlarm(
"Gpaw relies on the gpaw module but this is unavailable. Please ensure your python environment contains gpaw, "
"e.g. by running `conda install -c conda-forge gpaw`."
) as import_alarm:
from gpaw import GPAW as GPAWcode
from gpaw import PW, MethfesselPaxton
[docs]
class Gpaw(AseJob, GenericDFTJob):
[docs]
@import_alarm
def __init__(self, project, job_name):
super(Gpaw, self).__init__(project, job_name)
self.input = GpawInput()
@property
def plane_wave_cutoff(self):
return self.input["encut"]
@plane_wave_cutoff.setter
def plane_wave_cutoff(self, val):
self.input["encut"] = val
def get_kpoints(self):
return self.input["kpoints"]
def _set_kpoints(
self,
mesh=None,
scheme="MP",
center_shift=None,
symmetry_reduction=True,
manual_kpoints=None,
weights=None,
reciprocal=True,
n_path=None,
path_name=None,
):
if scheme != "MP":
raise ValueError("Currently only MP is supported in the pyiron wrapper.")
if center_shift is not None:
raise ValueError("centershift is not implemented in the pyiron wrapper.")
if not symmetry_reduction:
raise ValueError(
"symmetry_reduction is not implemented in the pyiron wrapper."
)
if manual_kpoints is not None:
raise ValueError(
"manual_kpoints are not implemented in the pyiron wrapper."
)
if weights is not None:
raise ValueError("weights are not implemented in the pyiron wrapper.")
if not reciprocal:
raise ValueError("reciprocal is not implemented in the pyiron wrapper.")
if n_path is not None:
raise ValueError("n_path is not implemented in the pyiron wrapper.")
if path_name is not None:
raise ValueError("path_name is not implemented in the pyiron wrapper.")
self.input["kpoints"] = mesh
def set_calculator(self):
kpoints = self.input["kpoints"]
if isinstance(kpoints, str):
kpoints = self.input["kpoints"].replace("[", "").replace("]", "").split()
self._create_working_directory()
calc = GPAWcode(
mode=PW(float(self.input["encut"])),
xc=self.input["potential"],
occupations=MethfesselPaxton(width=float(self.input["sigma"])),
kpts=kpoints,
txt=self.working_directory + "/" + self.job_name + ".txt",
)
self.structure.calc = calc
[docs]
def to_hdf(self, hdf=None, group_name=None):
"""
Store the ExampleJob object in the HDF5 File
Args:
hdf (ProjectHDFio): HDF5 group object - optional
group_name (str): HDF5 subgroup name - optional
"""
super(Gpaw, self).to_hdf(hdf=hdf, group_name=group_name)
with self.project_hdf5.open("input") as hdf5_input:
self.input.to_hdf(hdf5_input)
[docs]
def from_hdf(self, hdf=None, group_name=None):
"""
Restore the ExampleJob object in the HDF5 File
Args:
hdf (ProjectHDFio): HDF5 group object - optional
group_name (str): HDF5 subgroup name - optional
"""
super(Gpaw, self).from_hdf(hdf=hdf, group_name=group_name)
with self.project_hdf5.open("input") as hdf5_input:
self.input.from_hdf(hdf5_input)