opendrift.readers.basereader.unstructured
Attributes
Classes
An unstructured reader. Data is gridded irregularily. |
Module Contents
- opendrift.readers.basereader.unstructured.logger
- class opendrift.readers.basereader.unstructured.UnstructuredReader[source]
Bases:
opendrift.readers.basereader.variables.Variables
An unstructured reader. Data is gridded irregularily.
The initial type of grid that this class supports are triangular prisms. Unstructured in xy-coordinates, x and y is constant in z. z might be non-cartesian (e.g. sigma-levels).
- PARALLEL_WORKERS = -1
- boundary = None
- x = None
- y = None
- node_variables = None
- nodes_idx = None
- xc = None
- yc = None
- face_variables = None
- faces_idx = None
- abstract get_variables(variables, time=None, x=None, y=None, z=None)[source]
Obtain and return values of the requested variables at all positions (x, y, z) closest to given time.
Returns:
Dictionary with arrays of length len(time) with values at exact positions x, y and z.
- _get_variables_interpolated_(variables, profiles, profiles_depth, time, reader_x, reader_y, z)[source]
This method _must_ be implemented by every reader. Usually by subclassing one of the reader types (e.g.
structured.StructuredReader
).Arguments are in _native projection_ of reader.
- _build_boundary_polygon_(x, y)[source]
Build a polygon of the boundary of the mesh.
- Arguments:
- param x:
Array of node x position, lenght N
- param y:
Array of node y position, length N
- Returns:
A shapely.prepareped.prep shapely.Polygon.
The boundary of the mesh, ideally including holes in the mesh.
Algorithms:
Note
Try this alogrithm: https://stackoverflow.com/a/14109211/377927
Boundary edges (line between two nodes) are only referenced by a single triangle.
Find a starting edge segment: [v_start, v_next] (v is vertex or node)
Find another _unvisited_ edge segment [v_i, v_j] that has either v_i = v_next or v_j = v_next and add the one not equal to v_next to the polygon.
Reset v_next to the newly added point. Mark edge as visited.
Continue untill we reach v_start.
The polygon has a rotation, but this should not matter for our purpose of checking the bounds.
Note: In order to find holes in the polygon all points must be scanned.
Approximate using the convex hull:
An alternative simple approximation is to use the convex hull of the points, but this will miss points along the boundary which form a wedge in the boundary (as well as holes in the mesh).
Holes in the mesh will often be covered by the landmask anyway, so they will usually not be a problem.