!
!##################################################################
!##################################################################
!###### ######
!###### ARPS Map Projection Subsystem. ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
! General Information
!
! This set of subroutines allows for transformation between
! lat-lon coordinates and any one of three map projections: Polar
! Stereographic, Lambert Conformal or Mercator.
!
! In order for the transformation subroutines to work, the
! map projection must first be set up by calling setmapr. The
! user may wish to call setorig immediately after setmapr to
! established an origin (given a lat-long or x-y in the default
! system) other than the default origin (e.g., the north pole).
!
! All lat-lons are in degrees (positive north, negative south,
! positive east and negative west). Note carefully the dimensions
! of x,y -- it differs among the subroutines to conform to ARPS usage.
! x,y coordinates are meters on earth but may be changed using the scale
! parameter in setmapr to change to km (scale=0.001) or to a different
! sphere (e.g., scale=mars_radius/earth_radius).
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SETMAPR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE setmapr(iproj,scale,latnot,orient) 60,6
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set constants for map projections, which are stored in
! the common block named /projcst/.
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/13/93.
!
! MODIFICATION HISTORY:
! 03/30/1995 (K. Brewster)
! Corrected error in Lambert Conformal scaling and added code to
! allow Lambert Tangent projection (lat1=lat2 in Lambert Conformal).
! Resulted in redefinition of projc1 for option 2.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! iproj Map projection number
! 1=North Polar Stereographic (-1 South Pole)
! 2=Northern Lambert Conformal (-2 Southern)
! 3=Mercator
! 4=Lat,Lon
!
! scale Map scale factor, at latitude=latnot
! Distance on map = (Distance on earth) * scale
! For ARPS model runs, generally this is 1.0
! For ARPS plotting this will depend on window
! size and the area to be plotted.
!
! latnot(2) Real "True" latitude(s) of map projection
! (degrees, positive north)
! Except for iproj=1, only latnot(1) is used
!
! orient Longitude line that runs vertically on the map.
! (degrees, negative west, positive east)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: iproj
REAL :: scale ! map scale factor
REAL :: latnot(2) ! true latitude (degrees N)
REAL :: orient ! orientation longitude (degrees E)
REAL :: d2rad,eradius
PARAMETER (d2rad=3.141592654/180., &
eradius = 6371000. ) ! mean earth radius in m
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: denom1,denom2,denom3
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
xorig=0.
yorig=0.
jproj=IABS(iproj)
jpole=ISIGN(1,iproj)
! print *, ' jpole = ',jpole
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF ( jproj == 0 ) THEN
IF (myproc == 0) WRITE(6,'(a)') ' No map projection will be used.'
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
trulat(1)=latnot(1)
rota=orient
scmap=scale
projc1=scale*eradius
projc2=(1. + SIN(d2rad*jpole*trulat(1)) )
projc3=projc1*projc2
IF(jpole > 0) THEN
IF (myproc == 0) WRITE(6,'(a/,a)') &
' Map projection set to Polar Stereographic', &
' X origin, Y origin set to 0.,0. at the North Pole.'
ELSE
IF (myproc == 0) WRITE(6,'(a/,a)') &
' Map projection set to Polar Stereographic', &
' X origin, Y origin set to 0.,0. at the South Pole.'
END IF
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
trulat(1)=latnot(1)
trulat(2)=latnot(2)
rota=orient
scmap=scale
projc2=COS(d2rad*trulat(1))
projc3=TAN(d2rad*(45.-0.5*jpole*trulat(1)))
denom1=COS(d2rad*trulat(2))
denom2=TAN(d2rad*(45.-0.5*jpole*trulat(2)))
IF(denom2 /= 0.) THEN
denom3=ALOG( projc3/denom2 )
ELSE
denom3=0.
END IF
IF(denom1 /= 0 .AND. denom3 /= 0.) THEN
projc4=ALOG( projc2/denom1 ) / denom3
! print *, ' The cone constant is : ',projc4
IF( projc4 < 0.) THEN
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2,/a)') &
' Warning in SETMAPR for Lambert Projection', &
' For the true latitudes provided, ', &
trulat(1),' and ',trulat(2), &
' projection must be from opposite pole...changing pole.'
jpole=-jpole
projc3=TAN(d2rad*(45.-0.5*jpole*trulat(1)) )
denom2=TAN(d2rad*(45.-0.5*jpole*trulat(2)))
IF(denom2 /= 0.) THEN
denom3=ALOG( projc3/denom2 )
ELSE
denom3=0.
END IF
IF(denom1 /= 0 .AND. denom3 /= 0.) THEN
projc4=ALOG( projc2/denom1 ) / denom3
! print *, ' The revised cone constant is : ',projc4
ELSE
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
' Error (1) in SETMAPR for Lambert Projection', &
' Illegal combination of trulats one: ', &
trulat(1),' and two: ',trulat(2)
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& trulat",1)
END IF
END IF
projc1=scale*eradius/projc4
ELSE IF(denom3 == 0. .AND. denom2 /= 0.) THEN ! tangent
! IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
! ' Using Tangent Lambert Projection', &
! ' Based on input combination of trulats one: ', &
! trulat(1),' and two: ',trulat(2)
projc4=SIN(d2rad*jpole*trulat(1))
! print *, ' The cone constant is : ',projc4
IF( projc4 < 0.) THEN
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2,/a)') &
' Warning in SETMAPR for Lambert Projection', &
' For the true latitudes provided, ', &
trulat(1),' and ',trulat(2), &
' projection must be from opposite pole...changing pole.'
jpole=-jpole
projc4=SIN(d2rad*jpole*trulat(1))
END IF
projc1=scale*eradius/projc4
ELSE
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
' Error (1) in SETMAPR for Lambert Projection', &
' Illegal combination of trulats one: ', &
trulat(1),' and two: ',trulat(2)
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& trulat Lambert Projection",1)
END IF
IF(jpole > 0) THEN
! IF (myproc == 0) WRITE(6,'(a/,a)') &
! ' Map projection set to Lambert Conformal', &
! ' X origin, Y origin set to 0.,0. at the North Pole.'
ELSE
IF (myproc == 0) WRITE(6,'(a/,a)') &
' Map projection set to Lambert Conformal', &
' X origin, Y origin set to 0.,0. at the South Pole.'
END IF
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 3 ) THEN
trulat(1)=latnot(1)
rota=orient
scmap=scale
projc1=scale*eradius
projc2=COS(d2rad*trulat(1))
projc3=projc1*projc2
IF(projc2 <= 0.) THEN
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
' Error (1) in SETMAPR for Mercator Projection', &
' Illegal true latitude provided: ',trulat(1)
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& trulat Mercator Projection",1)
END IF
IF (myproc == 0) WRITE(6,'(a/,a,f6.1/,a)') &
' Map projection set to Mercator', &
' X origin, Y origin set to 0.,0. at the equator,',rota, &
' Y positive toward the North Pole.'
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 4 ) THEN
trulat(1)=latnot(1)
rota=orient
scmap=scale
projc1=scale*eradius
projc2=COS(d2rad*trulat(1))
IF(projc2 <= 0.) THEN
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
' Error (1) in SETMAPR for Lat,Lon Projection', &
' Illegal true latitude provided: ',trulat(1)
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& trulat illegal lat-lon Projection",1)
END IF
projc3=projc1*projc2/d2rad
IF (myproc == 0) WRITE(6,'(a/,a,/a)') &
' Map projection set to Lat, Lon', &
' X origin, Y origin set to 0.,0. at the equator, 0. long', &
' Y positive toward the North Pole.'
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For a 512 km box
! at a latitude of 75 it is off by 0.8 km
! 70 0.4 km
! 65 0.3 km
! 55 0.1 km
! 45 0.05 km
! 35 0.02 km
! 0 0.01 km
! at the corners of the box.
!
! For this projection:
! projc1 = lat0
! projc2 = COS(d2rad*lat0)
! projc3 = lon0
! projc4 = d2rad*scale*eradius ! deg_to_km
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
trulat(1)=latnot(1)
rota=orient
scmap=scale
projc1 = trulat(1)
projc2 = COS(d2rad*trulat(1))
projc3 = orient
projc4 = d2rad*scale*eradius ! deg_to_km
IF(trulat(1) <= 0.) THEN
IF (myproc == 0) WRITE(6,'(a/,a,f9.2,a,f9.2)') &
' Error (1) in SETMAPR for Lat,Lon Projection', &
' Illegal true latitude provided: ',trulat(1)
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& trulat illegal lat-lon Projection-2",1)
END IF
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') iproj,' projection is not supported'
CALL arpsstop
("arpsstop called from SETMAPR problems with &
& iproj",1)
END IF
RETURN
END SUBROUTINE setmapr
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GETMAPR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE getmapr(iproj,scale,latnot,orient,x0,y0) 13
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Get the constants for the current map projection, which are stored
! in the common block named /projcst/.
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 9/17/94.
!
! MODIFICATION HISTORY:
! 1/17/96 Corrected retrieval of iproj to assign sign from jpole.
!
!-----------------------------------------------------------------------
!
! OUTPUT:
!
! iproj Map projection number
! 1=North Polar Stereographic (-1 South Pole)
! 2=Northern Lambert Conformal (-2 Southern)
! 3=Mercator
! 4=Lat,Lon
!
! scale Map scale factor, at latitude=latnot
! Distance on map = (Distance on earth) * scale
! For ARPS model runs, generally this is 1.0
! For ARPS plotting this will depend on window
! size and the area to be plotted.
!
! latnot(2) Real "True" latitude(s) of map projection
! (degrees, positive north)
! Except for iproj=2, only latnot(1) is used
!
! orient Longitude line that runs vertically on the map.
! (degrees, negative west, positive east)
!
! x0 x coordinate of origin
! y0 y coordinate of origin
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: iproj ! map projection number
REAL :: scale ! map scale factor
REAL :: latnot(2) ! true latitude (degrees N)
REAL :: orient ! orientation longitude (degrees E)
REAL :: x0 ! x coordinate of origin
REAL :: y0 ! y coordinate of origin
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
iproj=jproj*jpole
scale=scmap
latnot(1)=trulat(1)
latnot(2)=trulat(2)
orient=rota
x0=xorig
y0=yorig
RETURN
END SUBROUTINE getmapr
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SETORIG ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE setorig(iopt,x0,y0) 40,3
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set the origin for the map projection.
! This is call after subroutine mapproj if the origin
! must be moved from the original position, which is the
! pole for the polar stereographic projection and the
! Lambert conformal, and the equator for Mercator.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/20/93.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! iopt origin setting option
! 1: origin given in corrdinate x,y
! 2: origin given in lat,lon on earth
!
! x0 first coordinate of origin
! y0 second coordinate of origin
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: iopt ! origin setting option
REAL :: x0 ! first coordinate of origin
REAL :: y0 ! second coordinate of origin
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: xnew,ynew,rlat,rlon
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! iopt=1 origin is given in x,y in absolute coordinates.
!
!-----------------------------------------------------------------------
!
IF( iopt == 1 ) THEN
xorig=x0
yorig=y0
CALL xytoll
(1,1,0.,0.,rlat,rlon)
! write(6,'(/a,f18.2,f18.2,/a,f16.2,f16.2/)')
! : ' Coordinate origin set to absolute x,y =',xorig,yorig,
! : ' Latitude, longitude= ',rlat,rlon
!
!-----------------------------------------------------------------------
!
! iopt=2 origin is given in lat,lon on earth
!
!-----------------------------------------------------------------------
!
!
ELSE IF( iopt == 2 ) THEN
xorig=0.
yorig=0.
CALL lltoxy
(1,1,x0,y0,xnew,ynew)
xorig=xnew
yorig=ynew
! write(6,'(/a,f16.2,f16.2,/a,f16.2,f16.2/)')
! : ' Coordinate origin set to absolute x,y =',xorig,yorig,
! : ' Latitude, longitude= ',x0,y0
ELSE
CALL xytoll
(1,1,0.,0.,rlat,rlon)
IF (myproc == 0) WRITE(6,'(/a,i4,a,/a,f16.2,f16.2,/a,f16.2,f16.2)') &
' Setorig option ',iopt,' not supported.', &
' Coordinate origin unchanged at x,y =',xorig,yorig, &
' Latitude, longitude= ',rlat,rlon
END IF
RETURN
END SUBROUTINE setorig
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE XYTOLL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE xytoll(idim,jdim,x,y,rlat,rlon) 77,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Determine latitude and longitude given X,Y coordinates on
! map projection. SETMAPR must be called before this routine
! to set-up the map projection constants.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/13/93.
!
! MODIFICATION HISTORY:
! 01/17/96 Bug in southern hemisphere for Polar Stereo and
! Mercator projections fixed.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Number of points in x direction.
! jdim Number of points in y direction.
!
! rlat Array of latitude.
! (degrees, negative south, positive north)
!
! rlon Array of longitude.
! (degrees, negative west, positive east)
!
! OUTPUT:
!
! x Vector of x in map coordinates
! y Vector of y in map coordinates
! Units are meters unless the scale parameter is
! not equal to 1.0
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim
REAL :: x(idim),y(jdim),rlat(idim,jdim),rlon(idim,jdim)
!wdt update
REAL :: d2rad,r2deg,eradius
PARAMETER (d2rad=3.141592654/180., r2deg=180./3.141592654, &
eradius = 6371000. ) ! mean earth radius in m
!
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: xabs,yabs,yjp
REAL :: radius,ratio,dlon
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF ( jproj == 0 ) THEN
ratio=r2deg/eradius
DO j = 1, jdim
DO i = 1, idim
rlat(i,j) = ratio*(y(j)+yorig)
rlon(i,j) = ratio*(x(i)+xorig)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
yabs=y(j)+yorig
xabs=x(i)+xorig
radius=SQRT( xabs*xabs + yabs*yabs )/projc3
rlat(i,j) = jpole*(90. - 2.*r2deg*ATAN(radius))
rlat(i,j)=AMIN1(rlat(i,j), 90.)
rlat(i,j)=AMAX1(rlat(i,j),-90.)
IF((jpole*yabs) > 0.) THEN
dlon=180. + r2deg*ATAN(-xabs/yabs)
ELSE IF((jpole*yabs) < 0.) THEN
dlon=r2deg*ATAN(-xabs/yabs)
ELSE IF (xabs > 0.) THEN ! y=0.
dlon=90.
ELSE
dlon=-90.
END IF
rlon(i,j)= rota + jpole*dlon
IF(rlon(i,j) > 180) rlon(i,j)=rlon(i,j)-360.
IF(rlon(i,j) < -180) rlon(i,j)=rlon(i,j)+360.
rlon(i,j)=AMIN1(rlon(i,j), 180.)
rlon(i,j)=AMAX1(rlon(i,j),-180.)
!
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF ( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
yabs=y(j)+yorig
xabs=x(i)+xorig
radius=SQRT( xabs*xabs+ yabs*yabs )
ratio=projc3*((radius/(projc1*projc2))**(1./projc4))
rlat(i,j)=jpole*(90. -2.*r2deg*(ATAN(ratio)))
rlat(i,j)=AMIN1(rlat(i,j), 90.)
rlat(i,j)=AMAX1(rlat(i,j),-90.)
yjp=jpole*yabs
IF(yjp > 0.) THEN
dlon=180. + r2deg*ATAN(-xabs/yabs)/projc4
ELSE IF(yjp < 0.) THEN
dlon=r2deg*ATAN(-xabs/yabs)/projc4
ELSE IF (xabs > 0.) THEN ! y=0.
dlon=90./projc4
ELSE
dlon=-90./projc4
END IF
rlon(i,j)= rota + jpole*dlon
IF(rlon(i,j) > 180) rlon(i,j)=rlon(i,j)-360.
IF(rlon(i,j) < -180) rlon(i,j)=rlon(i,j)+360.
rlon(i,j)=AMIN1(rlon(i,j), 180.)
rlon(i,j)=AMAX1(rlon(i,j),-180.)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 3 ) THEN
DO j=1,jdim
DO i=1,idim
yabs=y(j)+yorig
xabs=x(i)+xorig
rlat(i,j)=(90. - 2.*r2deg*ATAN(EXP(-yabs/projc3)))
rlat(i,j)=AMIN1(rlat(i,j), 90.)
rlat(i,j)=AMAX1(rlat(i,j),-90.)
dlon=r2deg*(xabs/projc3)
rlon(i,j)=rota + dlon
IF(rlon(i,j) > 180) rlon(i,j)=rlon(i,j)-360.
IF(rlon(i,j) < -180) rlon(i,j)=rlon(i,j)+360.
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 4 ) THEN
DO j=1,jdim
DO i=1,idim
rlon(i,j)=x(i)+xorig
rlat(i,j)=y(j)+yorig
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 = lat0
! projc2 = COS(d2rad*lat0)
! projc3 = lon0
! projc4 = d2rad*scale*eradius ! deg_to_km
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
DO j=1,jdim
DO i=1,idim
yabs = y(j) + yorig
xabs = x(i) + xorig
rlat(i,j) = projc1 + yabs/projc4
rlat(i,j) = AMIN1(rlat(i,j), 90.)
rlat(i,j) = AMAX1(rlat(i,j),-90.)
rlon(i,j) = xabs/projc4/(0.5*(projc2+COS(rlat(i,j)*d2rad))) + projc3
IF(rlon(i,j) > 180) rlon(i,j)=rlon(i,j)-360.
IF(rlon(i,j) < -180) rlon(i,j)=rlon(i,j)+360.
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
("arpsstop called from XYTOLL problems with &
& jproj",1)
END IF
RETURN
END SUBROUTINE xytoll
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE LLTOXY ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE lltoxy(idim,jdim,rlat,rlon,xloc,yloc) 79,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Determine x, y coordinates on map projection from the given latitude
! and longitude. SETMAPR must be called before this routine to set-up
! the map projection constants.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/11/93.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Array dimension in x direction
! jdim Array dimension in y direction
!
! rlat Real vector of latitude.
! (degrees, negative south, positive north)
!
! rlon Real vector of longitude.
! (degrees, negative west, positive east)
!
! OUTPUT:
!
! xloc Real vector of x in map coordinates
! yloc Real vector of y in map coordinates
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim
REAL :: rlat(idim,jdim),rlon(idim,jdim)
REAL :: xloc(idim,jdim),yloc(idim,jdim)
REAL :: d2rad,eradius
PARAMETER (d2rad=3.141592654/180., &
eradius = 6371000. ) ! mean earth radius in m
INTEGER :: jproj,jpole
REAL :: tem, lat
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: radius,denom,dlon,ratio
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
ratio=d2rad*eradius
DO j = 1, jdim
DO i = 1, idim
xloc(i,j) = ratio*rlon(i,j) - xorig
yloc(i,j) = ratio*rlat(i,j) - yorig
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
denom=(1. + SIN(d2rad*jpole*rlat(i,j)))
IF(denom == 0.) denom=1.0E-10
radius=jpole*projc3*COS(d2rad*rlat(i,j))/denom
dlon=jpole*d2rad*(rlon(i,j)-rota)
xloc(i,j)= radius*SIN(dlon) - xorig
yloc(i,j)=-radius*COS(dlon) - yorig
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
!wdt update
! Handle opposite pole
IF (jpole*rlat(i,j) < -89.9) THEN
lat = -89.9 * jpole
ELSE
lat = rlat(i,j)
END IF
radius=projc1*projc2 &
*(TAN(d2rad*(45.-0.5*jpole*lat))/projc3)**projc4
tem = rlon(i,j)-rota
IF( tem < -180.0) tem = 360.0+tem
IF( tem > 180.0) tem = tem-360.0
dlon=projc4*d2rad*tem
xloc(i,j)= radius*SIN(dlon) - xorig
yloc(i,j)=-jpole*radius*COS(dlon) - yorig
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
DO i=1,idim
dlon=rlon(i,j)-rota
IF(dlon < -180.) dlon=dlon+360.
IF(dlon > 180.) dlon=dlon-360.
xloc(i,j)=projc3*d2rad*dlon - xorig
denom=TAN(d2rad*(45. - 0.5*rlat(i,j)))
IF( denom <= 0. ) denom=1.0E-10
yloc(i,j)=-projc3*ALOG(denom) - yorig
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
DO i=1,idim
xloc(i,j)=rlon(i,j)-xorig
yloc(i,j)=rlat(i,j)-yorig
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 = lat0
! projc2 = COS(d2rad*lat0)
! projc3 = lon0
! projc4 = d2rad*scale*eradius ! deg_to_km
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
DO j=1,jdim
DO i=1,idim
xloc(i,j) = projc4*(rlon(i,j) - projc3) &
* 0.5*(projc2 + COS(rlat(i,j)*d2rad)) - xorig
yloc(i,j) = projc4*(rlat(i,j) - projc1) - yorig
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
("arpsstop called from LLTOXY problems with &
& jproj not supported",1)
END IF
RETURN
END SUBROUTINE lltoxy
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE LATTOMF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE lattomf(idim,jdim,rlat,emfact),1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Determine the map scale factor, emfact, at a given latitude.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/11/93.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Array dimension in x direction
! jdim Array dimension in y direction
!
! rlat Real vector of latitudes.
! (degrees, negative south, positive north)
!
! OUTPUT:
!
! emfact Vector of map scale factors corresponding to the
! input latitudes (map scale includes the projection
! image scale times the overall scale of the map).
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim ! dimensions of arrays
REAL :: rlat(idim,jdim) ! latitude (degrees)
REAL :: emfact(idim,jdim) ! local map scale factor
REAL :: d2rad
PARAMETER (d2rad=3.141592654/180.)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: denom
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
DO j=1,jdim
DO i=1,idim
emfact(i,j)=1.0
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
denom=(1. + SIN(d2rad*jpole*rlat(i,j)))
IF(denom == 0.) denom=1.0E-10
emfact(i,j)=scmap*projc2/denom
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
denom=COS( d2rad*rlat(i,j) )
IF(denom < 1.0E-06) THEN
emfact(i,j)=1.0E+10
ELSE
emfact(i,j)=scmap*(projc2/denom) &
*(TAN(d2rad*(45.-0.5*jpole*rlat(i,j))) &
/projc3)**projc4
END IF
emfact(i,j)=AMAX1(emfact(i,j),1.0E-10)
emfact(i,j)=AMIN1(emfact(i,j),1.0E+10)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
DO i=1,idim
denom=COS( d2rad*rlat(i,j) )
IF(denom == 0.) denom=1.0E-10
emfact(i,j)=projc2/denom
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
DO i=1,idim
denom=COS( d2rad*rlat(i,j) )
IF(denom == 0.) denom=1.0E-10
emfact(i,j)=projc3/denom
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
DO j=1,jdim
DO i=1,idim
emfact(i,j) = 1.0 ! WARNING: the actual map factor for this
! projection has not been determined.
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from LATTOMF problems with jproj',1)
END IF
RETURN
END SUBROUTINE lattomf
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE XYTOMF ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE xytomf(idim,jdim,x,y,emfact) 11,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Determine the map scale factor, emfact, given x,y in the projected
! space.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/11/93.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Array dimension in x direction.
! jdim Array dimension in y direction.
!
! x x coordinate values (meters if scmap=1.0)
! y y coordinate values (meters if scmap=1.0)
!
! OUTPUT:
!
! emfact Vector of map scale factors corresponding to the
! input x,y's.
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim ! array dimensions
REAL :: x(idim) ! x map coordinate
REAL :: y(jdim) ! y map coordinate
REAL :: emfact(idim,jdim) ! local map scale factor
REAL :: d2rad,r2deg
PARAMETER (d2rad=3.141592654/180., &
r2deg=180./3.141592654)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: xabs,yabs,rlat,ratio,radius,denom
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
IF( jproj == 0 ) THEN
DO j=1,jdim
DO i=1,idim
emfact(i,j)=1.0
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
xabs=x(i)+xorig
yabs=y(j)+yorig
radius=SQRT( xabs*xabs + yabs*yabs )/projc3
rlat = 90. - 2.*r2deg*ATAN(radius)
rlat=AMIN1(rlat, 90.)
rlat=AMAX1(rlat,-90.)
denom=(1. + SIN(d2rad*rlat))
IF(denom == 0.) denom=1.0E-10
emfact(i,j)=scmap*projc2/denom
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
xabs=x(i)+xorig
yabs=y(j)+yorig
radius=SQRT( xabs*xabs+ yabs*yabs )
ratio=projc3*((radius/(projc1*projc2))**(1./projc4))
rlat=90. -2.*r2deg*(ATAN(ratio))
rlat=AMIN1(rlat, 90.)
rlat=AMAX1(rlat,-90.)
denom=COS( d2rad*rlat )
IF(denom == 0.) denom=1.0E-10
emfact(i,j)=scmap*(projc2/denom) &
*(TAN(d2rad*(45.-0.5*rlat))/projc3)**projc4
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
yabs=y(j)+yorig
rlat=90. - 2.*r2deg*ATAN(EXP(-yabs/projc3))
rlat=AMIN1(rlat, 90.)
rlat=AMAX1(rlat,-90.)
denom=COS( d2rad*rlat )
IF(denom == 0.) denom=1.0E-10
DO i=1,idim
emfact(i,j)=projc2/denom
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
yabs=y(j)+yorig
denom=COS( d2rad*yabs )
IF(denom == 0.) denom=1.0E-10
DO i=1,idim
emfact(i,j)=projc3/denom
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
DO j=1,jdim
DO i=1,idim
emfact(i,j) = 1.0 ! WARNING: the actual map factor for this
! projection has not been determined.
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from XYTOMF problems with jproj',1)
END IF
RETURN
END SUBROUTINE xytomf
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE DDROTUV ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE ddrotuv(nsta,stalon,dd,ff,ddrot,umap,vmap) 7,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Rotate wind from earth direction to map orientation.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/20/93.
!
! MODIFICATION HISTORY:
! 03/30/95 (K. Brewster)
! Removed the map scale factor from the conversion of winds
! from u,v on the earth to projection u,v. Affected argument
! list of ddrotuv.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nsta array dimension
!
! stalon longitude (degrees E)
!
! dd wind direction (degrees from north)
! ff wind speed
!
! OUTPUT:
!
! ddrot wind direction rotated to map orientation
!
! umap u wind component on map (same units as ff)
! vmap v wind component on map (same units as ff)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: nsta ! array dimension
REAL :: stalon(nsta) ! longitude (degrees E)
REAL :: dd(nsta) ! wind direction
REAL :: ff(nsta) ! speed
REAL :: ddrot(nsta) ! wind direction rotated to map orientation
REAL :: umap(nsta) ! u wind component on map
REAL :: vmap(nsta) ! v wind component on map
REAL :: d2rad,r2deg
PARAMETER (d2rad=3.141592654/180., &
r2deg=180./3.141592654)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i
REAL :: arg
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection.
! Just do conversion from ddff to u,v.
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
DO i=1,nsta
ddrot(i)=dd(i)
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO i=1,nsta
ddrot(i)=dd(i) + rota - stalon(i)
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO i=1,nsta
ddrot(i)=dd(i) + projc4*(rota - stalon(i))
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO i=1,nsta
ddrot(i)=dd(i)
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO i=1,nsta
ddrot(i)=dd(i)
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
DO i=1,nsta
! WARNING: this projection is not conformal. The following is only
! approximately correct.
ddrot(i)=dd(i)
arg = (ddrot(i) * d2rad)
umap(i) = -ff(i) * SIN(arg)
vmap(i) = -ff(i) * COS(arg)
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from DDROTUV problems with jproj',1)
END IF
RETURN
END SUBROUTINE ddrotuv
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE UVROTDD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE uvrotdd(idim,jdim,elon,umap,vmap,dd,ff) 3,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Convert winds u, v in map coordinates to wind direction and speed
! in earth coordinates.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 11/20/93.
!
! MODIFICATION HISTORY:
! 03/30/95 (K. Brewster)
! Removed the map scale factor from the conversion of winds
! from u,v on the earth to projection u,v. Affected argument
! list of uvrotdd.
!
!-----------------------------------------------------------------------
!
! INPUT:
! idim Array dimension in the x direction
! jdim Array dimension in the y direction
!
! elon Earth longitude (degrees E)
!
! umap u wind component on map
! vmap v wind component on map
!
! OUTPUT:
! dd wind direction on earth
! ff wind speed on earth
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim ! array dimensions
REAL :: elon(idim,jdim) ! longitude (degrees E)
REAL :: umap(idim,jdim) ! u wind component on map
REAL :: vmap(idim,jdim) ! v wind component on map
REAL :: dd(idim,jdim) ! direction
REAL :: ff(idim,jdim) ! wind speed
REAL :: d2rad,r2deg
PARAMETER (d2rad=3.141592654/180., &
r2deg=180./3.141592654)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: dlon
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180.
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180. + elon(i,j) - rota
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180. + projc4*(elon(i,j) - rota)
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180.
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180.
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
! WARNING: this projection is not conformal. The following is only
! approximately correct.
DO j=1,jdim
DO i=1,idim
ff(i,j) = SQRT(umap(i,j)*umap(i,j) + vmap(i,j)*vmap(i,j))
IF(vmap(i,j) > 0.) THEN
dlon=r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(vmap(i,j) < 0.) THEN
dlon=180. + r2deg*ATAN(umap(i,j)/vmap(i,j))
ELSE IF(umap(i,j) >= 0.) THEN
dlon=90.
ELSE
dlon=-90.
END IF
dd(i,j)= dlon + 180.
dd(i,j)= dd(i,j)-360.*(nint(dd(i,j))/360)
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from UVROTDD problems with jproj',1)
END IF
RETURN
END SUBROUTINE uvrotdd
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE UVETOMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE uvetomp(idim,jdim,uear,vear,lon,umap,vmap) 3,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Transform u, v wind from earth coordinates to map coordinates.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 04/30/94.
!
! MODIFICATION HISTORY:
! 03/30/95 (K. Brewster)
! Removed the map scale factor from the conversion of winds
! from u,v on the earth to projection u,v. Affected argument
! list of uvetomp.
! 04/30/96 (KB)
! Streamlined the computation for iproj=1 and iproj=2.
! 12/11/96 (KB)
! Corrected a bug in the computation for iproj=1 and iproj=2.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Array dimension in the x direction
! jdim Array dimension in the y direction
!
! uear u (eastward) wind component on earth
! vear v (northwrd) wind component on earth
!
! lon earth longitude
!
! OUTPUT:
!
! umap u wind component on map
! vmap v wind component on map
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim ! array dimensions
REAL :: uear(idim,jdim) ! u (eastward) wind component on earth
REAL :: vear(idim,jdim) ! v (northward) wind component on earth
REAL :: lon(idim,jdim) ! longitude (degrees east)
REAL :: umap(idim,jdim) ! u wind component on map
REAL :: vmap(idim,jdim) ! v wind component on map
REAL :: d2rad,r2deg
PARAMETER (d2rad=3.141592654/180., &
r2deg=180./3.141592654)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: dlon,arg,dxdlon,dydlon,utmp,vtmp
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
DO j=1,jdim
DO i=1,idim
umap(i,j) = uear(i,j)
vmap(i,j) = vear(i,j)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
dlon=(lon(i,j)-rota)
arg=d2rad*dlon
dxdlon=COS(arg)
dydlon=SIN(arg)
utmp=uear(i,j)
vtmp=vear(i,j)
umap(i,j)=utmp*dxdlon - vtmp*dydlon
vmap(i,j)=vtmp*dxdlon + utmp*dydlon
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
DO j=1,jdim
DO i=1,idim
dlon=(lon(i,j)-rota)
arg=d2rad*projc4*(dlon - 360.*nint(dlon/360.))
dxdlon=COS(arg)
dydlon=SIN(arg)
utmp=uear(i,j)
vtmp=vear(i,j)
umap(i,j)=utmp*dxdlon - vtmp*dydlon
vmap(i,j)=vtmp*dxdlon + utmp*dydlon
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
DO i=1,idim
umap(i,j) = uear(i,j)
vmap(i,j) = vear(i,j)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
DO i=1,idim
umap(i,j) = uear(i,j)
vmap(i,j) = vear(i,j)
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
! WARNING: this projection is not conformal. The following is only
! approximately correct.
DO j=1,jdim
DO i=1,idim
umap(i,j) = uear(i,j)
vmap(i,j) = vear(i,j)
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from UVEROTDD problems with jproj',1)
END IF
RETURN
END SUBROUTINE uvetomp
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE UVMPTOE ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE uvmptoe(idim,jdim,umap,vmap,lon,uear,vear) 12,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Transform u, v wind from map coordinates to earth coordinates.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 04/30/94.
!
! MODIFICATION HISTORY:
! 03/30/95 (K. Brewster)
! Removed the map scale factor from the conversion of winds
! from u,v on the map to earth u,v. Affected argument
! list of uvmptoe.
! 04/30/96 (KB)
! Streamlined the computation for iproj=1 and iproj=2.
! 12/11/96 (KB)
! Corrected a bug in the computation for iproj=1 and iproj=2.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! idim Array dimension in x direction
! jdim Array dimension in y direction
!
! umap u wind component on map
! vmap v wind component on map
!
! lon Longitude (degrees E)
!
! OUTPUT:
!
! uear u (eastward) wind component on earth
! vear v (northward) wind component on earth
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: idim,jdim ! array dimensions
REAL :: lon(idim,jdim) ! longitude (degrees E)
REAL :: umap(idim,jdim) ! u wind component on map
REAL :: vmap(idim,jdim) ! v wind component on map
REAL :: uear(idim,jdim) ! u (eastward) wind component on earth
REAL :: vear(idim,jdim) ! v (northward) wind component on earth
REAL :: d2rad,r2deg
PARAMETER (d2rad=3.141592654/180., &
r2deg=180./3.141592654)
INTEGER :: jproj,jpole
REAL :: trulat(2),rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
COMMON /projcst/ jproj,jpole,trulat,rota,scmap,xorig,yorig, &
projc1,projc2,projc3,projc4,projc5
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
REAL :: dlon,arg,utmp,vtmp,dxdlon,dydlon
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! No map projection
!
!-----------------------------------------------------------------------
!
IF( jproj == 0 ) THEN
DO j=1,jdim
DO i=1,idim
uear(i,j) = umap(i,j)
vear(i,j) = vmap(i,j)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Polar Stereographic projection
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is the numerator of emfact, the map image scale factor.
! projc3 is projc2 times the scaled earth's radius.
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 1 ) THEN
DO j=1,jdim
DO i=1,idim
dlon=(lon(i,j)-rota)
arg=d2rad*dlon
dxdlon=COS(arg)
dydlon=SIN(arg)
utmp=umap(i,j)
vtmp=vmap(i,j)
uear(i,j)=utmp*dxdlon + vtmp*dydlon
vear(i,j)=vtmp*dxdlon - utmp*dydlon
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lambert Conformal Conic Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius/n
! projc2 is cos of trulat(1)
! projc3 is tan (45. - trulat/2) a const for local map scale
! projc4 is the cone constant, n
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 2 ) THEN
! uear(1,1)=-9.20149E+00
! vear(1,1)=-4.53746E+00
DO j=1,jdim
DO i=1,idim
dlon=(lon(i,j)-rota)
arg=d2rad*projc4*(dlon - 360.*nint(dlon/360.))
dxdlon=COS(arg)
dydlon=SIN(arg)
!2001-05-16 GMB: Having umap & uear (or vmap & vear) point to
!the same array causes numerical errors when optimizing.
uear(i,j) = umap(i,j)*dxdlon + vmap(i,j)*dydlon
vear(i,j) = vmap(i,j)*dxdlon - umap(i,j)*dydlon
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Mercator Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 3) THEN
DO j=1,jdim
DO i=1,idim
uear(i,j) = umap(i,j)
vear(i,j) = vmap(i,j)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Lat, Lon Projection.
! For this projection:
! projc1 is the scaled earth's radius, scale times eradius
! projc2 is cos of trulat(1)
! projc3 is projc1 times projc2 times 180/pi
!
!-----------------------------------------------------------------------
!
ELSE IF(jproj == 4) THEN
DO j=1,jdim
DO i=1,idim
uear(i,j) = umap(i,j)
vear(i,j) = vmap(i,j)
END DO
END DO
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
!wdt mapproj
!-----------------------------------------------------------------------
!
! Approximate flat earth projection (using approximate great circle to
! compute distances).
!
! For this projection:
! projc1 is 2 pi times scaled earth's radius divided by 360
! (i.e. degrees to km conversion factor)
! projc2 is projc1 * trulat(1) (i.e. -y0)
! projc3 is cos of trulat(1)
! projc4 is trulon
!
!-----------------------------------------------------------------------
!
ELSE IF( jproj == 5 ) THEN
! WARNING: this projection is not conformal. The following is only
! approximately correct.
DO j=1,jdim
DO i=1,idim
uear(i,j) = umap(i,j)
vear(i,j) = vmap(i,j)
END DO
END DO
ELSE
IF (myproc == 0) WRITE(6,'(i4,a)') jproj,' projection is not supported'
CALL arpsstop
('arpsstop called from UVMPTOE problems with jproj',1)
END IF
RETURN
END SUBROUTINE uvmptoe