1 | |
---|
2 | C SUBROUTINE DE PARAMETRISATION DES MONTAGNES D ECHELLE SOUS MAILLE |
---|
3 | |
---|
4 | SUBROUTINE drag_noro (nlon,nlev,dtime,paprs,pplay,pgeop,pn2, |
---|
5 | e pmea,pstd, psig, pgam, pthe,ppic,pval, |
---|
6 | e kgwd,kdx,ktest, |
---|
7 | e t, u, v, |
---|
8 | s pulow, pvlow, pustr, pvstr, |
---|
9 | s d_t, d_u, d_v, |
---|
10 | s blustr,blvstr,pnlow,zeff,zbl, |
---|
11 | s ptau,tau0,knu2,kbreak) |
---|
12 | c |
---|
13 | use dimphy |
---|
14 | IMPLICIT none |
---|
15 | |
---|
16 | c====================================================================== |
---|
17 | c Auteur(s): F.Lott (LMD/CNRS) date: 19950201 |
---|
18 | c Object: Mountain drag interface. Made necessary because: |
---|
19 | C 1. in the LMD-GCM Layers are from bottom to top, |
---|
20 | C contrary to most European GCM. |
---|
21 | c 2. the altitude above ground of each model layers |
---|
22 | c needs to be known (variable zgeom) |
---|
23 | c====================================================================== |
---|
24 | c Explicit Arguments: |
---|
25 | c ================== |
---|
26 | c nlon----input-I-Total number of horizontal points that get into physics |
---|
27 | c nlev----input-I-Number of vertical levels |
---|
28 | c dtime---input-R-Time-step (s) |
---|
29 | c paprs---input-R-Pressure in semi layers (Pa) |
---|
30 | c pplay---input-R-Pressure model-layers (Pa) |
---|
31 | c pgeop---input-R-Geopotential model layers (reference to ground) |
---|
32 | c pn2-----input-R-Brunt-Vaisala freq.^2 at 1/2 layers |
---|
33 | c t-------input-R-temperature (K) |
---|
34 | c u-------input-R-Horizontal wind (m/s) |
---|
35 | c v-------input-R-Meridional wind (m/s) |
---|
36 | c pmea----input-R-Mean Orography (m) |
---|
37 | C pstd----input-R-SSO standard deviation (m) |
---|
38 | c psig----input-R-SSO slope |
---|
39 | c pgam----input-R-SSO Anisotropy |
---|
40 | c pthe----input-R-SSO Angle |
---|
41 | c ppic----input-R-SSO Peacks elevation (m) |
---|
42 | c pval----input-R-SSO Valleys elevation (m) |
---|
43 | c |
---|
44 | c kgwd- -input-I: Total nb of points where the orography schemes are active |
---|
45 | c ktest--input-I: Flags to indicate active points |
---|
46 | c kdx----input-I: Locate the physical location of an active point. |
---|
47 | |
---|
48 | c pulow, pvlow -output-R: Low-level wind |
---|
49 | c pustr, pvstr -output-R: Surface stress due to SSO drag (Pa) |
---|
50 | c |
---|
51 | c d_t-----output-R: T increment |
---|
52 | c d_u-----output-R: U increment |
---|
53 | c d_v-----output-R: V increment |
---|
54 | c |
---|
55 | c Implicit Arguments: |
---|
56 | c =================== |
---|
57 | c |
---|
58 | c iim--common-I: Number of longitude intervals |
---|
59 | c jjm--common-I: Number of latitude intervals |
---|
60 | c klon-common-I: Number of points seen by the physics |
---|
61 | c (iim+1)*(jjm+1) for instance |
---|
62 | c klev-common-I: Number of vertical layers |
---|
63 | c====================================================================== |
---|
64 | c Local Variables: |
---|
65 | c ================ |
---|
66 | c |
---|
67 | c zgeom-----R: Altitude (m) of layer above ground (from top to bottom) |
---|
68 | c pt, pu, pv --R: t u v from top to bottom |
---|
69 | c pdtdt, pdudt, pdvdt --R: t u v tendencies (from top to bottom) |
---|
70 | c papmf: pressure at model layer (from top to bottom) |
---|
71 | c papmh: pressure at model 1/2 layer (from top to bottom) |
---|
72 | c |
---|
73 | c====================================================================== |
---|
74 | |
---|
75 | #include "YOMCST.h" |
---|
76 | #include "YOEGWD.h" |
---|
77 | |
---|
78 | c ARGUMENTS |
---|
79 | c |
---|
80 | INTEGER nlon,nlev |
---|
81 | REAL dtime |
---|
82 | REAL paprs(nlon,nlev+1) |
---|
83 | REAL pplay(nlon,nlev) |
---|
84 | REAL pgeop(nlon,nlev),pn2(nlon,nlev) |
---|
85 | REAL pmea(nlon),pstd(nlon),psig(nlon),pgam(nlon),pthe(nlon) |
---|
86 | REAL ppic(nlon),pval(nlon) |
---|
87 | REAL pulow(nlon),pvlow(nlon),pustr(nlon),pvstr(nlon) |
---|
88 | REAL t(nlon,nlev), u(nlon,nlev), v(nlon,nlev) |
---|
89 | REAL d_t(nlon,nlev), d_u(nlon,nlev), d_v(nlon,nlev) |
---|
90 | REAL blustr(nlon),blvstr(nlon),pnlow(nlon),zeff(nlon),zbl(nlon) |
---|
91 | REAL knu2(nlon),kbreak(nlon) |
---|
92 | REAL ztau(klon,klev+1), ptau(klon,klev), tau0(klon) |
---|
93 | c |
---|
94 | INTEGER i, k, kgwd, kdx(nlon), ktest(nlon) |
---|
95 | INTEGER ikenvh(nlon) |
---|
96 | INTEGER iknu2(nlon) |
---|
97 | INTEGER ikbreak(nlon) |
---|
98 | c |
---|
99 | c LOCAL VARIABLES: |
---|
100 | c |
---|
101 | REAL zgeom(klon,klev),zn2(klon,klev) |
---|
102 | REAL pdtdt(klon,klev), pdudt(klon,klev), pdvdt(klon,klev) |
---|
103 | REAL pt(klon,klev), pu(klon,klev), pv(klon,klev) |
---|
104 | REAL papmf(klon,klev),papmh(klon,klev+1) |
---|
105 | c |
---|
106 | c INITIALIZE OUTPUT VARIABLES |
---|
107 | c |
---|
108 | DO i = 1,klon |
---|
109 | pulow(i) = 0.0 |
---|
110 | pvlow(i) = 0.0 |
---|
111 | pustr(i) = 0.0 |
---|
112 | pvstr(i) = 0.0 |
---|
113 | ENDDO |
---|
114 | DO k = 1, klev |
---|
115 | DO i = 1, klon |
---|
116 | d_t(i,k) = 0.0 |
---|
117 | d_u(i,k) = 0.0 |
---|
118 | d_v(i,k) = 0.0 |
---|
119 | pdudt(i,k)=0.0 |
---|
120 | pdvdt(i,k)=0.0 |
---|
121 | pdtdt(i,k)=0.0 |
---|
122 | ENDDO |
---|
123 | ENDDO |
---|
124 | c |
---|
125 | c PREPARE INPUT VARIABLES FOR ORODRAG (i.e., ORDERED FROM TOP TO BOTTOM) |
---|
126 | C CALCULATE LAYERS HEIGHT ABOVE GROUND) |
---|
127 | c |
---|
128 | DO k = 1, klev |
---|
129 | DO i = 1, klon |
---|
130 | pt(i,k) = t(i,klev-k+1) |
---|
131 | pu(i,k) = u(i,klev-k+1) |
---|
132 | pv(i,k) = v(i,klev-k+1) |
---|
133 | papmf(i,k) = pplay(i,klev-k+1) |
---|
134 | ENDDO |
---|
135 | ENDDO |
---|
136 | DO k = 1, klev+1 |
---|
137 | DO i = 1, klon |
---|
138 | papmh(i,k) = paprs(i,klev-k+2) |
---|
139 | ENDDO |
---|
140 | ENDDO |
---|
141 | |
---|
142 | DO k = klev, 1, -1 |
---|
143 | DO i = 1, klon |
---|
144 | zgeom(i,k) = pgeop(i,klev-k+1)/RG |
---|
145 | zn2(i,k) = pn2(i,klev-k+1) |
---|
146 | ENDDO |
---|
147 | ENDDO |
---|
148 | |
---|
149 | c CALL SSO DRAG ROUTINES |
---|
150 | c |
---|
151 | CALL orodrag(klon,klev,kgwd,kdx,ktest, |
---|
152 | . dtime, |
---|
153 | . papmh, papmf, zgeom, zn2, |
---|
154 | . pt, pu, pv, |
---|
155 | . pmea, pstd, psig, pgam, pthe, ppic,pval, |
---|
156 | . pulow,pvlow, |
---|
157 | . pdudt,pdvdt,pdtdt, |
---|
158 | . blustr,blvstr,pnlow,zeff,ikenvh, |
---|
159 | . ztau,iknu2,ikbreak) |
---|
160 | |
---|
161 | zbl(:) = real(klev-ikenvh(:)) |
---|
162 | knu2(:) = real(klev-iknu2(:)) |
---|
163 | kbreak(:) = real(klev-ikbreak(:)) |
---|
164 | tau0 = ztau(:,klev+1) |
---|
165 | |
---|
166 | C |
---|
167 | C COMPUTE INCREMENTS AND STRESS FROM TENDENCIES |
---|
168 | |
---|
169 | DO k = 1, klev |
---|
170 | DO i = 1, klon |
---|
171 | ptau(i,klev+1-k) = ztau(i,k) |
---|
172 | d_u(i,klev+1-k) = dtime*pdudt(i,k) |
---|
173 | d_v(i,klev+1-k) = dtime*pdvdt(i,k) |
---|
174 | d_t(i,klev+1-k) = dtime*pdtdt(i,k) |
---|
175 | pustr(i) = pustr(i) |
---|
176 | . +pdudt(i,k)*(papmh(i,k+1)-papmh(i,k))/rg |
---|
177 | pvstr(i) = pvstr(i) |
---|
178 | . +pdvdt(i,k)*(papmh(i,k+1)-papmh(i,k))/rg |
---|
179 | ENDDO |
---|
180 | ENDDO |
---|
181 | c |
---|
182 | RETURN |
---|
183 | END |
---|
184 | |
---|