Deltares / Deltares/MeshKernelPy
`angle` is not accepted in `curvilinear_make_uniform_on_extension`
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 27
- Forks
- 5
- PR merge metrics
- No merged PRs in 30d
Description
Describe the bug
When using curvilinear_make_uniform_on_extension instead of curvilinear_make_uniform, angle is not an accepted keyword, it raises:
"MeshKernelError: Exception of type 'AlgorithmError' in libs/MeshKernelApi/include/MeshKernelApi/Utils.hpp (375:45) CreateUniformCurvilinearGridOnExtension: When generating an uniform grid on an defined extension, the grid angle must be equal to 0"
Also, when generating a spherical+rotated grid, the orthogonality is quite high (0.039 for this small extent)
To Reproduce
import meshkernel
import numpy as np
import matplotlib.pyplot as plt
plt.close("all")
projection = meshkernel.ProjectionType.SPHERICAL #SPERICAL results in non-orthogonal grid (0.039)
on_extension = False #True is not possible with angle!=0
#general settings
lon_min,lon_max = -1,-0.2
lat_min,lat_max = 49.1,49.6
lon_res,lat_res = 0.1,0.1
# Create an instance of MakeGridParameters and set the values
make_grid_parameters = meshkernel.MakeGridParameters()
make_grid_parameters.angle = 10.0
make_grid_parameters.origin_x = lon_min
make_grid_parameters.origin_y = lat_min
if on_extension:
make_grid_parameters.upper_right_x = lon_max
make_grid_parameters.upper_right_y = lat_max
else:
num_x = int(np.ceil((lon_max-lon_min)/lon_res))
num_y = int(np.ceil((lat_max-lat_min)/lat_res))
if projection == meshkernel.ProjectionType.SPHERICAL:
num_y = num_y*2 #TODO: remove *2, necessary to get correct lat grid extent with is_geographic=True
make_grid_parameters.num_columns = num_x
make_grid_parameters.num_rows = num_y
make_grid_parameters.block_size_x = lon_res
make_grid_parameters.block_size_y = lat_res
mk2 = meshkernel.MeshKernel(projection=projection)
if on_extension:
mk2.curvilinear_compute_rectangular_grid_on_extension(make_grid_parameters)
else:
mk2.curvilinear_compute_rectangular_grid(make_grid_parameters)
mk2.curvilinear_convert_to_mesh2d() #convert to ugrid/mesh2d
mesh2d = mk2.mesh2d_get()
fig, ax = plt.subplots()
mesh2d.plot_edges(ax)
print(mk2.mesh2d_get_orthogonality().values.max())
Expected behavior
A rotated grid, also when using curvilinear_make_uniform_on_extension
Version info (please complete the following information):
- OS: [e.g. Windows]
- Version branch 2.1.0 wheel of 4-7-2023
Registered also under: https://issuetracker.deltares.nl/browse/GRIDEDIT-1859
Additional context
Spherical grids are sometimes used for small domains, but very often for larger coastal seas or bays. These are some use cases from the real world:
- DCSM (not rotated, lon -15 to 5, lat 43 to 64): 3D model computation water level, current, temperature | Deltares
- MWRA (rotated 30-40 deg, lon -76 to -60, lat 35 to 45): The Updated Bays Eutrophication Model (BEM) | Deltares and https://www.mwra.com/media/file/2023-07.pdf
It would be neat if we could generate such meshes with curvilinear_make_uniform_on_extension. The acceptance criterion could be fairly straightforward: a mesh in the desired extent, with an acceptable orthogonality. Additionally, a 90 degree rotated grid should be fairly similar to 0 degree rotation, or we should limit the rotation between -45 degrees and +45 degrees.
More information about resulting orthogonality of the current algorithms is documented in https://github.com/Deltares/MeshKernelPy/issues/113.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the reproduction script and the curvilinear_compute_rectangular_grid_on_extension and curvilinear_compute_rectangular_grid entry points, then compare their behavior for a rotated spherical grid. Review issue #113 for the documented orthogonality context. Done means the extension path accepts the angle and produces the requested extent with acceptable orthogonality, including sensible 90-degree rotation behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- computer-graphics
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100