From 2cf01497735679177d204a093204f74dc6953363 Mon Sep 17 00:00:00 2001 From: rhugman Date: Thu, 27 Nov 2025 15:07:04 +0000 Subject: [PATCH 1/4] notebooks --- examples/basic_example.ipynb | 125 +++++++++++--- examples/comprehensive_demo.ipynb | 262 ++++++++++++++++++++++++++++++ 2 files changed, 364 insertions(+), 23 deletions(-) create mode 100644 examples/comprehensive_demo.ipynb diff --git a/examples/basic_example.ipynb b/examples/basic_example.ipynb index a74468c..2385cd7 100644 --- a/examples/basic_example.ipynb +++ b/examples/basic_example.ipynb @@ -27,7 +27,7 @@ "outputs": [], "source": [ "\n", - "domain = box(0, 0, 200, 150)\n", + "domain = box(0, 0, 200, 200)\n", "poly1 = box(50, 50, 75, 75)\n", "# generate sine wave curve for river\n", "river_coords = [(x, 75 + 20 * np.sin(0.1 * x)) for x in range(-10, 220, 10)]\n", @@ -36,60 +36,139 @@ "fault_line = LineString([(100, 0), (100, 150)])" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "c970674e", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, "id": "d52a10b8", "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71f205cc", + "metadata": {}, + "outputs": [], "source": [ "# 1. Setup Blueprint\n", + "background_lc=100\n", + "\n", "blueprint = ConceptualMesh(crs=\"EPSG:3857\")\n", - "blueprint.add_polygon(domain, zone_id=1, resolution=200)\n", - "blueprint.add_polygon(poly1, zone_id=2, resolution=5, z_order=1) \n", - "blueprint.add_point(well_point, point_id=\"Well-A\", resolution=100)\n", - "blueprint.add_line(fault_line, line_id=\"Fault-1\", resolution=5, \n", - " is_barrier=True)\n", - "blueprint.add_line(river_coords, line_id=\"riv-1\", resolution=3, \n", - " is_barrier=False)\n", + "blueprint.add_polygon(domain, zone_id=1)#,border_density=100,dist_max_in=background_lc)\n", + "blueprint.add_polygon(poly1, zone_id=2, \n", + " resolution=1, z_order=2,\n", + " dist_max_out=3* background_lc,\n", + " #dist_max_in=10\n", + " ) \n", + "blueprint.add_point(well_point, point_id=\"Well-A\", \n", + " resolution=2,\n", + " dist_max=300)\n", + "blueprint.add_line(fault_line, line_id=\"Fault-1\", \n", + " resolution=1, \n", + " is_barrier=True,\n", + " #straddle_width=1,\n", + " dist_max=3* 5)\n", + "blueprint.add_line(river_coords, line_id=\"riv-1\", \n", + " resolution=1, \n", + " is_barrier=False,\n", + " dist_max=3* 5,)\n", "\n", "clean_polys, clean_lines, clean_pts = blueprint.generate()\n", "\n", "# 2. Mesh Generation\n", - "mesher = MeshGenerator()\n", + "mesher = MeshGenerator(background_lc=background_lc, verbosity=10)\n", "mesher.generate(clean_polys, clean_lines, clean_pts)\n", "\n", "# 3. Voronoi Conversion\n", - "tessellator = VoronoiTessellator(mesher, blueprint)\n", + "tessellator = VoronoiTessellator(mesher, blueprint, clip_to_boundary=True)\n", "grid_gdf = tessellator.generate()\n", "\n", "# 4. Output\n", - "#grid_gdf.to_file(\"mf6_grid.shp\")" + "#grid_gdf.to_file(\"mf6_grid.shp\")\n", + "\n", + "\n", + "\n", + "fig,ax = plt.subplots(1,1,figsize=(12,12))\n", + "ax.set_aspect('equal')\n", + "# plot domain\n", + "ax.plot(*domain.exterior.xy,marker='.', color='black')\n", + "# plot poly1\n", + "#ax.plot(*poly1.exterior.xy, color='blue',lw=1,ls='--',label='Polygon 1')\n", + "ax.plot(*river_coords.xy, color='cyan',lw=1,ls='--',label='River')\n", + "ax.plot(*fault_line.xy, color='r',lw=1,ls='--',label='Fault')\n", + "ax.scatter(*well_point.xy, color='r',s=20,marker='x',label='Well')\n", + "grid_gdf.plot(ax=ax, alpha=0.5, edgecolor='k', linewidth=0.2)\n", + "\n", + "ax.legend(loc='upper left', fontsize=8)\n", + "#ax.set_ylim(50,80)\n", + "#ax.set_xlim(90, 110)\n", + "#\n", + "#ax.set_ylim(40,80)\n", + "#ax.set_xlim(40, 80)\n", + "\n", + "fig.tight_layout()" ] }, { "cell_type": "code", "execution_count": null, - "id": "71f205cc", + "id": "efd5f0a2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eda65ca1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ba0153a", "metadata": {}, "outputs": [], "source": [ - "fig,ax = plt.subplots(1,1,figsize=(15,15))\n", - "ax.set_aspect('equal')\n", - "# plot domain\n", - "ax.plot(*domain.exterior.xy,marker='.', color='black')\n", - "# plot poly1\n", - "ax.plot(*poly1.exterior.xy, color='blue',lw=1,ls='--')\n", - "ax.plot(*river_coords.xy, color='cyan',lw=1,ls='--')\n", - "ax.plot(*fault_line.xy, color='r',lw=1,ls='--')\n", - "ax.scatter(*well_point.xy, color='green',s=100,marker='x')\n", - "grid_gdf.plot(ax=ax)" + "from vorflow.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfd21be8", + "metadata": {}, + "outputs": [], + "source": [ + "gdf = calculate_mesh_quality(grid_gdf,calc_ortho=True)\n", + "gdf.plot(column='drift_ratio', cmap='viridis', legend=True, figsize=(10,8),vmax=.25)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f7361dd", + "metadata": {}, + "outputs": [], + "source": [ + "summarize_quality(gdf)" ] }, { "cell_type": "code", "execution_count": null, - "id": "b6c2a945", + "id": "870ec1be", "metadata": {}, "outputs": [], "source": [] diff --git a/examples/comprehensive_demo.ipynb b/examples/comprehensive_demo.ipynb new file mode 100644 index 0000000..571fbb8 --- /dev/null +++ b/examples/comprehensive_demo.ipynb @@ -0,0 +1,262 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6f3f8101", + "metadata": {}, + "source": [ + "# Vorflow Comprehensive Demo\n", + "\n", + "This notebook demonstrates the full capabilities of the `vorflow` package for generating unstructured Voronoi grids for MODFLOW 6.\n", + "\n", + "## Workflow\n", + "1. **Define Geometry**: Create Shapely objects (Polygons, Lines, Points).\n", + "2. **ConceptualMesh**: Register these objects with refinement parameters.\n", + "3. **MeshGenerator**: Generate a triangular mesh using Gmsh.\n", + "4. **VoronoiTessellator**: Convert the triangles to a Voronoi grid.\n", + "5. **Analysis**: Inspect mesh quality." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42e1c562", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import geopandas as gpd\n", + "from shapely.geometry import Point, Polygon, LineString, box\n", + "\n", + "from vorflow import ConceptualMesh, MeshGenerator, VoronoiTessellator\n", + "from vorflow.utils import calculate_mesh_quality, summarize_quality" + ] + }, + { + "cell_type": "markdown", + "id": "e2b415d8", + "metadata": {}, + "source": [ + "## 1. Define Geometry\n", + "We define a domain with a river, a fault, a well, and a refined zone." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20f14eb4", + "metadata": {}, + "outputs": [], + "source": [ + "# Domain: 200x200 box\n", + "domain = box(0, 0, 200, 200)\n", + "\n", + "# Refined Zone: A smaller box inside\n", + "zone_poly = box(50, 50, 75, 75)\n", + "\n", + "# River: A sine wave\n", + "river_coords = [(x, 75 + 20 * np.sin(0.1 * x)) for x in range(-10, 220, 10)]\n", + "river_line = LineString(river_coords)\n", + "\n", + "# Fault: A straight line (Barrier)\n", + "fault_line = LineString([(100, 0), (100, 150)])\n", + "\n", + "# Well: A point\n", + "well_point1 = Point(25, 25)\n", + "well_point2 = Point(60,60)" + ] + }, + { + "cell_type": "markdown", + "id": "890b48eb", + "metadata": {}, + "source": [ + "## 2. Build Conceptual Mesh\n", + "Here we configure the mesh refinement.\n", + "- **resolution**: Target edge length.\n", + "- **dist_min**: Distance from the feature where resolution is constant.\n", + "- **dist_max**: Distance where resolution decays to background size." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65365548", + "metadata": {}, + "outputs": [], + "source": [ + "cm = ConceptualMesh(crs=\"EPSG:3857\")\n", + "\n", + "# 1. Add Domain (Background)\n", + "cm.add_polygon(domain, zone_id=1, resolution=20.0)\n", + "\n", + "# 2. Add Refined Zone\n", + "# dist_max_out controls how fast the mesh grows outside this zone\n", + "cm.add_polygon(zone_poly,z_order=2, zone_id=2, resolution=3.0, dist_max_out=20.0)\n", + "\n", + "\n", + "# 3. Add River (Standard Line)\n", + "cm.add_line(river_line, line_id=\"river\", resolution=2.0, dist_max=15.0)\n", + "\n", + "# 4. Add Fault (Barrier)\n", + "# is_barrier=True ensures the mesh edges align with this line\n", + "cm.add_line(fault_line, line_id=\"fault\", resolution=2.0, is_barrier=True, dist_max=15.0)\n", + "\n", + "# 5. Add Well\n", + "cm.add_point(well_point1, point_id=\"well-a\", resolution=1.0, dist_max=50.0)\n", + "cm.add_point(well_point2, point_id=\"well-b\", resolution=1.0, dist_max=20.0)\n", + "\n", + "# Process inputs\n", + "clean_polys, clean_lines, clean_pts = cm.generate()" + ] + }, + { + "cell_type": "markdown", + "id": "38c1334b", + "metadata": {}, + "source": [ + "## 3. Generate Triangular Mesh\n", + "We use Gmsh to generate the underlying triangulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1d756f6", + "metadata": {}, + "outputs": [], + "source": [ + "mg = MeshGenerator(background_lc=20.0, verbosity=2)\n", + "mg.generate(clean_polys, clean_lines, clean_pts)" + ] + }, + { + "cell_type": "markdown", + "id": "7860463e", + "metadata": {}, + "source": [ + "## 4. Voronoi Tessellation\n", + "Convert the triangular mesh to a Voronoi grid, clipped to the domain." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a00aaba", + "metadata": {}, + "outputs": [], + "source": [ + "vt = VoronoiTessellator(mg, cm, clip_to_boundary=True)\n", + "grid = vt.generate()" + ] + }, + { + "cell_type": "markdown", + "id": "566b45a5", + "metadata": {}, + "source": [ + "## 5. Visualization\n", + "Plot the resulting grid along with the input features." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3db9769f", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(12, 12))\n", + "ax.set_aspect('equal')\n", + "\n", + "# Plot Grid\n", + "grid.plot(ax=ax, edgecolor='black', linewidth=0.5, alpha=0.5, color='white')\n", + "\n", + "# Plot Features\n", + "gpd.GeoSeries([domain]).boundary.plot(ax=ax, color='black', linewidth=2, label='Domain')\n", + "gpd.GeoSeries([zone_poly]).boundary.plot(ax=ax, color='blue', linestyle='--', label='Refined Zone')\n", + "gpd.GeoSeries([river_line]).plot(ax=ax, color='cyan', linewidth=2, label='River')\n", + "gpd.GeoSeries([fault_line]).plot(ax=ax, color='red', linewidth=2, linestyle='-', label='Fault (Barrier)')\n", + "gpd.GeoSeries([well_point1]).plot(ax=ax, color='red', marker='*', markersize=100, label='Well')\n", + "gpd.GeoSeries([well_point2]).plot(ax=ax, color='red', marker='*', markersize=100,)\n", + "\n", + "plt.legend()\n", + "plt.title(\"Voronoi Grid with Refinement\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e8657d18", + "metadata": {}, + "source": [ + "## 6. Quality Analysis\n", + "Check the geometric quality of the grid cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0de14088", + "metadata": {}, + "outputs": [], + "source": [ + "quality_gdf = calculate_mesh_quality(grid, calc_ortho=True)\n", + "summarize_quality(quality_gdf)\n", + "\n", + "# Plot Orthogonality Error\n", + "fig, ax = plt.subplots(figsize=(10, 8))\n", + "quality_gdf.plot(column='ortho_error', ax=ax, legend=True, cmap='Reds', vmin=0, vmax=10)\n", + "plt.title(\"Orthogonality Error (Degrees)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8172e0e5", + "metadata": {}, + "outputs": [], + "source": [ + "# Plot Orthogonality Error\n", + "fig, ax = plt.subplots(figsize=(10, 8))\n", + "quality_gdf.plot(column='drift_ratio', ax=ax, legend=True, cmap='Reds', vmin=0, vmax=.4)\n", + "plt.title(\"Drift Ratio\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "857040ca", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "vorflow", + "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.14.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 7631ad4cbba5e9fcc2a3c862100e2a5bb4a4325b Mon Sep 17 00:00:00 2001 From: rhugman Date: Thu, 27 Nov 2025 15:08:48 +0000 Subject: [PATCH 2/4] ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 04bfedb..883286e 100644 --- a/.gitignore +++ b/.gitignore @@ -214,3 +214,4 @@ __marimo__/ # .pyc +__pycache__ From d1611a6c2bb01a4eeb4ac0e081655d856b32f843 Mon Sep 17 00:00:00 2001 From: rhugman Date: Thu, 27 Nov 2025 15:10:08 +0000 Subject: [PATCH 3/4] cleanup --- .../__pycache__/__init__.cpython-314.pyc | Bin 346 -> 0 bytes .../__pycache__/blueprint.cpython-314.pyc | Bin 13189 -> 0 bytes src/vorflow/__pycache__/engine.cpython-314.pyc | Bin 24511 -> 0 bytes .../__pycache__/tessellator.cpython-314.pyc | Bin 12395 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/vorflow/__pycache__/__init__.cpython-314.pyc delete mode 100644 src/vorflow/__pycache__/blueprint.cpython-314.pyc delete mode 100644 src/vorflow/__pycache__/engine.cpython-314.pyc delete mode 100644 src/vorflow/__pycache__/tessellator.cpython-314.pyc diff --git a/src/vorflow/__pycache__/__init__.cpython-314.pyc b/src/vorflow/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 1427741647096f08cf93564612739df2d0cc8b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmYL^%}N6?6or#Xr`48rp$||*U6eutvlG-!7o9FtDC*KMt#KMilae2$JMnFN1D_=@ zE_CHi=nHr=DBi`rUrz2hB*R{}jiBDoj>H?x&v^K&t_@!k!p#K2Daa$t* diff --git a/src/vorflow/__pycache__/blueprint.cpython-314.pyc b/src/vorflow/__pycache__/blueprint.cpython-314.pyc deleted file mode 100644 index fd71c65e759b3587486912b938348b86aa157e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13189 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 YS7cX~?D{9-|Ft=0Hn<)Vj47%A1#I4eOaK4? diff --git a/src/vorflow/__pycache__/engine.cpython-314.pyc b/src/vorflow/__pycache__/engine.cpython-314.pyc deleted file mode 100644 index f6c56a1bc1906a2590f853437e8f9f8bbbfe41b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24511 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 HrndhJ@009{ diff --git a/src/vorflow/__pycache__/tessellator.cpython-314.pyc b/src/vorflow/__pycache__/tessellator.cpython-314.pyc deleted file mode 100644 index 34f48ac415435901b7d5780a85832e2cd8d77773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12395 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 H!p#34o*nCA From 5d0cf8e6c5b64657b5bb07a3e9459cc5853c40a3 Mon Sep 17 00:00:00 2001 From: rhugman Date: Thu, 27 Nov 2025 15:16:56 +0000 Subject: [PATCH 4/4] added hole to domain --- examples/comprehensive_demo.ipynb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/comprehensive_demo.ipynb b/examples/comprehensive_demo.ipynb index 571fbb8..8df3770 100644 --- a/examples/comprehensive_demo.ipynb +++ b/examples/comprehensive_demo.ipynb @@ -54,6 +54,10 @@ "source": [ "# Domain: 200x200 box\n", "domain = box(0, 0, 200, 200)\n", + "# add a hole to the domain\n", + "hole = box(80, 80, 120, 120)\n", + "domain = Polygon(domain.exterior.coords, [hole.exterior.coords])\n", + "\n", "\n", "# Refined Zone: A smaller box inside\n", "zone_poly = box(50, 50, 75, 75)\n",