Re: a suggestion about wrf_latlon_to_ij

From: Mary Haley <haley_at_nyahnyahspammersnyahnyah>
Date: Wed, 4 Jun 2008 10:28:17 -0600 (MDT)

Hi Yunfei,

Thanks for your suggestion. I'll pass this onto the WRF developers,
since they are the ones who gave us the Fortran code for the NCL
version of this function.

--Mary

On Wed, 4 Jun 2008, yunfei zhang wrote:

> recently, I used the function wrf_latlon_to_ij.
> when the data points become very large, for example 300*500, this function
> needs long time to process.
> I read the source code ./ni/src/lib/nfpfort/wrf_user.f, and found this
> function use the least distance method.
> I think it should use projection information to transform a latitude
> longitude pair into a i j pair on grid,
> because the wrf grid is a regular projection.
> I give a example fortran program as following:
>
> SUBROUTINE llij_lc( lat, lon, proj, i, j)
>
> ! Subroutine to compute the geographical latitude and longitude values
> ! to the cartesian x/y on a Lambert Conformal projection.
>
> IMPLICIT NONE
>
> ! Input Args
> REAL, INTENT(IN) :: lat ! Latitude (-90->90 deg N)
> REAL, INTENT(IN) :: lon ! Longitude (-180->180 E)
> TYPE(proj_info),INTENT(IN) :: proj ! Projection info structure
>
> ! Output Args
> REAL, INTENT(OUT) :: i ! Cartesian X coordinate
> REAL, INTENT(OUT) :: j ! Cartesian Y coordinate
>
> ! Locals
> REAL :: arg
> REAL :: deltalon
> REAL :: tl1r
> REAL :: rm
> REAL :: ctl1r
>
>
> ! BEGIN CODE
>
> ! Compute deltalon between known longitude and standard lon and ensure
> ! it is not in the cut zone
> deltalon = lon - proj%stdlon
> IF (deltalon .GT. +180.) deltalon = deltalon - 360.
> IF (deltalon .LT. -180.) deltalon = deltalon + 360.
>
> ! Convert truelat1 to radian and compute COS for later use
> tl1r = proj%truelat1 * rad_per_deg
> ctl1r = COS(tl1r)
>
> ! Radius to desired point
> rm = proj%rebydx * ctl1r/proj%cone * &
> (TAN((90.*proj%hemi-lat)*rad_per_deg/2.) / &
> TAN((90.*proj%hemi-proj%truelat1)*rad_per_deg/2.))**proj%cone
>
> arg = proj%cone*(deltalon*rad_per_deg)
> i = proj%polei + proj%hemi * rm * SIN(arg)
> j = proj%polej - rm * COS(arg)
>
> ! Finally, if we are in the southern hemisphere, flip the i/j
> ! values to a coordinate system where (1,1) is the SW corner
> ! (what we assume) which is different than the original NCEP
> ! algorithms which used the NE corner as the origin in the
> ! southern hemisphere (left-hand vs. right-hand coordinate?)
> IF (proj%hemi .EQ. -1.) THEN
> i = 2. - i
> j = 2. - j
> ENDIF
> RETURN
> END SUBROUTINE llij_lc
>
_______________________________________________
ncl-talk mailing list
ncl-talk_at_ucar.edu
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Wed Jun 04 2008 - 10:28:17 MDT

This archive was generated by hypermail 2.2.0 : Wed Jun 04 2008 - 15:43:54 MDT