1 | MODULE trdvor |
---|
2 | !!====================================================================== |
---|
3 | !! *** MODULE trdvor *** |
---|
4 | !! Ocean diagnostics: momentum trends |
---|
5 | !!===================================================================== |
---|
6 | |
---|
7 | #if defined key_trd_vor || defined key_esopa |
---|
8 | !!---------------------------------------------------------------------- |
---|
9 | !! 'key_trd_vor' : momentum trend diagnostics |
---|
10 | !!---------------------------------------------------------------------- |
---|
11 | !! trd_vor : momentum trends averaged over the depth |
---|
12 | !!---------------------------------------------------------------------- |
---|
13 | !! * Modules used |
---|
14 | USE oce ! ocean dynamics and tracers variables |
---|
15 | USE dom_oce ! ocean space and time domain variables |
---|
16 | USE trddyn_oce ! ocean active tracer trend variables |
---|
17 | USE zdf_oce ! ocean vertical physics |
---|
18 | USE in_out_manager ! I/O manager |
---|
19 | |
---|
20 | USE phycst ! Define parameters for the routines |
---|
21 | USE ldfdyn_oce ! ocean active tracers: lateral physics |
---|
22 | USE daymod ! calandar |
---|
23 | USE dianam ! build the name of file (routine) |
---|
24 | USE ldfslp ! iso-neutral slopes |
---|
25 | USE zdfmxl |
---|
26 | USE ioipsl |
---|
27 | USE lbclnk |
---|
28 | |
---|
29 | IMPLICIT NONE |
---|
30 | PRIVATE |
---|
31 | |
---|
32 | |
---|
33 | !! * Accessibility |
---|
34 | PUBLIC trd_vor ! routine called by step.F90 |
---|
35 | |
---|
36 | !! * Shared module variables |
---|
37 | LOGICAL, PUBLIC :: lk_trdvor = .TRUE. ! momentum trend flag |
---|
38 | |
---|
39 | !! * Module variables |
---|
40 | INTEGER,PARAMETER :: jplvor=11 |
---|
41 | INTEGER :: & |
---|
42 | nh_t, nmoydpvor , & |
---|
43 | nidvor, nhoridvor, & |
---|
44 | ndexvor1(jpi*jpj), & |
---|
45 | ndimvor1 |
---|
46 | |
---|
47 | REAL(wp), DIMENSION(jpi,jpj) :: & |
---|
48 | vor_avr , & ! average |
---|
49 | vor_avrb , & ! before vorticity (kt-1) |
---|
50 | vor_avrbb , & ! vorticity at begining of the nwrite-1 timestep averaging period |
---|
51 | vor_avrbn , & ! after vorticity at time step after the |
---|
52 | rotot , & ! begining of the NWRITE-1 timesteps |
---|
53 | udpvor , & ! total cumulative trends |
---|
54 | vdpvor ! " " " |
---|
55 | |
---|
56 | REAL(wp), DIMENSION(jpi,jpj,jplvor):: & !: curl of trends |
---|
57 | vortrd |
---|
58 | |
---|
59 | !! * Substitutions |
---|
60 | # include "domzgr_substitute.h90" |
---|
61 | # include "ldfdyn_substitute.h90" |
---|
62 | # include "vectopt_loop_substitute.h90" |
---|
63 | |
---|
64 | !!---------------------------------------------------------------------- |
---|
65 | !! OPA 9.0 , LODYC-IPS (2004) |
---|
66 | !!---------------------------------------------------------------------- |
---|
67 | |
---|
68 | CONTAINS |
---|
69 | |
---|
70 | SUBROUTINE trd_vor( kt ) |
---|
71 | !!---------------------------------------------------------------------------- |
---|
72 | !! *** ROUTINE trd_vor *** |
---|
73 | !! |
---|
74 | !! ** Purpose : computation of vertically integrated vorticity budgets |
---|
75 | !! from ocean surface down to control surface (NetCDF output) |
---|
76 | !! |
---|
77 | !! ** Method/usage : |
---|
78 | !! integration done over nwrite-1 time steps |
---|
79 | !! |
---|
80 | !! |
---|
81 | !! ** Action : |
---|
82 | !! /commld/ : |
---|
83 | !! vor_avr average |
---|
84 | !! vor_avrb vorticity at kt-1 |
---|
85 | !! vor_avrbb vorticity at begining of the NWRITE-1 |
---|
86 | !! time steps averaging period |
---|
87 | !! vor_avrbn vorticity at time step after the |
---|
88 | !! begining of the NWRITE-1 time |
---|
89 | !! steps averaging period |
---|
90 | !! |
---|
91 | !! trends : |
---|
92 | !! |
---|
93 | !! vortrd (,,1) = Pressure Gradient Trend |
---|
94 | !! vortrd (,,2) = KE Gradient Trend |
---|
95 | !! vortrd (,,3) = Relative Vorticity Trend |
---|
96 | !! vortrd (,,4) = Coriolis Term Trend |
---|
97 | !! vortrd (,,5) = Horizontal Diffusion Trend |
---|
98 | !! vortrd (,,6) = Vertical Advection Trend |
---|
99 | !! vortrd (,,7) = Vertical Diffusion Trend |
---|
100 | !! vortrd (,,8) = Surface Pressure Grad. Trend |
---|
101 | !! vortrd (,,9) = Beta V |
---|
102 | !! vortrd (,,10) = forcing term |
---|
103 | !! vortrd (,,11) = bottom friction term |
---|
104 | !! rotot(,) : total cumulative trends over nwrite-1 time steps |
---|
105 | !! vor_avrtot(,) : first membre of vrticity equation |
---|
106 | !! vor_avrres(,) : residual = dh/dt entrainment |
---|
107 | !! |
---|
108 | !! trends output in netCDF format using ioipsl |
---|
109 | !!---------------------------------------------------------------------- |
---|
110 | !! * Arguments |
---|
111 | INTEGER, INTENT( in ) :: kt ! ocean time-step index |
---|
112 | |
---|
113 | !! * Local declarations |
---|
114 | INTEGER ilseq |
---|
115 | INTEGER ji, jj, jk, jl, idebug, it |
---|
116 | |
---|
117 | REAL(wp) :: zmean |
---|
118 | REAL(wp) :: zun(jpi,jpj), zvn(jpi,jpj) |
---|
119 | REAL(wp) :: zjulian, zsto, zout |
---|
120 | REAL(wp) :: vor_avrtot(jpi,jpj), vor_avrres(jpi,jpj) |
---|
121 | INTEGER(wp) :: ikbu,ikbum1,ikbv,ikbvm1 |
---|
122 | CHARACTER (len=12) :: cvort |
---|
123 | CHARACTER (len=40) :: clhstnam |
---|
124 | CHARACTER (len=40) :: clop |
---|
125 | |
---|
126 | NAMELIST/namtrd/ ntrd,nctls |
---|
127 | !!---------------------------------------------------------------------- |
---|
128 | |
---|
129 | ! =================== |
---|
130 | ! 0. initialization |
---|
131 | ! =================== |
---|
132 | |
---|
133 | cvort='averaged-vor' |
---|
134 | |
---|
135 | ! Open specifier |
---|
136 | ilseq = 1 |
---|
137 | idebug = 0 ! set it to 1 in case of problem to have more Print |
---|
138 | |
---|
139 | IF( kt == nit000 ) THEN |
---|
140 | |
---|
141 | ! namelist namtrd : trend diagnostic |
---|
142 | REWIND( numnam ) |
---|
143 | READ ( numnam, namtrd ) |
---|
144 | |
---|
145 | IF(lwp) THEN |
---|
146 | WRITE(numout,*) 'namtrd' |
---|
147 | WRITE(numout,*) ' ' |
---|
148 | WRITE(numout,*) ' time step frequency trend ntrd = ',ntrd |
---|
149 | WRITE(numout,*) ' ' |
---|
150 | ENDIF |
---|
151 | |
---|
152 | ! cumulated trends array init |
---|
153 | nmoydpvor = 0 |
---|
154 | rotot(:,:)=0 |
---|
155 | vor_avrtot(:,:)=0 |
---|
156 | vor_avrres(:,:)=0 |
---|
157 | ENDIF |
---|
158 | |
---|
159 | ! set before values of vertically average u and v |
---|
160 | |
---|
161 | IF( kt > nit000 ) THEN |
---|
162 | vor_avrb(:,:) = vor_avr(:,:) |
---|
163 | ENDIF |
---|
164 | |
---|
165 | IF( idebug /= 0 ) THEN |
---|
166 | WRITE(numout,*) ' debuging trd_vor: 0. done ' |
---|
167 | CALL FLUSH(numout) |
---|
168 | ENDIF |
---|
169 | |
---|
170 | ! ================================= |
---|
171 | ! I. vertically integrated vorticity |
---|
172 | ! ================================= |
---|
173 | |
---|
174 | vor_avr(:,:) = 0. |
---|
175 | zun(:,:)=0 |
---|
176 | zvn(:,:)=0 |
---|
177 | vor_avrtot(:,:)=0 |
---|
178 | vor_avrres(:,:)=0 |
---|
179 | |
---|
180 | ! vertically averaged velocity |
---|
181 | DO jk = 1, jpk - 1 |
---|
182 | zun(:,:)=zun(:,:) + e1u(:,:)*un(:,:,jk)*fse3u(:,:,jk) |
---|
183 | zvn(:,:)=zvn(:,:) + e2v(:,:)*vn(:,:,jk)*fse3v(:,:,jk) |
---|
184 | END DO |
---|
185 | |
---|
186 | |
---|
187 | zun(:,:)=zun(:,:)*hur(:,:) |
---|
188 | zvn(:,:)=zvn(:,:)*hvr(:,:) |
---|
189 | |
---|
190 | !Curl |
---|
191 | DO ji=1,jpim1 |
---|
192 | DO jj=1,jpjm1 |
---|
193 | vor_avr(ji,jj) = ((zvn(ji+1,jj)-zvn(ji,jj))- & |
---|
194 | (zun(ji,jj+1)-zun(ji,jj))) & |
---|
195 | /( e1f(ji,jj) * e2f(ji,jj) ) |
---|
196 | vor_avr(ji,jj) = vor_avr(ji,jj)*fmask(ji,jj,1) |
---|
197 | END DO |
---|
198 | END DO |
---|
199 | |
---|
200 | |
---|
201 | IF(idebug /= 0) THEN |
---|
202 | WRITE(numout,*) ' debuging trd_vor: I done' |
---|
203 | CALL FLUSH(numout) |
---|
204 | ENDIF |
---|
205 | |
---|
206 | ! ================================= |
---|
207 | ! II. netCDF output initialization |
---|
208 | ! ================================= |
---|
209 | |
---|
210 | # include "trdvor_ncinit.h90" |
---|
211 | |
---|
212 | IF( idebug /= 0 ) THEN |
---|
213 | WRITE(numout,*) ' debuging trd_vor: II. done' |
---|
214 | CALL FLUSH(numout) |
---|
215 | ENDIF |
---|
216 | |
---|
217 | ! ===================================== |
---|
218 | ! III vertical integration of 3D trends |
---|
219 | ! ===================================== |
---|
220 | ! Beta.V : intergration, no average |
---|
221 | utrd(:,:,:,9)=utrd(:,:,:,4) |
---|
222 | vtrd(:,:,:,9)=vtrd(:,:,:,4) |
---|
223 | |
---|
224 | DO jl=1,jplvor |
---|
225 | |
---|
226 | udpvor(:,:)=0 |
---|
227 | vdpvor(:,:)=0 |
---|
228 | |
---|
229 | !bottom friction |
---|
230 | IF( jl == jplvor ) THEN |
---|
231 | |
---|
232 | CALL lbc_lnk( tautrd(:,:,3), 'U' , -1. ) |
---|
233 | CALL lbc_lnk( tautrd(:,:,4), 'V' , -1. ) |
---|
234 | |
---|
235 | DO jj = 2, jpjm1 |
---|
236 | DO ji = fs_2, fs_jpim1 |
---|
237 | ikbu = min( mbathy(ji+1,jj), mbathy(ji,jj) ) |
---|
238 | ikbum1 = max( ikbu-1, 1 ) |
---|
239 | ikbv = min( mbathy(ji,jj+1), mbathy(ji,jj) ) |
---|
240 | ikbvm1 = max( ikbv-1, 1 ) |
---|
241 | |
---|
242 | udpvor(ji,jj)=tautrd(ji,jj,3)*fse3u(ji,jj,ikbum1)*e1u(ji,jj)*umask(ji,jj,ikbum1) |
---|
243 | vdpvor(ji,jj)=tautrd(ji,jj,4)*fse3v(ji,jj,ikbvm1)*e2v(ji,jj)*vmask(ji,jj,ikbvm1) |
---|
244 | END DO |
---|
245 | END DO |
---|
246 | |
---|
247 | !wind stress |
---|
248 | ELSE IF( jl == (jplvor-1) ) THEN |
---|
249 | |
---|
250 | CALL lbc_lnk( tautrd(:,:,1), 'U' , -1. ) |
---|
251 | CALL lbc_lnk( tautrd(:,:,2), 'V' , -1. ) |
---|
252 | |
---|
253 | udpvor(:,:)=tautrd(:,:,1)*fse3u(:,:,1)*e1u(:,:)*umask(:,:,1) |
---|
254 | vdpvor(:,:)=tautrd(:,:,2)*fse3v(:,:,1)*e2v(:,:)*vmask(:,:,1) |
---|
255 | |
---|
256 | ELSE |
---|
257 | |
---|
258 | CALL lbc_lnk( utrd(:,:,:,jl), 'U' , -1. ) |
---|
259 | CALL lbc_lnk( vtrd(:,:,:,jl), 'V' , -1. ) |
---|
260 | |
---|
261 | !utrd and vtrd terms |
---|
262 | DO jk = 1,jpk |
---|
263 | udpvor(:,:)=udpvor(:,:)+utrd(:,:,jk,jl)*fse3u(:,:,jk)*e1u(:,:)*umask(:,:,jk) |
---|
264 | vdpvor(:,:)=vdpvor(:,:)+vtrd(:,:,jk,jl)*fse3v(:,:,jk)*e2v(:,:)*vmask(:,:,jk) |
---|
265 | END DO |
---|
266 | |
---|
267 | ENDIF |
---|
268 | |
---|
269 | !average except for Beta.V |
---|
270 | IF (jl/=9) THEN |
---|
271 | udpvor(:,:) = udpvor(:,:) * hur(:,:) |
---|
272 | vdpvor(:,:) = vdpvor(:,:) * hvr(:,:) |
---|
273 | ENDIF |
---|
274 | |
---|
275 | !Curl |
---|
276 | DO ji=1,jpim1 |
---|
277 | DO jj=1,jpjm1 |
---|
278 | vortrd(ji,jj,jl)=( vdpvor(ji+1,jj)-vdpvor(ji,jj) & |
---|
279 | - ( udpvor(ji,jj+1)-udpvor(ji,jj) ) ) & |
---|
280 | / ( e1f(ji,jj) * e2f(ji,jj) ) |
---|
281 | END DO |
---|
282 | END DO |
---|
283 | |
---|
284 | vortrd(:,:,9)=vortrd(:,:,9)*hur(:,:) |
---|
285 | |
---|
286 | !surface mask |
---|
287 | DO ji=1,jpi |
---|
288 | DO jj=1,jpj |
---|
289 | vortrd(ji,jj,jl)=vortrd(ji,jj,jl)*fmask(ji,jj,1) !surface mask |
---|
290 | END DO |
---|
291 | END DO |
---|
292 | |
---|
293 | END DO |
---|
294 | |
---|
295 | IF( idebug /= 0 ) THEN |
---|
296 | IF(lwp) WRITE(numout,*) ' debuging trd_vor: III done' |
---|
297 | CALL FLUSH(numout) |
---|
298 | ENDIF |
---|
299 | |
---|
300 | ! ================================= |
---|
301 | ! IV. Cumulated trends |
---|
302 | ! ================================= |
---|
303 | |
---|
304 | ! IV.1 set `before' mixed layer values for kt = nit000+1 |
---|
305 | ! -------------------------------------------------------- |
---|
306 | IF( kt == nit000+1 ) THEN |
---|
307 | vor_avrbb(:,:) = vor_avrb(:,:) |
---|
308 | vor_avrbn(:,:) = vor_avr (:,:) |
---|
309 | ENDIF |
---|
310 | |
---|
311 | IF( idebug /= 0 ) THEN |
---|
312 | WRITE(numout,*) ' debuging trd_vor: IV.1 done' |
---|
313 | CALL FLUSH(numout) |
---|
314 | ENDIF |
---|
315 | |
---|
316 | ! IV.2 cumulated trends over analysis period (kt=2 to nwrite) |
---|
317 | ! ---------------------- |
---|
318 | ! trends cumulated over nwrite-2 time steps |
---|
319 | |
---|
320 | IF( kt >= nit000+2 ) THEN |
---|
321 | nmoydpvor = nmoydpvor + 1 |
---|
322 | DO jl = 1, jplvor |
---|
323 | IF( jl /= 9 ) THEN |
---|
324 | rotot(:,:) = rotot(:,:) + vortrd(:,:,jl) |
---|
325 | ENDIF |
---|
326 | END DO |
---|
327 | ENDIF |
---|
328 | |
---|
329 | IF( idebug /= 0 ) THEN |
---|
330 | WRITE(numout,*) ' debuging trd_vor: IV.2 done' |
---|
331 | CALL FLUSH(numout) |
---|
332 | ENDIF |
---|
333 | |
---|
334 | ! ============================================= |
---|
335 | ! V. Output in netCDF + residual computation |
---|
336 | ! ============================================= |
---|
337 | IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN |
---|
338 | |
---|
339 | ! V.1 compute total trend |
---|
340 | ! ------------------------ |
---|
341 | zmean = float(nmoydpvor) |
---|
342 | |
---|
343 | vor_avrtot(:,:) = ( vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - & |
---|
344 | vor_avrbb(:,:) ) / (zmean * 2. * rdt) |
---|
345 | |
---|
346 | IF( idebug /= 0 ) THEN |
---|
347 | WRITE(numout,*) ' zmean = ',zmean |
---|
348 | WRITE(numout,*) ' debuging trd_vor: V.1 done' |
---|
349 | CALL FLUSH(numout) |
---|
350 | ENDIF |
---|
351 | |
---|
352 | ! V.2 compute residual |
---|
353 | ! --------------------- |
---|
354 | vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean |
---|
355 | |
---|
356 | ! Boundary conditions |
---|
357 | CALL lbc_lnk( vor_avrtot, 'F', 1. ) |
---|
358 | CALL lbc_lnk( vor_avrres, 'F', 1. ) |
---|
359 | |
---|
360 | IF( idebug /= 0 ) THEN |
---|
361 | WRITE(numout,*) ' debuging trd_vor: V.2 done' |
---|
362 | CALL FLUSH(numout) |
---|
363 | ENDIF |
---|
364 | |
---|
365 | ! V.3 time evolution array swap |
---|
366 | ! ------------------------------ |
---|
367 | vor_avrbb(:,:) = vor_avrb(:,:) |
---|
368 | vor_avrbn(:,:) = vor_avr(:,:) |
---|
369 | |
---|
370 | IF( idebug /= 0 ) THEN |
---|
371 | WRITE(numout,*) ' debuging trd_vor: V.3 done' |
---|
372 | CALL FLUSH(numout) |
---|
373 | ENDIF |
---|
374 | |
---|
375 | nmoydpvor=0 |
---|
376 | |
---|
377 | ENDIF |
---|
378 | |
---|
379 | ! V.5 write trends to output |
---|
380 | ! --------------------------- |
---|
381 | IF( kt >= nit000+1 ) THEN |
---|
382 | |
---|
383 | #include "trdvor_ncwrite.h90" |
---|
384 | |
---|
385 | IF( idebug /= 0 ) THEN |
---|
386 | WRITE(numout,*) ' debuging trd_vor: IV.5 done' |
---|
387 | CALL FLUSH(numout) |
---|
388 | ENDIF |
---|
389 | |
---|
390 | ENDIF |
---|
391 | |
---|
392 | IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN |
---|
393 | rotot(:,:)=0 |
---|
394 | ENDIF |
---|
395 | |
---|
396 | IF( kt == nitend ) THEN |
---|
397 | CALL histclo( nidvor ) |
---|
398 | ENDIF |
---|
399 | |
---|
400 | END SUBROUTINE trd_vor |
---|
401 | |
---|
402 | #else |
---|
403 | !!---------------------------------------------------------------------- |
---|
404 | !! Default option : Empty module |
---|
405 | !!---------------------------------------------------------------------- |
---|
406 | LOGICAL, PUBLIC :: lk_trdvor = .FALSE. ! momentum trend flag |
---|
407 | CONTAINS |
---|
408 | SUBROUTINE trd_vor( kt ) ! Empty routine |
---|
409 | WRITE(*,*) 'trd_vor: You should not have seen this print! error?', kt |
---|
410 | END SUBROUTINE trd_vor |
---|
411 | #endif |
---|
412 | |
---|
413 | !!====================================================================== |
---|
414 | END MODULE trdvor |
---|