source: trunk/LMDZ.MARS/libf/phymars/drag_noro.F @ 1711

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