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

Ryan Connelly rconne01 at gmail.com
Wed Apr 27 09:37:20 MDT 2016


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/5b1203c9/attachment.html 


More information about the ncl-talk mailing list