[ncl-talk] wrf_user_intrp3d with rectilinear grid, dimension mismatch

Mary Haley haley at ucar.edu
Wed Apr 27 13:32:34 MDT 2016


Ryan,

You have valid complaints about the ESMF_WRF_to_rect.ncl script, which I've
tried to address.  I cleaned it up so that nlat and nlon are now defined,
and I also added some code to draw the original WRF lat/lon grid and the
new lat/lon grid so you can better see what's happening.

I've attached the code which I ran with one of my WRF files, and included
the two images.

I see that Dennis has addressed your grad_latlon_cfd question.

--Mary


On Wed, Apr 27, 2016 at 9:37 AM, Ryan Connelly <rconne01 at gmail.com> wrote:

> Hi Mary,
>
> Thanks for taking the time to explain the differences.
>
> I'm trying to follow this example script:
> https://www.ncl.ucar.edu/Applications/Templates/ESMF_WRF_to_rect.ncl.
> This is where I got fspan from, not that I knew why I was using it.  It's a
> bit frustrating that in this script, nlat and nlon aren't actually
> declared, and except for suggestions on what to change, the script is
> rather sparsely commented, leaving me to guess what to input.
>
> Moving wrf_user_intrp3d up ahead of the grid conversion, and with
> switching back to the 1D nlat and mlon in fspan, has gotten that portion to
> complete successfully, so I'll call that success.
>
> Next problem: I'm getting an out of bounds error when I call
> grad_latlon_cfd that doesn't make sense, since I'm feeding it that
> [281,353] grid as the first arg and 281 and 353 as the second and third
> args, respectively, but it says something about an error on lon (the third
> arg).
>
> Thanks,
> Ryan
>
> On Tue, Apr 26, 2016 at 10:15 PM, Mary Haley <haley at ucar.edu> wrote:
>
>> Ryan,
>>
>> When you use ESMF_regrid, it's not required that the dimensions of the
>> source and destination grids match.
>>
>> There are three types of grids you might encounter in regridding:
>>
>> 1) rectilinear
>>
>> You have a 2D data array dimensioned nlat x nlon, and the latitudes are
>> represented by a 1D array of size nlat, and the longitudes are represented
>> by a 1D array of size nlon. These are often known as coordinate arrays, and
>> you can identify them right away in NCL because when you do a
>> "printVarSummary" on a variable, you will see something like:
>>
>> Variable: ts
>> Type: float
>> Total Size: 414056448 bytes
>>             103514112 values
>> Number of Dimensions: 3
>> Dimensions and sizes: [time | 1872] x [lat | 192] x [lon | 288]
>> Coordinates:
>>             time: [15.5..56924.5]
>>             lat: [ -90..  90]
>>             lon: [   0..358.75]
>>
>> Note that under the "Coordinates" section it actually gives you the list
>> of coordinate arrays associated with your variable "ts", which tells you
>> that you have a rectilinear grid.
>>
>> 2) curvilinear
>>
>> You have a 2D data array dimensioned nlat x nlon, and the latitudes AND
>> longitudes are represented by 2D arrays of size nlat x nlon. The WRF data
>> you read in is a curvilinear grid, because XLAT and XLONG are both 2D
>> arrays of the same dimensionality.
>>
>> 3) unstructured
>>
>> Here you don't have a "gridded" data array, but rather a structure like a
>> triangular mesh or a hexagonal grid. I'm not going to go into this one
>> since this is not what you are dealing with here.
>>
>> In practice, your source and destination grids can be any of these types,
>> and hence the dimensions do not have to match.  The idea behind regridding
>> is that you are trying to get your data that is on some particular grid
>> ("source" grid), onto a *different* grid ("destination" grid), so that you
>> can perhaps you can do array calculations on the regridded data with some
>> other variable on the same destination grid.
>>
>> In your case, your source grid (the WRF grid) is a curvilinear grid, and
>> the script you are using is regridding it to a rectilinear grid, so it's
>> correct that you are getting this:
>>
>> (0) write_grid_description: source lat dims = (281,353)
>> (0) write_grid_description: source lon dims = (281,353)
>> (0) write_grid_description: source grid type is 'curvilinear'
>> (...)
>> (0) write_grid_description: destination lat dims = (281)
>> (0) write_grid_description: destination lon dims = (353)
>> (0) write_grid_description: destination grid type is 'rectilinear'
>>
>> I believe this script is based on the same one used by ESMF_regrid_5.ncl
>> at:
>>
>> http://www.ncl.ucar.edu/Applications/ESMF.shtml#ex5
>>
>> As a side, I'm not sure why you are doing this:
>>
>>     dst_lat = fspan(lat_south,lat_north,src_lat)
>>     dst_lon = fspan(lon_west,lon_east,src_lon)
>>
>> The "fspan" function is a very basic function where you give it a start
>> value, an end value, and the number of equally-spaced values you want to
>> span between those two values. For example:
>>
>>   x = fspan(1,5,4)    ; 1, 2.3333, 3.666667, 5
>>
>> You are trying to give "fspan" an array of latitudes and longitudes for
>> the third argument which makes no sense and simply won't work.
>>
>> Backing up a bit here, why are you trying to regrid your WRF "tc"
>> variable before you call wrf_user_intrp3d?  Couldn't you simply subscript
>> tc using the lat/lon indexes you calculated, and pass this to
>> wrf_user_intrp3d?
>>
>>
>> --Mary
>>
>>
>>
>> On Tue, Apr 26, 2016 at 3:10 PM, Ryan Connelly <rconne01 at gmail.com>
>> wrote:
>>
>>> Follow-up: I had my lat and lon arrays switched.  Fixed that.  But the
>>> error still persists.
>>>
>>> It seems to be a Catch 22.  Right now, I have
>>>
>>>     locSW = wrf_user_ij_to_ll(a,1.,1.,True)     ; SW corner of domain
>>> for lat and lon minima. Func is fortran-based so 1 not 0
>>>     lon_west = locSW(0)
>>>     lat_south = locSW(1)
>>>
>>> ; Use any variable that spans the entire grid to get maxima of i,j
>>> ; which will then be used to get lat, lon of upper right (NE) corner
>>>
>>>     grid_size = dimsizes(tc)                    ; z is 0th index, lat
>>> 1st, lon 2nd
>>>     jMax = grid_size(1)
>>>     iMax = grid_size(2)
>>>
>>>     locNE = wrf_user_ij_to_ll(a,iMax,jMax,True)     ; NE corner of
>>> domain for lat and lon maxima. Func is fortran-based so max not max-1
>>>     lon_east = locNE(0)
>>>     lat_north = locNE(1)
>>>
>>>     n = dimsizes(lat)
>>>     m = dimsizes(lon)
>>>
>>>     nlat = n(0)
>>>     mlon = m(1)
>>>
>>>     dst_lat = fspan(lat_south,lat_north,nlat)
>>>     dst_lon = fspan(lon_west,lon_east,mlon)
>>>
>>> which means that element (2) of fspan has 1 dimension.  Therefore, in
>>> the output, I see:
>>>
>>> (0) write_grid_description: source lat dims = (281,353)
>>> (0) write_grid_description: source lon dims = (281,353)
>>> (0) write_grid_description: source grid type is 'curvilinear'
>>> (...)
>>> (0) write_grid_description: destination lat dims = (281)
>>> (0) write_grid_description: destination lon dims = (353)
>>> (0) write_grid_description: destination grid type is 'rectilinear'
>>>
>>> which seems like it should not be.  Shouldn't I want(need) the
>>> dimensions of the source and destination grid to match?
>>>
>>> So then, in fspan, I switch nlat to src_lat and mlon to src_lon, making
>>> that element two-dimensional instead of one-dimensional:
>>>
>>>     dst_lat = fspan(lat_south,lat_north,src_lat)
>>>     dst_lon = fspan(lon_west,lon_east,src_lon)
>>>
>>> Yet when I run with that change, I get: fatal:Number of dimensions in
>>> parameter (2) of (fspan) is (2), (1) dimensions were expected
>>>
>>> How can NCL simultaneously be expecting a one- and two-dimension array?
>>> I'm very confused here.
>>>
>>> Ryan
>>>
>>> On Tue, Apr 26, 2016 at 2:16 PM, Ryan Connelly <rconne01 at gmail.com>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> I'm using ESMF_WRF_to_rect.ncl to regrid (
>>>> https://www.ncl.ucar.edu/Applications/Templates/ESMF_WRF_to_rect.ncl).
>>>> Regridding completes fine, but then when i try to interpolate the regridded
>>>> variable to an isobaric plane using wrf_user_intrp3d I get:
>>>>
>>>> fatal:Dimension size mismatch, dimension (1) of left hand side
>>>> reference does not have the same size as the right hand side reference
>>>> after subscripting.
>>>>
>>>> This is a pretty literal error message and one that I've fixed before,
>>>> but this time it has me stumped.  I haven't even declared the variable on
>>>> the left hand side until this particular line (and I've double checked that
>>>> by issuing a printVarSummary and having it throw a variable undefined
>>>> error) so how can the dimension sizes not match if this is a blank new
>>>> variable?
>>>>
>>>> I then decided to be extra super literal and declare a new array with
>>>> the right dimensions before calling wrf_user_intrp3d, but the error
>>>> persists:
>>>>
>>>> (...)
>>>> tc_rect = ESMF_regrid(tc,Opt)     ; Do the regridding
>>>>
>>>>
>>>> ; Interpolate to isobaric planes
>>>>
>>>>       pressure = 850.
>>>>
>>>>       newdim = (dimsizes(tc_rect))
>>>>       print(newdim)
>>>>
>>>>       tc_rect_plane =
>>>> new((/newdim(0),newdim(1),newdim(2)/),typeof(tc_rect))
>>>>
>>>>       tc_rect_plane = wrf_user_intrp3d(tc_rect,p,"h",pressure,0.,False)
>>>> (...)
>>>>
>>>> I'm out of ideas here.
>>>>
>>>> Ryan
>>>>
>>>> --
>>>> Ryan Connelly
>>>> M.S. Student in Atmospheric Sciences, Stony Brook University
>>>> B.S. in Meteorology with Minors in Mathematics and GIS, Valparaiso
>>>> University
>>>> rconne01 at gmail.com
>>>> ryan.connelly at stonybrook.edu
>>>>
>>>
>>>
>>>
>>> --
>>> Ryan Connelly
>>> M.S. Student in Atmospheric Sciences, Stony Brook University
>>> B.S. in Meteorology with Minors in Mathematics and GIS, Valparaiso
>>> University
>>> rconne01 at gmail.com
>>> ryan.connelly at stonybrook.edu
>>>
>>> _______________________________________________
>>> ncl-talk mailing list
>>> ncl-talk at ucar.edu
>>> List instructions, subscriber options, unsubscribe:
>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>
>>>
>>
>
>
> --
> Ryan Connelly
> M.S. Student in Atmospheric Sciences, Stony Brook University
> B.S. in Meteorology with Minors in Mathematics and GIS, Valparaiso
> University
> rconne01 at gmail.com
> ryan.connelly at stonybrook.edu
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20160427/4df69baa/attachment-0001.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: WRF_to_rect.grid.png
Type: image/png
Size: 856967 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20160427/4df69baa/attachment-0002.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: WRF_to_rect.png
Type: image/png
Size: 249480 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20160427/4df69baa/attachment-0003.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ESMF_WRF_to_rect.ncl
Type: application/octet-stream
Size: 5690 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20160427/4df69baa/attachment-0001.obj 


More information about the ncl-talk mailing list