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/2010_and_older/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/DYN – NEMO

source: branches/2010_and_older/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/DYN/dynzdf_imp_tam.F90 @ 5226

Last change on this file since 5226 was 2578, checked in by rblod, 13 years ago

first import of NEMOTAM 3.2.2

File size: 22.0 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      ! non zero value at the ocean bottom depending on the bottom friction
122      ! used but the bottom velocities have already been updated with the bottom
123      ! friction velocity in dyn_bfr using values from the previous timestep. There
124      ! is no need to include these in the implicit calculation.
125      DO jk = 1, jpkm1
126         DO jj = 2, jpjm1 
127            DO ji = fs_2, fs_jpim1   ! vector opt.
128               zcoef = - p2dt / fse3u(ji,jj,jk)
129               zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  ) * umask(ji,jj,jk)
130               zzws          = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1)
131               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1)
132               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws
133            END DO
134         END DO
135      END DO
136
137      ! Surface boudary conditions
138      DO jj = 2, jpjm1 
139         DO ji = fs_2, fs_jpim1   ! vector opt.
140            zwi(ji,jj,1) = 0.0_wp
141            zwd(ji,jj,1) = 1. - zws(ji,jj,1)
142         END DO
143      END DO
144
145      ! Matrix inversion starting from the first level
146      !-----------------------------------------------------------------------
147      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
148      !
149      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
150      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
151      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
152      !        (        ...               )( ...  ) ( ...  )
153      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
154      !
155      !   m is decomposed in the product of an upper and a lower triangular matrix
156      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
157      !   The solution (the after velocity) is in ua
158      !-----------------------------------------------------------------------
159
160      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
161      DO jk = 2, jpkm1
162         DO jj = 2, jpjm1   
163            DO ji = fs_2, fs_jpim1   ! vector opt.
164               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
165            END DO
166         END DO
167      END DO
168
169      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
170      DO jj = 2, jpjm1   
171         DO ji = fs_2, fs_jpim1   ! vector opt.
172            ua_tl(ji,jj,1) = ub_tl(ji,jj,1)  &
173                           + p2dt * ua_tl(ji,jj,1)
174         END DO
175      END DO
176      DO jk = 2, jpkm1
177         DO jj = 2, jpjm1   
178            DO ji = fs_2, fs_jpim1   ! vector opt.
179               zrhstl          = ub_tl(ji,jj,jk) + p2dt * ua_tl(ji,jj,jk)   ! zrhs=right hand side
180               ua_tl(ji,jj,jk) = zrhstl - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua_tl(ji,jj,jk-1)
181            END DO
182         END DO
183      END DO
184
185      ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk
186      DO jj = 2, jpjm1   
187         DO ji = fs_2, fs_jpim1   ! vector opt.
188            ua_tl(ji,jj,jpkm1) = ua_tl(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
189         END DO
190      END DO
191      DO jk = jpk-2, 1, -1
192         DO jj = 2, jpjm1   
193            DO ji = fs_2, fs_jpim1   ! vector opt.
194               ua_tl(ji,jj,jk) = ( ua_tl(ji,jj,jk) - zws(ji,jj,jk) * ua_tl(ji,jj,jk+1) ) / zwd(ji,jj,jk)
195            END DO
196         END DO
197      END DO
198
199      ! Normalization to obtain the general momentum trend ua
200      DO jk = 1, jpkm1
201         DO jj = 2, jpjm1   
202            DO ji = fs_2, fs_jpim1   ! vector opt.
203               ua_tl(ji,jj,jk) = ( ua_tl(ji,jj,jk) - ub_tl(ji,jj,jk) ) / p2dt
204            END DO
205         END DO
206      END DO
207
208
209      ! 2. Vertical diffusion on v
210      ! ---------------------------
211      ! Matrix and second member construction
212      ! bottom boundary condition: both zwi and zws must be masked as avmv can take
213      ! non zero value at the ocean bottom depending on the bottom friction
214      ! used but the bottom velocities have already been updated with the bottom
215      ! friction velocity in dyn_bfr using values from the previous timestep. There
216      ! is no need to include these in the implicit calculation.
217      DO jk = 1, jpkm1
218         DO jj = 2, jpjm1   
219            DO ji = fs_2, fs_jpim1   ! vector opt.
220               zcoef          = -p2dt / fse3v(ji,jj,jk)
221               zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  ) * vmask(ji,jj,jk)
222               zzws          = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1)
223               zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1)
224               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws
225            END DO
226         END DO
227      END DO
228
229      ! Surface boudary conditions
230      DO jj = 2, jpjm1   
231         DO ji = fs_2, fs_jpim1   ! vector opt.
232            zwi(ji,jj,1) = 0._wp
233            zwd(ji,jj,1) = 1. - zws(ji,jj,1)
234         END DO
235      END DO
236
237      ! Matrix inversion
238      !-----------------------------------------------------------------------
239      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
240      !
241      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
242      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
243      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
244      !        (        ...               )( ...  ) ( ...  )
245      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
246      !
247      !   m is decomposed in the product of an upper and lower triangular
248      !   matrix
249      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
250      !   The solution (after velocity) is in 2d array va
251      !-----------------------------------------------------------------------
252
253      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
254      DO jk = 2, jpkm1
255         DO jj = 2, jpjm1   
256            DO ji = fs_2, fs_jpim1   ! vector opt.
257               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
258            END DO
259         END DO
260      END DO
261
262      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
263      DO jj = 2, jpjm1
264         DO ji = fs_2, fs_jpim1   ! vector opt.
265            va_tl(ji,jj,1) = vb_tl(ji,jj,1)  &
266                           + p2dt * va_tl(ji,jj,1)
267         END DO
268      END DO
269      DO jk = 2, jpkm1
270         DO jj = 2, jpjm1
271            DO ji = fs_2, fs_jpim1   ! vector opt.
272               zrhstl          = vb_tl(ji,jj,jk) + p2dt * va_tl(ji,jj,jk)   ! zrhs=right hand side
273               va_tl(ji,jj,jk) = zrhstl - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va_tl(ji,jj,jk-1)
274            END DO
275         END DO
276      END DO
277
278      ! thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk
279      DO jj = 2, jpjm1   
280         DO ji = fs_2, fs_jpim1   ! vector opt.
281            va_tl(ji,jj,jpkm1) = va_tl(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
282         END DO
283      END DO
284      DO jk = jpk-2, 1, -1
285         DO jj = 2, jpjm1   
286            DO ji = fs_2, fs_jpim1   ! vector opt.
287               va_tl(ji,jj,jk) = ( va_tl(ji,jj,jk) - zws(ji,jj,jk) * va_tl(ji,jj,jk+1) ) / zwd(ji,jj,jk)
288            END DO
289         END DO
290      END DO
291
292      ! Normalization to obtain the general momentum trend va
293      DO jk = 1, jpkm1
294         DO jj = 2, jpjm1   
295            DO ji = fs_2, fs_jpim1   ! vector opt.
296               va_tl(ji,jj,jk) = ( va_tl(ji,jj,jk) - vb_tl(ji,jj,jk) ) / p2dt
297            END DO
298         END DO
299      END DO
300
301   END SUBROUTINE dyn_zdf_imp_tan
302   SUBROUTINE dyn_zdf_imp_adj( kt, p2dt )
303      !!----------------------------------------------------------------------
304      !!                  ***  ROUTINE dyn_zdf_imp_adj  ***
305      !!                   
306      !! ** Purpose of the direct routine:
307      !!      Compute the trend due to the vert. momentum diffusion
308      !!      and the surface forcing, and add it to the general trend of
309      !!      the momentum equations.
310      !!
311      !! ** Method of the direct routine:
312      !!      The vertical momentum mixing trend is given by :
313      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) )
314      !!      backward time stepping
315      !!      Surface boundary conditions: wind stress input
316      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F)
317      !!      Add this trend to the general trend ua :
318      !!         ua = ua + dz( avmu dz(u) )E
319      !!
320      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive
321      !!               mixing trend.
322      !!---------------------------------------------------------------------
323      !! * Modules used
324      !! * Arguments
325      INTEGER , INTENT( in ) ::   kt                           ! ocean time-step index
326      REAL(wp), INTENT( in ) ::   p2dt                         ! time-step
327
328      !! * Local declarations
329      !! * Local declarations
330      INTEGER ::   ji, jj, jk                          ! dummy loop indices
331      REAL(wp) ::   zrau0r, z2dtf, zcoef, zzws, zrhsad ! temporary scalars
332      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zws, zwd! temporary workspace arrays
333      !!----------------------------------------------------------------------
334
335      IF( kt == nitend ) THEN
336         IF(lwp) WRITE(numout,*)
337         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp_adj : vertical momentum diffusion explicit operator'
338         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~ '
339      ENDIF
340      ! 0. Local constant initialization
341      ! --------------------------------
342      zrau0r = 1. / rau0      ! inverse of the reference density
343      zrhsad = 0.0_wp
344
345      ! 2. Vertical diffusion on v
346      ! ---------------------------
347      ! Matrix and second member construction
348      ! bottom boundary condition: both zwi and zws must be masked as avmv can take
349      ! non zero value at the ocean bottom depending on the bottom friction
350      ! used but the bottom velocities have already been updated with the bottom
351      ! friction velocity in dyn_bfr using values from the previous timestep. There
352      ! is no need to include these in the implicit calculation.
353      DO jk = 1, jpkm1
354         DO jj = 2, jpjm1   
355            DO ji = fs_2, fs_jpim1   ! vector opt.
356               zcoef         = -p2dt / fse3v(ji,jj,jk)
357               zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  ) * vmask(ji,jj,jk)
358               zzws          = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1)
359               zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1)
360               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws
361            END DO
362         END DO
363      END DO
364
365      ! Surface boudary conditions
366      DO jj = 2, jpjm1   
367         DO ji = fs_2, fs_jpim1   ! vector opt.
368            zwi(ji,jj,1) = 0._wp
369            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
370         END DO
371      END DO
372
373      ! Matrix inversion
374      !-----------------------------------------------------------------------
375      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
376      !
377      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
378      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
379      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
380      !        (        ...               )( ...  ) ( ...  )
381      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
382      !
383      !   m is decomposed in the product of an upper and lower triangular
384      !   matrix
385      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
386      !   The solution (after velocity) is in 2d array va
387      !-----------------------------------------------------------------------
388
389      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
390      DO jk = 2, jpkm1
391         DO jj = 2, jpjm1   
392            DO ji = fs_2, fs_jpim1   ! vector opt.
393               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
394            END DO
395         END DO
396      END DO
397
398      ! Normalization to obtain the general momentum trend va
399      DO jk = jpkm1, 1, -1
400         DO jj = jpjm1, 2, -1   
401            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
402               vb_ad(ji,jj,jk) = vb_ad(ji,jj,jk) - va_ad(ji,jj,jk) / p2dt
403               va_ad(ji,jj,jk) = va_ad(ji,jj,jk) / p2dt
404            END DO
405         END DO
406      END DO
407      ! thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk
408      DO jk = 1, jpk-2
409         DO jj = jpjm1, 2, -1   
410            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
411               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)
412               va_ad(ji,jj,jk  ) = va_ad(ji,jj,jk  ) / zwd(ji,jj,jk)
413            END DO
414         END DO
415      END DO
416      DO jj = jpjm1, 2, -1   
417         DO ji = fs_jpim1, fs_2, -1   ! vector opt.
418            va_ad(ji,jj,jpkm1) = va_ad(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
419         END DO
420      END DO
421      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
422      DO jk = jpkm1, 2, -1
423         DO jj = jpjm1, 2, -1
424            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
425               zrhsad            = zrhsad + va_ad(ji,jj,jk)
426               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)
427               va_ad(ji,jj,jk  ) = 0.0_wp
428               vb_ad(ji,jj,jk)   = vb_ad(ji,jj,jk) + zrhsad
429               va_ad(ji,jj,jk)   = va_ad(ji,jj,jk) + p2dt * zrhsad
430               zrhsad            = 0.0_wp
431            END DO
432         END DO
433      END DO
434      DO jj = jpjm1, 2, -1
435         DO ji = fs_jpim1, fs_2, -1   ! vector opt.
436            vb_ad(ji,jj,1) = vb_ad(ji,jj,1) + va_ad(ji,jj,1)
437            va_ad(ji,jj,1) = va_ad(ji,jj,1) * p2dt 
438         END DO
439      END DO
440
441      ! 1. Vertical diffusion on u
442      ! ---------------------------
443      ! Matrix and second member construction
444      ! bottom boundary condition: both zwi and zws must be masked as avmu can take
445      ! non zero value at the ocean bottom depending on the bottom friction
446      ! used but the bottom velocities have already been updated with the bottom
447      ! friction velocity in dyn_bfr using values from the previous timestep. There
448      ! is no need to include these in the implicit calculation.
449      DO jk = 1, jpkm1
450         DO jj = 2, jpjm1 
451            DO ji = fs_2, fs_jpim1   ! vector opt.
452               zcoef = - p2dt / fse3u(ji,jj,jk)
453               zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  ) * umask(ji,jj,jk)
454               zzws          = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1)
455               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1)
456               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws
457            END DO
458         END DO
459      END DO
460
461      ! Surface boudary conditions
462      DO jj = 2, jpjm1 
463         DO ji = fs_2, fs_jpim1   ! vector opt.
464            zwi(ji,jj,1) = 0._wp
465            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
466         END DO
467      END DO
468
469      ! Matrix inversion starting from the first level
470      !-----------------------------------------------------------------------
471      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
472      !
473      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
474      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
475      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
476      !        (        ...               )( ...  ) ( ...  )
477      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
478      !
479      !   m is decomposed in the product of an upper and a lower triangular matrix
480      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
481      !   The solution (the after velocity) is in ua
482      !-----------------------------------------------------------------------
483
484     ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)
485      DO jk = 2, jpkm1
486         DO jj = 2, jpjm1   
487            DO ji = fs_2, fs_jpim1   ! vector opt.
488               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
489            END DO
490         END DO
491      END DO
492      ! Normalization to obtain the general momentum trend ua
493      DO jk = jpkm1, 1, -1
494         DO jj = jpjm1, 2, -1 
495            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
496               ub_ad(ji,jj,jk) = ub_ad(ji,jj,jk) - ua_ad(ji,jj,jk) / p2dt
497               ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) / p2dt
498            END DO
499         END DO
500      END DO
501      ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk
502      DO jk = 1, jpk-2
503         DO jj = jpjm1, 2, -1   
504            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
505               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)
506               ua_ad(ji,jj,jk)   = ua_ad(ji,jj,jk) / zwd(ji,jj,jk)
507            END DO
508         END DO
509      END DO
510      DO jj = jpjm1, 2, -1   
511         DO ji = fs_jpim1, fs_2, -1
512            ua_ad(ji,jj,jpkm1) = ua_ad(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
513         END DO
514      END DO
515      DO jk = jpkm1, 2, -1
516         DO jj = jpjm1, 2, -1   
517            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
518               zrhsad            = zrhsad + ua_ad(ji,jj,jk)
519               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)
520               ua_ad(ji,jj,jk)   = 0.0_wp
521               ub_ad(ji,jj,jk)   = ub_ad(ji,jj,jk) + zrhsad
522               ua_ad(ji,jj,jk)   = ua_ad(ji,jj,jk) + zrhsad * p2dt
523               zrhsad            = 0.0_wp
524            END DO
525         END DO
526      END DO
527      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1
528      DO jj = 2, jpjm1   
529         DO ji = fs_2, fs_jpim1   ! vector opt.
530            ub_ad(ji,jj,1) = ub_ad(ji,jj,1) + ua_ad(ji,jj,1)
531            ua_ad(ji,jj,1) = p2dt * ua_ad(ji,jj,1)
532         END DO
533      END DO
534
535 
536
537   END SUBROUTINE dyn_zdf_imp_adj
538#endif
539   !!==============================================================================
540END MODULE dynzdf_imp_tam
Note: See TracBrowser for help on using the repository browser.