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.
dynspg_flt_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/dynspg_flt_tam.F90 @ 9254

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

first import of NEMOTAM 3.2.2

File size: 70.5 KB
Line 
1MODULE dynspg_flt_tam
2   !!----------------------------------------------------------------------
3   !!    This software is governed by the CeCILL licence (Version 2)
4   !!----------------------------------------------------------------------
5#if defined key_tam
6   !!======================================================================
7   !!  ***  MODULE  dynspg_flt_tam : TANGENT/ADJOINT OF MODULE dynspg_flt  ***
8   !!
9   !! Ocean dynamics:  surface pressure gradient trend
10   !!
11   !!======================================================================
12   !! History of the direct module:
13   !! History    OPA  !  1998-05  (G. Roullet)  free surface
14   !!                 !  1998-10  (G. Madec, M. Imbard)  release 8.2
15   !!   NEMO     O.1  !  2002-08  (G. Madec)  F90: Free form and module
16   !!             -   !  2002-11  (C. Talandier, A-M Treguier) Open boundaries
17   !!            1.0  !  2004-08  (C. Talandier) New trends organization
18   !!             -   !  2005-11  (V. Garnier) Surface pressure gradient organization
19   !!            2.0  !  2006-07  (S. Masson)  distributed restart using iom
20   !!             -   !  2006-08  (J.Chanut, A.Sellar) Calls to BDY routines.
21   !!            3.2  !  2009-03  (G. Madec, M. Leclair, R. Benshila) introduce sshwzv module
22   !! History of the TAM module:
23   !!            9.0  ! 2008-08  (A. Vidard) skeleton
24   !!             -   ! 2008-08  (A. Weaver) original version
25   !!   NEMO     3.2  ! 2010-04  (F. Vigilant) converison to 3.2
26   !!----------------------------------------------------------------------
27# if defined key_dynspg_flt   ||   defined key_esopa 
28   !!----------------------------------------------------------------------
29   !!   'key_dynspg_flt'                              filtered free surface
30   !!----------------------------------------------------------------------
31   !!----------------------------------------------------------------------
32   !!   dyn_spg_flt_tan  : update the momentum trend with the surface pressure
33   !!                      gradient in the filtered free surface case
34   !!                      (tangent routine)
35   !!   dyn_spg_flt_adj  : update the momentum trend with the surface pressure
36   !!                      gradient in the filtered free surface case
37   !!                      (adjoint routine)
38   !!   dyn_spg_flt_adj_tst : Test of the adjoint routine
39   !!----------------------------------------------------------------------
40   USE par_kind      , ONLY: & ! Precision variables
41      & wp
42   USE prtctl                  ! Print control
43   USE par_oce       , ONLY: & ! Ocean space and time domain variables
44      & jpi,                 &
45      & jpj,                 & 
46      & jpk,                 &
47      & jpim1,               &
48      & jpjm1,               &
49      & jpkm1,               &
50      & jpr2di,              &
51      & jpr2dj,              &
52      & jpij,                &
53      & jpiglo,              &
54      & lk_vopt_loop
55   USE in_out_manager, ONLY: & ! I/O manager
56      & lwp,                 &
57      & numout,              & 
58      & nit000,              &
59      & nitend,              &
60      & ctl_stop,            &
61      & ln_ctl,              &
62      & ctmp1
63   USE phycst        , ONLY: & ! Physical constants
64      & grav
65   USE lib_mpp       , ONLY: & ! distributed memory computing
66      & lk_mpp,              &
67      & mpp_sum
68   USE mppsum        , ONLY: & ! Summation of arrays across processors
69      & mpp_sum_indep
70   USE dom_oce       , ONLY: & ! Ocean space and time domain
71      & e1u,                 &
72      & e2u,                 &
73      & e1v,                 &
74      & e2v,                 &
75      & e1t,                 &
76      & e2t,                 &
77#  if defined key_zco
78      & e3t_0,               &
79#  else
80      & e3u,                 &
81      & e3v,                 &
82#  endif
83      & tmask,               &
84      & umask,               &
85      & vmask,               &
86      & bmask,               &
87      & rdt,                 &
88      & neuler,              &
89      & n_cla,               &
90      & mig,                 &
91      & mjg,                 &
92      & nldi,                &
93      & nldj,                &
94      & nlei,                &
95      & nlej,                &
96      & atfp,                &   
97      & atfp1,               &
98      & lk_vvl
99   USE solver        , ONLY: & ! Solvers
100      & sol_mat
101   USE sol_oce       , ONLY: & ! Solver variables in memory
102      & nn_solv,             &
103      & nn_nmod,             &
104      & ncut,                &
105      & niter,               &
106      & eps,                 &
107      & epsr,                &
108      & rnorme,              &
109      & res,                 &
110      & c_solver_pt,         &
111      & gcdprc
112   USE oce_tam       , ONLY: & ! Tangent-linear and adjoint model variables
113      & ub_tl,               &
114      & vb_tl,               &
115      & ua_tl,               &
116      & va_tl,               &
117      & ub_ad,               &
118      & vb_ad,               &
119      & ua_ad,               &
120      & va_ad,               &
121      & spgu_tl,             &
122      & spgv_tl,             &
123      & spgu_ad,             &
124      & spgv_ad,             &
125      & sshn_tl,             &
126      & sshn_ad
127   USE sbc_oce_tam   , ONLY: & ! Surface BCs for tangent and adjoint model
128      & emp_tl,              &
129      & emp_ad
130#  if defined key_obc
131#    if defined key_pomme_r025
132   USE obc_oce
133   USE obcdyn_tam
134#    else
135   Error, OBC not ready.
136#    endif
137#  endif
138   USE sol_oce       , ONLY: & ! Solver arrays
139      & gcdmat
140   USE sol_oce_tam   , ONLY: & ! Solver arrays for tangent and adjoint model
141      & gcx_tl,              &
142      & gcxb_tl,             &
143      & gcb_tl,              &
144      & gcx_ad,              &
145      & gcxb_ad,             &
146      & gcb_ad
147   USE solsor_tam    , ONLY: & ! SOR solver for tangent and adjoint model
148      & sol_sor_tan,         &
149      & sol_sor_adj
150   USE solpcg_tam    , ONLY: & ! PCG solver for tangent and adjoint model
151      & sol_pcg_tan,         &
152      & sol_pcg_adj
153   USE lbclnk        , ONLY: & ! Lateral boundary conditions
154      & lbc_lnk,             &
155      & lbc_lnk_e
156   USE lbclnk_tam    , ONLY: & ! TAM lateral boundary conditions
157      & lbc_lnk_adj,         &
158      & lbc_lnk_e_adj
159   USE gridrandom    , ONLY: & ! Random Gaussian noise on grids
160      & grid_random
161   USE dotprodfld    , ONLY: & ! Computes dot product for 3D and 2D fields
162      & dot_product
163   USE paresp        , ONLY: & ! Normalized energy weights
164      & wesp_emp,            &
165      & wesp_ssh         
166   USE dynadv,         ONLY: &
167      & ln_dynadv_vec          ! vector form flag     
168   USE cla_dynspg_tam, ONLY: & ! Cross land advection on surface pressure
169      & dyn_spg_cla_tan,     &
170      & dyn_spg_cla_adj
171   USE tstool_tam    , ONLY: &
172      & stdu,                &
173      & stdv,                &
174      & stdw,                &
175      & stdemp,              &
176      & stdssh,              &
177      & prntst_adj,          &
178      & prntst_tlm           
179
180   IMPLICIT NONE
181   PRIVATE
182
183   !! * Accessibility
184   PUBLIC dyn_spg_flt_tan,     & ! routine called by step_tan.F90
185      &   dyn_spg_flt_adj,     & ! routine called by step_adj.F90
186      &   dyn_spg_flt_adj_tst    ! routine called by the tst.F90
187#  if defined key_tst_tlm
188   PUBLIC dyn_spg_flt_tlm_tst
189#  endif
190   !! * Substitutions
191#  include "domzgr_substitute.h90"
192#  include "vectopt_loop_substitute.h90"
193   !!----------------------------------------------------------------------
194CONTAINS
195
196   SUBROUTINE dyn_spg_flt_tan( kt, kindic )
197      !!---------------------------------------------------------------------
198      !!                  ***  routine dyn_spg_flt_tan  ***
199      !!
200      !! ** Purpose of the direct routine:
201      !!      Compute the now trend due to the surface pressure
202      !!      gradient in case of filtered free surface formulation  and add
203      !!      it to the general trend of momentum equation.
204      !!
205      !! ** Method of the direct routine:
206      !!      Filtered free surface formulation. The surface
207      !!      pressure gradient is given by:
208      !!         spgu = 1/rau0 d/dx(ps) =  1/e1u di( sshn + btda )
209      !!         spgv = 1/rau0 d/dy(ps) =  1/e2v dj( sshn + btda )
210      !!      where sshn is the free surface elevation and btda is the after
211      !!      time derivative of the free surface elevation
212      !!       -1- evaluate the surface presure trend (including the addi-
213      !!      tional force) in three steps:
214      !!        a- compute the right hand side of the elliptic equation:
215      !!            gcb = 1/(e1t e2t) [ di(e2u spgu) + dj(e1v spgv) ]
216      !!         where (spgu,spgv) are given by:
217      !!            spgu = vertical sum[ e3u (ub+ 2 rdt ua ) ]
218      !!                 - grav 2 rdt hu /e1u di[sshn + emp]
219      !!            spgv = vertical sum[ e3v (vb+ 2 rdt va) ]
220      !!                 - grav 2 rdt hv /e2v dj[sshn + emp]
221      !!         and define the first guess from previous computation :
222      !!            zbtd = btda
223      !!            btda = 2 zbtd - btdb
224      !!            btdb = zbtd
225      !!        b- compute the relative accuracy to be reached by the
226      !!         iterative solver
227      !!        c- apply the solver by a call to sol... routine
228      !!       -2- compute and add the free surface pressure gradient inclu-
229      !!      ding the additional force used to stabilize the equation.
230      !!
231      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
232      !!
233      !! References : Roullet and Madec 1999, JGR.
234      !!---------------------------------------------------------------------
235      !! * Arguments
236      INTEGER, INTENT( IN  ) :: &
237         &  kt         ! ocean time-step index
238      INTEGER, INTENT( OUT ) :: &
239         &  kindic     ! solver convergence flag (<0 if not converge)
240
241      !! * Local declarations
242      INTEGER  :: &
243         & ji,    &     ! dummy loop indices
244         & jj,    &
245         & jk                         
246      REAL(wp) ::  &
247         & z2dt,   & ! temporary scalars
248         & z2dtg,  & 
249         & zgcb,   &
250         & zbtd,   & 
251         & ztdgu,  &
252         & ztdgv             
253      !! Variable volume
254      REAL(wp), DIMENSION(jpi,jpj) ::  & ! 2D workspace
255         & zsshub, & 
256         & zsshua, &
257         & zsshvb, &
258         & zsshva, &
259         & zssha         
260      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  &  ! 3D workspace
261         & zfse3ub, &
262         & zfse3ua, &
263         & zfse3vb, &
264         & zfse3va 
265      !!----------------------------------------------------------------------
266      !
267      IF( kt == nit000 ) THEN
268
269         IF(lwp) WRITE(numout,*)
270         IF(lwp) WRITE(numout,*) 'dyn_spg_flt_tan : surface pressure gradient trend'
271         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   (free surface constant volume case)'
272       
273         ! set to zero free surface specific arrays
274         spgu_tl(:,:) = 0.0_wp                    ! surface pressure gradient (i-direction)
275         spgv_tl(:,:) = 0.0_wp                    ! surface pressure gradient (j-direction)
276
277      ENDIF
278
279      ! Local constant initialization
280      IF     ( neuler == 0 .AND. kt == nit000     ) THEN
281
282         z2dt = rdt             ! time step: Euler if restart from rest
283         CALL sol_mat(kt)       ! initialize matrix
284
285      ELSEIF ( neuler == 0 .AND. kt == nit000 + 1 ) THEN
286
287         z2dt = 2.0_wp * rdt    ! time step: leap-frog
288         CALL sol_mat(kt)       ! initialize matrix
289
290      ELSEIF ( neuler /= 0 .AND. kt == nit000     ) THEN
291
292         z2dt = 2.0_wp * rdt    ! time step: leap-frog
293         CALL sol_mat(kt)       ! initialize matrix
294
295      ELSE
296
297         z2dt = 2.0_wp * rdt    ! time step: leap-frog
298
299      ENDIF
300
301      z2dtg  = grav * z2dt
302
303      ! Evaluate the masked next velocity (effect of the additional force not included)
304
305      IF( lk_vvl ) THEN          ! variable volume  (surface pressure gradient already included in dyn_hpg)
306         !
307         IF( ln_dynadv_vec ) THEN      ! vector form : applied on velocity
308            DO jk = 1, jpkm1
309               DO jj = 2, jpjm1
310                  DO ji = fs_2, fs_jpim1   ! vector opt.
311                     ua_tl(ji,jj,jk) = (  ub_tl(ji,jj,jk) + z2dt * ua_tl(ji,jj,jk)  ) * umask(ji,jj,jk)
312                     va_tl(ji,jj,jk) = (  vb_tl(ji,jj,jk) + z2dt * va_tl(ji,jj,jk)  ) * vmask(ji,jj,jk)
313                  END DO
314               END DO
315            END DO
316            !
317         ELSE                          ! flux form : applied on thickness weighted velocity
318            DO jk = 1, jpkm1
319               DO jj = 2, jpjm1
320                  DO ji = fs_2, fs_jpim1   ! vector opt.
321                     ua_tl(ji,jj,jk) = (        ub_tl(ji,jj,jk) * fse3u_b(ji,jj,jk)      &
322                        &           + z2dt * ua_tl(ji,jj,jk) * fse3u_n(ji,jj,jk)  )   &
323                        &         / fse3u_a(ji,jj,jk) * umask(ji,jj,jk)
324                     va_tl(ji,jj,jk) = (        vb_tl(ji,jj,jk) * fse3v_b(ji,jj,jk)      &
325                        &           + z2dt * va_tl(ji,jj,jk) * fse3v_n(ji,jj,jk)  )   &
326                        &         / fse3v_a(ji,jj,jk) * vmask(ji,jj,jk)
327                 END DO
328               END DO
329            END DO
330            !
331         ENDIF
332         !
333      ELSE                       ! fixed volume  (add the surface pressure gradient + unweighted time stepping)
334         !
335         DO jj = 2, jpjm1              ! Surface pressure gradient (now)
336            DO ji = fs_2, fs_jpim1   ! vector opt.
337               spgu_tl(ji,jj) = - grav * ( sshn_tl(ji+1,jj) - sshn_tl(ji,jj) ) / e1u(ji,jj)
338               spgv_tl(ji,jj) = - grav * ( sshn_tl(ji,jj+1) - sshn_tl(ji,jj) ) / e2v(ji,jj)
339            END DO
340         END DO
341         DO jk = 1, jpkm1              ! unweighted time stepping
342            DO jj = 2, jpjm1
343               DO ji = fs_2, fs_jpim1   ! vector opt.
344                  ua_tl(ji,jj,jk) = (  ub_tl(ji,jj,jk) + z2dt * ( ua_tl(ji,jj,jk) + spgu_tl(ji,jj) )  ) * umask(ji,jj,jk)
345                  va_tl(ji,jj,jk) = (  vb_tl(ji,jj,jk) + z2dt * ( va_tl(ji,jj,jk) + spgv_tl(ji,jj) )  ) * vmask(ji,jj,jk)
346               END DO
347            END DO
348         END DO
349         !
350      ENDIF
351
352#  if defined key_obc
353      IF( lk_obc )   CALL obc_dyn_tan( kt )      ! Update velocities on each open boundary with the radiation algorithm
354!      IF( lk_obc )   CALL obc_vol_tan( kt )   ! Correction of the barotropic componant velocity to control the volume of the system
355#  endif
356#  if defined key_bdy
357      CALL ctl_stop( 'dyn_spg_flt_tan: key_bdy is not available' )
358#  endif
359#  if defined key_agrif
360      CALL ctl_stop( 'dyn_spg_flt_tan: key_agrif is not available' )
361#  endif
362#  if defined key_orca_r2
363      IF( n_cla == 1 )   CALL dyn_spg_cla_tan( kt )      ! Cross Land Advection (update (ua,va))
364#  endif
365
366      ! compute the next vertically averaged velocity (effect of the additional force not included)
367      ! ---------------------------------------------
368      DO jj = 2, jpjm1
369         DO ji = fs_2, fs_jpim1   ! vector opt.
370            spgu_tl(ji,jj) = 0.0_wp
371            spgv_tl(ji,jj) = 0.0_wp
372         END DO
373      END DO
374
375      ! vertical sum
376!CDIR NOLOOPCHG
377      IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
378         DO jk = 1, jpkm1
379            DO ji = 1, jpij
380               spgu_tl(ji,1) = spgu_tl(ji,1) + fse3u(ji,1,jk) * ua_tl(ji,1,jk)
381               spgv_tl(ji,1) = spgv_tl(ji,1) + fse3v(ji,1,jk) * va_tl(ji,1,jk)
382            END DO
383         END DO
384      ELSE                        ! No  vector opt.
385         DO jk = 1, jpkm1
386            DO jj = 2, jpjm1
387               DO ji = 2, jpim1
388                  spgu_tl(ji,jj) = spgu_tl(ji,jj) + fse3u(ji,jj,jk) * ua_tl(ji,jj,jk)
389                  spgv_tl(ji,jj) = spgv_tl(ji,jj) + fse3v(ji,jj,jk) * va_tl(ji,jj,jk)
390               END DO
391            END DO
392         END DO
393      ENDIF
394
395      ! transport: multiplied by the horizontal scale factor
396      DO jj = 2, jpjm1
397         DO ji = fs_2, fs_jpim1   ! vector opt.
398            spgu_tl(ji,jj) = spgu_tl(ji,jj) * e2u(ji,jj)
399            spgv_tl(ji,jj) = spgv_tl(ji,jj) * e1v(ji,jj)
400         END DO
401      END DO
402
403      CALL lbc_lnk( spgu_tl, 'U', -1.0_wp )       ! lateral boundary conditions
404      CALL lbc_lnk( spgv_tl, 'V', -1.0_wp )
405
406      IF( lk_vvl ) CALL ctl_stop( 'dyn_spg_flt_tan: lk_vvl is not available' )
407
408      ! Right hand side of the elliptic equation and first guess
409      ! -----------------------------------------------------------
410      DO jj = 2, jpjm1
411         DO ji = fs_2, fs_jpim1   ! vector opt.
412            ! Divergence of the after vertically averaged velocity
413            zgcb =  spgu_tl(ji,jj) - spgu_tl(ji-1,jj)   &
414               &  + spgv_tl(ji,jj) - spgv_tl(ji,jj-1)
415            gcb_tl(ji,jj) = gcdprc(ji,jj) * zgcb
416            ! First guess of the after barotropic transport divergence
417            zbtd = gcx_tl(ji,jj)
418            gcx_tl (ji,jj) = 2.0_wp * zbtd - gcxb_tl(ji,jj)
419            gcxb_tl(ji,jj) =          zbtd
420         END DO
421      END DO
422      ! apply the lateral boundary conditions
423      IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) CALL lbc_lnk_e( gcb_tl, c_solver_pt, 1.0_wp )   
424#  if defined key_agrif
425      CALL ctl_stop( 'dyn_spg_flt_tan: key_agrif is not available' )
426#  endif
427
428      ! Relative precision (computation on one processor)
429      ! ------------------
430      rnorme = SUM( gcb_tl(1:jpi,1:jpj) * gcdmat(1:jpi,1:jpj) * gcb_tl(1:jpi,1:jpj) * bmask(:,:) )
431      IF( lk_mpp )   CALL mpp_sum( rnorme )   ! sum over the global domain
432
433      epsr = eps * eps * rnorme
434      ncut = 0
435      ! if rnorme is 0, the solution is 0, the solver is not called
436      IF( rnorme == 0.0_wp ) THEN
437         gcx_tl(:,:) = 0.0_wp
438         res   = 0.0_wp
439         niter = 0
440         ncut  = 999
441      ENDIF
442
443      ! Evaluate the next transport divergence
444      ! --------------------------------------
445      !    Iterarive solver for the elliptic equation (except IF sol.=0)
446      !    (output in gcx with boundary conditions applied)
447      kindic = 0
448      IF( ncut == 0 ) THEN
449         IF    ( nn_solv == 1 ) THEN  ;  CALL sol_pcg_tan( kt, kindic )   ! diagonal preconditioned conjuguate gradient
450         ELSEIF( nn_solv == 2 ) THEN  ;  CALL sol_sor_tan( kt, kindic )   ! successive-over-relaxation
451         ENDIF
452      ENDIF
453     
454      ! Transport divergence gradient multiplied by z2dt
455      ! --------------------------------------------====
456      DO jj = 2, jpjm1
457         DO ji = fs_2, fs_jpim1   ! vector opt.
458            ! trend of Transport divergence gradient
459            ztdgu = z2dtg * ( gcx_tl(ji+1,jj  ) - gcx_tl(ji,jj) ) / e1u(ji,jj)
460            ztdgv = z2dtg * ( gcx_tl(ji  ,jj+1) - gcx_tl(ji,jj) ) / e2v(ji,jj)
461            ! multiplied by z2dt
462#  if defined key_obc
463            ! caution : grad D = 0 along open boundaries
464            IF( Agrif_Root() ) THEN
465               spgu_tl(ji,jj) = z2dt * ztdgu * obcumask(ji,jj)
466               spgv_tl(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj)         
467            ELSE
468               spgu_tl(ji,jj) = z2dt * ztdgu
469               spgv_tl(ji,jj) = z2dt * ztdgv
470            ENDIF
471#  elif defined key_bdy
472            CALL ctl_stop( 'dyn_spg_flt_tan: key_bdy is not available' )
473#  else
474            spgu_tl(ji,jj) = z2dt * ztdgu
475            spgv_tl(ji,jj) = z2dt * ztdgv
476#  endif
477         END DO
478      END DO
479
480#  if defined key_agrif     
481      CALL ctl_stop( 'dyn_spg_flt_tan: key_agrif is not available' )
482#  endif
483
484      ! Add the trends multiplied by z2dt to the after velocity
485      ! -------------------------------------------------------
486      !     ( c a u t i o n : (ua_tl,va_tl) here are the after velocity not the
487      !                       trend, the leap-frog time stepping will not
488      !                       be done in dynnxt_tan.F90 routine)
489      DO jk = 1, jpkm1
490         DO jj = 2, jpjm1
491            DO ji = fs_2, fs_jpim1   ! vector opt.
492               ua_tl(ji,jj,jk) = ( ua_tl(ji,jj,jk) + spgu_tl(ji,jj) ) * umask(ji,jj,jk)
493               va_tl(ji,jj,jk) = ( va_tl(ji,jj,jk) + spgv_tl(ji,jj) ) * vmask(ji,jj,jk)
494            END DO
495         END DO
496      END DO
497
498      !
499   END SUBROUTINE dyn_spg_flt_tan
500
501   SUBROUTINE dyn_spg_flt_adj( kt, kindic )
502      !!----------------------------------------------------------------------
503      !!                  ***  routine dyn_spg_flt_adj  ***
504      !!
505      !! ** Purpose of the direct routine:
506      !!      Compute the now trend due to the surface pressure
507      !!      gradient in case of filtered free surface formulation  and add
508      !!      it to the general trend of momentum equation.
509      !!
510      !! ** Method of the direct routine:
511      !!      Filtered free surface formulation. The surface
512      !!      pressure gradient is given by:
513      !!         spgu = 1/rau0 d/dx(ps) =  1/e1u di( sshn + btda )
514      !!         spgv = 1/rau0 d/dy(ps) =  1/e2v dj( sshn + btda )
515      !!      where sshn is the free surface elevation and btda is the after
516      !!      time derivative of the free surface elevation
517      !!       -1- evaluate the surface presure trend (including the addi-
518      !!      tional force) in three steps:
519      !!        a- compute the right hand side of the elliptic equation:
520      !!            gcb = 1/(e1t e2t) [ di(e2u spgu) + dj(e1v spgv) ]
521      !!         where (spgu,spgv) are given by:
522      !!            spgu = vertical sum[ e3u (ub+ 2 rdt ua ) ]
523      !!                 - grav 2 rdt hu /e1u di[sshn + emp]
524      !!            spgv = vertical sum[ e3v (vb+ 2 rdt va) ]
525      !!                 - grav 2 rdt hv /e2v dj[sshn + emp]
526      !!         and define the first guess from previous computation :
527      !!            zbtd = btda
528      !!            btda = 2 zbtd - btdb
529      !!            btdb = zbtd
530      !!        b- compute the relative accuracy to be reached by the
531      !!         iterative solver
532      !!        c- apply the solver by a call to sol... routine
533      !!       -2- compute and add the free surface pressure gradient inclu-
534      !!      ding the additional force used to stabilize the equation.
535      !!
536      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
537      !!
538      !! References : Roullet and Madec 1999, JGR.
539      !!---------------------------------------------------------------------
540      !! * Arguments
541      INTEGER, INTENT( IN  ) :: &
542         &  kt         ! ocean time-step index
543      INTEGER, INTENT( OUT ) :: &
544         &  kindic     ! solver convergence flag (<0 if not converge)
545
546      !! * Local declarations
547      INTEGER  :: &
548         & ji, &     ! dummy loop indices
549         & jj, &
550         & jk                         
551      REAL(wp) :: &
552         & z2dt,   & ! temporary scalars
553         & z2dtg,  &
554         & zgcb,   &
555         & zbtd,   & 
556         & ztdgu,  &
557         & ztdgv             
558      !!----------------------------------------------------------------------
559      !
560      IF( kt == nitend ) THEN
561         IF(lwp) WRITE(numout,*)
562         IF(lwp) WRITE(numout,*) 'dyn_spg_flt_adj : surface pressure gradient trend'
563         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   (free surface constant volume case)'
564      ENDIF
565
566      ! Local constant initialization
567      IF     ( neuler == 0 .AND. kt == nit000     ) THEN
568
569         z2dt = rdt             ! time step: Euler if restart from rest
570         CALL sol_mat(kt)       ! initialize matrix
571
572      ELSEIF (   neuler == 0 .AND. kt == nit000 + 1 ) THEN
573
574         z2dt = 2.0_wp * rdt    ! time step: leap-frog
575         CALL sol_mat(kt)       ! reinitialize matrix
576
577      ELSEIF (                   kt == nitend     ) THEN
578
579         z2dt = 2.0_wp * rdt    ! time step: leap-frog
580         CALL sol_mat(kt)       ! reinitialize matrix
581
582      ELSEIF ( neuler /= 0 .AND. kt == nit000     ) THEN
583
584         z2dt = 2.0_wp * rdt    ! time step: leap-frog
585         CALL sol_mat(kt)       ! initialize matrix
586
587      ELSE
588
589         z2dt = 2.0_wp * rdt    ! time step: leap-frog
590
591      ENDIF
592
593      z2dtg  = grav * z2dt
594
595      ! Add the trends multiplied by z2dt to the after velocity
596      ! -----------------------------------------------------------
597      !     ( c a u t i o n : (ua_ad,va_ad) here are the after velocity not the
598      !                       trend, the leap-frog time stepping will not
599      !                       be done in dynnxt_adj.F90 routine)
600      DO jk = 1, jpkm1
601         DO jj = 2, jpjm1
602            DO ji = fs_2, fs_jpim1   ! vector opt.
603               ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) * umask(ji,jj,jk)
604               va_ad(ji,jj,jk) = va_ad(ji,jj,jk) * vmask(ji,jj,jk)
605               spgu_ad(ji,jj)  = spgu_ad(ji,jj)  + ua_ad(ji,jj,jk)
606               spgv_ad(ji,jj)  = spgv_ad(ji,jj)  + va_ad(ji,jj,jk)
607            END DO
608         END DO
609      END DO
610
611#  if defined key_agrif     
612      CALL ctl_stop( 'dyn_spg_flt_adj: key_agrif is not available' )
613#  endif
614
615      ! Transport divergence gradient multiplied by z2dt
616      ! --------------------------------------------====
617      DO jj = 2, jpjm1
618         DO ji = fs_2, fs_jpim1   ! vector opt.
619            ! multiplied by z2dt
620#  if defined key_obc
621            ! caution : grad D = 0 along open boundaries
622            IF( Agrif_Root() ) THEN
623               ztdgu = z2dt * spgu_ad(ji,jj) * obcumask(ji,jj)
624               ztdgv = z2dt * spgv_ad(ji,jj) * obcvmask(ji,jj)     
625               spgu_ad(ji,jj) = 0.0_wp
626               spgv_ad(ji,jj) = 0.0_wp
627            ELSE
628               ztdgu = z2dt * spgu_ad(ji,jj)
629               ztdgv = z2dt * spgv_ad(ji,jj)     
630               spgu_ad(ji,jj) = 0.0_wp
631               spgv_ad(ji,jj) = 0.0_wp
632            ENDIF
633#  elif defined key_bdy
634            CALL ctl_stop( 'dyn_spg_flt_adj: key_bdy is not available' )
635#  else
636            ztdgu = z2dt * spgu_ad(ji,jj)
637            ztdgv = z2dt * spgv_ad(ji,jj)
638            spgu_ad(ji,jj) = 0.0_wp
639            spgv_ad(ji,jj) = 0.0_wp
640#  endif
641            ! trend of Transport divergence gradient
642            ztdgu = ztdgu * z2dtg / e1u(ji,jj)
643            ztdgv = ztdgv * z2dtg / e2v(ji,jj)
644            gcx_ad(ji  ,jj  ) = gcx_ad(ji  ,jj  ) - ztdgu - ztdgv
645            gcx_ad(ji  ,jj+1) = gcx_ad(ji  ,jj+1) + ztdgv
646            gcx_ad(ji+1,jj  ) = gcx_ad(ji+1,jj  ) + ztdgu
647         END DO
648      END DO
649
650      ! Evaluate the next transport divergence
651      ! --------------------------------------
652      !    Iterative solver for the elliptic equation (except IF sol.=0)
653      !    (output in gcx_ad with boundary conditions applied)
654
655      kindic = 0
656      ncut = 0    !  Force solver
657      IF( ncut == 0 ) THEN
658         IF    ( nn_solv == 1 ) THEN ;  CALL sol_pcg_adj( kt, kindic )   ! diagonal preconditioned conjuguate gradient
659         ELSEIF( nn_solv == 2 ) THEN ;  CALL sol_sor_adj( kt, kindic )   ! successive-over-relaxation
660         ENDIF
661      ENDIF
662#  if defined key_agrif
663      CALL ctl_stop( 'dyn_spg_flt_adj: key_agrif is not available' )
664#  endif
665
666      ! Right hand side of the elliptic equation and first guess
667      ! --------------------------------------------------------
668      ! apply the lateral boundary conditions
669      IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) &
670         &    CALL lbc_lnk_e_adj( gcb_ad, c_solver_pt, 1.0_wp )   
671
672      DO jj = 2, jpjm1
673         DO ji = fs_2, fs_jpim1   ! vector opt.
674            ! First guess of the after barotropic transport divergence
675            zbtd = gcxb_ad(ji,jj) + 2.0_wp * gcx_ad(ji,jj) 
676            gcxb_ad(ji,jj) = - gcx_ad(ji,jj)
677            gcx_ad (ji,jj) = zbtd
678            ! Divergence of the after vertically averaged velocity
679            zgcb = gcb_ad(ji,jj) * gcdprc(ji,jj)
680            gcb_ad(ji,jj) = 0.0_wp
681            spgu_ad(ji-1,jj  ) = spgu_ad(ji-1,jj  ) - zgcb
682            spgu_ad(ji  ,jj  ) = spgu_ad(ji  ,jj  ) + zgcb
683            spgv_ad(ji  ,jj-1) = spgv_ad(ji  ,jj-1) - zgcb
684            spgv_ad(ji  ,jj  ) = spgv_ad(ji  ,jj  ) + zgcb
685         END DO
686      END DO
687
688      IF( lk_vvl ) CALL ctl_stop( 'dyn_spg_flt_adj: lk_vvl is not available' )
689
690      ! Boundary conditions on (spgu_ad,spgv_ad)
691      CALL lbc_lnk_adj( spgu_ad, 'U', -1.0_wp )
692      CALL lbc_lnk_adj( spgv_ad, 'V', -1.0_wp )
693
694      ! transport: multiplied by the horizontal scale factor
695      DO jj = 2,jpjm1
696         DO ji = fs_2,fs_jpim1   ! vector opt.
697            spgu_ad(ji,jj) = spgu_ad(ji,jj) * e2u(ji,jj)
698            spgv_ad(ji,jj) = spgv_ad(ji,jj) * e1v(ji,jj)
699         END DO
700      END DO
701
702      ! compute the next vertically averaged velocity (effect of the additional force not included)
703      ! ---------------------------------------------
704
705      ! vertical sum
706!CDIR NOLOOPCHG
707      IF( lk_vopt_loop ) THEN     ! vector opt., forced unroll
708         DO jk = 1, jpkm1
709            DO ji = 1, jpij
710               ua_ad(ji,1,jk) = ua_ad(ji,1,jk) + fse3u(ji,1,jk) * spgu_ad(ji,1)
711               va_ad(ji,1,jk) = va_ad(ji,1,jk) + fse3v(ji,1,jk) * spgv_ad(ji,1)
712            END DO
713         END DO
714      ELSE                        ! No  vector opt.
715         DO jk = 1, jpkm1
716            DO jj = 2, jpjm1
717               DO ji = 2, jpim1
718                  ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) + fse3u(ji,jj,jk) * spgu_ad(ji,jj)
719                  va_ad(ji,jj,jk) = va_ad(ji,jj,jk) + fse3v(ji,jj,jk) * spgv_ad(ji,jj)
720               END DO
721            END DO
722         END DO
723      ENDIF
724
725      DO jj = 2, jpjm1
726         DO ji = fs_2, fs_jpim1 ! vector opt.
727            spgu_ad(ji,jj) = 0.0_wp
728            spgv_ad(ji,jj) = 0.0_wp
729         END DO
730      END DO
731
732#  if defined key_orca_r2
733      IF( n_cla == 1 )   CALL dyn_spg_cla_adj( kt )      ! Cross Land Advection (update (ua,va))
734#  endif
735#  if defined key_agrif
736      CALL ctl_stop( 'dyn_spg_flt_adj: key_agrif is not available' )
737#  endif
738#  if defined key_bdy
739      CALL ctl_stop( 'dyn_spg_flt_adj: key_bdy is not available' )
740#  endif
741#  if defined key_obc
742      !      IF( lk_obc )   CALL obc_vol_adj( kt )   ! Correction of the barotropic componant velocity to control the volume of the system
743      IF( lk_obc )   CALL obc_dyn_adj( kt )      ! Update velocities on each open boundary with the radiation algorithm     
744#  endif
745
746      ! Evaluate the masked next velocity (effect of the additional force not included)
747      IF( lk_vvl ) THEN          ! variable volume  (surface pressure gradient already included in dyn_hpg)
748         !
749         IF( ln_dynadv_vec ) THEN      ! vector form : applied on velocity
750            DO jk = 1, jpkm1
751               DO jj = 2, jpjm1
752                  DO ji = fs_2, fs_jpim1   ! vector opt.
753                     ub_ad(ji,jj,jk) = ub_ad(ji,jj,jk) + z2dt * ua_ad(ji,jj,jk) * umask(ji,jj,jk)
754                     ua_ad(ji,jj,jk) = z2dt * ua_ad(ji,jj,jk) * umask(ji,jj,jk)
755                     vb_ad(ji,jj,jk) = vb_ad(ji,jj,jk) + z2dt * va_ad(ji,jj,jk) * vmask(ji,jj,jk)
756                     va_ad(ji,jj,jk) = z2dt * va_ad(ji,jj,jk) * vmask(ji,jj,jk)
757                  END DO
758               END DO
759            END DO
760            !
761         ELSE                          ! flux form : applied on thickness weighted velocity
762            DO jk = 1, jpkm1
763               DO jj = 2, jpjm1
764                  DO ji = fs_2, fs_jpim1   ! vector opt.
765                     ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) / fse3u_a(ji,jj,jk) * umask(ji,jj,jk)
766                     ub_ad(ji,jj,jk) = ub_ad(ji,jj,jk) + ua_ad(ji,jj,jk) * fse3u_b(ji,jj,jk)
767                     ua_ad(ji,jj,jk) = ua_ad(ji,jj,jk) * z2dt * fse3u_n(ji,jj,jk)
768                     va_ad(ji,jj,jk) = va_ad(ji,jj,jk) / fse3v_a(ji,jj,jk) * vmask(ji,jj,jk)
769                     vb_ad(ji,jj,jk) = vb_ad(ji,jj,jk) + va_ad(ji,jj,jk) * fse3v_b(ji,jj,jk)
770                     va_ad(ji,jj,jk) = va_ad(ji,jj,jk) * z2dt * fse3v_n(ji,jj,jk)
771                 END DO
772               END DO
773            END DO
774            !
775         ENDIF
776         !
777      ELSE                       ! fixed volume  (add the surface pressure gradient + unweighted time stepping)
778         !
779         DO jk = 1, jpkm1               ! unweighted time stepping
780            DO jj = 2, jpjm1
781               DO ji = fs_2, fs_jpim1   ! vector opt.
782                  ua_ad(  ji,jj,jk) = ua_ad(ji,jj,jk) * umask(ji,jj,jk)
783                  ub_ad(  ji,jj,jk) = ub_ad(ji,jj,jk) + ua_ad(ji,jj,jk)
784                  spgu_ad(ji,jj   ) = spgu_ad(ji,jj)  + ua_ad(ji,jj,jk) * z2dt
785                  ua_ad(  ji,jj,jk) = ua_ad(ji,jj,jk) * z2dt
786                  va_ad(  ji,jj,jk) = va_ad(ji,jj,jk) * vmask(ji,jj,jk)
787                  vb_ad(  ji,jj,jk) = vb_ad(ji,jj,jk) + va_ad(ji,jj,jk)
788                  spgv_ad(ji,jj   ) = spgv_ad(ji,jj)  + va_ad(ji,jj,jk) * z2dt
789                  va_ad(  ji,jj,jk) = va_ad(ji,jj,jk) * z2dt
790               END DO
791            END DO
792         END DO
793         DO jj = 2, jpjm1              ! Surface pressure gradient (now)
794            DO ji = fs_2, fs_jpim1     ! vector opt.
795               spgu_ad(ji  ,jj  ) = spgu_ad(ji  ,jj  ) * grav / e1u(ji,jj)
796               spgv_ad(ji  ,jj  ) = spgv_ad(ji  ,jj  ) * grav / e2v(ji,jj)
797               sshn_ad(ji  ,jj  ) = sshn_ad(ji  ,jj  ) + spgv_ad(ji,jj)
798               sshn_ad(ji  ,jj+1) = sshn_ad(ji  ,jj+1) - spgv_ad(ji,jj)
799               sshn_ad(ji  ,jj  ) = sshn_ad(ji  ,jj  ) + spgu_ad(ji,jj)
800               sshn_ad(ji+1,jj  ) = sshn_ad(ji+1,jj  ) - spgu_ad(ji,jj)
801               spgu_ad(ji  ,jj  ) = 0.0_wp
802               spgv_ad(ji  ,jj  ) = 0.0_wp
803            END DO
804         END DO
805      ENDIF
806
807      IF( kt == nit000 ) THEN
808         ! set to zero free surface specific arrays
809         spgu_ad(:,:) = 0.0_wp                    ! surface pressure gradient (i-direction)
810         spgv_ad(:,:) = 0.0_wp                    ! surface pressure gradient (j-direction)
811      ENDIF
812
813   END SUBROUTINE dyn_spg_flt_adj
814
815   SUBROUTINE dyn_spg_flt_adj_tst( kumadt )
816      !!-----------------------------------------------------------------------
817      !!
818      !!                  ***  ROUTINE dyn_spg_flt_adj_tst ***
819      !!
820      !! ** Purpose : Test the adjoint routine.
821      !!
822      !! ** Method  : Verify the scalar product
823      !!           
824      !!                 ( L dx )^T W dy  =  dx^T L^T W dy
825      !!
826      !!              where  L   = tangent routine
827      !!                     L^T = adjoint routine
828      !!                     W   = diagonal matrix of scale factors
829      !!                     dx  = input perturbation (random field)
830      !!                     dy  = L dx
831      !!
832      !! ** Action  :
833      !!               
834      !! History :
835      !!        ! 09-01 (A. Weaver)
836      !!-----------------------------------------------------------------------
837      !! * Modules used
838
839      !! * Arguments
840      INTEGER, INTENT(IN) :: &
841         & kumadt        ! Output unit
842
843      !! * Local declarations
844      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: &
845         & zua_tlin,    & ! Tangent input: ua_tl
846         & zva_tlin,    & ! Tangent input: va_tl
847         & zub_tlin,    & ! Tangent input: ub_tl
848         & zvb_tlin,    & ! Tangent input: vb_tl
849         & zua_tlout,   & ! Tangent output: ua_tl
850         & zva_tlout,   & ! Tangent output: va_tl
851         & zub_tlout,   & ! Tangent output: ua_tl
852         & zvb_tlout,   & ! Tangent output: va_tl         
853         & zub_adin,    & ! Tangent output: ua_ad
854         & zvb_adin,    & ! Tangent output: va_ad         
855         & zua_adin,    & ! Adjoint input: ua_ad
856         & zva_adin,    & ! Adjoint input: va_ad
857         & zua_adout,   & ! Adjoint output: ua_ad
858         & zva_adout,   & ! Adjoint output: va_ad
859         & zub_adout,   & ! Adjoint oputput: ub_ad
860         & zvb_adout,   & ! Adjoint output: vb_ad
861         & znu            ! 3D random field for u
862
863      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
864         & zgcx_tlin, zgcxb_tlin, zgcb_tlin, zgcx_tlout, zgcxb_tlout, zgcb_tlout,  &
865         & zgcx_adin, zgcxb_adin, zgcb_adin, zgcx_adout, zgcxb_adout, zgcb_adout,  &
866         & zspgu_tlout, zspgv_tlout, zspgu_adin, zspgv_adin
867
868      REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: &
869         & zsshn_tlin, & ! Tangent input: sshn_tl
870         & zsshn_adout,& ! Adjoint output: sshn_ad
871         & zemp_tlin,  & ! Tangent input: emp_tl
872         & zemp_adout, & ! Adjoint output: emp_ad
873         & znssh         ! 2D random field for SSH
874      REAL(wp) :: &
875         & zsp1,    &   ! scalar product involving the tangent routine
876         & zsp2         ! scalar product involving the adjoint routine
877      INTEGER, DIMENSION(jpi,jpj) :: &
878         & iseed_2d    ! 2D seed for the random number generator
879      INTEGER :: &
880         & indic, &
881         & istp
882      INTEGER :: &
883         & ji, &
884         & jj, &
885         & jk, &
886         & kmod, &
887         & jstp
888      CHARACTER (LEN=14) :: &
889         & cl_name
890      INTEGER ::             &
891         & jpert
892      INTEGER, PARAMETER :: jpertmax = 7
893
894      ! Allocate memory
895
896      ALLOCATE( &
897         & zua_tlin(jpi,jpj,jpk),  &
898         & zva_tlin(jpi,jpj,jpk),  &
899         & zub_tlin(jpi,jpj,jpk),  &
900         & zvb_tlin(jpi,jpj,jpk),  &
901         & zua_tlout(jpi,jpj,jpk), &
902         & zva_tlout(jpi,jpj,jpk), &
903         & zua_adin(jpi,jpj,jpk),  &
904         & zva_adin(jpi,jpj,jpk),  &
905         & zua_adout(jpi,jpj,jpk), &
906         & zva_adout(jpi,jpj,jpk), &
907         & zub_adout(jpi,jpj,jpk), &
908         & zvb_adout(jpi,jpj,jpk), &
909         & znu(jpi,jpj,jpk)        &
910         & )
911      ALLOCATE( &
912         & zsshn_tlin(jpi,jpj), &
913         & zsshn_adout(jpi,jpj),&
914         & zemp_tlin(jpi,jpj),  &
915         & zemp_adout(jpi,jpj), &
916         & znssh(jpi,jpj)       &
917         & )
918
919#  if defined key_obc
920      ALLOCATE( zemp_tlout(jpi,jpj), zemp_adin  (jpi,jpj), &
921                zwn_tlout (jpi,jpj), zwn_adin   (jpi,jpj) )
922#  endif
923
924      ALLOCATE( zgcx_tlin (jpi,jpj), zgcx_tlout (jpi,jpj), zgcx_adin (jpi,jpj), zgcx_adout (jpi,jpj),  &
925                zgcxb_tlin(jpi,jpj), zgcxb_tlout(jpi,jpj), zgcxb_adin(jpi,jpj), zgcxb_adout(jpi,jpj),  &
926                zgcb_tlin (jpi,jpj), zgcb_tlout (jpi,jpj), zgcb_adin (jpi,jpj), zgcb_adout (jpi,jpj)   &
927               & )
928
929      ALLOCATE ( zub_tlout(jpi,jpj,jpk), zvb_tlout(jpi,jpj,jpk),  &
930                 zub_adin (jpi,jpj,jpk), zvb_adin (jpi,jpj,jpk)  )
931
932      ALLOCATE( zspgu_tlout (jpi,jpj), zspgv_tlout (jpi,jpj), zspgu_adin (jpi,jpj), zspgv_adin (jpi,jpj))
933
934      !=========================================================================
935      !     dx = ( sshb_tl, sshn_tl, ub_tl, ua_tl, vb_tl, va_tl, wn_tl, emp_tl )
936      ! and dy = ( sshb_tl, sshn_tl, ua_tl, va_tl )
937      !=========================================================================
938
939      ! Test for time steps nit000 and nit000 + 1 (the matrix changes)
940
941      DO jstp = nit000, nit000 + 1
942         DO jpert = 1, jpertmax
943            istp = jstp
944
945            !--------------------------------------------------------------------
946            ! Reset the tangent and adjoint variables
947            !--------------------------------------------------------------------
948
949            zub_tlin (:,:,:) = 0.0_wp
950            zvb_tlin (:,:,:) = 0.0_wp
951            zua_tlin (:,:,:) = 0.0_wp
952            zva_tlin (:,:,:) = 0.0_wp
953            zua_tlout(:,:,:) = 0.0_wp
954            zva_tlout(:,:,:) = 0.0_wp
955            zua_adin (:,:,:) = 0.0_wp
956            zva_adin (:,:,:) = 0.0_wp
957            zub_adout(:,:,:) = 0.0_wp
958            zvb_adout(:,:,:) = 0.0_wp
959            zua_adout(:,:,:) = 0.0_wp
960            zva_adout(:,:,:) = 0.0_wp
961
962            zsshn_tlin (:,:) = 0.0_wp
963            zemp_tlin  (:,:) = 0.0_wp
964            zsshn_adout(:,:) = 0.0_wp
965            zemp_adout (:,:) = 0.0_wp
966            zspgu_adin (:,:) = 0.0_wp
967            zspgv_adin (:,:) = 0.0_wp
968            zspgu_tlout(:,:) = 0.0_wp
969            zspgv_tlout(:,:) = 0.0_wp
970
971            zgcx_tlout (:,:) = 0.0_wp ; zgcx_adin (:,:) = 0.0_wp ; zgcx_adout (:,:) = 0.0_wp
972            zgcxb_tlout(:,:) = 0.0_wp ; zgcxb_adin(:,:) = 0.0_wp ; zgcxb_adout(:,:) = 0.0_wp
973            zgcb_tlout (:,:) = 0.0_wp ; zgcb_adin (:,:) = 0.0_wp ; zgcb_adout (:,:) = 0.0_wp
974
975            ub_tl(:,:,:) = 0.0_wp
976            vb_tl(:,:,:) = 0.0_wp
977            ua_tl(:,:,:) = 0.0_wp
978            va_tl(:,:,:) = 0.0_wp
979            sshn_tl(:,:) = 0.0_wp
980            emp_tl(:,:)  = 0.0_wp
981            gcb_tl(:,:)  = 0.0_wp
982            gcx_tl(:,:)  = 0.0_wp
983            gcxb_tl(:,:) = 0.0_wp
984            spgu_tl(:,:) = 0.0_wp
985            spgv_tl(:,:) = 0.0_wp
986            ub_ad(:,:,:) = 0.0_wp
987            vb_ad(:,:,:) = 0.0_wp
988            ua_ad(:,:,:) = 0.0_wp
989            va_ad(:,:,:) = 0.0_wp
990            sshn_ad(:,:) = 0.0_wp
991            emp_ad(:,:)  = 0.0_wp
992            gcb_ad(:,:)  = 0.0_wp
993            gcx_ad(:,:)  = 0.0_wp
994            gcxb_ad(:,:) = 0.0_wp
995            spgu_ad(:,:) = 0.0_wp
996            spgv_ad(:,:) = 0.0_wp
997            !--------------------------------------------------------------------
998            ! Initialize the tangent input with random noise: dx
999            !--------------------------------------------------------------------
1000            IF ( (jpert == 1) .OR. (jpert == jpertmax) ) THEN
1001
1002               DO jj = 1, jpj
1003                  DO ji = 1, jpi
1004                     iseed_2d(ji,jj) = - ( 456953 + &
1005                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1006                  END DO
1007               END DO
1008               CALL grid_random( iseed_2d, znu, 'U', 0.0_wp, stdu )
1009
1010               DO jk = 1, jpk
1011                  DO jj = nldj, nlej
1012                     DO ji = nldi, nlei
1013                        zua_tlin(ji,jj,jk) = znu(ji,jj,jk)
1014                     END DO
1015                  END DO
1016               END DO
1017
1018            ENDIF
1019            IF ( (jpert == 2) .OR. (jpert == jpertmax) ) THEN
1020               DO jj = 1, jpj
1021                  DO ji = 1, jpi
1022                     iseed_2d(ji,jj) = - ( 3434334 + &
1023                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1024                  END DO
1025               END DO
1026               CALL grid_random( iseed_2d, znu, 'V', 0.0_wp, stdv )
1027
1028               DO jk = 1, jpk
1029                  DO jj = nldj, nlej
1030                     DO ji = nldi, nlei
1031                        zva_tlin(ji,jj,jk) = znu(ji,jj,jk)
1032                     END DO
1033                  END DO
1034               END DO
1035
1036            ENDIF
1037            IF ( (jpert == 3) .OR. (jpert == jpertmax) ) THEN
1038               DO jj = 1, jpj
1039                  DO ji = 1, jpi
1040                     iseed_2d(ji,jj) = - ( 935678 + &
1041                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1042                  END DO
1043               END DO
1044               CALL grid_random( iseed_2d, znu, 'U', 0.0_wp, stdu )
1045
1046               DO jk = 1, jpk
1047                  DO jj = nldj, nlej
1048                     DO ji = nldi, nlei
1049                        zub_tlin(ji,jj,jk) = znu(ji,jj,jk)
1050                     END DO
1051                  END DO
1052               END DO
1053
1054            ENDIF
1055            IF ( (jpert == 4) .OR. (jpert == jpertmax) ) THEN
1056               DO jj = 1, jpj
1057                  DO ji = 1, jpi
1058                     iseed_2d(ji,jj) = - ( 1462578 + &
1059                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1060                  END DO
1061               END DO
1062               CALL grid_random( iseed_2d, znu, 'V', 0.0_wp, stdv )
1063
1064               DO jk = 1, jpk
1065                  DO jj = nldj, nlej
1066                     DO ji = nldi, nlei
1067                        zvb_tlin(ji,jj,jk) = znu(ji,jj,jk)
1068                     END DO
1069                  END DO
1070               END DO
1071
1072            ENDIF
1073            IF ( (jpert == 5) .OR. (jpert == jpertmax) ) THEN
1074               DO jj = 1, jpj
1075                  DO ji = 1, jpi
1076                     iseed_2d(ji,jj) = - ( 25674910 + &
1077                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1078                  END DO
1079               END DO
1080               CALL grid_random( iseed_2d, znssh, 'T', 0.0_wp, stdemp )
1081
1082               DO jj = nldj, nlej
1083                  DO ji = nldi, nlei
1084                     zemp_tlin(ji,jj) = znssh(ji,jj)
1085                  END DO
1086               END DO
1087
1088            ENDIF
1089            IF ( (jpert == 6) .OR. (jpert == jpertmax) ) THEN
1090               DO jj = 1, jpj
1091                  DO ji = 1, jpi
1092                     iseed_2d(ji,jj) = - ( 12672456 + &
1093                        &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
1094                  END DO
1095               END DO
1096               CALL grid_random( iseed_2d, znssh, 'T', 0.0_wp, stdssh )
1097               DO jj = nldj, nlej
1098                  DO ji = nldi, nlei
1099                     zsshn_tlin(ji,jj) = znssh(ji,jj)
1100                  END DO
1101               END DO
1102            END IF
1103#  if defined key_obc
1104            zgcx_tlin  (:,:) = ( zua_tlin(:,:,1) + zub_tlin(:,:,1) ) / 10.
1105            zgcxb_tlin (:,:) = ( zua_tlin(:,:,2) + zub_tlin(:,:,2) ) / 10.
1106            zgcb_tlin  (:,:) = ( zua_tlin(:,:,3) + zub_tlin(:,:,3) ) / 10.
1107#  endif
1108            zgcx_tlin  (:,:) = ( zua_tlin(:,:,1) + zub_tlin(:,:,1) ) / 10.
1109            zgcxb_tlin (:,:) = ( zua_tlin(:,:,2) + zub_tlin(:,:,2) ) / 10.
1110            !--------------------------------------------------------------------
1111            ! Call the tangent routine: dy = L dx
1112            !--------------------------------------------------------------------
1113
1114            ua_tl(:,:,:) = zua_tlin(:,:,:)
1115            va_tl(:,:,:) = zva_tlin(:,:,:)
1116            ub_tl(:,:,:) = zub_tlin(:,:,:)
1117            vb_tl(:,:,:) = zvb_tlin(:,:,:)
1118            emp_tl (:,:) = zemp_tlin (:,:)
1119            sshn_tl(:,:) = zsshn_tlin(:,:)
1120
1121#  if defined key_obc
1122            gcb_tl (:,:) = zgcb_tlin (:,:)
1123#  else
1124            gcx_tl (:,:) = 0.e0              ;   gcxb_tl(:,:) = 0.e0
1125            gcb_tl (:,:) = 0.e0
1126            gcx_tl (:,:) = zgcx_tlin (:,:)   ;   gcxb_tl(:,:) = zgcxb_tlin(:,:)
1127#  endif
1128
1129            CALL dyn_spg_flt_tan( istp, indic )
1130
1131            zua_tlout(:,:,:) = ua_tl(:,:,:)   ;   zva_tlout(:,:,:) = va_tl(:,:,:)
1132#  if defined key_obc
1133            zgcx_tlout (:,:) = gcx_tl (:,:)   ;   zgcxb_tlout(:,:) = gcxb_tl(:,:)
1134#  endif
1135            zspgu_tlout(:,:) = spgu_tl(:,:)   ;   zspgv_tlout(:,:) = spgv_tl(:,:)
1136            zgcb_tlout (:,:) = gcb_tl (:,:)
1137
1138            !--------------------------------------------------------------------
1139            ! Initialize the adjoint variables: dy^* = W dy
1140            !--------------------------------------------------------------------
1141
1142            DO jk = 1, jpk
1143               DO jj = nldj, nlej
1144                  DO ji = nldi, nlei
1145                     zua_adin(ji,jj,jk) = zua_tlout(ji,jj,jk) &
1146                        &               * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) &
1147                        &               * umask(ji,jj,jk)
1148                     zva_adin(ji,jj,jk) = zva_tlout(ji,jj,jk) &
1149                        &               * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) &
1150                        &               * vmask(ji,jj,jk)
1151                  END DO
1152               END DO
1153            END DO
1154#  if defined key_obc
1155            DO jj = nldj, nlej
1156               DO ji = nldi, nlei
1157                  zgcx_adin (ji,jj) = zgcx_tlout (ji,jj) &
1158                     &              * e1t(ji,jj) * e2t(ji,jj) * fse3u(ji,jj,1) * tmask(ji,jj,1)
1159                  zgcxb_adin(ji,jj) = zgcxb_tlout(ji,jj) &
1160                     &              * e1t(ji,jj) * e2t(ji,jj) * fse3u(ji,jj,1) * tmask(ji,jj,1)
1161               END DO
1162            END DO
1163#  endif
1164            DO jj = nldj, nlej
1165               DO ji = nldi, nlei
1166                  zgcb_adin (ji,jj) = zgcb_tlout (ji,jj) &
1167                     &              * e1t(ji,jj) * e2t(ji,jj) * fse3u(ji,jj,1) * tmask(ji,jj,1)
1168                  zspgu_adin (ji,jj) = zspgu_tlout (ji,jj) &
1169                     &              * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) * umask(ji,jj,1)
1170                  zspgv_adin(ji,jj) = zspgv_tlout(ji,jj) &
1171                     &              * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,1) * vmask(ji,jj,1)
1172               END DO
1173            END DO
1174
1175            !--------------------------------------------------------------------
1176            ! Compute the scalar product: ( L dx )^T W dy
1177            !--------------------------------------------------------------------
1178
1179            zsp1 =   DOT_PRODUCT( zua_tlout  , zua_adin   ) &
1180#  if defined key_obc
1181               &   + DOT_PRODUCT( zgcx_tlout , zgcx_adin  ) &
1182               &   + DOT_PRODUCT( zgcxb_tlout, zgcxb_adin ) &
1183#  endif
1184               &   + DOT_PRODUCT( zgcb_tlout , zgcb_adin  ) &
1185               &   + DOT_PRODUCT( zspgu_tlout , zspgu_adin  ) &
1186               &   + DOT_PRODUCT( zspgv_tlout , zspgv_adin  ) &
1187               &   + DOT_PRODUCT( zva_tlout  , zva_adin   ) 
1188
1189
1190            !--------------------------------------------------------------------
1191            ! Call the adjoint routine: dx^* = L^T dy^*
1192            !--------------------------------------------------------------------
1193
1194            ua_ad(:,:,:) = zua_adin(:,:,:)
1195            va_ad(:,:,:) = zva_adin(:,:,:)
1196
1197#  if defined key_obc
1198            gcx_ad (:,:)   = zgcx_adin (:,:)   ;   gcxb_ad(:,:)   = zgcxb_adin(:,:)
1199#  else
1200            gcx_ad (:,:)   = 0.0_wp            ;   gcxb_ad(:,:) = 0.0_wp
1201            gcb_ad (:,:)   = zgcb_adin (:,:)
1202            spgu_ad(:,:)   = zspgu_adin(:,:)
1203            spgv_ad(:,:)   = zspgv_adin(:,:)
1204            ub_ad  (:,:,:) = zub_adin  (:,:,:) ;  vb_ad  (:,:,:) = zvb_adin  (:,:,:)
1205#  endif
1206
1207            CALL dyn_spg_flt_adj( istp, indic )
1208
1209            zua_adout(:,:,:) = ua_ad(:,:,:) 
1210            zva_adout(:,:,:) = va_ad(:,:,:)
1211            zub_adout(:,:,:) = ub_ad(:,:,:) 
1212            zvb_adout(:,:,:) = vb_ad(:,:,:) 
1213            zemp_adout (:,:) = emp_ad (:,:) 
1214            zsshn_adout(:,:) = sshn_ad(:,:) 
1215            zgcx_adout (:,:) = gcx_ad (:,:) 
1216            zgcxb_adout(:,:) = gcxb_ad(:,:) 
1217#  if defined key_obc
1218            zgcb_adout (:,:) = gcb_ad (:,:) 
1219#  endif
1220
1221            !--------------------------------------------------------------------
1222            ! Compute the scalar product: dx^T L^T W dy
1223            !--------------------------------------------------------------------
1224
1225            zsp2 =   DOT_PRODUCT( zua_tlin  , zua_adout   ) &
1226               &   + DOT_PRODUCT( zva_tlin  , zva_adout   ) &
1227               &   + DOT_PRODUCT( zub_tlin  , zub_adout   ) &
1228               &   + DOT_PRODUCT( zvb_tlin  , zvb_adout   ) &
1229               &   + DOT_PRODUCT( zgcx_tlin , zgcx_adout  ) &           
1230               &   + DOT_PRODUCT( zgcxb_tlin, zgcxb_adout ) & 
1231#  if defined key_obc           
1232               &   + DOT_PRODUCT( zgcb_tlin , zgcb_adout  ) &           
1233#  endif
1234               &   + DOT_PRODUCT( zsshn_tlin, zsshn_adout ) &
1235               &   + DOT_PRODUCT( zemp_tlin , zemp_adout  )
1236
1237            ! Compare the scalar products
1238
1239            !    14 char:'12345678901234'
1240            IF ( istp == nit000 ) THEN
1241               SELECT CASE (jpert)
1242               CASE(1)
1243                  cl_name = 'spg_flt  Ua T1'
1244               CASE(2)
1245                  cl_name = 'spg_flt  Va T1'
1246               CASE(3)
1247                  cl_name = 'spg_flt  Ub T1'
1248               CASE(4)
1249                  cl_name = 'spg_flt  Vb T1'
1250               CASE(5)
1251                  cl_name = 'spg_flt emp T1'
1252               CASE(6)
1253                  cl_name = 'spg_flt ssh T1'
1254               CASE(jpertmax)
1255                  cl_name = 'dyn_spg_flt T1'
1256               END SELECT
1257            ELSEIF ( istp == nit000 + 1 ) THEN
1258               SELECT CASE (jpert)
1259               CASE(1)
1260                  cl_name = 'spg_flt  Ua T2'
1261               CASE(2)
1262                  cl_name = 'spg_flt  Va T2'
1263               CASE(3)
1264                  cl_name = 'spg_flt  Ub T2'
1265               CASE(4)
1266                  cl_name = 'spg_flt  Vb T2'
1267               CASE(5)
1268                  cl_name = 'spg_flt emp T2'
1269               CASE(6)
1270                  cl_name = 'spg_flt ssh T2'
1271               CASE(jpertmax)
1272                  cl_name = 'dyn_spg_flt T2'
1273               END SELECT
1274            END IF
1275            CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 )
1276
1277         END DO
1278      END DO
1279
1280!nn_nmod = kmod  ! restore initial frequency of test for the SOR solver
1281
1282      ! Deallocate memory
1283
1284      DEALLOCATE( &
1285         & zua_tlin,  &
1286         & zva_tlin,  &
1287         & zub_tlin,  &
1288         & zvb_tlin,  &
1289         & zua_tlout, &
1290         & zva_tlout, &
1291         & zua_adin,  &
1292         & zva_adin,  &
1293         & zua_adout, &
1294         & zva_adout, &
1295         & zub_adout, &
1296         & zvb_adout, &
1297         & znu        &
1298         & )
1299      DEALLOCATE( &
1300         & zsshn_tlin, &
1301         & zemp_tlin,  &
1302         & zsshn_adout,&
1303         & zemp_adout, &
1304         & znssh       &
1305         & )
1306      DEALLOCATE( zgcx_tlin , zgcx_tlout , zgcx_adin , zgcx_adout,  &
1307         & zgcxb_tlin, zgcxb_tlout, zgcxb_adin, zgcxb_adout,  &
1308         & zgcb_tlin , zgcb_tlout , zgcb_adin , zgcb_adout    &
1309         & )
1310      DEALLOCATE ( zub_tlout, zvb_tlout, zub_adin , zvb_adin )
1311#  if defined key_obc
1312      DEALLOCATE( zemp_tlout, zemp_adin  ,                           &
1313                  zwn_tlout , zwn_adin    )
1314#  endif
1315   END SUBROUTINE dyn_spg_flt_adj_tst
1316
1317#  if defined key_tst_tlm
1318   SUBROUTINE dyn_spg_flt_tlm_tst( kumadt )
1319      !!-----------------------------------------------------------------------
1320      !!
1321      !!                  ***  ROUTINE dyn_spg_flt_tlm_tst ***
1322      !!
1323      !! ** Purpose : Test the tangent routine.
1324      !!
1325      !! ** Method  : Verify the tangent with Taylor expansion
1326      !!           
1327      !!                 M(x+hdx) = M(x) + L(hdx) + O(h^2)
1328      !!
1329      !!              where  L   = tangent routine
1330      !!                     M   = direct routine
1331      !!                     dx  = input perturbation (random field)
1332      !!                     h   = ration on perturbation
1333      !!
1334      !!    In the tangent test we verify that:
1335      !!                M(x+h*dx) - M(x)
1336      !!        g(h) = ------------------ --->  1    as  h ---> 0
1337      !!                    L(h*dx)
1338      !!    and
1339      !!                g(h) - 1
1340      !!        f(h) = ----------         --->  k (costant) as  h ---> 0
1341      !!                    p
1342      !!                   
1343      !! History :
1344      !!        ! 09-08 (A. Vigilant)
1345      !!-----------------------------------------------------------------------
1346      !! * Modules used
1347      USE dynspg_flt
1348      USE tamtrj              ! writing out state trajectory
1349      USE par_tlm,    ONLY: &
1350        & tlm_bch,          &
1351        & cur_loop,         &
1352        & h_ratio
1353      USE istate_mod
1354      USE gridrandom, ONLY: &
1355        & grid_rd_sd
1356      USE trj_tam
1357      USE oce       , ONLY: & ! ocean dynamics and tracers variables
1358        & ua, va, ub, vb,   &
1359        & sshn
1360      USE sbc_oce   , ONLY: &
1361        & emp
1362      USE tamctl,         ONLY: & ! Control parameters
1363       & numtan, numtan_sc
1364      !! * Arguments
1365      INTEGER, INTENT(IN) :: &
1366         & kumadt        ! Output unit
1367
1368      !! * Local declarations
1369      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: &
1370         & zua_tlin,    & ! Tangent input: ua_tl
1371         & zva_tlin,    & ! Tangent input: va_tl
1372         & zub_tlin,    & ! Tangent input: ub_tl
1373         & zvb_tlin,    & !
1374         & zua_out,     & !
1375         & zva_out,     & !
1376         & zua_wop,     & !
1377         & zva_wop,     &
1378         & z3r            ! 3D field
1379
1380      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
1381         & zsshn_tlin, & ! Tangent input: sshn_tl
1382         & zemp_tlin,  & ! Tangent input: emp_tl
1383         & zsshn_out,  & !
1384         & zsshn_wop,  &
1385         & z2r           ! 2D field
1386      REAL(wp) :: &
1387         & zsp1, zsp1_1, zsp1_2, zsp1_3, zsp1_4,  &   !
1388         & zsp2, zsp2_1, zsp2_2, zsp2_3, zsp2_4,  &   !
1389         & zsp3, zsp3_1, zsp3_2, zsp3_3, zsp3_4,  &   !
1390         & zzsp, zzsp_1, zzsp_2, zzsp_3, zzsp_4,  &
1391         & gamma,                                 &
1392         & zgsp1, zgsp2, zgsp3, zgsp4, zgsp5,     &
1393         & zgsp6, zgsp7
1394      INTEGER :: &
1395         & indic, &
1396         & istp
1397      INTEGER :: &
1398         & ji, &
1399         & jj, &
1400         & jk
1401      CHARACTER(LEN=14)   :: cl_name
1402      CHARACTER (LEN=128) :: file_out, file_wop, file_xdx
1403      CHARACTER (LEN=90)  ::  FMT
1404      REAL(KIND=wp), DIMENSION(100):: &
1405         & zscua, zscva,        &
1406         & zscerrua, zscerrva,  &
1407         & zscsshb, zscsshn,    &
1408         & zscerrsshb, zscerrsshn
1409      INTEGER, DIMENSION(100):: &
1410         & iipossshb, iipossshn, iiposua, iiposva,   &
1411         & ijpossshb, ijpossshn, ijposua, ijposva,   &
1412         & ikposua, ikposva
1413      INTEGER::             &
1414         & ii,              &
1415         & isamp=40,        &
1416         & jsamp=40,        &
1417         & ksamp=40,        &
1418         & numsctlm
1419     REAL(KIND=wp), DIMENSION(jpi,jpj,jpk) :: &
1420         & zerrua, zerrva 
1421     REAL(KIND=wp), DIMENSION(jpi,jpj) :: &
1422         & zerrsshb, zerrsshn
1423      ! Allocate memory
1424
1425      ALLOCATE( &
1426         & zua_tlin(jpi,jpj,jpk),  &
1427         & zva_tlin(jpi,jpj,jpk),  &
1428         & zub_tlin(jpi,jpj,jpk),  &
1429         & zvb_tlin(jpi,jpj,jpk),  &
1430         & zua_out( jpi,jpj,jpk),  &
1431         & zva_out( jpi,jpj,jpk),  &
1432         & zua_wop( jpi,jpj,jpk),  &
1433         & zva_wop( jpi,jpj,jpk),  &
1434         & z3r(jpi,jpj,jpk)        &
1435         & )
1436      ALLOCATE( &
1437         & zsshn_tlin(jpi,jpj), &
1438         & zemp_tlin(jpi,jpj),  &
1439         & zsshn_out(jpi,jpj),  &
1440         & zsshn_wop(jpi,jpj),  &
1441         & z2r(jpi,jpj)         &
1442         & )
1443      !--------------------------------------------------------------------
1444      ! Reset variables
1445      !--------------------------------------------------------------------
1446      zua_tlin( :,:,:) = 0.0_wp
1447      zva_tlin( :,:,:) = 0.0_wp
1448      zub_tlin( :,:,:) = 0.0_wp
1449      zvb_tlin( :,:,:) = 0.0_wp
1450      zsshn_tlin( :,:) = 0.0_wp
1451      zemp_tlin(  :,:) = 0.0_wp
1452      zua_out ( :,:,:) = 0.0_wp
1453      zva_out ( :,:,:) = 0.0_wp
1454      zsshn_out ( :,:) = 0.0_wp
1455      zua_wop ( :,:,:) = 0.0_wp
1456      zva_wop ( :,:,:) = 0.0_wp
1457      zsshn_wop( :,:) = 0.0_wp
1458
1459      zscua(:)         = 0.0_wp
1460      zscva(:)         = 0.0_wp
1461      zscerrua(:)      = 0.0_wp
1462      zscerrva(:)      = 0.0_wp
1463      zerrua(:,:,:)    = 0.0_wp
1464      zerrva(:,:,:)    = 0.0_wp
1465      zscsshn(:)       = 0.0_wp
1466      zscerrsshn(:)    = 0.0_wp
1467      zerrsshn(:,:)    = 0.0_wp
1468      !--------------------------------------------------------------------
1469      ! Output filename Xn=F(X0)
1470      !--------------------------------------------------------------------
1471!!!!      CALL tlm_namrd
1472      gamma = h_ratio
1473      file_wop='trj_wop_dynspg'
1474      file_xdx='trj_xdx_dynspg'
1475      !--------------------------------------------------------------------
1476      ! Initialize the tangent input with random noise: dx
1477      !--------------------------------------------------------------------
1478      IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN
1479         CALL grid_rd_sd( 456953, z3r,  'U', 0.0_wp, stdu)
1480         DO jk = 1, jpk
1481            DO jj = nldj, nlej
1482               DO ji = nldi, nlei
1483                  zua_tlin(ji,jj,jk) = z3r(ji,jj,jk)
1484               END DO
1485            END DO
1486         END DO
1487         CALL grid_rd_sd( 3434334, z3r, 'V', 0.0_wp, stdv)
1488         DO jk = 1, jpk
1489            DO jj = nldj, nlej
1490               DO ji = nldi, nlei
1491                  zva_tlin(ji,jj,jk) = z3r(ji,jj,jk)
1492               END DO
1493            END DO
1494         END DO
1495         CALL grid_rd_sd( 935678, z3r,  'U', 0.0_wp, stdu)
1496         DO jk = 1, jpk
1497            DO jj = nldj, nlej
1498               DO ji = nldi, nlei
1499                  zub_tlin(ji,jj,jk) = z3r(ji,jj,jk)
1500               END DO
1501            END DO
1502         END DO
1503         CALL grid_rd_sd( 1462578, z3r, 'V', 0.0_wp, stdv) 
1504         DO jk = 1, jpk
1505            DO jj = nldj, nlej
1506               DO ji = nldi, nlei
1507                  zvb_tlin(ji,jj,jk) = z3r(ji,jj,jk)
1508               END DO
1509            END DO
1510         END DO
1511         CALL grid_rd_sd( 25674910, z2r, 'T', 0.0_wp, stdemp)
1512         DO jj = nldj, nlej
1513            DO ji = nldi, nlei
1514               zemp_tlin(ji,jj) = z2r(ji,jj)
1515            END DO
1516         END DO
1517         CALL grid_rd_sd( 12672456, z2r,'T', 0.0_wp, stdssh)
1518         DO jj = nldj, nlej
1519            DO ji = nldi, nlei
1520               zsshn_tlin(ji,jj) = z2r(ji,jj)
1521            END DO
1522         END DO
1523      ENDIF   
1524
1525      !--------------------------------------------------------------------
1526      ! Complete Init for Direct
1527      !-------------------------------------------------------------------
1528      CALL istate_p 
1529      ! *** initialize the reference trajectory
1530      ! ------------
1531      CALL  trj_rea( nit000-1, 1 )
1532      CALL  trj_rea( nit000, 1 )
1533
1534
1535      IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN
1536         zua_tlin(:,:,:) = gamma * zua_tlin(:,:,:)
1537         ua(:,:,:)       = ua(:,:,:) + zua_tlin(:,:,:)
1538
1539         zva_tlin(:,:,:) = gamma * zva_tlin(:,:,:)
1540         va(:,:,:)       = va(:,:,:) + zva_tlin(:,:,:)
1541
1542         zub_tlin(:,:,:) = gamma * zub_tlin(:,:,:)
1543         ub(:,:,:)       = ub(:,:,:) + zub_tlin(:,:,:)
1544
1545         zvb_tlin(:,:,:) = gamma * zvb_tlin(:,:,:)
1546         vb(:,:,:)       = vb(:,:,:) + zvb_tlin(:,:,:)
1547
1548         zemp_tlin(:,:) = gamma * zemp_tlin(:,:)
1549         emp(:,:)       = emp(:,:) + zemp_tlin(:,:)
1550
1551         zsshn_tlin(:,:) = gamma * zsshn_tlin(:,:)
1552         sshn(:,:)       = sshn(:,:) + zsshn_tlin(:,:)
1553      ENDIF
1554
1555      !--------------------------------------------------------------------
1556      !  Compute the direct model F(X0,t=n) = Xn
1557      !--------------------------------------------------------------------
1558      IF ( tlm_bch /= 2 ) CALL dyn_spg_flt(nit000, indic)
1559      IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop)
1560      IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx)
1561      !--------------------------------------------------------------------
1562      !  Compute the Tangent
1563      !--------------------------------------------------------------------
1564      IF ( tlm_bch == 2 ) THEN
1565         !--------------------------------------------------------------------
1566         ! Initialize the tangent variables
1567         !--------------------------------------------------------------------
1568         CALL  trj_rea( nit000-1, 1 ) 
1569         CALL  trj_rea( nit000, 1 ) 
1570         ua_tl  (:,:,:) = zua_tlin  (:,:,:)
1571         va_tl  (:,:,:) = zva_tlin  (:,:,:)
1572         ub_tl  (:,:,:) = zub_tlin  (:,:,:)
1573         vb_tl  (:,:,:) = zvb_tlin  (:,:,:)
1574         emp_tl (:,:  ) = zemp_tlin (:,:  )
1575         sshn_tl(:,:  ) = zsshn_tlin(:,:  )
1576
1577         CALL dyn_spg_flt_tan(nit000, indic)
1578         !--------------------------------------------------------------------
1579         ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) )
1580         !--------------------------------------------------------------------
1581
1582         zsp2_1    = DOT_PRODUCT( ua_tl,   ua_tl    )
1583         zsp2_2    = DOT_PRODUCT( va_tl,   va_tl    )
1584         zsp2_4    = DOT_PRODUCT( sshn_tl, sshn_tl  )
1585         zsp2      = zsp2_1 + zsp2_2 + zsp2_4
1586         !--------------------------------------------------------------------
1587         !  Storing data
1588         !--------------------------------------------------------------------
1589         CALL trj_rd_spl(file_wop) 
1590         zua_wop  (:,:,:) = ua  (:,:,:)
1591         zva_wop  (:,:,:) = va  (:,:,:)
1592         zsshn_wop(:,:) = sshn(:,:)
1593         CALL trj_rd_spl(file_xdx) 
1594         zua_out  (:,:,:) = ua   (:,:,:)
1595         zva_out  (:,:,:) = va   (:,:,:)
1596         zsshn_out(:,:  ) = sshn (:,:  )
1597         !--------------------------------------------------------------------
1598         ! Compute the Linearization Error
1599         ! Nn = M( X0+gamma.dX0, t0,tn) - M(X0, t0,tn)
1600         ! and
1601         ! Compute the Linearization Error
1602         ! En = Nn -TL(gamma.dX0, t0,tn)
1603         !--------------------------------------------------------------------
1604         ! Warning: Here we re-use local variables z()_out and z()_wop
1605         ii=0
1606         DO jk = 1, jpk
1607            DO jj = 1, jpj
1608               DO ji = 1, jpi
1609                  zua_out   (ji,jj,jk) = zua_out    (ji,jj,jk) - zua_wop  (ji,jj,jk)
1610                  zua_wop   (ji,jj,jk) = zua_out    (ji,jj,jk) - ua_tl    (ji,jj,jk)
1611                  IF (  ua_tl(ji,jj,jk) .NE. 0.0_wp ) &
1612                     & zerrua(ji,jj,jk) = zua_out(ji,jj,jk)/ua_tl(ji,jj,jk)
1613                  IF( (MOD(ji, isamp) .EQ. 0) .AND. &
1614                  &   (MOD(jj, jsamp) .EQ. 0) .AND. &
1615                  &   (MOD(jk, ksamp) .EQ. 0)     ) THEN
1616                      ii = ii+1
1617                      iiposua(ii) = ji
1618                      ijposua(ii) = jj
1619                      ikposua(ii) = jk
1620                      IF ( INT(umask(ji,jj,jk)) .NE. 0)  THEN
1621                         zscua (ii) =  zua_wop(ji,jj,jk)
1622                         zscerrua (ii) =  ( zerrua(ji,jj,jk) - 1.0_wp ) /gamma
1623                      ENDIF
1624                  ENDIF
1625               END DO
1626            END DO
1627         END DO
1628         ii=0
1629         DO jk = 1, jpk
1630            DO jj = 1, jpj
1631               DO ji = 1, jpi
1632                  zva_out   (ji,jj,jk) = zva_out    (ji,jj,jk) - zva_wop  (ji,jj,jk)
1633                  zva_wop   (ji,jj,jk) = zva_out    (ji,jj,jk) - va_tl    (ji,jj,jk)
1634                  IF (  va_tl(ji,jj,jk) .NE. 0.0_wp ) &
1635                     & zerrva(ji,jj,jk) = zva_out(ji,jj,jk)/va_tl(ji,jj,jk)
1636                  IF( (MOD(ji, isamp) .EQ. 0) .AND. &
1637                  &   (MOD(jj, jsamp) .EQ. 0) .AND. &
1638                  &   (MOD(jk, ksamp) .EQ. 0)     ) THEN
1639                      ii = ii+1
1640                      iiposva(ii) = ji
1641                      ijposva(ii) = jj
1642                      ikposva(ii) = jk
1643                      IF ( INT(vmask(ji,jj,jk)) .NE. 0)  THEN
1644                         zscva (ii) =  zua_wop(ji,jj,jk)
1645                         zscerrva (ii) =  ( zerrva(ji,jj,jk) - 1.0_wp ) /gamma
1646                      ENDIF
1647                  ENDIF
1648               END DO
1649            END DO
1650         END DO
1651         ii=0
1652         DO jj = 1, jpj
1653            DO ji = 1, jpi
1654               zsshn_out   (ji,jj) = zsshn_out    (ji,jj) - zsshn_wop  (ji,jj)
1655               zsshn_wop   (ji,jj) = zsshn_out    (ji,jj) - sshn_tl    (ji,jj)
1656               IF (  sshn_tl(ji,jj) .NE. 0.0_wp ) &
1657                  & zerrsshn(ji,jj) = zsshn_out(ji,jj)/sshn_tl(ji,jj)
1658               IF( (MOD(ji, isamp) .EQ. 0) .AND. &
1659               &   (MOD(jj, jsamp) .EQ. 0)  ) THEN
1660                   ii = ii+1
1661                   iipossshn(ii) = ji
1662                   ijpossshn(ii) = jj
1663                   IF ( INT(tmask(ji,jj,1)) .NE. 0)  THEN
1664                      zscsshn (ii) =  zsshn_wop(ji,jj)
1665                      zscerrsshn (ii) =  ( zerrsshn(ji,jj) - 1.0_wp ) /gamma
1666                   ENDIF
1667               ENDIF
1668            END DO
1669         END DO
1670         zsp1_1    = DOT_PRODUCT( zua_out,   zua_out    )
1671         zsp1_2    = DOT_PRODUCT( zva_out,   zva_out    )
1672         zsp1_4    = DOT_PRODUCT( zsshn_out, zsshn_out  )
1673         zsp1      = zsp1_1 + zsp1_2 + zsp1_4
1674         zsp3_1    = DOT_PRODUCT( zua_wop,   zua_wop    )
1675         zsp3_2    = DOT_PRODUCT( zva_wop,   zva_wop    )
1676         zsp3_4    = DOT_PRODUCT( zsshn_wop, zsshn_wop  )
1677         zsp3      = zsp3_1 + zsp3_2 + zsp3_4
1678
1679         !--------------------------------------------------------------------
1680         ! Print the linearization error En - norme 2
1681         !--------------------------------------------------------------------
1682         ! 14 char:'12345678901234'
1683         cl_name  = 'dynspg_tam:En '
1684         zzsp     = SQRT(zsp3)
1685         zzsp_1   = SQRT(zsp3_1)
1686         zzsp_2   = SQRT(zsp3_2)
1687         zzsp_4   = SQRT(zsp3_4)
1688         zgsp5    = zzsp
1689         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1690         !--------------------------------------------------------------------
1691         ! Compute TLM norm2
1692         !--------------------------------------------------------------------
1693         zzsp     = SQRT(zsp2)
1694         zzsp_1   = SQRT(zsp2_1)
1695         zzsp_2   = SQRT(zsp2_2)
1696         zzsp_4   = SQRT(zsp2_4)
1697         zgsp4    = zzsp
1698         cl_name = 'dynspg_tam:Ln2'
1699         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1700         !--------------------------------------------------------------------
1701         ! Print the linearization error Nn - norme 2
1702         !--------------------------------------------------------------------
1703         zzsp     = SQRT(zsp1)
1704         zzsp_1   = SQRT(zsp1_1)
1705         zzsp_2   = SQRT(zsp1_2)
1706         zzsp_4   = SQRT(zsp1_4)
1707         cl_name  = 'dynspg:Mhdx-Mx'
1708         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1709
1710
1711         zgsp3    = SQRT( zsp3/zsp2 )
1712         zgsp7    = zgsp3/gamma
1713         zgsp1    = zzsp
1714         zgsp2    = zgsp1 / zgsp4
1715         zgsp6    = (zgsp2 - 1.0_wp)/gamma
1716
1717         FMT = "(A8,2X,I4.4,2X,E6.1,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13)"
1718         WRITE(numtan,FMT) 'dspgflt ', cur_loop, h_ratio, zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, zgsp6, zgsp7
1719         !--------------------------------------------------------------------
1720         ! Unitary calculus
1721         !--------------------------------------------------------------------
1722         FMT = "(A8,2X,A8,2X,I4.4,2X,E6.1,2X,I4.4,2X,I4.4,2X,I4.4,2X,E20.13,1X)"
1723         cl_name = 'dspgflt '
1724         IF(lwp) THEN
1725            DO ii=1, 100, 1
1726               IF ( zscua(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscua     ', &
1727                    & cur_loop, h_ratio, ii, iiposua(ii), ijposua(ii), zscua(ii)
1728            ENDDO
1729            DO ii=1, 100, 1
1730               IF ( zscva(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscva     ', &
1731                    & cur_loop, h_ratio, ii, iiposva(ii), ijposva(ii), zscva(ii)
1732            ENDDO
1733            DO ii=1, 100, 1
1734               IF ( zscsshn(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscsshn   ', &
1735                    & cur_loop, h_ratio, ii, iipossshn(ii), ijpossshn(ii), zscsshn(ii)
1736            ENDDO
1737            DO ii=1, 100, 1
1738               IF ( zscerrua(ii) .NE. 0.0_wp ) WRITE(numsctlm,FMT) cl_name, 'zscerrua  ', &
1739                    & cur_loop, h_ratio, ii, iiposua(ii), ijposua(ii), zscerrua(ii)
1740            ENDDO
1741            DO ii=1, 100, 1
1742               IF ( zscerrva(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscerrva  ', &
1743                    & cur_loop, h_ratio, ii, iiposva(ii), ijposva(ii), zscerrva(ii)
1744            ENDDO
1745            DO ii=1, 100, 1
1746               IF ( zscerrsshn(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscerrsshn  ', &
1747                    & cur_loop, h_ratio, ii, iipossshn(ii), ijpossshn(ii), zscerrsshn(ii)
1748            ENDDO
1749            ! write separator
1750            WRITE(numtan_sc,"(A4)") '===='
1751         ENDIF
1752      ENDIF
1753
1754      DEALLOCATE(                   &
1755         & zemp_tlin, zsshn_tlin,   &
1756         & zua_tlin, zva_tlin,      &
1757         & zua_out, zva_out,        & 
1758         & zua_wop, zva_wop,        &
1759         & zsshn_out, zsshn_wop,    &
1760         & z3r, z2r                 &
1761         & )
1762   END SUBROUTINE dyn_spg_flt_tlm_tst
1763#  endif
1764# else
1765   !!----------------------------------------------------------------------
1766   !!   Default case :   Empty module   No standart explicit free surface
1767   !!----------------------------------------------------------------------
1768CONTAINS
1769   SUBROUTINE dyn_spg_flt_tan( kt, kindic )       ! Empty routine
1770      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt
1771   END SUBROUTINE dyn_spg_flt_tan
1772   SUBROUTINE dyn_spg_flt_adj( kt, kindic )       ! Empty routine
1773      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt
1774   END SUBROUTINE dyn_spg_flt_adj
1775   SUBROUTINE dyn_spg_flt_adj_tst( kt )       ! Empty routine
1776      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt
1777   END SUBROUTINE dyn_spg_flt_adj_tst
1778   SUBROUTINE dyn_spg_flt_tlm_tst( kt )       ! Empty routine
1779      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt
1780   END SUBROUTINE dyn_spg_flt_tlm_tst
1781# endif
1782#endif
1783END MODULE dynspg_flt_tam
Note: See TracBrowser for help on using the repository browser.