source: LMDZ6/branches/LMDZ-COSP/libf/phylmd/pppmer.f90 @ 5898

Last change on this file since 5898 was 5842, checked in by rkazeroni, 3 months ago

For GPU porting of diag_slp routine:

  • Put routine into module (speeds up source-to-source transformation)
  • Add "horizontal" comment to specify possible names of horizontal variables
File size: 5.1 KB
Line 
1!$gpum horizontal kproma kprof
2MODULE pppmer_mod
3  PRIVATE
4
5  PUBLIC pppmer
6
7  CONTAINS
8
9SUBROUTINE PPPMER(KPROMA,KSTART,KPROF,PRPRESS,POROG,PTSTAR,PT0,PMSLPPP)
10
11!**** *PPPMER* - POST-PROCESS MSL PRESSURE.
12
13!     PURPOSE.
14!     --------
15!           COMPUTES MSL PRESSURE.
16
17!**   INTERFACE.
18!     ----------
19
20!        *CALL* *PPPMER(KPROMA,KSTART,KPROF,PRPRESS,POROG,PTSTAR,PT0,
21!    S                  PMSLPPP)
22
23!        EXPLICIT ARGUMENTS
24!        --------------------
25
26
27!        KPROMA                    - HORIZONTAL DIMENSION.             (INPUT)
28!        KSTART                    - START OF WORK.                    (INPUT)
29!        KPROF                     - DEPTH OF WORK.                    (INPUT)
30!        PRPRESS(KPROMA)           - SURFACE PRESSURE                  (INPUT)
31!        POROG(KPROMA)             - MODEL OROGRAPHY.                  (INPUT)
32!        PTSTAR(KPROMA)            - SURFACE TEMPERATURE               (INPUT)
33!        PT0(KPROMA)               - STANDARD SURFACE TEMPERATURE      (INPUT)
34!        PMSLPPP(KPROMA)           - POST-PROCESSED MSL PRESSURE       (OUTPUT)
35!        IMPLICIT ARGUMENTS :  CONSTANTS FROM YOMCST,YOMGEM,YOMSTA.
36!        --------------------
37
38!     METHOD.
39!     -------
40!        SEE DOCUMENTATION
41
42!     EXTERNALS.  NONE
43!     ----------
44
45!     REFERENCE.
46!     ----------
47!        ECMWF Research Department documentation of the IFS
48
49!     AUTHOR.
50!     -------
51!        MATS HAMRUD AND PHILIPPE COURTIER  *ECMWF*
52
53!     MODIFICATIONS.
54!     --------------
55!        ORIGINAL : 89-01-26
56
57!     E. A-son, J-F Geleyn 920409 Mod. T*, T0 and alpha below surface.
58!        M.Hamrud      01-Oct-2003 CY28 Cleaning
59
60!     ------------------------------------------------------------------
61
62! USE PARKIND1
63!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/xrd/module/parkind1.F90.php#parkind1>  ,ONLY : JPIM     ,JPRB
64! USE YOMHOOK
65!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/xrd/module/yomhook.F90.php#yomhook>   ,ONLY : LHOOK,   DR_HOOK
66
67!USE YOMCST, ONLY : RG, RD
68!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/arp/module/yomcst.F90.php#yomcst>   , ONLY : RG
69
70!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/xrd/support/rg.F.php#rg>       ,RD
71! USE YOMSTA
72!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/arp/module/yomsta.F90.php#yomsta>   , ONLY : RDTDZ1
73
74  USE yomcst_mod_h
75IMPLICIT NONE
76
77
78!IM INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA
79!IM INTEGER(KIND=JPIM),INTENT(IN)    :: KSTART
80!IM INTEGER(KIND=JPIM),INTENT(IN)    :: KPROF
81 INTEGER,INTENT(IN)    :: KPROMA
82 INTEGER,INTENT(IN)    :: KSTART
83 INTEGER,INTENT(IN)    :: KPROF
84!IM REAL(KIND=JPRB)   ,INTENT(IN)    :: PRPRESS(KPROMA)
85!IM REAL(KIND=JPRB)   ,INTENT(IN)    :: POROG(KPROMA)
86!IM REAL(KIND=JPRB)   ,INTENT(IN)    :: PTSTAR(KPROMA)
87!IM REAL(KIND=JPRB)   ,INTENT(IN)    :: PT0(KPROMA)
88!IM REAL(KIND=JPRB)   ,INTENT(OUT)   :: PMSLPPP(KPROMA)
89!IM REAL(KIND=JPRB) :: ZTSTAR(KPROMA)
90!IM REAL(KIND=JPRB) :: ZALPHA(KPROMA)
91 REAL,INTENT(IN)    :: PRPRESS(KPROMA)
92 REAL,INTENT(IN)    :: POROG(KPROMA)
93 REAL,INTENT(IN)    :: PTSTAR(KPROMA)
94 REAL,INTENT(IN)    :: PT0(KPROMA)
95 REAL,INTENT(OUT)   :: PMSLPPP(KPROMA)
96 REAL :: ZTSTAR(KPROMA)
97 REAL :: ZALPHA(KPROMA)
98
99!IM INTEGER(KIND=JPIM) :: JL
100 INTEGER :: JL
101
102!IM REAL(KIND=JPRB) :: ZDTDZSG, ZOROG, ZT0, ZTX, ZTY, ZX, ZY, ZY2
103!IM REAL(KIND=JPRB) :: ZHOOK_HANDLE
104 REAL :: ZDTDZSG, ZOROG, ZT0, ZTX, ZTY, ZX, ZY, ZY2
105 REAL :: ZHOOK_HANDLE
106!IM beg
107REAL, PARAMETER                  :: RDTDZ1=-0.0065 !or USE YOMSTA
108!IM end
109
110!     ------------------------------------------------------------------
111
112!*       1.    POST-PROCESS MSL PRESSURE.
113!              --------------------------
114
115!*       1.1   COMPUTATION OF MODIFIED ALPHA AND TSTAR.
116
117!IM IF (LHOOK) CALL DR_HOOK('PPPMER',0,ZHOOK_HANDLE)
118!IM ZTX=290.5_JPRB
119!IM ZTY=255.0_JPRB
120 ZTX=290.5
121 ZTY=255.0
122 ZDTDZSG=-RDTDZ1/RG
123!<http://intra.cnrm.meteo.fr/eac/ARPCLI5.2/doci/code/arpcli5.2/xrd/support/rg.F.php#rg>
124 DO JL=KSTART,KPROF
125
126   IF(PTSTAR(JL) < ZTY) THEN
127!IM  ZTSTAR(JL)=0.5_JPRB*(ZTY+PTSTAR(JL))
128     ZTSTAR(JL)=0.5*(ZTY+PTSTAR(JL))
129   ELSEIF(PTSTAR(JL) < ZTX) THEN
130     ZTSTAR(JL)=PTSTAR(JL)
131   ELSE
132!IM    ZTSTAR(JL)=0.5_JPRB*(ZTX+PTSTAR(JL))
133     ZTSTAR(JL)=0.5*(ZTX+PTSTAR(JL))
134   ENDIF
135
136   ZT0=ZTSTAR(JL)+ZDTDZSG*POROG(JL)
137   IF(ZTX > ZTSTAR(JL) .AND. ZT0 > ZTX) THEN
138     ZT0=ZTX
139   ELSEIF(ZTX <= ZTSTAR(JL) .AND. ZT0 > ZTSTAR(JL)) THEN
140     ZT0=ZTSTAR(JL)
141   ELSE
142     ZT0=PT0(JL)
143   ENDIF
144
145!IM  ZOROG=SIGN(MAX(1.0_JPRB,ABS(POROG(JL))),POROG(JL))
146   ZOROG=SIGN(MAX(1.0,ABS(POROG(JL))),POROG(JL))
147   ZALPHA(JL)=RD*(ZT0-ZTSTAR(JL))/ZOROG
148 ENDDO
149
150!*       1.2   COMPUTATION OF MSL PRESSURE.
151
152 DO JL=KSTART,KPROF
153!IM  IF (ABS(POROG(JL)) >= 0.001_JPRB) THEN
154   IF (ABS(POROG(JL)) >= 0.001) THEN
155     ZX=POROG(JL)/(RD*ZTSTAR(JL))
156     ZY=ZALPHA(JL)*ZX
157     ZY2=ZY*ZY
158
159!IM    PMSLPPP(JL)=PRPRESS(JL)*EXP(ZX*(1.0_JPRB-0.5_JPRB*ZY+1.0_JPRB/3._JPRB*ZY2))
160     PMSLPPP(JL)=PRPRESS(JL)*EXP(ZX*(1.0-0.5*ZY+1.0/3.*ZY2))
161   ELSE
162     PMSLPPP(JL)=PRPRESS(JL)
163   ENDIF
164 ENDDO
165
166
167!     ------------------------------------------------------------------
168
169!IM IF (LHOOK) CALL DR_HOOK('PPPMER',1,ZHOOK_HANDLE)
170 END SUBROUTINE PPPMER
171
172END MODULE pppmer_mod
Note: See TracBrowser for help on using the repository browser.