source: trunk/LMDZ.MARS/libf/phymars/gwprofil.F @ 1747

Last change on this file since 1747 was 1266, checked in by aslmd, 11 years ago

LMDZ.MARS
IMPORTANT CHANGE

  • Remove all reference/use of nlayermx and dimphys.h
  • Made use of automatic arrays whenever arrays are needed with dimension nlayer
  • Remove lots of obsolete reference to dimensions.h
  • Converted iono.h and param_v4.h into corresponding modules

(with embedded subroutine to allocate arrays)
(no arrays allocated if thermosphere not used)

  • Deleted param.h and put contents into module param_v4_h
  • Adapted testphys1d, newstart, etc...
  • Made DATA arrays in param_read to be initialized by subroutine

fill_data_thermos in module param_v4_h

  • Optimized computations in paramfoto_compact (twice less dlog10 calculations)
  • Checked consistency before/after modification in debug mode
  • Checked performance is not impacted (same as before)
File size: 5.5 KB
Line 
1      SUBROUTINE GWPROFIL
2     *         ( klon, klev
3     *         , kgwd ,kdx  , ktest
4     *         , KKCRIT, KKCRITH, KCRIT ,  kkenvh, kknu,kknu2
5     *         , PAPHM1, PRHO   , PSTAB , PTFR , PVPH , PRI , PTAU
6     *         , ptauf ,pdmod   , pnu   , psig ,pgamma, pvar      )
7
8C**** *GWPROFIL*
9C
10C     PURPOSE.
11C     --------
12C
13C**   INTERFACE.
14C     ----------
15C          FROM *GWDRAG*
16C
17C        EXPLICIT ARGUMENTS :
18C        --------------------
19C     ==== INPUTS ===
20C     ==== OUTPUTS ===
21C
22C        IMPLICIT ARGUMENTS :   NONE
23C        --------------------
24C
25C     METHOD:
26C     -------
27C     THE STRESS PROFILE FOR GRAVITY WAVES IS COMPUTED AS FOLLOWS:
28C     IT IS CONSTANT (NO GWD) AT THE LEVELS BETWEEN THE GROUND
29C     AND THE TOP OF THE BLOCKED LAYER (KKENVH).
30C     IT DECREASES LINEARLY WITH HEIGHTS FROM THE TOP OF THE
31C     BLOCKED LAYER TO 3*VAROR (kKNU), TO SIMULATES LEE WAVES OR
32C     NONLINEAR GRAVITY WAVE BREAKING.
33C     ABOVE IT IS CONSTANT, EXCEPT WHEN THE WAVE ENCOUNTERS A CRITICAL
34C     LEVEL (KCRIT) OR WHEN IT BREAKS.
35C     
36C
37C
38C     EXTERNALS.
39C     ----------
40C
41C
42C     REFERENCE.
43C     ----------
44C
45C        SEE ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE "I.F.S."
46C
47C     AUTHOR.
48C     -------
49C
50C     MODIFICATIONS.
51C     --------------
52C     PASSAGE OF THE NEW GWDRAG TO I.F.S. (F. LOTT, 22/11/93)
53C-----------------------------------------------------------------------
54      use dimradmars_mod, only: ndlo2
55      implicit none
56C
57
58C
59
60      integer klon,klev,kidia,kfdia
61#include "yoegwd.h"
62
63C-----------------------------------------------------------------------
64C
65C*       0.1   ARGUMENTS
66C              ---------
67C
68      integer kgwd
69      INTEGER KKCRIT(NDLO2),KKCRITH(NDLO2),KCRIT(NDLO2)
70     *       ,kdx(NDLO2),ktest(NDLO2)
71     *       ,kkenvh(NDLO2),kknu(NDLO2),kknu2(NDLO2)
72C
73      REAL PAPHM1(NDLO2,klev+1), PSTAB(NDLO2,klev+1),
74     *     PRHO  (NDLO2,klev+1), PVPH (NDLO2,klev+1),
75     *     PRI   (NDLO2,klev+1), PTFR (NDLO2), PTAU(NDLO2,klev+1),
76     *     ptauf (NDLO2,klev+1)
77     
78      REAL pdmod (NDLO2) , pnu (NDLO2) , psig(NDLO2),
79     *     pgamma(NDLO2) , pvar(NDLO2)
80     
81C-----------------------------------------------------------------------
82C
83C*       0.2   LOCAL ARRAYS
84C              ------------
85C
86c   declarations pour 'implicit none"
87      real zsqr,zalfa,zriw,zalpha,zb,zdel,zdz2n,zdelp,zdelpt
88
89      integer ji,jk,jl,ilevh
90      REAL ZDZ2 (NDLO2,klev) , ZNORM(NDLO2) , zoro(NDLO2)
91      REAL ZTAU (NDLO2,klev+1)
92C
93C-----------------------------------------------------------------------
94C
95C*         1.    INITIALIZATION
96C                --------------
97
98
99      kidia=1
100      kfdia=klon
101
102 100  CONTINUE
103C
104C
105C*    COMPUTATIONAL CONSTANTS.
106C     ------------- ----------
107C
108      ilevh=KLEV/3
109C
110      DO 400 ji=1,kgwd
111      jl=kdx(ji)
112      Zoro(JL)=Psig(JL)*Pdmod(JL)/4./max(pvar(jl),1.0)
113      ZTAU(JL,KKNU(JL)+1)=PTAU(JL,KKNU(JL)+1)
114      ZTAU(JL,KLEV+1)=PTAU(JL,KLEV+1)
115  400 CONTINUE
116C
117      DO 430 JK=KLEV,2,-1
118C
119C
120C*         4.1    CONSTANT WAVE STRESS UNTIL TOP OF THE
121C                 BLOCKING LAYER.
122  410 CONTINUE
123C
124      DO 411 ji=1,kgwd
125      jl=kdx(ji)
126           IF(JK.GE.KKNU2(JL)) THEN
127           PTAU(JL,JK)=ZTAU(JL,KLEV+1)
128           ENDIF
129 411  CONTINUE             
130C
131C*         4.15   CONSTANT SHEAR STRESS UNTIL THE TOP OF THE
132C                 LOW LEVEL FLOW LAYER.
133 415  CONTINUE
134C       
135C
136C*         4.2    WAVE DISPLACEMENT AT NEXT LEVEL.
137C
138  420 CONTINUE
139C
140      DO 421 ji=1,kgwd
141      jl=kdx(ji)
142      IF(JK.LT.KKNU2(JL)) THEN
143      ZNORM(JL)=gkdrag*PRHO(JL,JK)*SQRT(PSTAB(JL,JK))*PVPH(JL,JK)
144     *                                                    *zoro(jl)
145      ZDZ2(JL,JK)=PTAU(JL,JK+1)/max(ZNORM(JL),gssec)
146      ENDIF
147  421 CONTINUE
148C
149C*         4.3    WAVE RICHARDSON NUMBER, NEW WAVE DISPLACEMENT
150C*                AND STRESS:  BREAKING EVALUATION AND CRITICAL
151C                 LEVEL
152C
153      DO 431 ji=1,kgwd
154      jl=kdx(ji)
155          IF(JK.LT.KKNU2(JL)) THEN
156          IF((PTAU(JL,JK+1).LT.GTSEC).OR.(JK.LE.KCRIT(JL))) THEN
157            PTAU(JL,JK)=0.0
158          ELSE
159               ZSQR=SQRT(PRI(JL,JK))
160               ZALFA=SQRT(PSTAB(JL,JK)*ZDZ2(JL,JK))/PVPH(JL,JK)
161               ZRIW=PRI(JL,JK)*(1.-ZALFA)/(1+ZALFA*ZSQR)**2
162               IF(ZRIW.LT.GRCRIT) THEN
163                 ZDEL=4./ZSQR/GRCRIT+1./GRCRIT**2+4./GRCRIT
164                 ZB=1./GRCRIT+2./ZSQR
165                 ZALPHA=0.5*(-ZB+SQRT(ZDEL))
166                 ZDZ2N=(PVPH(JL,JK)*ZALPHA)**2/PSTAB(JL,JK)
167                 PTAU(JL,JK)=ZNORM(JL)*ZDZ2N
168               ELSE
169                 PTAU(JL,JK)=ZNORM(JL)*ZDZ2(JL,JK)
170               ENDIF
171            PTAU(JL,JK)=MIN(PTAU(JL,JK),PTAU(JL,JK+1))
172          ENDIF
173          ENDIF
174  431 CONTINUE
175 
176  430 CONTINUE
177  440 CONTINUE
178 
179c     write(*,*) 'ptau'
180c     write(*,99) ((ji,ilevh,ptau(ji,ilevh),ji=1,NDLO2),
181c    .                  ilevh=1,klev+1)
182 99   FORMAT(i3,i3,f15.5)
183
184
185C  REORGANISATION OF THE STRESS PROFILE
186C  IF BREAKING OCCURS AT LOW LEVEL:
187
188      DO 530 ji=1,kgwd
189      jl=kdx(ji)
190      ZTAU(JL,KKENVH(JL))=PTAU(JL,KKENVH(JL))
191      ZTAU(JL,KKCRITH(JL))=PTAU(JL,KKCRITH(JL))
192 530  CONTINUE     
193
194      DO 531 JK=1,KLEV
195     
196      DO 532 ji=1,kgwd
197      jl=kdx(ji)
198               
199         IF(JK.GT.KKCRITH(JL).AND.JK.LT.KKENVH(JL))THEN
200
201          ZDELP=PAPHM1(JL,JK)-PAPHM1(JL,KKENVH(JL))
202          ZDELPT=PAPHM1(JL,KKCRITH(JL))-PAPHM1(JL,KKENVH(JL))
203          PTAU(JL,JK)=ZTAU(JL,KKENVH(JL)) +
204     .                (ZTAU(JL,KKCRITH(JL))-ZTAU(JL,KKENVH(JL)) )*
205     .                ZDELP/ZDELPT
206     
207        ENDIF
208           
209 532  CONTINUE   
210 
211 531  CONTINUE       
212
213      RETURN
214      END
Note: See TracBrowser for help on using the repository browser.