New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
dynzdf_imp_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynzdf_imp_tam.F90 @ 2587

Last change on this file since 2587 was 2587, checked in by vidard, 13 years ago

refer to ticket #798

File size: 21.2 KB
Line 
1MODULE dynzdf_imp_tam
2#ifdef key_tam
3   !!==============================================================================
4   !!                     ***  MODULE  dynzdf_imp_tam  ***
5   !! Ocean dynamics:  vertical component(s) of the momentum mixing trend
6   !!                 Tangent and Adjoint Module
7   !!==============================================================================
8   !! History of the direct module:
9   !!                !  90-10  (B. Blanke)  Original code
10   !!                !  97-05  (G. Madec)  vertical component of isopycnal
11   !!           8.5  !  02-08  (G. Madec)  F90: Free form and module
12   !! History of the TAM module:
13   !!           9.0  !  09-01  (A. Vidard) TAM of the 02-08 version
14   !!----------------------------------------------------------------------
15
16   !!----------------------------------------------------------------------
17   !!   dyn_zdf_imp  : update the momentum trend with the vertical diffu-
18   !!                  sion using an implicit time-stepping scheme.
19   !!----------------------------------------------------------------------
20   !! * Modules used
21   USE par_kind      , ONLY: & ! Precision variables
22      & wp
23   USE par_oce       , ONLY: & ! Ocean space and time domain variables
24      & jpi,                 &
25      & jpj,                 & 
26      & jpk,                 & 
27      & jpim1,               &
28      & jpjm1,               & 
29      & jpkm1
30   USE oce_tam       , ONLY: & ! ocean dynamics and tracers
31      & ub_tl,               &
32      & ua_tl,               &
33      & vb_tl,               &
34      & va_tl,               &
35      & ub_ad,               &
36      & ua_ad,               &
37      & vb_ad,               &
38      & va_ad
39   USE zdf_oce       , ONLY: & ! ocean vertical physics
40      & avmu,                &
41      & avmv
42   USE dom_oce       , ONLY: & ! ocean space and time domain
43#if defined key_zco
44      & e3t_0,               &
45      & e3w_0,               &
46#else
47      & e3u,                 &
48      & e3v,                 &
49      & e3uw,                &
50      & e3vw,                &
51#endif
52      & umask,               &
53      & vmask
54   USE phycst        , ONLY: & ! physical constants
55      & rau0
56   USE in_out_manager, ONLY: & ! I/O manager
57      & nit000,              &
58      & nitend,              &
59      & numout,              &
60      & lwp
61 
62
63   IMPLICIT NONE
64   PRIVATE
65
66   !! * Routine accessibility
67   PUBLIC dyn_zdf_imp_tan     ! called by dynzdf_tam.F90
68   PUBLIC dyn_zdf_imp_adj     ! called by dynzdf_tam.F90
69
70   !! * Substitutions
71#  include "domzgr_substitute.h90"
72#  include "vectopt_loop_substitute.h90"
73   !!----------------------------------------------------------------------
74
75CONTAINS
76
77   SUBROUTINE dyn_zdf_imp_tan( kt, p2dt )
78      !!----------------------------------------------------------------------
79      !!                  ***  ROUTINE dyn_zdf_imp_tan  ***
80      !!                   
81      !! ** Purpose of the direct routine:
82      !!      Compute the trend due to the vert. momentum diffusion
83      !!      and the surface forcing, and add it to the general trend of
84      !!      the momentum equations.
85      !!
86      !! ** Method of the direct routine:
87      !!      The vertical momentum mixing trend is given by :
88      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) )
89      !!      backward time stepping
90      !!      Surface boundary conditions: wind stress input
91      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F)
92      !!      Add this trend to the general trend ua :
93      !!         ua = ua + dz( avmu dz(u) )E
94      !!
95      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive
96      !!               mixing trend.
97      !!---------------------------------------------------------------------
98      !! * Modules used
99      !! * Arguments
100      INTEGER , INTENT( in ) ::   kt                           ! ocean time-step index
101      REAL(wp), INTENT( in ) ::   p2dt                         ! time-step
102
103      !! * Local declarations
104      INTEGER ::   ji, jj, jk                          ! dummy loop indices
105      REAL(wp) ::   zrau0r, z2dtf, zcoef, zzws, zrhstl ! temporary scalars
106      REAL(wp), DIMENSION(jpi,jpj,jpk):: zwi, zws, zwd ! temporary workspace arrays
107      !!----------------------------------------------------------------------
108
109      IF( kt == nit000 ) THEN
110         IF(lwp) WRITE(numout,*)
111         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp_tan : vertical momentum diffusion explicit operator'
112         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~ '
113      ENDIF
114      ! 0. Local constant initialization
115      ! --------------------------------
116      zrau0r = 1. / rau0      ! inverse of the reference density
117
118      ! 1. Vertical diffusion on u
119      ! ---------------------------
120      ! Matrix and second member construction
121      ! bottom boundary condition: only zws must be masked as avmu can take
122      ! non zero value at the ocean bottom depending on the bottom friction
123      ! used (see zdfmix.F)
124      DO jk = 1, jpkm1
125         DO jj = 2, jpjm1 
126            DO ji = fs_2, fs_jpim1   ! vector opt.
127               zcoef = - p2dt / fse3u(ji,jj,jk)
128               zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  ) * umask(ji,jj,jk)
129               zzws          = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1)
130               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1)
131               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws
132            END DO
133         END DO
134      END DO
135
136      ! Surface boudary conditions
137      DO jj = 2, jpjm1 
138         DO ji = fs_2, fs_jpim1   ! vector opt.
139            zwi(ji,jj,1) = 0.
140            zwd(ji,jj,1) = 1. - zws(ji,jj,1)
141         END DO
142      END DO
143
144      ! Matrix inversion starting from the first level
145      !-----------------------------------------------------------------------
146      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
147      !
148      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
149      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
150      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
151      !        (        ...               )( ...  ) ( ...  )
152      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
153      !
154      !   m is decomposed in the product of an upper and a lower triangular matrix
155      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
156      !   The solution (the after velocity) is in ua
157      !-----------------------------------------------------------------------
158
159      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
160      DO jk = 2, jpkm1
161         DO jj = 2, jpjm1   
162            DO ji = fs_2, fs_jpim1   ! vector opt.
163               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
164            END DO
165         END DO
166      END DO
167
168      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
169      DO jj = 2, jpjm1   
170         DO ji = fs_2, fs_jpim1   ! vector opt.
171            ua_tl(ji,jj,1) = ub_tl(ji,jj,1)  &
172                           + p2dt * ua_tl(ji,jj,1)
173         END DO
174      END DO
175      DO jk = 2, jpkm1
176         DO jj = 2, jpjm1   
177            DO ji = fs_2, fs_jpim1   ! vector opt.
178               zrhstl          = ub_tl(ji,jj,jk) + p2dt * ua_tl(ji,jj,jk)   ! zrhs=right hand side
179               ua_tl(ji,jj,jk) = zrhstl - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua_tl(ji,jj,jk-1)
180            END DO
181         END DO
182      END DO
183
184      ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk
185      DO jj = 2, jpjm1   
186         DO ji = fs_2, fs_jpim1   ! vector opt.
187            ua_tl(ji,jj,jpkm1) = ua_tl(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
188         END DO
189      END DO
190      DO jk = jpk-2, 1, -1
191         DO jj = 2, jpjm1   
192            DO ji = fs_2, fs_jpim1   ! vector opt.
193               ua_tl(ji,jj,jk) = ( ua_tl(ji,jj,jk) - zws(ji,jj,jk) * ua_tl(ji,jj,jk+1) ) / zwd(ji,jj,jk)
194            END DO
195         END DO
196      END DO
197
198      ! Normalization to obtain the general momentum trend ua
199      DO jk = 1, jpkm1
200         DO jj = 2, jpjm1   
201            DO ji = fs_2, fs_jpim1   ! vector opt.
202               ua_tl(ji,jj,jk) = ( ua_tl(ji,jj,jk) - ub_tl(ji,jj,jk) ) / p2dt
203            END DO
204         END DO
205      END DO
206
207
208      ! 2. Vertical diffusion on v
209      ! ---------------------------
210      ! Matrix and second member construction
211      ! bottom boundary condition: only zws must be masked as avmv can take
212      ! non zero value at the ocean bottom depending on the bottom friction
213      ! used (see zdfmix.F)
214      DO jk = 1, jpkm1
215         DO jj = 2, jpjm1   
216            DO ji = fs_2, fs_jpim1   ! vector opt.
217               zcoef         = -p2dt / fse3v(ji,jj,jk)
218               zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  )
219               zzws          = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1)
220               zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1)
221               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws
222            END DO
223         END DO
224      END DO
225
226      ! Surface boudary conditions
227      DO jj = 2, jpjm1   
228         DO ji = fs_2, fs_jpim1   ! vector opt.
229            zwi(ji,jj,1) = 0._wp
230            zwd(ji,jj,1) = 1. - zws(ji,jj,1)
231         END DO
232      END DO
233
234      ! Matrix inversion
235      !-----------------------------------------------------------------------
236      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
237      !
238      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
239      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
240      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
241      !        (        ...               )( ...  ) ( ...  )
242      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
243      !
244      !   m is decomposed in the product of an upper and lower triangular
245      !   matrix
246      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
247      !   The solution (after velocity) is in 2d array va
248      !-----------------------------------------------------------------------
249
250      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
251      DO jk = 2, jpkm1
252         DO jj = 2, jpjm1   
253            DO ji = fs_2, fs_jpim1   ! vector opt.
254               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
255            END DO
256         END DO
257      END DO
258
259      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
260      DO jj = 2, jpjm1
261         DO ji = fs_2, fs_jpim1   ! vector opt.
262            va_tl(ji,jj,1) = vb_tl(ji,jj,1)  &
263                           + p2dt * va_tl(ji,jj,1)
264         END DO
265      END DO
266      DO jk = 2, jpkm1
267         DO jj = 2, jpjm1
268            DO ji = fs_2, fs_jpim1   ! vector opt.
269               zrhstl          = vb_tl(ji,jj,jk) + p2dt * va_tl(ji,jj,jk)   ! zrhs=right hand side
270               va_tl(ji,jj,jk) = zrhstl - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va_tl(ji,jj,jk-1)
271            END DO
272         END DO
273      END DO
274
275      ! thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk
276      DO jj = 2, jpjm1   
277         DO ji = fs_2, fs_jpim1   ! vector opt.
278            va_tl(ji,jj,jpkm1) = va_tl(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
279         END DO
280      END DO
281      DO jk = jpk-2, 1, -1
282         DO jj = 2, jpjm1   
283            DO ji = fs_2, fs_jpim1   ! vector opt.
284               va_tl(ji,jj,jk) = ( va_tl(ji,jj,jk) - zws(ji,jj,jk) * va_tl(ji,jj,jk+1) ) / zwd(ji,jj,jk)
285            END DO
286         END DO
287      END DO
288
289      ! Normalization to obtain the general momentum trend va
290      DO jk = 1, jpkm1
291         DO jj = 2, jpjm1   
292            DO ji = fs_2, fs_jpim1   ! vector opt.
293               va_tl(ji,jj,jk) = ( va_tl(ji,jj,jk) - vb_tl(ji,jj,jk) ) / p2dt
294            END DO
295         END DO
296      END DO
297
298   END SUBROUTINE dyn_zdf_imp_tan
299   SUBROUTINE dyn_zdf_imp_adj( kt, p2dt )
300      !!----------------------------------------------------------------------
301      !!                  ***  ROUTINE dyn_zdf_imp_adj  ***
302      !!                   
303      !! ** Purpose of the direct routine:
304      !!      Compute the trend due to the vert. momentum diffusion
305      !!      and the surface forcing, and add it to the general trend of
306      !!      the momentum equations.
307      !!
308      !! ** Method of the direct routine:
309      !!      The vertical momentum mixing trend is given by :
310      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) )
311      !!      backward time stepping
312      !!      Surface boundary conditions: wind stress input
313      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F)
314      !!      Add this trend to the general trend ua :
315      !!         ua = ua + dz( avmu dz(u) )E
316      !!
317      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive
318      !!               mixing trend.
319      !!---------------------------------------------------------------------
320      !! * Modules used
321      !! * Arguments
322      INTEGER , INTENT( in ) ::   kt                           ! ocean time-step index
323      REAL(wp), INTENT( in ) ::   p2dt                         ! time-step
324
325      !! * Local declarations
326      !! * Local declarations
327      INTEGER ::   ji, jj, jk                          ! dummy loop indices
328      REAL(wp) ::   zrau0r, z2dtf, zcoef, zzws, zrhsad ! temporary scalars
329      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zws, zwd! temporary workspace arrays
330      !!----------------------------------------------------------------------
331
332      IF( kt == nit000 ) THEN
333         IF(lwp) WRITE(numout,*)
334         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp_adj : vertical momentum diffusion explicit operator'
335         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~ '
336      ENDIF
337      ! 0. Local constant initialization
338      ! --------------------------------
339      zrau0r = 1. / rau0      ! inverse of the reference density
340      zrhsad = 0.0_wp
341
342
343
344
345      ! 2. Vertical diffusion on v
346      ! ---------------------------
347      ! Matrix and second member construction
348      ! bottom boundary condition: only zws must be masked as avmv can take
349      ! non zero value at the ocean bottom depending on the bottom friction
350      ! used (see zdfmix.F)
351      DO jk = 1, jpkm1
352         DO jj = 2, jpjm1   
353            DO ji = fs_2, fs_jpim1   ! vector opt.
354               zcoef         = -p2dt / fse3v(ji,jj,jk)
355               zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  )
356               zzws          = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1)
357               zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1)
358               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws
359            END DO
360         END DO
361      END DO
362
363      ! Surface boudary conditions
364      DO jj = 2, jpjm1   
365         DO ji = fs_2, fs_jpim1   ! vector opt.
366            zwi(ji,jj,1) = 0._wp
367            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
368         END DO
369      END DO
370
371      ! Matrix inversion
372      !-----------------------------------------------------------------------
373      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
374      !
375      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
376      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
377      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
378      !        (        ...               )( ...  ) ( ...  )
379      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
380      !
381      !   m is decomposed in the product of an upper and lower triangular
382      !   matrix
383      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
384      !   The solution (after velocity) is in 2d array va
385      !-----------------------------------------------------------------------
386
387      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
388      DO jk = 2, jpkm1
389         DO jj = 2, jpjm1   
390            DO ji = fs_2, fs_jpim1   ! vector opt.
391               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
392            END DO
393         END DO
394      END DO
395
396      ! Normalization to obtain the general momentum trend va
397      DO jk = jpkm1, 1, -1
398         DO jj = jpjm1, 2, -1   
399            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
400               vb_ad(ji,jj,jk) = vb_ad(ji,jj,jk) - va_ad(ji,jj,jk) / p2dt
401               va_ad(ji,jj,jk) = va_ad(ji,jj,jk) / p2dt
402            END DO
403         END DO
404      END DO
405      ! thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk
406      DO jk = 1, jpk-2
407         DO jj = jpjm1, 2, -1   
408            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
409               va_ad(ji,jj,jk+1) = va_ad(ji,jj,jk+1) - zws(ji,jj,jk) * va_ad(ji,jj,jk) / zwd(ji,jj,jk)
410               va_ad(ji,jj,jk  ) = va_ad(ji,jj,jk  ) / zwd(ji,jj,jk)
411            END DO
412         END DO
413      END DO
414      DO jj = jpjm1, 2, -1   
415         DO ji = fs_jpim1, fs_2, -1   ! vector opt.
416            va_ad(ji,jj,jpkm1) = va_ad(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
417         END DO
418      END DO
419      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
420      DO jk = jpkm1, 2, -1
421         DO jj = jpjm1, 2, -1
422            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
423               zrhsad            = zrhsad + va_ad(ji,jj,jk)
424               va_ad(ji,jj,jk-1) = va_ad(ji,jj,jk-1) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va_ad(ji,jj,jk)
425               va_ad(ji,jj,jk  ) = 0.0_wp
426               vb_ad(ji,jj,jk)   = vb_ad(ji,jj,jk) + zrhsad
427               va_ad(ji,jj,jk)   = va_ad(ji,jj,jk) + p2dt * zrhsad
428               zrhsad            = 0.0_wp
429            END DO
430         END DO
431      END DO
432      DO jj = jpjm1, 2, -1
433         DO ji = fs_jpim1, fs_2, -1   ! vector opt.
434            vb_ad(ji,jj,1) = vb_ad(ji,jj,1) + va_ad(ji,jj,1)
435            va_ad(ji,jj,1) = va_ad(ji,jj,1) * p2dt 
436         END DO
437      END DO
438
439      ! 1. Vertical diffusion on u
440      ! ---------------------------
441      ! Matrix and second member construction
442      ! bottom boundary condition: only zws must be masked as avmu can take
443      ! non zero value at the ocean bottom depending on the bottom friction
444      ! used (see zdfmix.F)
445      DO jk = 1, jpkm1
446         DO jj = 2, jpjm1 
447            DO ji = fs_2, fs_jpim1   ! vector opt.
448               zcoef = - p2dt / fse3u(ji,jj,jk)
449               zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  )
450               zzws          = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1)
451               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1)
452               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws
453            END DO
454         END DO
455      END DO
456
457      ! Surface boudary conditions
458      DO jj = 2, jpjm1 
459         DO ji = fs_2, fs_jpim1   ! vector opt.
460            zwi(ji,jj,1) = 0._wp
461            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
462         END DO
463      END DO
464
465      ! Matrix inversion starting from the first level
466      !-----------------------------------------------------------------------
467      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
468      !
469      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
470      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
471      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
472      !        (        ...               )( ...  ) ( ...  )
473      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
474      !
475      !   m is decomposed in the product of an upper and a lower triangular matrix
476      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
477      !   The solution (the after velocity) is in ua
478      !-----------------------------------------------------------------------
479
480     ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
481      DO jk = 2, jpkm1
482         DO jj = 2, jpjm1   
483            DO ji = fs_2, fs_jpim1   ! vector opt.
484               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
485            END DO
486         END DO
487      END DO
488      ! Normalization to obtain the general momentum trend ua
489      DO jk = jpkm1, 1, -1
490         DO jj = jpjm1, 2, -1 
491            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
492               ub_ad(ji,jj,jk) = ub_ad(ji,jj,jk) - ua_ad(ji,jj,jk) / p2dt
493               ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) / p2dt
494            END DO
495         END DO
496      END DO
497      ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk
498      DO jk = 1, jpk-2
499         DO jj = jpjm1, 2, -1   
500            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
501               ua_ad(ji,jj,jk+1) = ua_ad(ji,jj,jk+1) - ua_ad(ji,jj,jk) * zws(ji,jj,jk) / zwd(ji,jj,jk)
502               ua_ad(ji,jj,jk)   = ua_ad(ji,jj,jk) / zwd(ji,jj,jk)
503            END DO
504         END DO
505      END DO
506      DO jj = jpjm1, 2, -1   
507         DO ji = fs_jpim1, fs_2, -1
508            ua_ad(ji,jj,jpkm1) = ua_ad(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
509         END DO
510      END DO
511      DO jk = jpkm1, 2, -1
512         DO jj = jpjm1, 2, -1   
513            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
514               zrhsad            = zrhsad + ua_ad(ji,jj,jk)
515               ua_ad(ji,jj,jk-1) = ua_ad(ji,jj,jk-1) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua_ad(ji,jj,jk)
516               ua_ad(ji,jj,jk)   = 0.0_wp
517               ub_ad(ji,jj,jk)   = ub_ad(ji,jj,jk) + zrhsad
518               ua_ad(ji,jj,jk)   = ua_ad(ji,jj,jk) + zrhsad * p2dt
519               zrhsad            = 0.0_wp
520            END DO
521         END DO
522      END DO
523      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
524      DO jj = 2, jpjm1   
525         DO ji = fs_2, fs_jpim1   ! vector opt.
526            ub_ad(ji,jj,1) = ub_ad(ji,jj,1) + ua_ad(ji,jj,1)
527            ua_ad(ji,jj,1) = p2dt * ua_ad(ji,jj,1)
528         END DO
529      END DO
530
531 
532
533   END SUBROUTINE dyn_zdf_imp_adj
534#endif
535   !!==============================================================================
536END MODULE dynzdf_imp_tam
Note: See TracBrowser for help on using the repository browser.