opendrift.readers.basereader.unstructured
Module Contents
Classes
An unstructured reader. Data is gridded irregularily. |
- 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).
Initialize self. See help(type(self)) for accurate signature.
- PARALLEL_WORKERS
- boundary
- x
- y
- node_variables
- nodes_idx
- xc
- yc
- face_variables
- faces_idx
- abstract get_variables(self, 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_(self, 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_(self, 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.