source: trunk/LMDZ.MARS/libf/phymars/gwprofil_mod.F @ 2090

Last change on this file since 2090 was 1913, checked in by emillour, 7 years ago

Mars GCM:

  • Forgotten in previous commit: gwprofil.F -> gwprofil_mod.F (here also the

size of an argument, rho, was incorrect in caller orodrag).

  • Turned newsedim.F into a module newsedim_mod.F
  • Adapted co2cloud.F and improvedCO2clouds.F to not use "newunit" to open file

(it is perfectly legitimate F2008 Fortran, but older compiler such as gfortran
on local LMD machines are not there yet).
EM

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