source: trunk/LMDZ.MARS/libf/phymars/drag_noro_mod.F @ 2141

Last change on this file since 2141 was 1912, checked in by emillour, 7 years ago

Mars GCM:
Tidying the gravity wave routines by turning them into modules:
orodrag.F -> orodrag_mod.F : note that the declared size of pvar(), which is
used in call to gwstress was wrong.
calldrag_noro.F -> calldrag_noro_mod.F
drag_noro.F -> drag_noro_mod.F
gwstress.F -> gwstress_mod.F
EM

File size: 5.3 KB
RevLine 
[1912]1      MODULE drag_noro_mod
2     
3      IMPLICIT NONE
4     
5      CONTAINS
6     
[38]7      SUBROUTINE drag_noro (klon,klev,dtime,pplay,pplev,
8     e                   pvar, psig, pgam, pthe,
9     e                   kgwd,kgwdim,kdx,ktest,
10     e                   t, u, v,
11     s                   pulow, pvlow, pustr, pvstr,
12     s                   d_t, d_u, d_v)
13C**** *DRAG_NORO* INTERFACE FOR SUB-GRID SCALE OROGRAPHIC SCHEME
14C
15C     PURPOSE.
16C     --------
17C           ZEROS TENDENCIES, COMPUTES GEOPOTENTIAL HEIGHT AND UPDATES THE
18C           TENDENCIES AFTER THE SCHEME HAS BEEN CALLED.
19C
20C     EXPLICIT ARGUMENTS :
21C     --------------------
22C
23C     INPUT :
24C
25C     NLON               : NUMBER OF HORIZONTAL GRID POINTS
26C     NLEV               : NUMBER OF LEVELS
27C     DTIME              : LENGTH OF TIME STEP
28C     PPLAY(NLON,NLEV+1) : PRESSURE AT MIDDLE LEVELS
29C     PPLEV(NLON,NLEV)   : PRESSURE ON MODEL LEVELS
30C     PVAR(NLON)         : SUB-GRID SCALE STANDARD DEVIATION
31C     PSIG(NLON)         : SUB-GRID SCALE SLOPE
32C     PGAM(NLON)         : SUB-GRID SCALE ANISOTROPY
33C     PTHE(NLON)         : SUB-GRID SCALE PRINCIPAL AXES ANGLE
34C     KGWD               : NUMBER OF POINTS AT WHICH THE SCHEME IS CALLED
35C     KGWDIM             : NUMBER OF POINTS AT WHICH THE SCHEME IS CALLED
36C     KDX(NLON)          : POINTS AT WHICH TO CALL THE SCHEME
37C     KTEST(NLON)        : MAP OF CALLING POINTS
38C     T(NLON,NLEV)       : TEMPERATURE
39C     U(NLON,NLEV)       : ZONAL WIND
40C     V(NLON,NLEV)       : MERIDIONAL WIND
41C
42C     OUTPUT :
43C
44C     PULOW(NLON)        : LOW LEVEL ZONAL WIND
45C     PVLOW(NLON)        : LOW LEVEL MERIDIONAL WIND
46C     PUSTR(NLON)        : LOW LEVEL ZONAL STRESS
47C     PVSTR(NLON)        : LOW LEVEL MERIDIONAL STRESS
48C     D_T(NLON,NLEV)     : TEMPERATURE TENDENCY
49C     D_U(NLON,NLEV)     : ZONAL WIND TENDENCY
50C     D_V(NLON,NLEV)     : MERIDIONAL WIND TENDENCY
51C
52C     IMPLICIT ARGUMENTS :
53C     --------------------
54C
55C     comcstfi.h
56C
57c
[1047]58      use dimradmars_mod, only:  ndlo2
[1912]59      USE orodrag_mod, ONLY: orodrag
60      USE comcstfi_h, ONLY: g, r
[38]61      IMPLICIT none
62c======================================================================
63c Auteur(s): Z.X. Li F.Lott (LMD/CNRS) date: 19950201
64c Objet: Frottement de la montagne Interface
65c======================================================================
66c Arguments:
67c dtime---input-R- pas d'integration (s)
68c s-------input-R-la valeur "s" pour chaque couche
69c pplay--input-R- pression au milieu des couches en Pa
70c pplev--input-R-pression au bords des couches en Pa
71c t-------input-R-temperature (K)
72c u-------input-R-vitesse horizontale (m/s)
73c v-------input-R-vitesse horizontale (m/s)
74c
75c d_t-----output-R-increment de la temperature t
76c d_u-----output-R-increment de la vitesse u
77c d_v-----output-R-increment de la vitesse v
78c======================================================================
79c
80c ARGUMENTS
81c
82      REAL dtime
83      INTEGER klon,klev
84      real pplay(NDLO2,klev),pplev(NDLO2,klev+1)
85      REAL pvar(NDLO2),psig(NDLO2),pgam(NDLO2),pthe(NDLO2)
86      REAL pulow(NDLO2),pvlow(NDLO2),pustr(NDLO2),pvstr(NDLO2)
87      REAL u(NDLO2,klev), v(NDLO2,klev),t(NDLO2,klev)
88      REAL d_t(NDLO2,klev), d_u(NDLO2,klev), d_v(NDLO2,klev)
89c
90      INTEGER i, k, kgwd, kgwdim, kdx(NDLO2), ktest(NDLO2)
91c
92c Variables locales:
93c
[1047]94      REAL paprs(NDLO2,klev+1)
95      REAL paprsf(NDLO2,klev)
96      REAL zgeom(NDLO2,klev)
97      REAL pdtdt(NDLO2,klev)
98      REAL pdudt(NDLO2,klev), pdvdt(NDLO2,klev)
99      REAL pt(NDLO2,klev), pu(NDLO2,klev)
100      REAL pv(NDLO2,klev)
[38]101c
102c initialiser les variables de sortie (pour securite)
103c
104      DO i = 1,klon
105         pulow(i) = 0.0
106         pvlow(i) = 0.0
107         pustr(i) = 0.0
108         pvstr(i) = 0.0
109      ENDDO
110      DO k = 1, klev
111      DO i = 1, klon
112         d_t(i,k) = 0.0
113         d_u(i,k) = 0.0
114         d_v(i,k) = 0.0
115         pdudt(i,k)=0.0
116         pdvdt(i,k)=0.0
117         pdtdt(i,k)=0.0
118      ENDDO
119      ENDDO
120c
121c preparer les variables d'entree (attention: l'ordre des niveaux
122c verticaux augmente du haut vers le bas)
123c
124      DO k = 1, klev
125      DO i = 1, klon
126         pt(i,k) = t(i,klev-k+1)
127         pu(i,k) = u(i,klev-k+1)
128         pv(i,k) = v(i,klev-k+1)
129         paprsf(i,k) = pplay(i,klev-k+1)
130         paprs(i,k) = pplev(i,klev+1-k+1)
131      ENDDO
132      ENDDO
133      DO i = 1, klon
134         paprs(i,klev+1) = pplev(i,1)
135      ENDDO
136      DO i = 1, klon
137         zgeom(i,klev) = r * pt(i,klev)
138     .                  * LOG(paprs(i,klev+1)/paprsf(i,klev))
139      ENDDO
140      DO k = klev-1, 1, -1
141      DO i = 1, klon
142         zgeom(i,k) = zgeom(i,k+1) + r * (pt(i,k)+pt(i,k+1))/2.0
143     .               * LOG(paprsf(i,k+1)/paprsf(i,k))
144      ENDDO
145      ENDDO
146c
147c appeler la routine principale
148c
149
150      CALL ORODRAG(klon,klev,kgwd,kgwdim,kdx,ktest,
151     .            dtime,
152     .            paprs, paprsf, zgeom,
153     .            pt, pu, pv, pvar, psig, pgam, pthe,
154     .            pulow,pvlow,
155     .            pdudt,pdvdt,pdtdt)
156C
157      DO k = 1, klev
158      DO i = 1, klon
159         d_u(i,klev+1-k) = dtime*pdudt(i,k)
160         d_v(i,klev+1-k) = dtime*pdvdt(i,k)
161         d_t(i,klev+1-k) = dtime*pdtdt(i,k)
162         pustr(i)        = pustr(i)
163     .                    +g*pdudt(i,k)*(paprs(i,k+1)-paprs(i,k))
164         pvstr(i)        = pvstr(i)
165     .                    +g*pdvdt(i,k)*(paprs(i,k+1)-paprs(i,k))
166      ENDDO
167      ENDDO
168c
[1912]169
170      END SUBROUTINE drag_noro
171     
172      END MODULE drag_noro_mod
Note: See TracBrowser for help on using the repository browser.