{"id":86280,"name":"oceanmesh","description":"A Python package for the development of unstructured triangular meshes that are used in the simulation of coastal ocean circulation.","url":"https://github.com/chlnddev/oceanmesh","last_synced_at":"2026-04-05T21:30:26.801Z","repository":{"id":39607510,"uuid":"282773845","full_name":"CHLNDDEV/oceanmesh","owner":"CHLNDDEV","description":"Automatic coastal ocean mesh generation in Python and C++. https://github.com/sponsors/krober10nd","archived":false,"fork":false,"pushed_at":"2026-01-04T14:16:47.000Z","size":22884,"stargazers_count":68,"open_issues_count":8,"forks_count":22,"subscribers_count":12,"default_branch":"master","last_synced_at":"2026-01-29T02:13:19.816Z","etag":null,"topics":["coastal-modelling","mesh-generation","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CHLNDDEV.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-07-27T02:21:05.000Z","updated_at":"2026-01-21T02:29:09.000Z","dependencies_parsed_at":"2025-12-16T20:07:52.907Z","dependency_job_id":null,"html_url":"https://github.com/CHLNDDEV/oceanmesh","commit_stats":{"total_commits":39,"total_committers":8,"mean_commits":4.875,"dds":0.3846153846153846,"last_synced_commit":"a017890d3ad43d3b932cc1254bc08eda893e612f"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/CHLNDDEV/oceanmesh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CHLNDDEV%2Foceanmesh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CHLNDDEV%2Foceanmesh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CHLNDDEV%2Foceanmesh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CHLNDDEV%2Foceanmesh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CHLNDDEV","download_url":"https://codeload.github.com/CHLNDDEV/oceanmesh/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CHLNDDEV%2Foceanmesh/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29126040,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T14:05:12.718Z","status":"ssl_error","status_checked_at":"2026-02-05T14:03:53.078Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"CHLNDDEV","name":"oceanmesh","uuid":"40673418","kind":"user","description":"Developing automatic mesh generation technology for modeling the coastal ocean and floodplain","email":"","website":"https://keithroberts.site","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/40673418?u=d7f4e3975dcbd709ec98742c2603ecdf3a05f337\u0026v=4","repositories_count":2,"last_synced_at":"2023-03-05T10:35:09.091Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/CHLNDDEV","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-15T13:28:04.418Z","updated_at":"2023-03-05T10:35:09.105Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CHLNDDEV","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CHLNDDEV/repositories"},"packages":[{"id":12656568,"name":"github.com/CHLNDDEV/oceanmesh","ecosystem":"go","description":null,"homepage":null,"licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/CHLNDDEV/oceanmesh","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2026-01-04T14:16:15.000Z","latest_release_published_at":"2026-01-04T14:16:15.000Z","latest_release_number":"v1.0.0","last_synced_at":"2026-03-30T19:01:07.097Z","created_at":"2026-01-05T09:00:49.099Z","updated_at":"2026-03-30T19:01:07.098Z","registry_url":"https://pkg.go.dev/github.com/CHLNDDEV/oceanmesh","install_command":"go get github.com/CHLNDDEV/oceanmesh","documentation_url":"https://pkg.go.dev/github.com/CHLNDDEV/oceanmesh#section-documentation","metadata":{},"repo_metadata":{},"repo_metadata_updated_at":"2026-01-05T11:26:24.537Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.3540680314630436,"dependent_packages_count":5.017401994479231,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":5.185735012971137},"purl":"pkg:golang/github.com/%21c%21h%21l%21n%21d%21d%21e%21v/oceanmesh","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/CHLNDDEV/oceanmesh","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/CHLNDDEV/oceanmesh","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/CHLNDDEV/oceanmesh/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2FCHLNDDEV%2Foceanmesh/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2FCHLNDDEV%2Foceanmesh/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2FCHLNDDEV%2Foceanmesh/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2FCHLNDDEV%2Foceanmesh/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2FCHLNDDEV%2Foceanmesh/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2085511,"maintainers_count":0,"namespaces_count":779106,"keywords_count":0,"github":"golang","metadata":{"funded_packages_count":53416},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-03T06:05:35.160Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},{"id":12656567,"name":"github.com/chlnddev/oceanmesh","ecosystem":"go","description":null,"homepage":null,"licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/chlnddev/oceanmesh","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2026-01-04T14:16:15.000Z","latest_release_published_at":"2026-01-04T14:16:15.000Z","latest_release_number":"v1.0.0","last_synced_at":"2026-03-30T19:01:07.111Z","created_at":"2026-01-05T09:00:47.917Z","updated_at":"2026-03-30T19:01:07.111Z","registry_url":"https://pkg.go.dev/github.com/chlnddev/oceanmesh","install_command":"go get github.com/chlnddev/oceanmesh","documentation_url":"https://pkg.go.dev/github.com/chlnddev/oceanmesh#section-documentation","metadata":{},"repo_metadata":{},"repo_metadata_updated_at":"2026-01-05T11:26:24.521Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.3540680314630436,"dependent_packages_count":5.017401994479231,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":5.185735012971137},"purl":"pkg:golang/github.com/chlnddev/oceanmesh","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/chlnddev/oceanmesh","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/chlnddev/oceanmesh","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/chlnddev/oceanmesh/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fchlnddev%2Foceanmesh/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fchlnddev%2Foceanmesh/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fchlnddev%2Foceanmesh/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fchlnddev%2Foceanmesh/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fchlnddev%2Foceanmesh/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2085511,"maintainers_count":0,"namespaces_count":779106,"keywords_count":0,"github":"golang","metadata":{"funded_packages_count":53416},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-03T06:05:35.160Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}}],"commits":{"id":1383897,"full_name":"chlnddev/oceanmesh","default_branch":"master","total_commits":43,"total_committers":9,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":4.777777777777778,"dds":0.4418604651162791,"past_year_total_commits":3,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":3.0,"past_year_dds":0.0,"last_synced_at":"2026-03-30T19:03:01.595Z","last_synced_commit":"e7053b724823da6a5b52598eb2bcf37d3ab8d727","created_at":"2023-09-22T00:14:23.803Z","updated_at":"2026-03-30T19:02:16.160Z","committers":[{"name":"Keith Roberts","email":"krober@usp.br","login":null,"count":24},{"name":"CHLNDDEV","email":"40673418+CHLNDDEV","login":"CHLNDDEV","count":5},{"name":"Keith Roberts","email":"keithmillibar@gmail.com","login":"krober10nd","count":3},{"name":"Thomas Saillour","email":"saillour.thomas@gmail.com","login":"tomsail","count":3},{"name":"Joseph Elmes","email":"49066093+ml14je","login":"ml14je","count":2},{"name":"Alain Coat","email":"97431609+alcoat","login":"alcoat","count":2},{"name":"Stefan Zieger","email":"9580169+stefanzieger","login":"stefanzieger","count":2},{"name":"Don Zimmer","email":"dzimmer@baird.com","login":"dpzimmer","count":1},{"name":"Caio Eadi Stringari","email":"caio.stringari@gmail.com","login":"caiostringari","count":1}],"past_year_committers":[{"name":"Keith Roberts","email":"keithmillibar@gmail.com","login":"krober10nd","count":3}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/chlnddev%2Foceanmesh/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-03T00:00:08.542Z","repositories_count":6211262,"commits_count":927230944,"contributors_count":35800340,"owners_count":1145290,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"chlnddev/oceanmesh","html_url":"https://github.com/chlnddev/oceanmesh","last_synced_at":"2026-02-13T21:02:45.331Z","status":"active","issues_count":36,"pull_requests_count":60,"avg_time_to_close_issue":6208575.1,"avg_time_to_close_pull_request":2447046.8163265307,"issues_closed_count":20,"pull_requests_closed_count":49,"pull_request_authors_count":12,"issue_authors_count":15,"avg_comments_per_issue":1.4166666666666667,"avg_comments_per_pull_request":2.783333333333333,"merged_pull_requests_count":41,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":154467.0,"past_year_avg_time_to_close_pull_request":598413.0,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":3,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":1.25,"past_year_avg_comments_per_pull_request":1.25,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"created_at":"2023-09-22T00:14:53.378Z","updated_at":"2026-02-13T21:02:45.331Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/chlnddev%2Foceanmesh","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/chlnddev%2Foceanmesh/issues","issue_labels_count":{"enhancement":1},"pull_request_labels_count":{"enhancement":3},"issue_author_associations_count":{"COLLABORATOR":18,"NONE":11,"CONTRIBUTOR":7},"pull_request_author_associations_count":{"COLLABORATOR":37,"CONTRIBUTOR":15,"NONE":7,"OWNER":1},"issue_authors":{"krober10nd":17,"ml14je":3,"tomsail":3,"SorooshMani-NOAA":2,"egeod":1,"derekeden":1,"shuoli-code":1,"stefanzieger":1,"ghost":1,"loctk":1,"filippogiaroli":1,"liesvyvall":1,"firesinger82":1,"caiostringari":1,"ChengJungHsu":1},"pull_request_authors":{"krober10nd":35,"tomsail":7,"alcoat":3,"ml14je":3,"jcharris":2,"sgriffithjones":2,"stefanzieger":2,"tomas19":2,"dpzimmer":1,"liesvyvall":1,"CHLNDDEV":1,"caiostringari":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-28T00:00:07.303Z","repositories_count":13963902,"issues_count":34579541,"pull_requests_count":113111678,"authors_count":11211471,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":2,"COLLABORATOR":1},"past_year_pull_request_author_associations_count":{"COLLABORATOR":4},"past_year_issue_authors":{"derekeden":1,"egeod":1,"stefanzieger":1},"past_year_pull_request_authors":{"krober10nd":4},"maintainers":[{"login":"krober10nd","count":52,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krober10nd"},{"login":"stefanzieger","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/stefanzieger"},{"login":"CHLNDDEV","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/CHLNDDEV"}],"active_maintainers":[{"login":"krober10nd","count":4,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/krober10nd"},{"login":"stefanzieger","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/stefanzieger"}]},"events":{"total":{"ReleaseEvent":1,"DeleteEvent":3,"PullRequestEvent":3,"ForkEvent":4,"IssuesEvent":8,"WatchEvent":14,"IssueCommentEvent":19,"PushEvent":26,"PullRequestReviewCommentEvent":11,"PullRequestReviewEvent":5,"CreateEvent":4},"last_year":{"DeleteEvent":3,"ForkEvent":1,"IssuesEvent":4,"WatchEvent":7,"IssueCommentEvent":2,"PushEvent":21,"PullRequestReviewEvent":3,"PullRequestReviewCommentEvent":6,"CreateEvent":3}},"keywords":["coastal-modelling","mesh-generation","python"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/testing.yml","sha":null,"kind":"manifest","created_at":"2023-09-25T07:02:48.025Z","updated_at":"2023-09-25T07:02:48.025Z","repository_link":"https://github.com/CHLNDDEV/oceanmesh/blob/master/.github/workflows/testing.yml","dependencies":[{"id":13935898283,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":13935898284,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":13935898285,"package_name":"codecov/codecov-action","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2023-09-25T07:02:48.034Z","updated_at":"2023-09-25T07:02:48.034Z","repository_link":"https://github.com/CHLNDDEV/oceanmesh/blob/master/pyproject.toml","dependencies":[]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2023-09-25T07:02:48.039Z","updated_at":"2023-09-25T07:02:48.039Z","repository_link":"https://github.com/CHLNDDEV/oceanmesh/blob/master/setup.py","dependencies":[]}],"score":null,"created_at":"2023-09-22T00:05:10.348Z","updated_at":"2026-04-05T21:30:26.881Z","avatar_url":"https://github.com/CHLNDDEV.png","language":"Python","category":"Hydrosphere","sub_category":"Coastal and Reefs","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# oceanmesh: Automatic coastal ocean mesh generation\n\n:ocean: :cyclone:\n\n[![Tests](https://github.com/CHLNDDEV/oceanmesh/actions/workflows/testing.yml/badge.svg)](https://github.com/CHLNDDEV/oceanmesh/actions/workflows/ci.yml)\n\n[![CodeCov](https://codecov.io/gh/CHLNDDEV/oceanmesh/branch/master/graph/badge.svg)](https://codecov.io/gh/CHLNDDEV/oceanmesh)\n\nCoastal ocean mesh generation from vector and raster GIS data.\n\n---\n\n## 1. Quick Start\n\nGet a mesh up and running in minutes. For a full walkthrough, see 5. Basic Usage.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport numpy as np\nimport oceanmesh as om\n\n# 1) Define a region (WGS84 example)\nregion = om.Region(extent=(-75.00, -70.00, 40.00, 42.00), crs=4326)\n\n# Alternatively, define an arbitrary polygon extent (lon, lat vertices)\npoly_vertices = np.array(\n  [\n    [-74.2, 40.4],\n    [-73.9, 40.4],\n    [-73.8, 40.7],\n    [-74.1, 40.8],\n    [-74.2, 40.4],  # close polygon\n  ]\n)\npoly_region = om.Region(extent=poly_vertices, crs=4326)\n\n# 2) Build shoreline and signed distance function from a coastline shapefile\nshore = om.Shoreline(\"path/to/coastline.shp\", poly_region, min_edge_length=0.01)\nsdf = om.signed_distance_function(shore)\n\n# 3) Create a sizing function and generate the mesh\nedge = om.distance_sizing_function(shore, rate=0.15)\npoints, cells = om.generate_mesh(sdf, edge)\n\n# 4) Clean up common boundary issues\npoints, cells = om.make_mesh_boundaries_traversable(points, cells)\npoints, cells = om.delete_boundary_faces(points, cells, min_qual=0.15)\n```\n\n[Back to top](#table-of-contents)\n\n---\n\n## Table of contents\n\n\u003c!--ts--\u003e\n\n- [1. Quick Start](#1-quick-start)\n- [2. Features](#2-features)\n- [3. Installation](#3-installation)\n  - [3.1 Linux/Mac](#31-linuxmac)\n  - [3.2 Windows](#32-windows)\n  - [3.3 Development installation](#33-development-installation)\n- [4. Support \u0026 Community](#4-support--community)\n- [5. Basic Usage](#5-basic-usage)\n  - [5.1 Setting the Region](#51-setting-the-region)\n  - [5.2 Reading Geophysical Data](#52-reading-geophysical-data)\n  - [5.3 Defining the Domain](#53-defining-the-domain)\n  - [5.4 Building Mesh Sizing Functions](#54-building-mesh-sizing-functions)\n  - [5.5 Cleaning up the Mesh](#55-cleaning-up-the-mesh)\n  - [5.6 Mesh Generation](#56-mesh-generation)\n- [6. Advanced Topics](#6-advanced-topics)\n  - [6.1 Multiscale Mesh Generation](#61-multiscale-mesh-generation)\n  - [6.2 Global and Multiscale Meshing](#62-global-and-multiscale-meshing)\n- [7. Performance Optimization](#7-performance-optimization)\n- [8. Third-Party Code](#8-third-party-code)\n- [9. Testing](#9-testing)\n- [10. Citation](#10-citation)\n- [11. License](#11-license)\n\n\u003c!--te--\u003e\n\n---\n\n## 2. Features\n\n- A Python package for the development of unstructured triangular meshes used in coastal ocean circulation modeling. The software integrates mesh generation directly with geophysical datasets such as topo-bathymetric rasters/digital elevation models and shapefiles representing coastal features. It provides pre- and post-processing tools to enable successful numerical simulation with the developed model.\n  - Automatically handles arbitrarily complex shoreline vector datasets and incorporates them into mesh generation.\n  - A variety of commonly used mesh size functions with simple, scriptable controls.\n  - Mesh checking and clean-up methods to avoid simulation problems.\n\n[Back to top](#table-of-contents)\n\n---\n\n## 3. Installation\n\n:warning: OceanMesh 1.0 provides a stable public API, but the project is still under active development. Check the release notes for details of any breaking changes between minor versions.\n\nThe notes below refer to installation on platforms other than MS Windows. For Windows, see 3.2.\n\n### 3.1 Linux/Mac\n\noceanmesh needs [CGAL](https://www.cgal.org/):\n\n```bash\nsudo apt install libcgal-dev\n```\n\nCGAL can also be installed with conda:\n\n\u003c!--pytest-codeblocks:skip--\u003e\n```bash\nconda install -c conda-forge cgal\n```\n\nAfter that, install or update OceanMesh with pip (recommended for most users):\n\n```bash\npip install -U oceanmesh\n```\n\nPrebuilt wheels are available for Apple Silicon (M1+) via `pip`.\n\nOn some clusters/HPC in order to install CGAL, you may need to load/install [gmp](https://gmplib.org/) and [mpfr](https://www.mpfr.org/). For example:\n\n```bash\nsudo apt install libmpfr-dev libgmp3-dev\n```\n\n### 3.2 Windows\n\nPython on Windows can encounter DLL conflicts due to version incompatibilities among required packages. We provide `install_cgal.bat` to build a CGAL development distribution separately as a prerequisite.\n\nPrerequisites to build CGAL using the provided batch file:\n\n- Windows 10 or later\n- Visual Studio with C++\n- CMake\n- Git\n\nAfter successful installation of a CGAL development package, proceed via one of the two options below to generate a Python environment with OceanMesh installed.\nperformance-critical operations:\nIf you are using a conda-based Python distribution, then `install_oceanmesh.bat` should take care of everything, provided no package conflicts arise.\n-  **Point-in-polygon queries** are implemented by\n   :mod:`oceanmesh.geometry.point_in_polygon` using a pure-Python\n   ray-casting backend with optional fast paths via Shapely and\n   Matplotlib when available. When built, an optional Cython extension\n   (:mod:`oceanmesh.geometry.point_in_polygon_`) accelerates the core\n   ray-casting kernel and is **enabled by default**.\n\n   Backend selection follows two environment variables:\n\n   - ``OCEANMESH_INPOLY_METHOD`` chooses among the Python backends\n     (``\"raycasting\"``, ``\"shapely\"``, ``\"matplotlib\"``). When this is\n     set, the corresponding backend is used and the Cython kernel is\n     not invoked.\n   - ``OCEANMESH_INPOLY_ACCEL`` controls whether the compiled kernel is\n     considered when ``OCEANMESH_INPOLY_METHOD`` is *not* set to a\n     recognised method name. By default (unset or non-falsey), OceanMesh\n     will attempt to import and use the Cython kernel; if the extension\n     is missing or fails at runtime, a **warning is logged** and the\n     code gracefully falls back to the pure-Python implementation.\n\n   If you intend to run without acceleration (for example on a\n   platform without a compiler toolchain), set\n   ``OCEANMESH_INPOLY_ACCEL=0`` to disable the compiled kernel and\n   silence the warning. Otherwise, a warning is emitted to highlight\n   that performance may be significantly degraded compared to the\n   accelerated path.\n\nNote: CMake is required by vcpkg to build CGAL dependencies, but is not used to build oceanmesh itself (which uses setuptools with pybind11).\n\n### 3.3 Development installation\n\nTo install from source for development and testing:\n\n```bash\npip install -e .\n```\n\n[Back to top](#table-of-contents)\n\n---\n\n## 4. Support \u0026 Community\n\n- Questions or problems? Post issues on GitHub or ask in Slack: https://join.slack.com/t/oceanmesh2d/shared_invite/zt-su1q3lh3-C_j6AIOQPrewqZnanhzN7g\n- Contact: Dr. Keith Roberts (keithrbt0@gmail.com)\n- Version information: oceanmesh uses versioneer.\n\u003c!--pytest-codeblocks:skip--\u003e\n```bash\npython -c \"import oceanmesh; print(oceanmesh.__version__)\"\npython setup.py version\n```\n\nLogging during script execution (default is suppressed):\n\n```python\nimport logging, sys\nlogging.basicConfig(stream=sys.stdout, level=logging.WARNING)\n# logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n# logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)\n```\n\n[Back to top](#table-of-contents)\n\n---\n\n## 5. Basic Usage\n\n### 5.1 Setting the Region\n\n```python\nimport oceanmesh as om\n\nEPSG = 32619  # CRS (UTM19N here)\nbbox = (-70.29637, -43.56508, -69.65537, 43.88338)\nextent = om.Region(extent=bbox, crs=4326)  # bbox given in WGS84\nextent = extent.transform_to(EPSG)         # transform to target CRS (UTM19N)\nprint(extent.bbox)                         # extents now in desired CRS\n```\n\n### 5.2 Reading Geophysical Data\n\nShoreline vector datasets (e.g., shapefiles) and digital elevation models (DEMs) are used to construct mesh size and signed distance functions. The dataset download and heavy plotting examples are skipped in CI.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport zipfile\nimport requests\nimport oceanmesh as om\n\nurl = \"http://www.soest.hawaii.edu/pwessel/gshhg/gshhg-shp-2.3.7.zip\"\nwith open(\"gshhg-shp-2.3.7.zip\", \"wb\") as f:\n    f.write(requests.get(url).content)\nzipfile.ZipFile(\"gshhg-shp-2.3.7.zip\").extractall(\"gshhg-shp-2.3.7\")\n\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nEPSG = 4326\nextent = om.Region(extent=(-75.000, -70.001, 40.0001, 41.9000), crs=EPSG)\nshoreline = om.Shoreline(fname, extent, 0.01)  # Preferred: pass Region\n```\n\n#### Working with Projected Coordinate Systems\n\nWhen working in projected CRSs (e.g., UTM), prefer passing a Region object so both bbox and CRS travel together.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\n\nEPSG = 32610  # UTM Zone 10N\nextent = om.Region(extent=(xmin, xmax, ymin, ymax), crs=EPSG)\n\nshore = om.Shoreline(fname, extent, min_edge_length=15)               # carries CRS\nshore = om.Shoreline(fname, extent.bbox, 15, crs=EPSG)                 # explicit CRS\n# Wrong: bbox in UTM but default CRS=WGS84 (do NOT do this)\n# shore = om.Shoreline(fname, extent.bbox, 15)\n```\n\n\u003e Best practice: Pass a Region object to Shoreline instead of just a bbox to ensure CRS matches automatically.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\n# DEM usage (example dataset from datasets/EastCoast.nc)\nimport oceanmesh as om\ndem = om.DEM(\"datasets/EastCoast.nc\", crs=4326)\ndem.plot(title=\"SRTM 30m\", vmin=-10, vmax=10)\n```\n![DEM](docs/images/dem_visualization_trimmed.png)\n\n\n### 5.3 Defining the Domain\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-75.00, -70.001, 40.0001, 41.9000), crs=4326)\nshoreline = om.Shoreline(fname, extent, 0.01)\nsdf = om.signed_distance_function(shoreline)\n```\n\nTo flip the inside/outside definition:\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nsdf = om.signed_distance_function(shoreline, invert=True)\n```\n\n### 5.4 Building Mesh Sizing Functions\n\nAll mesh size functions are defined on regular Cartesian grids. See the Grid class for details.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-75.00, -70.001, 40.0001, 41.9000), crs=4326)\nshoreline = om.Shoreline(fname, extent, 0.01)\nedge_length = om.distance_sizing_function(shoreline, rate=0.15)\n```\n![Distance sizing](docs/images/my_edge_length_sizing_function.png)\n\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-75.00, -70.001, 40.0001, 41.9000), crs=4326)\nshoreline = om.Shoreline(fname, extent, 0.01)\nsdf = om.signed_distance_function(shoreline)\nedge_length = om.feature_sizing_function(shoreline, sdf, max_edge_length=0.05)\nedge_length = om.enforce_mesh_gradation(edge_length, gradation=0.15)\n```\n![Feature sizing](docs/images/feature_sizing_function.png)\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\nfdem = \"datasets/EastCoast.nc\"\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-74.3, -73.8, 40.3, 40.8), crs=4326)\ndem = om.DEM(fdem, bbox=extent, crs=4326)\nshoreline = om.Shoreline(fname, dem.bbox, 0.01)\nsdf = om.signed_distance_function(shoreline)\nedge1 = om.feature_sizing_function(shoreline, sdf, max_edge_length=0.05)\nedge2 = om.wavelength_sizing_function(dem, wl=100, period=12.42 * 3600)\nedge = om.enforce_mesh_gradation(om.compute_minimum([edge1, edge2]), gradation=0.15)\n```\n![Feature sizing](docs/images/feature_sizing+wavelength.png)\n\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport oceanmesh as om\nfdem = \"datasets/EastCoast.nc\"\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-74.4, -73.4, 40.2, 41.2), crs=4326)\ndem = om.DEM(fdem, crs=4326)\nshoreline = om.Shoreline(fname, extent, 0.0025)\nsdf = om.signed_distance_function(shoreline)\nedge_feat = om.feature_sizing_function(shoreline, sdf, max_edge_length=0.10, crs=4326)\nedge_grad = om.bathymetric_gradient_sizing_function(\n    dem, slope_parameter=5.0, filter_quotient=50, min_edge_length=0.0025, max_edge_length=0.10, crs=4326\n)\nedge = om.enforce_mesh_gradation(om.compute_minimum([edge_feat, edge_grad]), gradation=0.15)\n```\n\n![Gradient sizing](docs/images/my_composite_edge_length_sizing_function.png)\n\n\n\n### 5.5 Cleaning up the Mesh\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\npoints, cells = fix_mesh(points, cells)\npoints, cells = make_mesh_boundaries_traversable(points, cells)\npoints, cells = delete_faces_connected_to_one_face(points, cells)\npoints, cells = delete_boundary_faces(points, cells, min_qual=0.15)\npoints, cells = laplacian2(points, cells)\n```\n\n### 5.6 Mesh Generation\n\nMesh generation uses the DistMesh algorithm and requires only a signed distance and a sizing function.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport meshio\nimport oceanmesh as om\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nextent = om.Region(extent=(-75.00, -70.001, 40.0001, 41.9000), crs=4326)\nshore = om.Shoreline(fname, extent.bbox, 0.01)\nedge = om.distance_sizing_function(shore, max_edge_length=0.05)\ndomain = om.signed_distance_function(shore)\npoints, cells = om.generate_mesh(domain, edge)\npoints, cells = om.make_mesh_boundaries_traversable(points, cells)\npoints, cells = om.delete_faces_connected_to_one_face(points, cells)\npoints, cells = om.delete_boundary_faces(points, cells, min_qual=0.15)\npoints, cells = om.laplacian2(points, cells)\nmeshio.write_points_cells(\"new_york.vtk\", points, [(\"triangle\", cells)], file_format=\"vtk\")\n```\n\n[Back to top](#table-of-contents)\n\n---\n\n## 6. Advanced Topics\n\n### 6.1 Multiscale Mesh Generation\n\nAreas of finer refinement can be incorporated seamlessly by using `generate_multiscale_mesh` with lists of signed distance and edge length functions. Transitions are blended automatically.\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport matplotlib.gridspec as gridspec\nimport matplotlib.pyplot as plt\nimport matplotlib.tri as tri\nimport numpy as np\n\nimport oceanmesh as om\n\nfname = \"gshhg-shp-2.3.7/GSHHS_shp/f/GSHHS_f_L1.shp\"\nEPSG = 4326  # EPSG:4326 or WGS84\nextent1 = om.Region(extent=(-75.00, -70.001, 40.0001, 41.9000), crs=EPSG)\nmin_edge_length1 = 0.01  # minimum mesh size in domain in projection\nbbox2 = np.array(\n  [\n    [-73.9481, 40.6028],\n    [-74.0186, 40.5688],\n    [-73.9366, 40.5362],\n    [-73.7269, 40.5626],\n    [-73.7231, 40.6459],\n    [-73.8242, 40.6758],\n    [-73.9481, 40.6028],\n  ],\n  dtype=float,\n)\nextent2 = om.Region(extent=bbox2, crs=EPSG)\nmin_edge_length2 = 4.6e-4  # minimum mesh size in domain in projection\ns1 = om.Shoreline(fname, extent1.bbox, min_edge_length1)\nsdf1 = om.signed_distance_function(s1)\nel1 = om.distance_sizing_function(s1, max_edge_length=0.05)\ns2 = om.Shoreline(fname, extent2.bbox, min_edge_length2)\nsdf2 = om.signed_distance_function(s2)\nel2 = om.distance_sizing_function(s2)\n# Control the element size transition\n# from coarse to fine with the kwargs prefixed with `blend`\npoints, cells = om.generate_multiscale_mesh(\n  [sdf1, sdf2],\n  [el1, el2],\n)\n# Remove degenerate mesh faces and other common problems in the mesh\npoints, cells = om.make_mesh_boundaries_traversable(points, cells)\n# Remove singly connected elements (elements connected to only one other element)\npoints, cells = om.delete_faces_connected_to_one_face(points, cells)\n# Remove poor boundary elements with quality \u003c 15%\npoints, cells = om.delete_boundary_faces(points, cells, min_qual=0.15)\n# Apply a Laplacian smoother that preservers the mesh size distribution\npoints, cells = om.laplacian2(points, cells)\n\n# Plot it showing the different levels of resolution\ntriang = tri.Triangulation(points[:, 0], points[:, 1], cells)\ngs = gridspec.GridSpec(2, 2)\ngs.update(wspace=0.5)\nplt.figure()\n\nbbox3 = np.array(\n  [\n    [-73.78, 40.60],\n    [-73.75, 40.60],\n    [-73.75, 40.64],\n    [-73.78, 40.64],\n    [-73.78, 40.60],\n  ],\n  dtype=float,\n)\n\nax = plt.subplot(gs[0, 0])\nax.set_aspect(\"equal\")\nax.triplot(triang, \"-\", lw=1)\nax.plot(bbox2[:, 0], bbox2[:, 1], \"r--\")\nax.plot(bbox3[:, 0], bbox3[:, 1], \"m--\")\n\nax = plt.subplot(gs[0, 1])\nax.set_aspect(\"equal\")\nax.triplot(triang, \"-\", lw=1)\nax.plot(bbox2[:, 0], bbox2[:, 1], \"r--\")\nax.set_xlim(np.amin(bbox2[:, 0]), np.amax(bbox2[:, 0]))\nax.set_ylim(np.amin(bbox2[:, 1]), np.amax(bbox2[:, 1]))\nax.plot(bbox3[:, 0], bbox3[:, 1], \"m--\")\n\nax = plt.subplot(gs[1, :])\nax.set_aspect(\"equal\")\nax.triplot(triang, \"-\", lw=1)\nax.set_xlim(-73.78, -73.75)\nax.set_ylim(40.60, 40.64)\nplt.show()\n```\n\n![Multiscale](docs/images/multiscale_trimmed.png)\n\n### 6.2 Global and Multiscale Meshing\n\nGlobal meshes are defined in EPSG:4326 but meshed in a stereographic projection. Regional refinement can be added as additional domains.\n\n#### Global mesh generation (two-step: EPSG:4326 sizing → stereographic meshing)\n\nGlobal mesh generation is done in two steps:\n\n1. Define the shoreline and sizing functions in EPSG:4326.\n2. Generate the mesh in a stereographic projection using a stereographic coastline.\n\nThe repository includes example global shoreline shapefiles under `tests/global/`:\n\n- `tests/global/global_latlon.shp`: shoreline in EPSG:4326 (lon/lat)\n- `tests/global/global_stereo.shp`: shoreline already transformed for stereographic meshing\n\nNote: `global_stereo.shp` can be produced using `global_tag()` in pyPoseidon:\nhttps://github.com/ec-jrc/pyPoseidon/blob/9cfd3bbf5598c810004def83b1f43dc5149addd0/pyposeidon/boundary.py#L452\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport numpy as np\nimport oceanmesh as om\nfrom oceanmesh.region import to_lat_lon\nimport matplotlib.pyplot as plt\n\n\ndef crosses_dateline(lon1, lon2):\n  return abs(lon1 - lon2) \u003e 180\n\n\ndef filter_triangles(points_lonlat, cells):\n  \"\"\"Drop triangles that cross the dateline to avoid plot artifacts.\"\"\"\n  filtered = []\n  for cell in cells:\n    p1, p2, p3 = (\n      points_lonlat[cell[0]],\n      points_lonlat[cell[1]],\n      points_lonlat[cell[2]],\n    )\n    if not (\n      crosses_dateline(p1[0], p2[0])\n      or crosses_dateline(p2[0], p3[0])\n      or crosses_dateline(p3[0], p1[0])\n    ):\n      filtered.append(cell)\n  return filtered\n\n\n# WGS84 shoreline and stereographic shoreline\nfname_wgs84 = \"tests/global/global_latlon.shp\"\nfname_stereo = \"tests/global/global_stereo.shp\"\n\nextent = om.Region(extent=(-180.0, 180.0, -89.0, 90.0), crs=4326)\n\n# 1) Define sizing functions in WGS84\nmin_edge_length = 0.5\nshoreline = om.Shoreline(fname_wgs84, extent.bbox, min_edge_length)\nedge_length = om.distance_sizing_function(shoreline, rate=0.11)\n\n# 2) Mesh in stereographic projection using a stereographic shoreline\nshoreline_stereo = om.Shoreline(fname_stereo, extent.bbox, min_edge_length, stereo=True)\ndomain = om.signed_distance_function(shoreline_stereo)\n\npoints, cells = om.generate_mesh(domain, edge_length, stereo=True, max_iter=100)\n\n# Clean up and smooth\npoints, cells = om.make_mesh_boundaries_traversable(points, cells)\npoints, cells = om.delete_faces_connected_to_one_face(points, cells)\npoints, cells = om.laplacian2(points, cells, max_iter=100)\n\n# Convert back to lon/lat for plotting\nlon, lat = to_lat_lon(points[:, 0], points[:, 1])\ntri_cells = filter_triangles(np.array([lon, lat]).T, cells)\n\nfig, ax, pc = edge_length.plot(\n  holding=True,\n  plot_colorbar=True,\n  cbarlabel=\"Resolution in °\",\n  cmap=\"magma\",\n)\nax.triplot(lon, lat, tri_cells, color=\"w\", linewidth=0.25)\nplt.tight_layout()\nplt.show()\n```\n\n![Global](docs/images/global_mesh_v1.png)\n\n\n\u003c!--pytest-codeblocks:skip--\u003e\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.tri as tri\nimport matplotlib.gridspec as gridspec\nimport oceanmesh as om\nfrom oceanmesh.region import to_lat_lon\n\nfname_global_latlon = \"tests/global/global_latlon.shp\"\nfname_global_stereo = \"tests/global/global_stereo.shp\"\n\nglobal_region = om.Region(extent=(-180.0, 180.0, -89.0, 90.0), crs=4326)\nshoreline_global_latlon = om.Shoreline(fname_global_latlon, global_region, 1.0)\nsdf_global_latlon = om.signed_distance_function(shoreline_global_latlon)\nedge_global = om.enforce_mesh_gradation(\n    om.compute_minimum([\n        om.distance_sizing_function(shoreline_global_latlon, rate=0.11),\n        om.feature_sizing_function(shoreline_global_latlon, sdf_global_latlon, max_edge_length=3.0),\n    ]),\n    gradation=0.15,\n    stereo=True,\n)\n\naus_region = om.Region(extent=(110.0, 160.0, -45.0, -10.0), crs=4326)\nshoreline_regional = om.Shoreline(fname_global_latlon, aus_region, 0.25)\nsdf_regional = om.signed_distance_function(shoreline_regional)\nedge_regional = om.enforce_mesh_gradation(\n    om.compute_minimum([\n        om.distance_sizing_function(shoreline_regional, rate=0.13),\n        om.feature_sizing_function(shoreline_regional, sdf_regional, max_edge_length=1.5),\n    ]),\n    gradation=0.12,\n)\n\nshoreline_global_stereo = om.Shoreline(fname_global_stereo, global_region, 1.0, stereo=True)\nsdf_global_stereo = om.signed_distance_function(shoreline_global_stereo)\n\npoints, cells = om.generate_multiscale_mesh(\n    [sdf_global_stereo, sdf_regional],\n    [edge_global, edge_regional],\n    blend_width=1.0e6,\n    blend_max_iter=50,\n    max_iter=75,\n)\n```\n\n![Global Regional Multiscale](docs/images/test_global_regional_multiscale.png)\n*The image shows the global mesh with a refined Australia region.\n\nSee the tests in the `tests/` folder for more inspiration; work is ongoing on this package.\n\n[Back to top](#table-of-contents)\n\n---\n\n## 7. Performance Optimization\n\nOceanMesh uses efficient, GPL-compatible geometry backends for\nperformance-critical operations:\n\n- **Point-in-polygon queries** use the new\n  `oceanmesh.geometry.inpoly2` implementation, which can automatically\n  take advantage of Shapely prepared geometries or Matplotlib path\n  operations when those libraries are available, falling back to a\n  portable pure-Python ray-casting algorithm otherwise.\n- **Delaunay triangulation** is provided by a pure-Python\n  Bowyer–Watson implementation with an optional Cython-accelerated\n  kernel, enabled automatically when built.\n\nNo special extras or build flags are required to enable these\noptimizations; the fastest available backend is selected at runtime\nbased on the installed dependencies.\n\n[Back to top](#table-of-contents)\n\n---\n\n## 8. Third-Party Code\n\nOceanMesh relies on a number of well-established open-source\ndependencies (see `setup.cfg` for the full list), but does not\ncurrently vendor any third-party geometry libraries. Earlier releases\nincluded a vendored copy of `inpoly-python`; this has been fully\nreplaced by the native GPL-compatible implementation in\n`oceanmesh.geometry.inpoly2`.\n\n[Back to top](#table-of-contents)\n\n---\n\n## 9. Testing\n\nTo run the oceanmesh unit tests (and turn off plots), check out this repository and run tox.\n\n[Back to top](#table-of-contents)\n\n---\n\n## 10. Citation\n\n```\n[1] - Roberts, K. J., Pringle, W. J., and Westerink, J. J., 2019.\n      OceanMesh2D 1.0: MATLAB-based software for two-dimensional unstructured mesh generation in coastal ocean modeling,\n      Geoscientific Model Development, 12, 1847-1868. https://doi.org/10.5194/gmd-12-1847-2019.\n```\n\n[Back to top](#table-of-contents)\n\n---\n\n## 11. License\n\nThis software is published under the [GPLv3 license](https://www.gnu.org/licenses/gpl-3.0.en.html)\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.5194/gmd-12-1847-2019"],"works":{"https://doi.org/10.5194/gmd-12-1847-2019":{"id":"https://openalex.org/W2893057958","doi":"https://doi.org/10.5194/gmd-12-1847-2019","title":"OceanMesh2D 1.0: MATLAB-based software for two-dimensional unstructured mesh generation in coastal ocean modeling","display_name":"OceanMesh2D 1.0: MATLAB-based software for two-dimensional unstructured mesh generation in coastal ocean modeling","publication_year":2019,"publication_date":"2019-05-10","ids":{"openalex":"https://openalex.org/W2893057958","doi":"https://doi.org/10.5194/gmd-12-1847-2019","mag":"2893057958"},"language":"en","primary_location":{"is_oa":true,"landing_page_url":"https://doi.org/10.5194/gmd-12-1847-2019","pdf_url":"https://gmd.copernicus.org/articles/12/1847/2019/gmd-12-1847-2019.pdf","source":{"id":"https://openalex.org/S60406085","display_name":"Geoscientific Model Development","issn_l":"1991-959X","issn":["1991-9603","1991-959X"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310313756","host_organization_name":"Copernicus Publications","host_organization_lineage":["https://openalex.org/P4310313756"],"host_organization_lineage_names":["Copernicus Publications"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true},"type":"article","type_crossref":"journal-article","open_access":{"is_oa":true,"oa_status":"gold","oa_url":"https://gmd.copernicus.org/articles/12/1847/2019/gmd-12-1847-2019.pdf","any_repository_has_fulltext":false},"authorships":[{"author_position":"first","author":{"id":"https://openalex.org/A5043532485","display_name":"Keith J. Roberts","orcid":"https://orcid.org/0000-0002-8470-0359"},"institutions":[{"id":"https://openalex.org/I107639228","display_name":"University of Notre Dame","ror":"https://ror.org/00mkhxb43","country_code":"US","type":"education","lineage":["https://openalex.org/I107639228"]}],"countries":["US"],"is_corresponding":true,"raw_author_name":"Keith J. Roberts","raw_affiliation_string":"Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA","raw_affiliation_strings":["Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA"]},{"author_position":"middle","author":{"id":"https://openalex.org/A5043755845","display_name":"William Pringle","orcid":"https://orcid.org/0000-0002-2877-4812"},"institutions":[{"id":"https://openalex.org/I107639228","display_name":"University of Notre Dame","ror":"https://ror.org/00mkhxb43","country_code":"US","type":"education","lineage":["https://openalex.org/I107639228"]}],"countries":["US"],"is_corresponding":true,"raw_author_name":"William J. Pringle","raw_affiliation_string":"Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA","raw_affiliation_strings":["Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA"]},{"author_position":"last","author":{"id":"https://openalex.org/A5087228134","display_name":"Joannes J. Westerink","orcid":null},"institutions":[{"id":"https://openalex.org/I107639228","display_name":"University of Notre Dame","ror":"https://ror.org/00mkhxb43","country_code":"US","type":"education","lineage":["https://openalex.org/I107639228"]}],"countries":["US"],"is_corresponding":true,"raw_author_name":"Joannes J. Westerink","raw_affiliation_string":"Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA","raw_affiliation_strings":["Department of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,  156Â Fitzpatrick Hall, Notre Dame, IN, USA"]}],"countries_distinct_count":1,"institutions_distinct_count":1,"corresponding_author_ids":["https://openalex.org/A5043532485","https://openalex.org/A5043755845","https://openalex.org/A5087228134"],"corresponding_institution_ids":["https://openalex.org/I107639228","https://openalex.org/I107639228","https://openalex.org/I107639228"],"apc_list":{"value":1600,"currency":"EUR","value_usd":1725,"provenance":"doaj"},"apc_paid":{"value":1600,"currency":"EUR","value_usd":1725,"provenance":"doaj"},"has_fulltext":true,"fulltext_origin":"pdf","cited_by_count":56,"cited_by_percentile_year":{"min":98,"max":99},"biblio":{"volume":"12","issue":"5","first_page":"1847","last_page":"1868"},"is_retracted":false,"is_paratext":false,"keywords":[{"keyword":"coastal oceanmesh2d modeling","score":0.6588},{"keyword":"matlab-based","score":0.25},{"keyword":"two-dimensional","score":0.25}],"concepts":[{"id":"https://openalex.org/C31487907","wikidata":"https://www.wikidata.org/wiki/Q1154597","display_name":"Polygon mesh","level":2,"score":0.8639214},{"id":"https://openalex.org/C41008148","wikidata":"https://www.wikidata.org/wiki/Q21198","display_name":"Computer science","level":0,"score":0.77298516},{"id":"https://openalex.org/C2780365114","wikidata":"https://www.wikidata.org/wiki/Q169478","display_name":"MATLAB","level":2,"score":0.7625992},{"id":"https://openalex.org/C181145010","wikidata":"https://www.wikidata.org/wiki/Q4418033","display_name":"Mesh generation","level":3,"score":0.72530025},{"id":"https://openalex.org/C34736171","wikidata":"https://www.wikidata.org/wiki/Q918333","display_name":"Preprocessor","level":2,"score":0.6642426},{"id":"https://openalex.org/C459310","wikidata":"https://www.wikidata.org/wiki/Q117801","display_name":"Computational science","level":1,"score":0.64710814},{"id":"https://openalex.org/C177212765","wikidata":"https://www.wikidata.org/wiki/Q627335","display_name":"Workflow","level":2,"score":0.6468319},{"id":"https://openalex.org/C2777904410","wikidata":"https://www.wikidata.org/wiki/Q7397","display_name":"Software","level":2,"score":0.5814187},{"id":"https://openalex.org/C170589453","wikidata":"https://www.wikidata.org/wiki/Q7940896","display_name":"Volume mesh","level":4,"score":0.4884335},{"id":"https://openalex.org/C98045186","wikidata":"https://www.wikidata.org/wiki/Q205663","display_name":"Process (computing)","level":2,"score":0.4790743},{"id":"https://openalex.org/C177264268","wikidata":"https://www.wikidata.org/wiki/Q1514741","display_name":"Set (abstract data type)","level":2,"score":0.47434035},{"id":"https://openalex.org/C62354387","wikidata":"https://www.wikidata.org/wiki/Q875399","display_name":"Boundary (topology)","level":2,"score":0.46771565},{"id":"https://openalex.org/C11413529","wikidata":"https://www.wikidata.org/wiki/Q8366","display_name":"Algorithm","level":1,"score":0.42033747},{"id":"https://openalex.org/C2776401178","wikidata":"https://www.wikidata.org/wiki/Q12050496","display_name":"Feature (linguistics)","level":2,"score":0.41320938},{"id":"https://openalex.org/C121684516","wikidata":"https://www.wikidata.org/wiki/Q7600677","display_name":"Computer graphics (images)","level":1,"score":0.3480102},{"id":"https://openalex.org/C154945302","wikidata":"https://www.wikidata.org/wiki/Q11660","display_name":"Artificial intelligence","level":1,"score":0.16460234},{"id":"https://openalex.org/C199360897","wikidata":"https://www.wikidata.org/wiki/Q9143","display_name":"Programming language","level":1,"score":0.13808393},{"id":"https://openalex.org/C135628077","wikidata":"https://www.wikidata.org/wiki/Q220184","display_name":"Finite element method","level":2,"score":0.11337349},{"id":"https://openalex.org/C127413603","wikidata":"https://www.wikidata.org/wiki/Q11023","display_name":"Engineering","level":0,"score":0.08773294},{"id":"https://openalex.org/C33923547","wikidata":"https://www.wikidata.org/wiki/Q395","display_name":"Mathematics","level":0,"score":0.08517927},{"id":"https://openalex.org/C134306372","wikidata":"https://www.wikidata.org/wiki/Q7754","display_name":"Mathematical analysis","level":1,"score":0.0},{"id":"https://openalex.org/C66938386","wikidata":"https://www.wikidata.org/wiki/Q633538","display_name":"Structural engineering","level":1,"score":0.0},{"id":"https://openalex.org/C77088390","wikidata":"https://www.wikidata.org/wiki/Q8513","display_name":"Database","level":1,"score":0.0},{"id":"https://openalex.org/C41895202","wikidata":"https://www.wikidata.org/wiki/Q8162","display_name":"Linguistics","level":1,"score":0.0},{"id":"https://openalex.org/C138885662","wikidata":"https://www.wikidata.org/wiki/Q5891","display_name":"Philosophy","level":0,"score":0.0}],"mesh":[],"locations_count":2,"locations":[{"is_oa":true,"landing_page_url":"https://doi.org/10.5194/gmd-12-1847-2019","pdf_url":"https://gmd.copernicus.org/articles/12/1847/2019/gmd-12-1847-2019.pdf","source":{"id":"https://openalex.org/S60406085","display_name":"Geoscientific Model Development","issn_l":"1991-959X","issn":["1991-9603","1991-959X"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310313756","host_organization_name":"Copernicus Publications","host_organization_lineage":["https://openalex.org/P4310313756"],"host_organization_lineage_names":["Copernicus Publications"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true},{"is_oa":false,"landing_page_url":"https://doaj.org/article/200ce915c91048f68d7c9bf0a6290f34","pdf_url":null,"source":{"id":"https://openalex.org/S4306401280","display_name":"DOAJ (DOAJ: Directory of Open Access Journals)","issn_l":null,"issn":null,"is_oa":true,"is_in_doaj":false,"host_organization":null,"host_organization_name":null,"host_organization_lineage":[],"host_organization_lineage_names":[],"type":"repository"},"license":null,"version":null,"is_accepted":false,"is_published":false}],"best_oa_location":{"is_oa":true,"landing_page_url":"https://doi.org/10.5194/gmd-12-1847-2019","pdf_url":"https://gmd.copernicus.org/articles/12/1847/2019/gmd-12-1847-2019.pdf","source":{"id":"https://openalex.org/S60406085","display_name":"Geoscientific Model Development","issn_l":"1991-959X","issn":["1991-9603","1991-959X"],"is_oa":true,"is_in_doaj":true,"host_organization":"https://openalex.org/P4310313756","host_organization_name":"Copernicus Publications","host_organization_lineage":["https://openalex.org/P4310313756"],"host_organization_lineage_names":["Copernicus Publications"],"type":"journal"},"license":"cc-by","version":"publishedVersion","is_accepted":true,"is_published":true},"sustainable_development_goals":[{"id":"https://metadata.un.org/sdg/14","display_name":"Life below water","score":0.76}],"grants":[{"funder":"https://openalex.org/F4320306076","funder_display_name":"National Science Foundation","award_id":"ACI-1339738"}],"referenced_works_count":37,"referenced_works":["https://openalex.org/W1516026694","https://openalex.org/W1975819923","https://openalex.org/W1986264234","https://openalex.org/W1988437960","https://openalex.org/W1991178197","https://openalex.org/W2013950197","https://openalex.org/W2014219760","https://openalex.org/W2019228767","https://openalex.org/W2021036023","https://openalex.org/W2023644139","https://openalex.org/W2039413727","https://openalex.org/W2041515902","https://openalex.org/W2045989154","https://openalex.org/W2061413830","https://openalex.org/W2063813773","https://openalex.org/W2063899295","https://openalex.org/W2071443789","https://openalex.org/W2074752115","https://openalex.org/W2084504874","https://openalex.org/W2087884757","https://openalex.org/W2093624119","https://openalex.org/W2110280135","https://openalex.org/W2115284993","https://openalex.org/W2151145131","https://openalex.org/W2158053697","https://openalex.org/W2159400622","https://openalex.org/W2169586996","https://openalex.org/W2512174018","https://openalex.org/W2530568295","https://openalex.org/W2604419520","https://openalex.org/W2754042574","https://openalex.org/W2797655347","https://openalex.org/W2836625807","https://openalex.org/W3023608962","https://openalex.org/W3105415274","https://openalex.org/W4232674688","https://openalex.org/W4238769865"],"related_works":["https://openalex.org/W2050851932","https://openalex.org/W2601611040","https://openalex.org/W2184057547","https://openalex.org/W4210950568","https://openalex.org/W2767124957","https://openalex.org/W2381018316","https://openalex.org/W2048163432","https://openalex.org/W1542092300","https://openalex.org/W156011255","https://openalex.org/W2369809820"],"ngrams_url":"https://api.openalex.org/works/W2893057958/ngrams","abstract_inverted_index":{"Abstract.":[0],"OceanMesh2D":[1],"is":[2,26,40,72],"a":[3,30,43,51],"set":[4],"of":[5,32,53,66,116],"MATLAB":[6],"functions":[7],"with":[8],"preprocessing":[9],"and":[10,35,50,94,108,119],"post-processing":[11],"utilities":[12],"to":[13,29,47,76],"generate":[14],"two-dimensional":[15],"(2-D)":[16],"unstructured":[17,130],"meshes":[18],"for":[19,84],"coastal":[20],"ocean":[21],"circulation":[22],"models.":[23],"Mesh":[24,38],"resolution":[25],"controlled":[27],"according":[28,75],"variety":[31],"feature-driven":[33],"geometric":[34],"topo-bathymetric":[36],"functions.":[37],"generation":[39,95],"achieved":[41],"through":[42],"force":[44],"balance":[45],"algorithm":[46],"locate":[48],"vertices":[49,67],"number":[52],"topological":[54],"improvement":[55],"strategies":[56],"aimed":[57],"at":[58],"improving":[59],"the":[60,69,77,82,91,113,117],"worst-case":[61],"triangle":[62],"quality.":[63],"The":[64,88],"placement":[65],"along":[68],"mesh":[70,78,92],"boundary":[71],"adapted":[73],"automatically":[74],"size":[79],"function,":[80],"eliminating":[81],"need":[83],"contour":[85],"simplification":[86],"algorithms.":[87],"software":[89,118],"expresses":[90],"design":[93],"process":[96],"via":[97],"an":[98],"objected-oriented":[99],"framework":[100],"that":[101,105],"facilitates":[102],"efficient":[103],"workflows":[104],"are":[106],"flexible":[107],"automatic.":[109],"This":[110],"paper":[111],"illustrates":[112],"various":[114],"capabilities":[115],"demonstrates":[120],"its":[121],"utility":[122],"in":[123],"realistic":[124],"applications":[125],"by":[126],"producing":[127],"high-quality,":[128],"multiscale,":[129],"meshes.":[131]},"cited_by_api_url":"https://api.openalex.org/works?filter=cites:W2893057958","counts_by_year":[{"year":2023,"cited_by_count":23},{"year":2022,"cited_by_count":16},{"year":2021,"cited_by_count":11},{"year":2020,"cited_by_count":5},{"year":2019,"cited_by_count":2}],"updated_date":"2023-12-14T04:37:47.280853","created_date":"2018-10-05"}},"citation_counts":{"https://doi.org/10.5194/gmd-12-1847-2019":57},"total_citations":57,"keywords_from_contributors":["meshes","geophysics","multiscale-simulation","shallow-water-equations"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/86280","html_url":"https://ost.ecosyste.ms/projects/86280"}