Directory: | ./ |
---|---|
File: | phys/aaam_bud.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 90 | 92 | 97.8% |
Branches: | 34 | 38 | 89.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | |||
2 | ! $Id: aaam_bud.F90 2350 2015-08-25 11:40:19Z emillour $ | ||
3 | |||
4 | 480 | SUBROUTINE aaam_bud(iam, nlon, nlev, rjour, rsec, rea, rg, ome, plat, plon, & | |
5 | 480 | phis, dragu, liftu, phyu, dragv, liftv, phyv, p, u, v, aam, torsfc) | |
6 | |||
7 | USE dimphy | ||
8 | USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo | ||
9 | IMPLICIT NONE | ||
10 | ! ====================================================================== | ||
11 | ! Auteur(s): F.Lott (LMD/CNRS) date: 20031020 | ||
12 | ! Object: Compute different terms of the axial AAAM Budget. | ||
13 | ! No outputs, every AAM quantities are written on the IAM | ||
14 | ! File. | ||
15 | |||
16 | ! Modif : I.Musat (LMD/CNRS) date : 20041020 | ||
17 | ! Outputs : axial components of wind AAM "aam" and total surface torque | ||
18 | ! "torsfc", | ||
19 | ! but no write in the iam file. | ||
20 | |||
21 | ! WARNING: Only valid for regular rectangular grids. | ||
22 | ! REMARK: CALL DANS PHYSIQ AFTER lift_noro: | ||
23 | ! CALL aaam_bud (27,klon,klev,rjourvrai,gmtime, | ||
24 | ! C ra,rg,romega, | ||
25 | ! C rlat,rlon,pphis, | ||
26 | ! C zustrdr,zustrli,zustrph, | ||
27 | ! C zvstrdr,zvstrli,zvstrph, | ||
28 | ! C paprs,u,v) | ||
29 | |||
30 | ! ====================================================================== | ||
31 | ! Explicit Arguments: | ||
32 | ! ================== | ||
33 | ! iam-----input-I-File number where AAMs and torques are written | ||
34 | ! It is a formatted file that has been opened | ||
35 | ! in physiq.F | ||
36 | ! nlon----input-I-Total number of horizontal points that get into physics | ||
37 | ! nlev----input-I-Number of vertical levels | ||
38 | ! rjour -R-Jour compte depuis le debut de la simu (run.def) | ||
39 | ! rsec -R-Seconde de la journee | ||
40 | ! rea -R-Earth radius | ||
41 | ! rg -R-gravity constant | ||
42 | ! ome -R-Earth rotation rate | ||
43 | ! plat ---input-R-Latitude en degres | ||
44 | ! plon ---input-R-Longitude en degres | ||
45 | ! phis ---input-R-Geopotential at the ground | ||
46 | ! dragu---input-R-orodrag stress (zonal) | ||
47 | ! liftu---input-R-orolift stress (zonal) | ||
48 | ! phyu----input-R-Stress total de la physique (zonal) | ||
49 | ! dragv---input-R-orodrag stress (Meridional) | ||
50 | ! liftv---input-R-orolift stress (Meridional) | ||
51 | ! phyv----input-R-Stress total de la physique (Meridional) | ||
52 | ! p-------input-R-Pressure (Pa) at model half levels | ||
53 | ! u-------input-R-Horizontal wind (m/s) | ||
54 | ! v-------input-R-Meridional wind (m/s) | ||
55 | ! aam-----output-R-Axial Wind AAM (=raam(3)) | ||
56 | ! torsfc--output-R-Total surface torque (=tmou(3)+tsso(3)+tbls(3)) | ||
57 | |||
58 | ! Implicit Arguments: | ||
59 | ! =================== | ||
60 | |||
61 | ! nbp_lon--common-I: Number of longitude intervals | ||
62 | ! (nbp_lat-1)--common-I: Number of latitude intervals | ||
63 | ! klon-common-I: Number of points seen by the physics | ||
64 | ! nbp_lon*(nbp_lat-2)+2 for instance | ||
65 | ! klev-common-I: Number of vertical layers | ||
66 | ! ====================================================================== | ||
67 | ! Local Variables: | ||
68 | ! ================ | ||
69 | ! dlat-----R: Latitude increment (Radians) | ||
70 | ! dlon-----R: Longitude increment (Radians) | ||
71 | ! raam ---R: Wind AAM (3 Components, 1 & 2 Equatoriales; 3 Axiale) | ||
72 | ! oaam ---R: Mass AAM (3 Components, 1 & 2 Equatoriales; 3 Axiale) | ||
73 | ! tmou-----R: Resolved Mountain torque (3 components) | ||
74 | ! tsso-----R: Parameterised Moutain drag torque (3 components) | ||
75 | ! tbls-----R: Parameterised Boundary layer torque (3 components) | ||
76 | |||
77 | ! LOCAL ARRAY: | ||
78 | ! =========== | ||
79 | ! zs ---R: Topographic height | ||
80 | ! ps ---R: Surface Pressure | ||
81 | ! ub ---R: Barotropic wind zonal | ||
82 | ! vb ---R: Barotropic wind meridional | ||
83 | ! zlat ---R: Latitude in radians | ||
84 | ! zlon ---R: Longitude in radians | ||
85 | ! ====================================================================== | ||
86 | |||
87 | ! ARGUMENTS | ||
88 | |||
89 | INTEGER iam, nlon, nlev | ||
90 | REAL, INTENT (IN) :: rjour, rsec, rea, rg, ome | ||
91 | REAL plat(nlon), plon(nlon), phis(nlon) | ||
92 | REAL dragu(nlon), liftu(nlon), phyu(nlon) | ||
93 | REAL dragv(nlon), liftv(nlon), phyv(nlon) | ||
94 | REAL p(nlon, nlev+1), u(nlon, nlev), v(nlon, nlev) | ||
95 | |||
96 | ! Variables locales: | ||
97 | |||
98 | INTEGER i, j, k, l | ||
99 | REAL xpi, hadley, hadday | ||
100 | REAL dlat, dlon | ||
101 | REAL raam(3), oaam(3), tmou(3), tsso(3), tbls(3) | ||
102 | INTEGER iax | ||
103 | ! IM ajout aam, torsfc | ||
104 | ! aam = composante axiale du Wind AAM raam | ||
105 | ! torsfc = composante axiale de (tmou+tsso+tbls) | ||
106 | REAL aam, torsfc | ||
107 | |||
108 | REAL zs(801, 401), ps(801, 401) | ||
109 | REAL ub(801, 401), vb(801, 401) | ||
110 | REAL ssou(801, 401), ssov(801, 401) | ||
111 | REAL blsu(801, 401), blsv(801, 401) | ||
112 | REAL zlon(801), zlat(401) | ||
113 | |||
114 | CHARACTER (LEN=20) :: modname = 'aaam_bud' | ||
115 | CHARACTER (LEN=80) :: abort_message | ||
116 | |||
117 | |||
118 | |||
119 | ! PUT AAM QUANTITIES AT ZERO: | ||
120 | |||
121 |
2/4✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 480 times.
|
480 | IF (nbp_lon+1>801 .OR. nbp_lat>401) THEN |
122 | ✗ | abort_message = 'Pb de dimension dans aaam_bud' | |
123 | ✗ | CALL abort_physic(modname, abort_message, 1) | |
124 | END IF | ||
125 | |||
126 | xpi = acos(-1.) | ||
127 | hadley = 1.E18 | ||
128 | hadday = 1.E18*24.*3600. | ||
129 |
1/2✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
|
480 | IF(klon_glo.EQ.1) THEN |
130 | dlat = xpi | ||
131 | ELSE | ||
132 | 480 | dlat = xpi/real(nbp_lat-1) | |
133 | ENDIF | ||
134 | 480 | dlon = 2.*xpi/real(nbp_lon) | |
135 | |||
136 |
2/2✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 480 times.
|
1920 | DO iax = 1, 3 |
137 | 1440 | oaam(iax) = 0. | |
138 | 1440 | raam(iax) = 0. | |
139 | 1440 | tmou(iax) = 0. | |
140 | 1440 | tsso(iax) = 0. | |
141 | 1920 | tbls(iax) = 0. | |
142 | END DO | ||
143 | |||
144 | ! MOUNTAIN HEIGHT, PRESSURE AND BAROTROPIC WIND: | ||
145 | |||
146 | ! North pole values (j=1): | ||
147 | |||
148 | l = 1 | ||
149 | |||
150 | 480 | ub(1, 1) = 0. | |
151 | 480 | vb(1, 1) = 0. | |
152 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO k = 1, nlev |
153 | 18720 | ub(1, 1) = ub(1, 1) + u(l, k)*(p(l,k)-p(l,k+1))/rg | |
154 | 19200 | vb(1, 1) = vb(1, 1) + v(l, k)*(p(l,k)-p(l,k+1))/rg | |
155 | END DO | ||
156 | |||
157 | 480 | zlat(1) = plat(l)*xpi/180. | |
158 | |||
159 |
2/2✓ Branch 0 taken 15840 times.
✓ Branch 1 taken 480 times.
|
16320 | DO i = 1, nbp_lon + 1 |
160 | |||
161 | 15840 | zs(i, 1) = phis(l)/rg | |
162 | 15840 | ps(i, 1) = p(l, 1) | |
163 | 15840 | ub(i, 1) = ub(1, 1) | |
164 | 15840 | vb(i, 1) = vb(1, 1) | |
165 | 15840 | ssou(i, 1) = dragu(l) + liftu(l) | |
166 | 15840 | ssov(i, 1) = dragv(l) + liftv(l) | |
167 | 15840 | blsu(i, 1) = phyu(l) - dragu(l) - liftu(l) | |
168 | 16320 | blsv(i, 1) = phyv(l) - dragv(l) - liftv(l) | |
169 | |||
170 | END DO | ||
171 | |||
172 | |||
173 |
2/2✓ Branch 0 taken 14880 times.
✓ Branch 1 taken 480 times.
|
15360 | DO j = 2, nbp_lat-1 |
174 | |||
175 | ! Values at Greenwich (Periodicity) | ||
176 | |||
177 | 14880 | zs(nbp_lon+1, j) = phis(l+1)/rg | |
178 | 14880 | ps(nbp_lon+1, j) = p(l+1, 1) | |
179 | 14880 | ssou(nbp_lon+1, j) = dragu(l+1) + liftu(l+1) | |
180 | 14880 | ssov(nbp_lon+1, j) = dragv(l+1) + liftv(l+1) | |
181 | 14880 | blsu(nbp_lon+1, j) = phyu(l+1) - dragu(l+1) - liftu(l+1) | |
182 | 14880 | blsv(nbp_lon+1, j) = phyv(l+1) - dragv(l+1) - liftv(l+1) | |
183 | zlon(nbp_lon+1) = -plon(l+1)*xpi/180. | ||
184 | 14880 | zlat(j) = plat(l+1)*xpi/180. | |
185 | |||
186 | 14880 | ub(nbp_lon+1, j) = 0. | |
187 | 14880 | vb(nbp_lon+1, j) = 0. | |
188 |
2/2✓ Branch 0 taken 580320 times.
✓ Branch 1 taken 14880 times.
|
595200 | DO k = 1, nlev |
189 | 580320 | ub(nbp_lon+1, j) = ub(nbp_lon+1, j) + u(l+1, k)*(p(l+1,k)-p(l+1,k+1))/rg | |
190 | 595200 | vb(nbp_lon+1, j) = vb(nbp_lon+1, j) + v(l+1, k)*(p(l+1,k)-p(l+1,k+1))/rg | |
191 | END DO | ||
192 | |||
193 | |||
194 |
2/2✓ Branch 0 taken 476160 times.
✓ Branch 1 taken 14880 times.
|
491520 | DO i = 1, nbp_lon |
195 | |||
196 | 476160 | l = l + 1 | |
197 | 476160 | zs(i, j) = phis(l)/rg | |
198 | 476160 | ps(i, j) = p(l, 1) | |
199 | 476160 | ssou(i, j) = dragu(l) + liftu(l) | |
200 | 476160 | ssov(i, j) = dragv(l) + liftv(l) | |
201 | 476160 | blsu(i, j) = phyu(l) - dragu(l) - liftu(l) | |
202 | 476160 | blsv(i, j) = phyv(l) - dragv(l) - liftv(l) | |
203 | zlon(i) = plon(l)*xpi/180. | ||
204 | |||
205 | 476160 | ub(i, j) = 0. | |
206 | 476160 | vb(i, j) = 0. | |
207 |
2/2✓ Branch 0 taken 18570240 times.
✓ Branch 1 taken 476160 times.
|
19061280 | DO k = 1, nlev |
208 | 18570240 | ub(i, j) = ub(i, j) + u(l, k)*(p(l,k)-p(l,k+1))/rg | |
209 | 19046400 | vb(i, j) = vb(i, j) + v(l, k)*(p(l,k)-p(l,k+1))/rg | |
210 | END DO | ||
211 | |||
212 | END DO | ||
213 | |||
214 | END DO | ||
215 | |||
216 | |||
217 | ! South Pole | ||
218 | |||
219 |
1/2✓ Branch 0 taken 480 times.
✗ Branch 1 not taken.
|
480 | IF (nbp_lat-1>1) THEN |
220 | 480 | l = l + 1 | |
221 | 480 | ub(1, nbp_lat) = 0. | |
222 | 480 | vb(1, nbp_lat) = 0. | |
223 |
2/2✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
|
19200 | DO k = 1, nlev |
224 | 18720 | ub(1, nbp_lat) = ub(1, nbp_lat) + u(l, k)*(p(l,k)-p(l,k+1))/rg | |
225 | 19200 | vb(1, nbp_lat) = vb(1, nbp_lat) + v(l, k)*(p(l,k)-p(l,k+1))/rg | |
226 | END DO | ||
227 | 480 | zlat(nbp_lat) = plat(l)*xpi/180. | |
228 | |||
229 |
2/2✓ Branch 0 taken 480 times.
✓ Branch 1 taken 15840 times.
|
16320 | DO i = 1, nbp_lon + 1 |
230 | 15840 | zs(i, nbp_lat) = phis(l)/rg | |
231 | 15840 | ps(i, nbp_lat) = p(l, 1) | |
232 | 15840 | ssou(i, nbp_lat) = dragu(l) + liftu(l) | |
233 | 15840 | ssov(i, nbp_lat) = dragv(l) + liftv(l) | |
234 | 15840 | blsu(i, nbp_lat) = phyu(l) - dragu(l) - liftu(l) | |
235 | 15840 | blsv(i, nbp_lat) = phyv(l) - dragv(l) - liftv(l) | |
236 | 15840 | ub(i, nbp_lat) = ub(1, nbp_lat) | |
237 | 16320 | vb(i, nbp_lat) = vb(1, nbp_lat) | |
238 | END DO | ||
239 | END IF | ||
240 | |||
241 | |||
242 | ! MOMENT ANGULAIRE | ||
243 | |||
244 |
2/2✓ Branch 0 taken 15360 times.
✓ Branch 1 taken 480 times.
|
15840 | DO j = 1, nbp_lat-1 |
245 |
2/2✓ Branch 0 taken 491520 times.
✓ Branch 1 taken 15360 times.
|
507360 | DO i = 1, nbp_lon |
246 | |||
247 | raam(1) = raam(1) - rea**3*dlon*dlat*0.5*(cos(zlon(i))*sin(zlat(j))*cos & | ||
248 | (zlat(j))*ub(i,j)+cos(zlon(i))*sin(zlat(j+1))*cos(zlat(j+ & | ||
249 | 1))*ub(i,j+1)) + rea**3*dlon*dlat*0.5*(sin(zlon(i))*cos(zlat(j))*vb(i & | ||
250 | 491520 | ,j)+sin(zlon(i))*cos(zlat(j+1))*vb(i,j+1)) | |
251 | |||
252 | oaam(1) = oaam(1) - ome*rea**4*dlon*dlat/rg*0.5*(cos(zlon(i))*cos(zlat( & | ||
253 | j))**2*sin(zlat(j))*ps(i,j)+cos(zlon(i))*cos(zlat(j+ & | ||
254 | 491520 | 1))**2*sin(zlat(j+1))*ps(i,j+1)) | |
255 | |||
256 | raam(2) = raam(2) - rea**3*dlon*dlat*0.5*(sin(zlon(i))*sin(zlat(j))*cos & | ||
257 | (zlat(j))*ub(i,j)+sin(zlon(i))*sin(zlat(j+1))*cos(zlat(j+ & | ||
258 | 1))*ub(i,j+1)) - rea**3*dlon*dlat*0.5*(cos(zlon(i))*cos(zlat(j))*vb(i & | ||
259 | ,j)+cos(zlon(i))*cos(zlat(j+1))*vb(i,j+1)) | ||
260 | |||
261 | oaam(2) = oaam(2) - ome*rea**4*dlon*dlat/rg*0.5*(sin(zlon(i))*cos(zlat( & | ||
262 | j))**2*sin(zlat(j))*ps(i,j)+sin(zlon(i))*cos(zlat(j+ & | ||
263 | 1))**2*sin(zlat(j+1))*ps(i,j+1)) | ||
264 | |||
265 | raam(3) = raam(3) + rea**3*dlon*dlat*0.5*(cos(zlat(j))**2*ub(i,j)+cos( & | ||
266 | 491520 | zlat(j+1))**2*ub(i,j+1)) | |
267 | |||
268 | oaam(3) = oaam(3) + ome*rea**4*dlon*dlat/rg*0.5*(cos(zlat(j))**3*ps(i,j & | ||
269 | 15360 | )+cos(zlat(j+1))**3*ps(i,j+1)) | |
270 | |||
271 | END DO | ||
272 | END DO | ||
273 | |||
274 | |||
275 | ! COUPLE DES MONTAGNES: | ||
276 | |||
277 | |||
278 | DO j = 1, nbp_lat-1 | ||
279 | 480 | DO i = 1, nbp_lon | |
280 | tmou(1) = tmou(1) - rea**2*dlon*0.5*sin(zlon(i))*(zs(i,j)-zs(i,j+1))*( & | ||
281 | cos(zlat(j+1))*ps(i,j+1)+cos(zlat(j))*ps(i,j)) | ||
282 | tmou(2) = tmou(2) + rea**2*dlon*0.5*cos(zlon(i))*(zs(i,j)-zs(i,j+1))*( & | ||
283 | cos(zlat(j+1))*ps(i,j+1)+cos(zlat(j))*ps(i,j)) | ||
284 | END DO | ||
285 | END DO | ||
286 | |||
287 |
2/2✓ Branch 0 taken 14880 times.
✓ Branch 1 taken 480 times.
|
15360 | DO j = 2, nbp_lat-1 |
288 |
2/2✓ Branch 0 taken 476160 times.
✓ Branch 1 taken 14880 times.
|
491520 | DO i = 1, nbp_lon |
289 | tmou(1) = tmou(1) + rea**2*dlat*0.5*sin(zlat(j))*(zs(i+1,j)-zs(i,j))*( & | ||
290 | 476160 | cos(zlon(i+1))*ps(i+1,j)+cos(zlon(i))*ps(i,j)) | |
291 | tmou(2) = tmou(2) + rea**2*dlat*0.5*sin(zlat(j))*(zs(i+1,j)-zs(i,j))*( & | ||
292 | sin(zlon(i+1))*ps(i+1,j)+sin(zlon(i))*ps(i,j)) | ||
293 | tmou(3) = tmou(3) - rea**2*dlat*0.5*cos(zlat(j))*(zs(i+1,j)-zs(i,j))*( & | ||
294 | 491040 | ps(i+1,j)+ps(i,j)) | |
295 | END DO | ||
296 | END DO | ||
297 | |||
298 | |||
299 | ! COUPLES DES DIFFERENTES FRICTION AU SOL: | ||
300 | |||
301 | l = 1 | ||
302 |
2/2✓ Branch 0 taken 14880 times.
✓ Branch 1 taken 480 times.
|
15360 | DO j = 2, nbp_lat-1 |
303 |
2/2✓ Branch 0 taken 476160 times.
✓ Branch 1 taken 14880 times.
|
491520 | DO i = 1, nbp_lon |
304 | l = l + 1 | ||
305 | tsso(1) = tsso(1) - rea**3*cos(zlat(j))*dlon*dlat*ssou(i, j)*sin(zlat(j & | ||
306 | ))*cos(zlon(i)) + rea**3*cos(zlat(j))*dlon*dlat*ssov(i, j)*sin(zlon(i & | ||
307 | 476160 | )) | |
308 | |||
309 | tsso(2) = tsso(2) - rea**3*cos(zlat(j))*dlon*dlat*ssou(i, j)*sin(zlat(j & | ||
310 | ))*sin(zlon(i)) - rea**3*cos(zlat(j))*dlon*dlat*ssov(i, j)*cos(zlon(i & | ||
311 | )) | ||
312 | |||
313 | tsso(3) = tsso(3) + rea**3*cos(zlat(j))*dlon*dlat*ssou(i, j)*cos(zlat(j & | ||
314 | 476160 | )) | |
315 | |||
316 | tbls(1) = tbls(1) - rea**3*cos(zlat(j))*dlon*dlat*blsu(i, j)*sin(zlat(j & | ||
317 | ))*cos(zlon(i)) + rea**3*cos(zlat(j))*dlon*dlat*blsv(i, j)*sin(zlon(i & | ||
318 | 476160 | )) | |
319 | |||
320 | tbls(2) = tbls(2) - rea**3*cos(zlat(j))*dlon*dlat*blsu(i, j)*sin(zlat(j & | ||
321 | ))*sin(zlon(i)) - rea**3*cos(zlat(j))*dlon*dlat*blsv(i, j)*cos(zlon(i & | ||
322 | )) | ||
323 | |||
324 | tbls(3) = tbls(3) + rea**3*cos(zlat(j))*dlon*dlat*blsu(i, j)*cos(zlat(j & | ||
325 | 491040 | )) | |
326 | |||
327 | END DO | ||
328 | END DO | ||
329 | |||
330 | |||
331 | ! write(*,*) 'AAM',rsec, | ||
332 | ! write(*,*) 'AAM',rjour+rsec/86400., | ||
333 | ! c raam(3)/hadday,oaam(3)/hadday, | ||
334 | ! c tmou(3)/hadley,tsso(3)/hadley,tbls(3)/hadley | ||
335 | |||
336 | ! write(iam,100)rjour+rsec/86400., | ||
337 | ! c raam(1)/hadday,oaam(1)/hadday, | ||
338 | ! c tmou(1)/hadley,tsso(1)/hadley,tbls(1)/hadley, | ||
339 | ! c raam(2)/hadday,oaam(2)/hadday, | ||
340 | ! c tmou(2)/hadley,tsso(2)/hadley,tbls(2)/hadley, | ||
341 | ! c raam(3)/hadday,oaam(3)/hadday, | ||
342 | ! c tmou(3)/hadley,tsso(3)/hadley,tbls(3)/hadley | ||
343 | 100 FORMAT (F12.5, 15(1X,F12.5)) | ||
344 | |||
345 | ! write(iam+1,*)((zs(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
346 | ! write(iam+1,*)((ps(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
347 | ! write(iam+1,*)((ub(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
348 | ! write(iam+1,*)((vb(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
349 | ! write(iam+1,*)((ssou(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
350 | ! write(iam+1,*)((ssov(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
351 | ! write(iam+1,*)((blsu(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
352 | ! write(iam+1,*)((blsv(i,j),i=1,nbp_lon),j=1,nbp_lat) | ||
353 | |||
354 | 480 | aam = raam(3) | |
355 | 480 | torsfc = tmou(3) + tsso(3) + tbls(3) | |
356 | |||
357 | 480 | RETURN | |
358 | END SUBROUTINE aaam_bud | ||
359 |