"""
Examples
--------
Create a grid of length 2 in the x direction, and 3 in the y direction.
>>> (x, y) = np.meshgrid ([1., 2., 4., 8.], [1., 2., 3.])
>>> g = Structured(y.flatten(), x.flatten(), [3, 4])
>>> g.get_point_count()
12
>>> g.get_cell_count()
6
>>> g.get_x()
array([ 1., 2., 4., 8., 1., 2., 4., 8., 1., 2., 4., 8.])
>>> g.get_y()
array([ 1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])
>>> g.get_shape()
array([3, 4])
Create a grid of length 2 in the i direction, and 3 in the j direction.
>>> (x, y) = np.meshgrid ([1., 2., 4., 8.], [1., 2., 3.])
>>> g = Structured (y.flatten (), x.flatten (), (3, 4), indexing='ij')
>>> g.get_x()
array([ 1., 2., 4., 8., 1., 2., 4., 8., 1., 2., 4., 8.])
>>> g.get_y()
array([ 1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])
>>> g.get_shape()
array([3, 4])
>>> g.get_offset()
array([ 4, 8, 12, 16, 20, 24])
>>> g.get_connectivity()
array([ 0, 1, 5, 4, 1, 2, 6, 5, 2, 3, 7, 6, 4, 5, 9, 8, 5,
6, 10, 9, 6, 7, 11, 10])
**Structured grid of points**
The same grid as the previous example but without any cells - just points.
>>> (x, y) = np.meshgrid ([1., 2., 4., 8.], [1., 2., 3.])
>>> g = StructuredPoints (y.flatten (), x.flatten (), (3, 4), indexing='ij', set_connectivity=True)
>>> g.get_x()
array([ 1., 2., 4., 8., 1., 2., 4., 8., 1., 2., 4., 8.])
>>> g.get_y()
array([ 1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])
>>> g.get_shape()
array([3, 4])
The number of points are the same, but the number of cells is now 0.
>>> g.get_point_count()
12
>>> g.get_cell_count()
0
The offset runs from 1 up to (and including) the number of points.
>>> all (g.get_offset ()==np.arange (1, g.get_point_count ()+1))
True
The connectivity runs from 0 to one less than the number of points.
>>> all (g.get_connectivity ()==np.arange (g.get_point_count ()))
True
**1D Grid of line segments**
>>> g = Structured([-1, 2, 3, 6], (4, ))
>>> g.get_x()
array([-1., 2., 3., 6.])
>>> g.get_y()
Traceback (most recent call last):
...
IndexError: Dimension out of bounds
>>> g.get_shape()
array([4])
>>> g.get_offset()
array([2, 4, 6])
>>> g.get_connectivity()
array([0, 1, 1, 2, 2, 3])
**3D Grid of cubes**
>>> x = [0, 1, 0, 1, 0, 1, 0, 1]
>>> y = [0, 0, 1, 1, 0, 0, 1, 1]
>>> z = [0, 0, 0, 0, 1, 1, 1, 1]
>>> g = Structured(z, y, x, (2, 2, 2))
>>> g.get_x()
array([ 0., 1., 0., 1., 0., 1., 0., 1.])
>>> g.get_y()
array([ 0., 0., 1., 1., 0., 0., 1., 1.])
>>> g.get_z()
array([ 0., 0., 0., 0., 1., 1., 1., 1.])
>>> g.get_connectivity()
array([0, 1, 3, 2, 4, 5, 7, 6])
>>> g.get_offset()
array([8])
>>> g = Structured(x, y, z, (2, 2, 2), ordering='ccw')
>>> g.get_connectivity()
array([1, 0, 2, 3, 5, 4, 6, 7])
"""
import warnings
import numpy as np
from pymt.grids.connectivity import get_connectivity
from pymt.grids.utils import get_default_coordinate_names, get_default_coordinate_units
from .unstructured import Unstructured, UnstructuredPoints
[docs]class StructuredPoints(UnstructuredPoints):
[docs] def __init__(self, *args, **kwds):
"""StructuredPoints(x0 [, x1 [, x2]], shape)"""
(coordinates, shape) = (args[:-1], args[-1])
if len(coordinates) < 1 or len(coordinates) > 3:
raise ValueError("number of dimensions must be between 1 and 3")
kwds.setdefault("set_connectivity", True)
indexing = kwds.pop("indexing", "xy")
if indexing != "ij":
warnings.warn("only ij indexing is supported", RuntimeWarning)
indexing = "ij"
coordinate_names = kwds.pop(
"coordinate_names", get_default_coordinate_names(len(coordinates))
)
coordinate_units = kwds.pop(
"units", get_default_coordinate_units(len(coordinates))
)
self._shape = np.array(shape, dtype=int)
kwds["units"] = coordinate_units
kwds["coordinate_names"] = coordinate_names
super().__init__(*coordinates, **kwds)
[docs] def get_shape(self, remove_singleton=False):
"""The shape of the structured grid with the given indexing.
Use remove_singleton=False to include singleton dimensions.
"""
shape = self._shape.copy()
if remove_singleton:
shape = shape[shape > 1]
return shape
[docs] def get_coordinate_units(self, i):
return super().get_coordinate_units(i)
[docs] def get_coordinate_name(self, i):
return super().get_coordinate_name(i)
[docs] def get_coordinate(self, i):
return super().get_coordinate(i)
[docs] def get_point_coordinates(self, *args, **kwds):
return super().get_point_coordinates(*args, **kwds)
[docs]class Structured(StructuredPoints, Unstructured):
"""Create a structured rectilinear grid.
Parameters
----------
x: ndarray
1-D array of x-coordinates of nodes.
y: ndarray
1-D array of y-coordinates of nodes.
shape: tuple of int
Shape of the grid.
indexing: {'xy', 'ij'}, optional
Cartesian('xy', default) or matrix('ij') indexing of output.
Returns
-------
Structured
An instance of a Structured grid.
"""
def __init__(self, *args, **kwds):
kwds.setdefault("indexing", "xy")
kwds.setdefault("set_connectivity", True)
ordering = kwds.pop("ordering", "cw")
if ordering not in ["cw", "ccw"]:
raise TypeError("ordering not understood (valid choices are 'cw' or 'ccw')")
shape = args[-1]
if kwds["set_connectivity"]:
(c, o) = get_connectivity(shape, ordering=ordering, with_offsets=True)
self._set_connectivity(c, o)
kwds["set_connectivity"] = False
super().__init__(*args, **kwds)
if __name__ == "__main__":
import doctest
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)