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

Last change on this file since 1635 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
Line 
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
52      use dimradmars_mod, only:  ndlo2
53      USE comcstfi_h
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
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)
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.