diff --git a/docs/examples/voronoi_example.ipynb b/docs/examples/voronoi_example.ipynb new file mode 100644 index 000000000..e9ea77a4f --- /dev/null +++ b/docs/examples/voronoi_example.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we can see an example of using SphericalVoronoi from scipy:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Imports\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.spatial import SphericalVoronoi, geometric_slerp\n", + "from mpl_toolkits.mplot3d import proj3d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setting the data, here we use cartesian coordinates" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# set input data\n", + "data = np.array([[0, 0, 1], [0, 0, -1], [1, 0, 0],\n", + " [0, 1, 0], [0, -1, 0], [-1, 0, 0]])\n", + "\n", + "# Calculate the maximum distance from the origin to any generator point\n", + "radius = np.max(np.linalg.norm(data, axis=1))\n", + "\n", + "# Create a Spherical Voronoi diagram with the calculated radius\n", + "sv = SphericalVoronoi(data, radius)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Voronoi data is now in sv, and we can extract it and assign it somewhere:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Assign the nodes\n", + "node_x = sv.vertices[:, 0]\n", + "node_y = sv.vertices[:, 1]\n", + "node_z = sv.vertices[:, 2]\n", + "\n", + "# Assign the face centers from the orginal data\n", + "face_x = data[:, 0]\n", + "face_y = data[:, 1]\n", + "face_z = data[:, 2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to visualize this to make sure everything looks right we can do that:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sv.sort_vertices_of_regions()\n", + "vals = np.linspace(0, 1, 2000)\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111, projection='3d')\n", + "ax.scatter(data[:, 0], data[:, 1], data[:, 2], c='b')\n", + "ax.scatter(sv.vertices[:, 0], sv.vertices[:, 1], sv.vertices[:, 2], c='g')\n", + "\n", + "for region in sv.regions:\n", + " n = len(region)\n", + " for i in range(n):\n", + " start = sv.vertices[region][i]\n", + " end = sv.vertices[region][(i + 1) % n]\n", + " result = geometric_slerp(start, end, vals)\n", + " ax.plot(result[..., 0], result[..., 1], result[..., 2], c='k')\n", + "\n", + "fig.set_size_inches(4, 4)\n", + "plt.show()" + ] + }, + { + "attachments": { + "image-2.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image-2.png](attachment:image-2.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At first glance it might look like the centers are outside the sphere, but they are correct, the lines run along the edges of the sphere, the surface of the sphere extends to those points." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.1" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/uxarray/grid/grid.py b/uxarray/grid/grid.py index c90b97786..d4c5788af 100644 --- a/uxarray/grid/grid.py +++ b/uxarray/grid/grid.py @@ -12,6 +12,8 @@ Union, ) +from scipy.spatial import SphericalVoronoi, Delaunay + # reader and writer imports from uxarray.io._exodus import _read_exodus, _encode_exodus from uxarray.io._mpas import _read_mpas @@ -415,6 +417,38 @@ def from_face_vertices( return cls(grid_ds, source_grid_spec="Face Vertices") + @classmethod + def from_xyz_vertices(cls, + node_x: Union[list, np.ndarray], + node_y: Union[list, np.ndarray], + node_z: Union[list, np.ndarray], + method="delaunay"): + """Constructs a ``Grid`` from a set of unstructured Cartesian [x,y,z] + coordinates.""" + if method == "delaunay": + pass + elif method == "voronoi": + pass + else: + raise ValueError( + f"Invalid method. Expected one of [delaunay, voronoi], but received {method}" + ) + + @classmethod + def from_latlon_vertices(cls, + node_lon: Union[list, np.ndarray], + nodeL_lat: Union[list, np.ndarray], + method="delaunay"): + """Constructs a ``Grid`` from a pair of unstructured LatLon [lon, lat] + coordinates.""" + if method == "delaunay": + pass + elif method == "voronoi": + pass + else: + raise ValueError( + f"Invalid method. Expected one of [delaunay, voronoi], but received {method}" + def validate(self): """Validates the current ``Grid``, checking for Duplicate Nodes, Present Connectivity, and Non-Zero Face Areas. @@ -2027,7 +2061,107 @@ def get_faces_at_constant_latitude(self, lat, method="fast"): Faces that are invalid or missing (e.g., with a fill value) are excluded from the result. """ + edges = self.get_edges_at_constant_latitude(lat, method) faces = np.unique(self.edge_face_connectivity[edges].data.ravel()) return faces[faces != INT_FILL_VALUE] + + + def from_vertices(self, method="spherical_voronoi"): + """Create a grid and related information from just vertices, using + either Spherical Voronoi or Delaunay Triangulation. + + Parameters + ---------- + method : string, optional + Method used to construct a grid from only vertices + """ + + # Assign values for the construction + x = self._ds["Mesh2_node_x"] + y = self._ds["Mesh2_node_y"] + z = self._ds["Mesh2_node_z"] + + # Assign units for x, y, x + x_units = "degrees_east" + y_units = "degrees_north" + z_units = "elevation" + + verts = np.column_stack((x, y, z)) + + if verts.size == 0: + raise ValueError("No vertices provided") + + if method == "spherical_voronoi": + if verts.shape[0] < 4: + raise ValueError( + "At least 4 vertices needed for Spherical Voronoi") + + # Calculate the maximum distance from the origin to any generator point + radius = np.max(np.linalg.norm(verts, axis=1)) + + # Perform Spherical Voronoi Construction + grid = SphericalVoronoi(verts, radius) + # Assign the nodes + node_x = grid.vertices[:, 0] + node_y = grid.vertices[:, 1] + node_z = grid.vertices[:, 2] + + # Assign the face centers + face_x = verts[:, 0] + face_y = verts[:, 1] + face_z = verts[:, 2] + + # TODO: Currently errors out due to nMesh2_node already having a certain size / + # however when the Refactor is merged and we move this so you can call it when / + # open_grid is called, it won't have a nMesh2_node value at all, so this won't / + # occur + + # Assign the connectivity information + self._ds["Mesh2_face_nodes"] = ([ + "nMesh2_face", "nMaxMesh2_face_nodes" + ], grid.regions) + self._ds["Mesh2_node_x"] = xr.DataArray(data=node_x, + dims=["nMesh2_node"], + attrs={"units": x_units}) + self._ds["Mesh2_node_y"] = xr.DataArray(data=node_y, + dims=["nMesh2_node"], + attrs={"units": y_units}) + self._ds["Mesh2_node_z"] = xr.DataArray(data=node_z, + dims=["nMesh2_node"], + attrs={"units": z_units}) + + # TODO: Handle special cases near the antimeridian and poles if necessary + # (e.g., split Voronoi cells that cross the antimeridian) + + elif method == "delaunay_triangulation": + if verts.shape[0] < 3: + raise ValueError( + "At least 3 vertices needed for Delaunay Triangulation") + + # Perform Stereographic Projection and filter out points with NaN values (The South Pole) + projected_points = [] + for point in verts: + x, y, z = point + x_on_plane = x / (1 - z) + y_on_plane = y / (1 - z) + if not np.isnan(x_on_plane) and not np.isnan(y_on_plane): + projected_points.append([x_on_plane, y_on_plane]) + + # Perform Delaunay Triangulation on the projected points + tri = Delaunay(projected_points) + + # TODO: Fix the hole created at one of the poles + # Assign the connectivity information + face_nodes = [] + for simplex in tri.simplices: + face_nodes.append(simplex) + self._ds["Mesh2_face_nodes"] = ([ + "nMesh2_face", "nMaxMesh2_face_nodes" + ], face_nodes) + # TODO: Assign all Mesh2 Values. Once this is moved to its proper place it will need / + # to assign the x, y, z coordinates + + else: + raise ValueError("Invalid method") diff --git a/uxarray/io/_vertices.py b/uxarray/io/_vertices.py index 792ac9b81..64cbbfd99 100644 --- a/uxarray/io/_vertices.py +++ b/uxarray/io/_vertices.py @@ -1,6 +1,8 @@ import xarray as xr import numpy as np +from typing import Union + from uxarray.constants import INT_FILL_VALUE, INT_DTYPE @@ -99,3 +101,30 @@ def _read_face_vertices(face_vertices, latlon): ) return grid_ds + + +def _xyz_to_delaunay_grid(node_x: Union[list, np.ndarray], + node_y: Union[list, np.ndarray], + node_z: Union[list, np.ndarray]): + grid_ds = xr.Dataset() + + # populate Cartesian coordinates + grid_ds['Mesh2_node_cart_x'] = xr.DataArray(data=node_x) + grid_ds['Mesh2_node_cart_y'] = xr.DataArray(data=node_y) + grid_ds['Mesh2_node_cart_z'] = xr.DataArray(data=node_z) + + pass + + +def _latlon_to_delaunay_grid(node_lon: Union[list, np.ndarray], + node_lat: Union[list, np.ndarray]): + + grid_ds = xr.Dataset() + + # populate LatLon coordinates + grid_ds['Mesh2_node_x'] = xr.DataArray(data=node_lon) + grid_ds['Mesh2_node_y'] = xr.DataArray(data=node_lat) + + # populate Cartesiain coordinates + + pass