Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding logically rectangular curvilinear grid generation to xesmf.util #42

Open
jthielen opened this issue Nov 17, 2018 · 3 comments
Open

Comments

@jthielen
Copy link

I’m new to using xESMF, and I’ve been finding it very useful in my research workflow, particularly in regridding from lat-lon coordinates to a conformal or equal area projection in order to perform image analysis. So, thank you for all your work!

One utility I’ve had to write myself, however, is generating those logically rectangular curvilinear grids to supply to xESMF. I think this could be a useful utility for more than just my own work, and so, would something like this be within scope to add to xesmf.util alongside grid_2d()?

If so, I’d be glad to submit a PR, but there could be a couple issues to discuss. First, I’ve been using pyproj to handle the projections and coordinate transformations. And so, would having that as an optional dependency be acceptable? (I could also implement it using another CRS handling library, but pyproj seemed simplest as I was working on it.) Second, I’m not sure what the best API would be for this utility. Perhaps something like

projection = pyproj.Proj(proj='lcc', ...)
ds_out = xe.util.grid_rectangular(projection, nx=850, ny=600, dx=3000, dy=3000)

to create a 850x600 LCC grid centered on the origin with 3 km grid spacing?

@JiaweiZhuang
Copy link
Owner

Thanks, that's a really interesting point!

generating those logically rectangular curvilinear grids

By "those" are you referring to WRF's three types of map projections, i.e. Lambert conformal, polar stereographic, Mercator (see WRF technical note, 2.4 Map Projections), or the over 100 projections in Proj4? What projections do you typically use?

LCC grid centered on the origin with 3 km grid spacing

My understanding is that a map projection alone cannot define a grid mesh. WRF assumes constant dx and dy in the projected, Cartesian space, which can then be translated to a mesh in the original spherical coordinate. But the spacing is not uniform anymore on the sphere. Thus "3 km grid spacing" is not well defined. Here's a figure from Section 3.2.1 Map projections in Warner, T. T. (2010). Numerical weather and climate prediction:

screen shot 2018-11-17 at 5 01 52 pm

Indeed, the distortion in grid spacing can be minimized by "using the Mercator projection for grids in tropical latitudes, the polar-stereographic projection for high-latitude grids, and the Lambert-conformal projection for midlatitude grids" (Warner 2010). But in any case the grid spacing will be varying on the sphere. A better API will be passing the total domain size and the resolution?

Also, is the mesh always uniform in the projected space? It is true for WRF but probably not true for all models. I guess for image analysis you can always assume uniform mesh because they are just pixels?

@JiaweiZhuang
Copy link
Owner

In terms of dependency & API, I think Cartopy will be a great fit (it also depends on Proj.4, but not pyproj), if there is way to use it for explicit coordinate transform. Passingccrs.LambertConformal(...) is more intuitive than passing pyproj.Proj(proj='lcc', ...), because people already use Cartopy for plotting.

@jthielen
Copy link
Author

Thank you for the thorough response and I apologize for my ambiguity!

The map projections I typically use (and so, what I had in mind when I said "those") are the projections used in WRF as you mentioned (especially Lambert conformal) and Albers equal area. But, if this kind of utility could generalize to other projections without too much difficulty, it would make sense to do so.

Also, when I said "3 km grid spacing," I meant it in the projected space in the fashion of WRF, rather than true spacing on the sphere/ellipsoid, since I am indeed assuming a uniform mesh for the pixels in my calculations. Though, I can see now the importance of being careful with this based on what you said. For a grid generation utility like this, would it still be okay to make the assumption of the mesh being uniform in the projected space (so long as this assumption is made clear in documentation)?

Finally, doing this through Cartopy sounds good! When I next get the chance, I can adapt what I have based on the feedback and submit an initial work-in-progress PR if it still seems like something useful.

huard pushed a commit to Ouranosinc/xESMF that referenced this issue Nov 23, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants