Source code for toughio.meshmaker._cylindric_grid

import numpy

from .._mesh import Mesh
from ._structured_grid import structured_grid

__all__ = [
    "cylindric_grid",
]


class CylindricMesh(Mesh):
    def __init__(self, dr, dz, *args, **kwargs):
        """
        Cylindric mesh.

        This class is only intended to be used as output of :func:`cylindric_grid`.

        Note
        ----
        This class inherits from :class:`toughio.Mesh` but overwrites how face areas
        and volumes are calculated.

        """
        super(CylindricMesh, self).__init__(*args, **kwargs)
        self._dr = dr
        self._dz = dz

    def _get_areas_heights(self):
        """Return areas and heights of cells in mesh."""
        nr, nz = len(self._dr), len(self._dz)
        r2 = numpy.cumsum(self._dr) ** 2
        areas = (
            numpy.tile(numpy.concatenate(([r2[0]], r2[1:] - r2[:-1])), nz) * numpy.pi
        )
        heights = numpy.tile(self._dz[:, None], nr).ravel()

        return areas, heights

    @property
    def face_areas(self):
        """Areas of faces in mesh."""
        nz = len(self._dz)
        dr = numpy.concatenate(([0.0], self._dr))
        perimeters_in = numpy.tile(numpy.cumsum(dr[:-1]), nz) * 2.0 * numpy.pi
        perimeters_out = numpy.tile(numpy.cumsum(dr[1:]), nz) * 2.0 * numpy.pi
        areas, heights = self._get_areas_heights()
        sections = numpy.tile(self._dr, nz) * heights

        return numpy.transpose(
            [
                areas,
                areas,
                sections,
                perimeters_out * heights,
                sections,
                perimeters_in * heights,
            ]
        )

    @property
    def volumes(self):
        """Volumes of cell in mesh."""
        areas, heights = self._get_areas_heights()
        return areas * heights


[docs]def cylindric_grid(dr, dz, origin_z=None, material="dfalt"): """ Generate a cylindric mesh as a radial XZ structured grid. Parameters ---------- dr : array_like Grid spacing along X axis. dz : array_like Grid spacing along Z axis. origin_z : scalar, optional, default None Depth of origin point. material : str, optional, default 'dfalt' Default material name. Returns ------- toughio.Mesh Output cylindric mesh. """ if not isinstance(dr, (list, tuple, numpy.ndarray)): raise TypeError() if not isinstance(dz, (list, tuple, numpy.ndarray)): raise TypeError() if not (origin_z is None or isinstance(origin_z, (int, float))): raise TypeError() if not isinstance(material, str): raise TypeError() dr = numpy.asarray(dr) dz = numpy.asarray(dz) if not (dr > 0.0).all(): raise ValueError() if not (dz > 0.0).all(): raise ValueError() origin_z = origin_z if origin_z is not None else -dz.sum() mesh = structured_grid( dr, [1.0], dz, origin=[0.0, -0.5, origin_z], material=material ) return CylindricMesh( dr, dz, points=mesh.points, cells=mesh.cells, point_data=mesh.point_data, cell_data=mesh.cell_data, field_data=mesh.field_data, )