Skip to content

Commit

Permalink
Fixes workshop (#58)
Browse files Browse the repository at this point in the history
* Bump patch version number
* Read all scalar data
* Deal with missing data in dielectric tensor
  • Loading branch information
martin-schlipf committed Sep 26, 2022
1 parent 2da417a commit 0bcf41a
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 41 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "py4vasp"
version = "0.5.0"
version = "0.5.1"
description = "Tool for assisting with the analysis and setup of VASP calculations."
authors = [
"VASP Software GmbH <py4vasp@vasp.at>",
Expand Down
2 changes: 1 addition & 1 deletion src/py4vasp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
from py4vasp._third_party.interactive import set_error_handling
from py4vasp._third_party.graph import plot

__version__ = "0.5.0"
__version__ = "0.5.1"
set_error_handling("Minimal")
12 changes: 10 additions & 2 deletions src/py4vasp/data/dielectric_tensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def to_dict(self):
"""
return {
"clamped_ion": self._raw_data.electron[:],
"relaxed_ion": self._raw_data.electron[:] + self._raw_data.ion[:],
"relaxed_ion": self._read_relaxed_ion(),
"independent_particle": self._read_independent_particle(),
"method": _convert.text_to_string(self._raw_data.method),
}
Expand All @@ -35,14 +35,22 @@ def __str__(self):
{_dielectric_tensor_string(data["relaxed_ion"], "relaxed-ion")}
""".strip()

def _read_relaxed_ion(self):
if self._raw_data.ion.is_none():
return None
else:
return self._raw_data.electron[:] + self._raw_data.ion[:]

def _read_independent_particle(self):
if self._raw_data.independent_particle is None:
if self._raw_data.independent_particle.is_none():
return None
else:
return self._raw_data.independent_particle[:]


def _dielectric_tensor_string(tensor, label):
if tensor is None:
return ""
row_to_string = lambda row: 6 * " " + " ".join(f"{x:12.6f}" for x in row)
rows = (row_to_string(row) for row in tensor)
return f"{label:^55}".rstrip() + "\n" + "\n".join(rows)
Expand Down
8 changes: 4 additions & 4 deletions src/py4vasp/raw/_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,13 @@ def _get_dataset(self, h5f, key):

def _parse_dataset(self, dataset):
result = raw.VaspData(dataset)
if _scalar_string(result):
result = result.data
if _is_scalar(result):
result = result[()]
return result


def _scalar_string(data):
return not data.is_none() and data.ndim == 0 and data.dtype.type == np.str_
def _is_scalar(data):
return not data.is_none() and data.ndim == 0


def _error_message(quantity, source):
Expand Down
22 changes: 13 additions & 9 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ def dielectric_function(selection):

@staticmethod
def dielectric_tensor(selection):
return _dielectric_tensor(selection)
method, with_ion = selection.split()
with_ion = with_ion == "with_ion"
return _dielectric_tensor(method, with_ion)

@staticmethod
def dos(selection):
Expand Down Expand Up @@ -243,13 +245,15 @@ def _ion_dielectric_function():
)


def _dielectric_tensor(method):
def _dielectric_tensor(method, with_ion):
shape = (3, axes, axes)
data = np.arange(np.prod(shape)).reshape(shape)
ion = raw.VaspData(data[1] if with_ion else None)
independent_particle = raw.VaspData(data[2] if method in ("dft", "rpa") else None)
return raw.DielectricTensor(
electron=data[0],
ion=data[1],
independent_particle=data[2] if method in ("dft", "rpa") else None,
electron=raw.VaspData(data[0]),
ion=ion,
independent_particle=independent_particle,
method=method.encode(),
)

Expand Down Expand Up @@ -373,7 +377,7 @@ def _single_band(projectors):
eigenvalues = np.array([np.linspace([0], [1], len(kpoints.coordinates))])
return raw.Band(
dispersion=raw.Dispersion(kpoints, eigenvalues),
fermi_energy=_make_data(0.0),
fermi_energy=0.0,
occupations=np.array([np.linspace([1], [0], len(kpoints.coordinates))]),
projectors=_Sr2TiO4_projectors(use_orbitals=False),
)
Expand All @@ -386,7 +390,7 @@ def _multiple_bands(projectors):
use_orbitals = projectors == "with_projectors"
raw_band = raw.Band(
dispersion=raw.Dispersion(kpoints, eigenvalues),
fermi_energy=_make_data(0.5),
fermi_energy=0.5,
occupations=np.arange(np.prod(shape)).reshape(shape),
projectors=_Sr2TiO4_projectors(use_orbitals),
)
Expand All @@ -403,7 +407,7 @@ def _line_band(labels):
eigenvalues = np.arange(np.prod(shape)).reshape(shape)
return raw.Band(
dispersion=raw.Dispersion(kpoints, eigenvalues),
fermi_energy=_make_data(0.5),
fermi_energy=0.5,
occupations=np.arange(np.prod(shape)).reshape(shape),
projectors=_Sr2TiO4_projectors(use_orbitals=False),
)
Expand All @@ -417,7 +421,7 @@ def _spin_polarized_bands(projectors):
use_orbitals = projectors in ["with_projectors", "excess_orbitals"]
raw_band = raw.Band(
dispersion=raw.Dispersion(kpoints, eigenvalues),
fermi_energy=_make_data(0.0),
fermi_energy=0.0,
occupations=np.arange(np.prod(shape)).reshape(shape),
projectors=_Fe3O4_projectors(use_orbitals),
)
Expand Down
58 changes: 34 additions & 24 deletions tests/data/test_dielectric_tensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,40 @@

@pytest.fixture
def dft_tensor(raw_data):
return make_reference(raw_data, "dft")
expected_description = "including local field effects in DFT"
return make_reference(raw_data, "dft with_ion", expected_description)


@pytest.fixture
def rpa_tensor(raw_data):
return make_reference(raw_data, "rpa")
expected_description = "including local field effects in RPA (Hartree)"
return make_reference(raw_data, "rpa without_ion", expected_description)


@pytest.fixture
def scf_tensor(raw_data):
return make_reference(raw_data, "scf")
expected_description = "including local field effects"
return make_reference(raw_data, "scf with_ion", expected_description)


@pytest.fixture
def nscf_tensor(raw_data):
return make_reference(raw_data, "nscf")
expected_description = "excluding local field effects"
return make_reference(raw_data, "nscf without_ion", expected_description)


def make_reference(raw_data, method):
def make_reference(raw_data, method, expected_description):
raw_tensor = raw_data.dielectric_tensor(method)
tensor = DielectricTensor.from_data(raw_tensor)
tensor.ref = types.SimpleNamespace()
tensor.ref.clamped_ion = raw_tensor.electron
tensor.ref.relaxed_ion = raw_tensor.ion + raw_tensor.electron
if raw_tensor.ion.is_none():
tensor.ref.relaxed_ion = None
else:
tensor.ref.relaxed_ion = raw_tensor.ion + raw_tensor.electron
tensor.ref.independent_particle = raw_tensor.independent_particle
tensor.ref.method = method
tensor.ref.method = method.split()[0]
tensor.ref.expected_description = expected_description
return tensor


Expand Down Expand Up @@ -64,45 +72,47 @@ def check_read_dielectric_tensor(dielectric_tensor, Assert):

def test_print_dft_tensor(dft_tensor, format_):
actual, _ = format_(dft_tensor)
expected_description = "including local field effects in DFT"
check_print_dielectric_tensor(actual, expected_description)
check_print_dielectric_tensor(actual, dft_tensor.ref)


def test_print_rpa_tensor(rpa_tensor, format_):
actual, _ = format_(rpa_tensor)
expected_description = "including local field effects in RPA (Hartree)"
check_print_dielectric_tensor(actual, expected_description)
check_print_dielectric_tensor(actual, rpa_tensor.ref)


def test_print_scf_tensor(scf_tensor, format_):
actual, _ = format_(scf_tensor)
expected_description = "including local field effects"
check_print_dielectric_tensor(actual, expected_description)
check_print_dielectric_tensor(actual, scf_tensor.ref)


def test_print_dft_tensor(nscf_tensor, format_):
actual, _ = format_(nscf_tensor)
expected_description = "excluding local field effects"
check_print_dielectric_tensor(actual, expected_description)
check_print_dielectric_tensor(actual, nscf_tensor.ref)


def check_print_dielectric_tensor(actual, expected_description):
reference = f"""
def check_print_dielectric_tensor(actual, reference):
if reference.relaxed_ion is None:
relaxed_ion = ""
else:
relaxed_ion = """\
relaxed-ion
9.000000 11.000000 13.000000
15.000000 17.000000 19.000000
21.000000 23.000000 25.000000
"""
expected = f"""
Macroscopic static dielectric tensor (dimensionless)
{expected_description}
{reference.expected_description}
------------------------------------------------------
clamped-ion
0.000000 1.000000 2.000000
3.000000 4.000000 5.000000
6.000000 7.000000 8.000000
relaxed-ion
9.000000 11.000000 13.000000
15.000000 17.000000 19.000000
21.000000 23.000000 25.000000
{relaxed_ion}
""".strip()
assert actual == {"text/plain": reference}
assert actual == {"text/plain": expected}


def test_factory_methods(raw_data, check_factory_methods):
data = raw_data.dielectric_tensor("dft")
data = raw_data.dielectric_tensor("dft with_ion")
check_factory_methods(DielectricTensor, data)

0 comments on commit 0bcf41a

Please sign in to comment.