Source code for sisl.io.siesta.transiesta_grid

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
import numpy as np

from .sile import SileCDFSiesta
from ..sile import add_sile, sile_fh_open, sile_raise_write

from sisl._internal import set_module
from sisl import Grid
from .siesta_grid import gridncSileSiesta
from sisl.unit.siesta import unit_convert


__all__ = ['tsvncSileSiesta']


_eV2Ry = unit_convert('eV', 'Ry')
_Ry2eV = 1. / _eV2Ry


@set_module("sisl.io.siesta")
class tsvncSileSiesta(gridncSileSiesta):
    """ TranSiesta potential input Grid file object

    This potential input file is mainly intended for the Hartree solution
    which complements N-electrode calculations in TranSiesta.

    See Also
    --------
    Grid.topyamg : intrinsic grid conversion to the Poisson equation
    """

[docs] def read_grid(self, *args, **kwargs): """ Reads the TranSiesta potential input grid """ sc = self.read_supercell().swapaxes(0, 2) # Create the grid na = len(self._dimension('a')) nb = len(self._dimension('b')) nc = len(self._dimension('c')) v = self._variable('V') # Create the grid, Siesta uses periodic, always grid = Grid([nc, nb, na], bc=Grid.PERIODIC, sc=sc, dtype=v.dtype) grid.grid[:, :, :] = v[:, :, :] * _Ry2eV # Read the grid, we want the z-axis to be the fastest # looping direction, hence x,y,z == 0,1,2 return grid.swapaxes(0, 2)
[docs] def write_grid(self, grid): """ Write the Poisson solution to the TSV.nc file """ sile_raise_write(self) self.write_supercell(grid.sc) self._crt_dim(self, 'one', 1) self._crt_dim(self, 'a', grid.shape[0]) self._crt_dim(self, 'b', grid.shape[1]) self._crt_dim(self, 'c', grid.shape[2]) vmin = self._crt_var(self, 'Vmin', 'f8', ('one',)) vmin.info = 'Minimum value in the Poisson solution (for TranSiesta interpolation)' vmin.unit = 'Ry' vmax = self._crt_var(self, 'Vmax', 'f8', ('one',)) vmax.info = 'Maximum value in the Poisson solution (for TranSiesta interpolation)' vmax.unit = 'Ry' v = self._crt_var(self, 'V', grid.dtype, ('c', 'b', 'a')) v.info = 'Poisson solution with custom boundary conditions' v.unit = 'Ry' vmin[:] = grid.grid.min() * _eV2Ry vmax[:] = grid.grid.max() * _eV2Ry v[:, :, :] = np.swapaxes(grid.grid, 0, 2) * _eV2Ry
add_sile('TSV.nc', tsvncSileSiesta)