# 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.gpaw.pyiron_ase import AseJob
from pyiron.dft.job.generic import GenericDFTJob
from pyiron_base import GenericParameters, Settings, ImportAlarm
__author__ = "Jan Janssen"
__copyright__ = (
"Copyright 2020, 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"
s = Settings()
try:
from gpaw import GPAW as GPAWcode, PW, MethfesselPaxton
import_alarm = ImportAlarm()
except ImportError:
import_alarm = ImportAlarm(
"Gpaw relies on the gpaw module but th is unavailable. Please ensure your python environment contains gpaw, "
"e.g. by running `conda install -c conda-forge gpaw`."
)
[docs]class Gpaw(AseJob, GenericDFTJob):
@import_alarm
def __init__(self, project, job_name):
super(Gpaw, self).__init__(project, job_name)
self.__name__ = "GpawJob"
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
[docs] 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
[docs] 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.set_calculator(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)