Update README.md

This commit is contained in:
SolaProject
2023-03-18 19:33:48 +08:00
committed by GitHub
parent 6d525bc426
commit 6f5d34800d

View File

@ -4,13 +4,70 @@
Tool to convert atmospheric model (e.g. WRF, NAQPMS) grid IDs to latitude and longitude and vice versa. Tool to convert atmospheric model (e.g. WRF, NAQPMS) grid IDs to latitude and longitude and vice versa.
There are two main functions:
1. tranfrom model ID to lonlat and back.
2. get XLON, XLAT in wrfout with out wrfout file.
Everything start from a class, and you should create an instance by `model = model_info_2d()`, always you should give some kwags like `proj` (projection), `nx`, `ny`, `dx`, `dy`. Maybe it is cumbersome to build it every time, so, you can see the part of model_info_2d instance to create your personal model_info.
Email: sola1211582551@outlook.com
## function
And this tool provide some useful function like: And this tool provide some useful function like:
1. `ix, iy = grid_id(longitude, latitude)`: Gives a lonlat location and returns its nearest integer ID. Note that ix/iy starts at 0. 1. `ix, iy = model.grid_id(longitude, latitude)`: Gives a lonlat location and returns its nearest integer ID. You can also use function `model.grid_id_float(longitude, latitude)` to get the precise ID in float. Note that ix/iy starts at 0.
You can also use function `grid_id_float(longitude, latitude)` to get the precise ID in float.
2.
2. get_grid(): return XLONG and XLAT that like the same name variable in wrfout file. 2. `longitude, latitude = model.grid_lonlat(ix, iy)`: similar like `model.grid_id()` but give the ID and return lonlat.
3. 3. `ix_array, iy_array = model.grid_ids(longitude_array, latitude_array)`: similar like `model.grid_id()` but you can give a `list/numpy.ndarray` and return `numpy.ndarray`. If you have lots of points to convert, it will be faster. In fact, if you give a array to `grid_id()`, it will call function `gird_ids()`. It also has a float version `model.grid_ids_float()`.
4. `lons, lats = model.grid_lonlats(ix_array, iy_array)`: similar like `model.grid_lonlat()` but you can give a `list/numpy.ndarray` and return `numpy.ndarray`, like `model.grid_ids()`.
5. `xlon, xlat = model.get_grid()`: return XLONG and XLAT that like the same name variable in wrfout file. It is useful in drawing.
6. `xlon, xlat = model.get_density_grid(density=10)`: return XLONG and XLAT. But there will be a larger matrix. The key ward `density` determine how many point in an original grid. For example, if `density=10`, the `xlon.shape` will be `(10, 10, ny, nx)`, that means every grid has been divided in 10*10 subgrids and their lonlat is `xlon[iy_sub, ix_sub, iy, ix]`, `xlat[iy_sub, ix_sub, iy, ix]`.
## model_info_2d instance
To build your personal model_info, you should have a porjection. The projection can be `cartopy.crs` (ccrs) like `ccrs.PlateCarree()`, or an instance with method like `transform_point`, `grid_id_float`. I provide an example case in `proj_info.py`, it is the projection algorithm from WRF/WPS and I rewrite it in Python (just proj_LC, lambert projection), because I find that there is a little different between `ccrs.LambertConformal()` and wrfout result.
Notise: i modify the code to let the ID start at 0 (like [1, 1] in Fortran -> [0, 0] in Python).
And then, Use your proj to build a subclass of model_info_2d, like this:
```Python
from model_info_2d import model_info_2d, proj_info
class china_15km(model_info_2d):
def __init__(self, fun_sim_dat_dir):
truelat1, truelat2 = 40, 25
stdlon = 105
lon1, lat1 = 105, 34
nx, ny = 432, 339
dx, dy = 15000, 15000
proj = proj_info.proj_LC(truelat1=truelat1, truelat2=truelat2,
lat1=lat1, lon1=lon1, stdlon=stdlon,
dx=dx, dy=dy, nx=nx, ny=ny)
lowerleft_lonlat = proj.grid_lonlat(0, 0)
super().__init__(proj, nx, ny, dx, dy, lowerleft_lonlat)
```
That describe a 15km grid distance domian of East Asia, China. With true latitude of 25° and 40°. The truelat1, truelat2, stdlon, lat1, lat2, dx, dy is same as namelist.wps in WPS. But notise, **the nx and ny is the UNSTAG number (e_we - 1 and e_sn -1 in namelist.wps)**.
You can also define some other function like read_data:
```Python
...
def read_data(self, timestamp, var, layer=None):
import netCDF4 as nc
with nc.Dataset(self.fun_sim_dat_dir(timestamp)) as nf:
if layer is None:
result = nf[var][0]
else:
result = nf[var][0, layer]
return result
```
Everything is denpend on you. Good luck!