SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
regrot_lonlat_rot.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #################################################################################
6 SUBROUTINE regrot_lonlat_rot(PXREG,PYREG,PXROT,PYROT,KXDIM,KYDIM,KX,KY, &
7  pxcen,pycen,kcall)
8 ! #################################################################################
9 !
10 !! PURPOSE
11 !! -------
12 !!
13 !! CONVERSION BETWEEN REGULAR AND ROTATED SPHERICAL COORDINATES.
14 !!
15 !! PXREG LONGITUDES OF THE REGULAR COORDINATES
16 !! PYREG LATITUDES OF THE REGULAR COORDINATES
17 !! PXROT LONGITUDES OF THE ROTATED COORDINATES
18 !! PYROT LATITUDES OF THE ROTATED COORDINATES
19 !! ALL COORDINATES GIVEN IN DEGREES N (NEGATIVE FOR S)
20 !! AND DEGREES E (NEGATIVE VALUES FOR W)
21 !! KXDIM DIMENSION OF THE GRIDPOINT FIELDS IN THE X-DIRECTION
22 !! KYDIM DIMENSION OF THE GRIDPOINT FIELDS IN THE Y-DIRECTION
23 !! KX NUMBER OF GRIDPOINT IN THE X-DIRECTION
24 !! KY NUMBER OF GRIDPOINTS IN THE Y-DIRECTION
25 !! PXCEN REGULAR LONGITUDE OF THE SOUTH POLE OF THE ROTATED GRID
26 !! PYCEN REGULAR LATITUDE OF THE SOUTH POLE OF THE ROTATED GRID
27 !!
28 !! KCALL=-1: FIND REGULAR AS FUNCTIONS OF ROTATED COORDINATES.
29 !! KCALL= 1: FIND ROTATED AS FUNCTIONS OF REGULAR COORDINATES.
30 !!
31 !!
32 !!** METHOD
33 !! ------
34 !!
35 !! REFERENCE
36 !! ---------
37 !!
38 !! J.E. HAUGEN HIRLAM JUNE -92
39 !!
40 !! AUTHOR
41 !! ------
42 !! U. Andrae
43 !!
44 !! MODIFICATIONS
45 !! -------------
46 !! Original 10/2007
47 !!------------------------------------------------------------------
48 !
49 USE yomhook ,ONLY : lhook, dr_hook
50 USE parkind1 ,ONLY : jprb
51 IMPLICIT NONE
52 
53 !
54 !-----------------------------------------------------------------------
55 !
56 INTEGER kxdim,kydim,kx,ky,kcall
57 REAL pxreg(kxdim,kydim),pyreg(kxdim,kydim), &
58  pxrot(kxdim,kydim),pyrot(kxdim,kydim), &
59  pxcen,pycen
60 !
61 !-----------------------------------------------------------------------
62 !
63 REAL pi,zrad,zsycen,zcycen,zxmxc,zsxmxc,zcxmxc,zsyreg,zcyreg, &
64  zsyrot,zcyrot,zcxrot,zsxrot,zradi
65 INTEGER jy,jx
66 REAL(KIND=JPRB) :: zhook_handle
67 !
68 !-----------------------------------------------------------------------
69 !
70 IF (lhook) CALL dr_hook('REGROT_LONLAT_ROT',0,zhook_handle)
71 pi = 4.*atan(1.)
72 zrad = pi/180.
73 zradi = 1./zrad
74 zsycen = sin(zrad*(pycen+90.))
75 zcycen = cos(zrad*(pycen+90.))
76 !
77 IF (kcall.EQ.1) THEN
78 !
79  DO jy = 1,ky
80  DO jx = 1,kx
81 !
82  zxmxc = zrad*(pxreg(jx,jy) - pxcen)
83  zsxmxc = sin(zxmxc)
84  zcxmxc = cos(zxmxc)
85  zsyreg = sin(zrad*pyreg(jx,jy))
86  zcyreg = cos(zrad*pyreg(jx,jy))
87  zsyrot = zcycen*zsyreg - zsycen*zcyreg*zcxmxc
88  zsyrot = max(zsyrot,-1.0)
89  zsyrot = min(zsyrot,+1.0)
90 !
91  pyrot(jx,jy) = asin(zsyrot)*zradi
92 !
93  zcyrot = cos(pyrot(jx,jy)*zrad)
94  zcxrot = (zcycen*zcyreg*zcxmxc + &
95  zsycen*zsyreg)/zcyrot
96  zcxrot = max(zcxrot,-1.0)
97  zcxrot = min(zcxrot,+1.0)
98  zsxrot = zcyreg*zsxmxc/zcyrot
99 !
100  pxrot(jx,jy) = acos(zcxrot)*zradi
101 !
102  IF (zsxrot.LT.0.0) pxrot(jx,jy) = -pxrot(jx,jy)
103 !
104  ENDDO
105  ENDDO
106 !
107 ELSEIF (kcall.EQ.-1) THEN
108 !
109  DO jy = 1,ky
110  DO jx = 1,kx
111 !
112  zsxrot = sin(zrad*pxrot(jx,jy))
113  zcxrot = cos(zrad*pxrot(jx,jy))
114  zsyrot = sin(zrad*pyrot(jx,jy))
115  zcyrot = cos(zrad*pyrot(jx,jy))
116  zsyreg = zcycen*zsyrot + zsycen*zcyrot*zcxrot
117  zsyreg = max(zsyreg,-1.0)
118  zsyreg = min(zsyreg,+1.0)
119 !
120  pyreg(jx,jy) = asin(zsyreg)*zradi
121 !
122  zcyreg = cos(pyreg(jx,jy)*zrad)
123  zcxmxc = (zcycen*zcyrot*zcxrot - &
124  zsycen*zsyrot)/zcyreg
125  zcxmxc = max(zcxmxc,-1.0)
126  zcxmxc = min(zcxmxc,+1.0)
127  zsxmxc = zcyrot*zsxrot/zcyreg
128  zxmxc = acos(zcxmxc)*zradi
129  IF (zsxmxc.LT.0.0) zxmxc = -zxmxc
130 !
131  pxreg(jx,jy) = zxmxc + pxcen
132 !
133  ENDDO
134 ENDDO
135 !
136 ELSE
137  WRITE(6,'(1X,''INVALID KCALL IN REGROT_LONLAT_ROT'')')
138  CALL abort
139 ENDIF
140 IF (lhook) CALL dr_hook('REGROT_LONLAT_ROT',1,zhook_handle)
141 !
142 !-------------------------------------------------------------------------------------
143 END SUBROUTINE regrot_lonlat_rot
144 !
subroutine regrot_lonlat_rot(PXREG, PYREG, PXROT, PYROT, KXDIM, KYDIM, KX, KY, PXCEN, PYCEN, KCALL)