[ncl-talk] difference between using res at tfDoNDCOverlay and @lat2d @lon2d when overlaying wind vectors

xiaoming Hu yuanfangcan at hotmail.com
Fri Apr 27 16:19:50 MDT 2018


Mary

  Thanks a lot for taking your time and your clear explanation!  "res at vcMapDirection=False" indeed made the difference for res at vcGlyphStyle="FillArrow"

   But if I use "CurlyVector",       "res at vcMapDirection = False" doesn't make difference.

See figure below, CurlyVector still appears incorrect.

I pasted my NCl below.

BTW: why the map did not show up?

Thanks a lot!

Xiaoming

[cid:399c97bf-60d0-4aa7-9d16-71b5940896b7]

[cid:983ba056-4968-4477-abe8-b7f11914001e]

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"

begin
  if(.not.isvar("ndc_overlay")) then
    ndc_overlay = False
  end if

  if(.not.isvar("map_direction")) then
    map_direction = False
  end if

;----------------------------------------------------------------------
; Get the data. You can set the filename on the command line, if
; desired:
;  ncl 'filename="wrfout_d01_2003-07-13_12:00:00"' wrf_vectors.ncl
;----------------------------------------------------------------------
  if(.not.isvar("filename")) then
    filename = "wrfout_d01_2011-08-08_12:00:00"
  end if
  print("==================================================")
  print("file: " + filename)
  f = addfile(filename+".nc","r")

  u     = wrf_user_getvar(f,"ua",0)
  v     = wrf_user_getvar(f,"va",0)
  pf    = wrf_user_getvar(f,"pressure",0) ; Full model pressure [hPa]
    geoHeight = ( f->PH(0,:,:,:) + f->PHB(0,:,:,:) ) / 9.81
    dim = dimsizes(geoHeight)
    geoHeight_nonstag = (geoHeight(0:dim(0)-2,:,:)+geoHeight(1:dim(0)-1,:,:))/2
      geoHeight_950 = wrf_interp_3d_z(geoHeight_nonstag,pf,950.)

  u_950 = wrf_interp_3d_z(u,pf,950.)
  v_950 = wrf_interp_3d_z(v,pf,950.)
  lat2d = f->XLAT(0,:,:)
  lon2d = f->XLONG(0,:,:)

  nlat = dimsizes(lat2d(:,0))
  nlon = dimsizes(lat2d(0,:))
  min_lat_diff = abs(min(lat2d(1,:)-lat2d(0,:)))
  min_lon_diff = abs(min(lon2d(:,1)-lon2d(0,0)))
  max_lat_diff = min_lat_diff
  max_lon_diff = min_lon_diff
  do n=2,nlat-1
    min_lat_diff = abs(min((/min_lat_diff,min(lat2d(n,:)-lat2d(n-1,:))/)))
    max_lat_diff = abs(max((/max_lat_diff,max(lat2d(n,:)-lat2d(n-1,:))/)))
  end do
  do n=2,nlon-1
    min_lon_diff = abs(min((/min_lon_diff,min(lon2d(:,n)-lon2d(:,n-1))/)))
    max_lon_diff = abs(max((/max_lon_diff,max(lon2d(:,n)-lon2d(:,n-1))/)))
  end do
  print("min lat diff = " + min_lat_diff)
  print("max lat diff = " + max_lat_diff)
  print("min lon diff = " + min_lon_diff)
  print("max lon diff = " + max_lon_diff)
;  printMinMax(u_950,0)
;  printMinMax(v_950,0)

;----------------------------------------------------------------------
; Set the plotting options
;----------------------------------------------------------------------
  res                         = True
  res at gsnMaximize             = True
  res at gsnAddCyclic            = False          ; don't add a longitude cyclic point

  res at tfDoNDCOverlay          = ndc_overlay    ; True / False

  res at pmTickMarkDisplayMode   = "Always"       ; turn on nice tickmarks

  res at vcMapDirection          = map_direction  ; True / False
  res at vcRefMagnitudeF         = 8.             ; define vector ref mag
  res at vcRefLengthF            = 0.025          ; define length of vec ref
  res at vcMinDistanceF          = 0.02           ; larger means sparser
  res at vcFillArrowEdgeColor    = "black"
  res at vcFillArrowEdgeThicknessF = .25
  res at vcGlyphStyle            = "FillArrow"
  res at gsnScalarContour      = True               ; contours desired
  res at cnFillOn              = True             ; color plot desired
  res at cnLinesOn             = False            ; turn off contour lines
  res at cnLineLabelsOn        = False            ; turn off contour labels
  res at cnLevelSelectionMode  = "ManualLevels"
  res at cnLevelSpacingF   = 5
  res at cnMaxLevelValF        = 585+10
  res at cnMinLevelValF       =  530
  res at lbLabelStride         = 4
;  res at gsnLeftString="GeoHeight at 950mb"

  res = wrf_map_resources(f, res)

  if(.not.ndc_overlay) then
    u_950 at lat2d = lat2d
    u_950 at lon2d = lon2d
    v_950 at lat2d = lat2d
    v_950 at lon2d = lon2d
   geoHeight_950 at lat2d = lat2d
   geoHeight_950 at lon2d = lon2d
;  n_cutoff = 150
;  res at mpLeftCornerLonF = lon2d(0,n_cutoff)
;  res at mpLeftCornerLatF = lat2d(0,n_cutoff)

  end if

  res at tiMainString   = "FillArrow"
  res at gsnLeftString  = "tfDoNDCOverlay=" + ndc_overlay
  res at gsnRightString = "vcMapDirection=" + map_direction

  figurename = str_sub_str(filename,":","_")

;----------------------------------------------------------------------
; Create the plot
;----------------------------------------------------------------------
  wks = gsn_open_wks("png",figurename + "_ndc_" + ndc_overlay + "_mapdir_" + map_direction+"_vcGlyphStyle_FillArrow")
;  vector_plot  = gsn_csm_vector_map(wks,u_950,v_950,res)
 plot                 = gsn_csm_vector_scalar_map(wks,u_950,v_950,geoHeight_950,res)

end




________________________________
From: Mary Haley <haley at ucar.edu>
Sent: Friday, April 27, 2018 2:34 PM
To: xiaoming Hu
Cc: ncl-talk; Xiaoming Hu
Subject: Re: difference between using res at tfDoNDCOverlay and @lat2d @lon2d when overlaying wind vectors

Xiaoming,

I finally had a chance to look at this.

I first took your script and reduced it to just create a basic line vector plot, because I wanted to make sure there were no extraneous resources being set that could be the source of the problem.

Long story short: if you set tfDoNDCOverlay=False and use the special lat2d/lon2d attributes to create the plot, then you also need to set:

  res at vcMapDirection = False

See the attached wrf_vectors.ncl (which I will make an official example on the WRF examples page somewhere).

This script allows you to try different combinations of vcMapDirection and tfDoNDCOverlay in one script so you can compare the images. You can also plug in other WRF output files and it should work.

To try different combinations of these two resources setting, set ndc_overlay and/or map_direction to True / False on the NCL command line. For example:

ncl map_direction=False ndc_overlay=True wrf_vectors.ncl
ncl map_direction=False ndc_overlay=False wrf_vectors.ncl
ncl map_direction=True ndc_overlay=True wrf_vectors.ncl
ncl map_direction=True ndc_overlay=False wrf_vectors.ncl

For the case of map_direction = True (vcMapDirection) and ndc_overlay = False (tfDoNDCOverlay), the vectors are slightly shifted (and incorrect as you pointed out).

For the other three combinations of these two settings, the vector plots are the same. I've attached all four PNGs to this email.

I have to admit that the vcMapDirection resource is a bit of a mystery to me as to when it should be True or False.  It is documented on the vectors resource page<http://www.ncl.ucar.edu/Document/Graphics/Resources/vc.shtml#vcMapDirection>:

vcMapDirection
This resource controls whether the vector direction is mapped into the same coordinate space as the vector location, or whether it is rendered in a locally uniform cartesian coordinate space. This resource has an effect whenever a non-uniform transformation is in effect. These include most of the MapTransformation transformations and IrregularTransformation transformations. Also included are logarithmic transformations provided by the LogLinTransformation and even linear transformations when the X and Y unit sizes are different.
Default: True


If you look at our vectors examples page (which I just updated):

http://www.ncl.ucar.edu/Applications/vector.shtml

it talks about the vcMapDirection resource and how it must be set to False if the latitude spacings are very different from the longitude spacings. With your data, the latitude spacings vary from 0.097 to 0.11, whereas the longitude spacings vary from 0.1 to 11.0. This is enough of a difference that vcMapDirection needs to be set to False.

As an extra test, I asked Bill Ladwig to plot this same data using a Python script that uses PyNIO to read in the data and matplotlib to plot it. I've attached the Python script and the wrf_quiver.png file so you can compare.

To learn more about wrf-python, see:

http://wrf-python.readthedocs.io/en/latest/

Thanks for your patience.

--Mary



On Fri, Apr 20, 2018 at 1:47 PM, xiaoming Hu <yuanfangcan at hotmail.com<mailto:yuanfangcan at hotmail.com>> wrote:

Realized ncl scripts are not attached in previous email.  Here again!


 Thanks a lot for helping on this!

 Now I changed to  NCl 6.3.0 and used wrf_map_resources and added res at gsnAddCyclic = False

 But I still did not make the case of tfDoNDCOverlay not being set    to be consistent with  the case of tfDoNDCOverlay setting to True

 I attached 2 cleaned script

 with plot_geoHeight950mb_combine2episodes_with_ndc_overlay.ncl I got:


with plot_geoHeight950mb_combine2episodes_without_ndc_overlay.ncl, I got:


The previous issue still exists, plus the map is gone. :)

See the difference between the 2 scripts:

< ;  res at tfDoNDCOverlay       = True
<   res at tfDoNDCOverlay       = False
---
>   res at tfDoNDCOverlay       = True
> ;  res at tfDoNDCOverlay       = False
134,140d132
<    u_950 at lat2d = lat2d
<    u_950 at lon2d = lon2d
<    v_950 at lat2d = lat2d
<    v_950 at lon2d = lon2d
<    geoHeight_950 at lat2d = lat2d
<    geoHeight_950 at lon2d = lon2d
<
146,147c138,139
< ;    plot                 = gsn_csm_vector_scalar_map(wks,u_950(:,n_cutoff:),v_950(:,n_cutoff:),geoHeight_950(:,n_cutoff:),res)
<     plot                 = gsn_csm_vector_scalar_map(wks,u_950,v_950,geoHeight_950,res)
---
>     plot                 = gsn_csm_vector_scalar_map(wks,u_950(:,n_cutoff:),v_950(:,n_cutoff:),geoHeight_950(:,n_cutoff:),res)
> ;    plot                 = gsn_csm_vector_scalar_map(wks,u_950,v_950,geoHeight_950,res)

Did I miss anything?


  I put the data (1.9G) at

 http://www.caps.ou.edu/micronet/HurricaneImpactonO3/WRFV3.9.1/YSU/wrfchem3.9.1_ERA2d_CONUS_NLCD_NEI2011_MEGAN_nudge2.2011082500/wrfout_d01_2011-08-08_12:00:00


Thanks a lot!

Xiaoming

________________________________
From: Mary Haley <haley at ucar.edu<mailto:haley at ucar.edu>>
Sent: Wednesday, April 18, 2018 7:18:48 PM
To: xiaoming Hu
Cc: ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>; Xiaoming Hu
Subject: Re: [ncl-talk] difference between using res at tfDoNDCOverlay and @lat2d @lon2d when overlaying wind vectors

Xiaoming,

You have an out-dated function call (WRF_map_c) that might possibly be the source of the problem. This is a deprecated function and you should use wrf_map_resources to set your WRF map projection instead:

http://www.ncl.ucar.edu/Document/Functions/WRF_arw/wrf_map_resources.shtml
wrf_map_resources - CISL's NCAR Command Language (NCL)<http://www.ncl.ucar.edu/Document/Functions/WRF_arw/wrf_map_resources.shtml>
www.ncl.ucar.edu<http://www.ncl.ucar.edu>
NCL Home > Documentation > Functions > WRF, Graphics routines wrf_map_resources. Sets map plotting resources based on an input WRF-ARW file. Available in version 6.1.0 and later.



I can't tell from your code why the two results are different, because it's not clear to me if the only thing you are changing is whether or not tfDoNDCOverlay is set.

If I'm understanding your email correctly, it sounds like the plot that is created when tfDoNDCOverlay is set to True is the one that's correct. However, I'm surprised it's working for you because:

[1] If you set tfDoNDCOverlay to True, you should NOT attach any lat2d/lon2d attributes to your data variables.

[2] Also, if tfDoNDCOverlay is True, you must be using the EXACT map projection that was defined on the file.  But, you are using WRF_map_c which hasn't been updated in years, so this function could likely be giving you wrong results. Also, you are setting:

  n_cutoff = 150
  res at mpLeftCornerLonF = lon2d(0,n_cutoff)
  res at mpLeftCornerLatF = lat2d(0,n_cutoff)

which looks to me like you are zooming in on the map, but you haven't also zoomed in on the data in the same way, so again, I don't know how your plots can be correct.

[3] For the case of tfDoNDCOverlay not being set, you may need to set res at gsnAddCyclic = False to prevent a longitude cyclic point from being added.

Please visit this WRF examples page, which has examples of plotting WRF data with both tfDoNDCOverlay set and without it set:

http://www.ncl.ucar.edu/Applications/wrfgsn.shtml

I've attached two modified versions of your script. Since I don't have the data, I am unable to test these scripts. But, hopefully they help show the difference between these two scenarios.

If you continue to have problems with this, please post back to ncl-talk, but include a clean, updated script if possible.

Good luck,

--Mary







On Tue, Apr 17, 2018 at 11:04 PM, xiaoming Hu <yuanfangcan at hotmail.com<mailto:yuanfangcan at hotmail.com>> wrote:

Hello


 If I use res at tfDoNDCOverlay  I got the figure of


But If I use @lat2d @lon2d without res at tfDoNDCOverlay  I got


The wind vectors near the right edge in the left panel do not follow the pressure lines now.


Any comments on overlaying wind vectors using res at tfDoNDCOverlay    or using @lat2d @lon2d without res at tfDoNDCOverlay ?

I attached my ncl script

Thanks

Xiaoming


_______________________________________________
ncl-talk mailing list
ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20180427/b248aa60/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pastedImage.png
Type: image/png
Size: 151930 bytes
Desc: pastedImage.png
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20180427/b248aa60/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pastedImage.png
Type: image/png
Size: 140036 bytes
Desc: pastedImage.png
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20180427/b248aa60/attachment-0003.png>


More information about the ncl-talk mailing list