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.
dynhpg_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/dynhpg_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: 63.2 KB
Line 
1MODULE dynhpg_tam
2#ifdef key_tam
3   !!======================================================================
4   !!                       ***  MODULE  dynhpg_tam  ***
5   !! Ocean dynamics:  hydrostatic pressure gradient trend
6   !!                  Tangent and Adjoint module
7   !!======================================================================
8   !! History of the direct module:
9   !!            1.0  !  87-09  (P. Andrich, M.-A. Foujols)  hpg_zco: Original code
10   !!            5.0  !  91-11  (G. Madec)
11   !!            7.0  !  96-01  (G. Madec)  hpg_sco: Original code for s-coordinates
12   !!            8.0  !  97-05  (G. Madec)  split dynber into dynkeg and dynhpg
13   !!            8.5  !  02-07  (G. Madec)  F90: Free form and module
14   !!            8.5  !  02-08  (A. Bozec)  hpg_zps: Original code
15   !!            9.0  !  05-10  (A. Beckmann, B.W. An)  various s-coordinate options
16   !!                           Original code for hpg_ctl, hpg_hel hpg_wdj, hpg_djc, hpg_rot
17   !!            9.0  !  05-11  (G. Madec) style & small optimisation
18   !! History of the TAM module:
19   !!            9.0  !  08-06  (A. Vidard) Skeleton
20   !!                 !  08-11  (A. Vidard) Nemo v3
21   !!----------------------------------------------------------------------
22
23   !!----------------------------------------------------------------------
24   !!   dyn_hpg      : update the momentum trend with the now horizontal
25   !!                  gradient of the hydrostatic pressure
26   !!       hpg_ctl  : initialisation and control of options
27   !!       hpg_zco  : z-coordinate scheme
28   !!       hpg_zps  : z-coordinate plus partial steps (interpolation)
29   !!       hpg_sco  : s-coordinate (standard jacobian formulation)
30   !!       hpg_hel  : s-coordinate (helsinki modification)
31   !!       hpg_wdj  : s-coordinate (weighted density jacobian)
32   !!       hpg_djc  : s-coordinate (Density Jacobian with Cubic polynomial)
33   !!       hpg_rot  : s-coordinate (ROTated axes scheme)
34   !!----------------------------------------------------------------------
35   USE par_kind,       ONLY: & ! Precision variables
36      & wp
37   USE par_oce,        ONLY: & ! Ocean space and time domain variables
38      & jpi,           jpj,           jpk,           &
39      & jpim1,         jpjm1,         jpkm1,         &
40      & jpiglo
41   USE oce_tam       , ONLY: & ! ocean dynamics and tracers
42      & ua_tl,         va_tl,         rhd_tl,        &
43      & ua_ad,         va_ad,         rhd_ad,        &
44      & gru_tl,        grv_tl,        gru_ad,        &
45      & grv_ad,        tn_tl,         sn_tl,         &
46      & gtu_tl,        gtv_tl,        gsu_tl,        &
47      & gsv_tl,        rhop_tl
48   USE dom_oce       , ONLY: & ! ocean space and time domain
49      & lk_vvl,        e1u,           e2u,           &
50      & e1v,           e2v,                          &
51#if defined key_zco
52      & e3t_0,         e3w_0,                        &
53#else
54      & e3u,           e3v,           e3w,           &
55#endif
56      & mbathy,        umask,         vmask,         &
57      & mig,           mjg,           nldi,          &
58      & nldj,          nlei,          nlej
59   USE dynhpg        , ONLY: &
60      & ln_hpg_zco,    ln_hpg_zps,    ln_hpg_sco,    &
61      & ln_hpg_hel,    ln_hpg_wdj,    ln_hpg_djc,    &
62      & ln_hpg_rot,    rn_gamma,      ln_dynhpg_imp, &
63      & nhpg
64   USE phycst        , ONLY: & ! physical constants
65      & grav
66   USE in_out_manager, ONLY: & ! I/O manager
67      & ctl_stop,      lwp,           numout,        & 
68      & numnam,        nit000,        nitend
69   USE gridrandom    , ONLY: & ! Random Gaussian noise on grids
70      & grid_random
71   USE dotprodfld,     ONLY: & ! Computes dot product for 3D and 2D fields
72      & dot_product
73   USE tstool_tam    , ONLY: &
74      & prntst_adj,    prntst_tlm,    stdu,          & 
75      & stdv,          stdr,          stdt,          & !
76      & stds
77
78   IMPLICIT NONE
79   PRIVATE
80
81   PUBLIC   dyn_hpg_tan    ! routine called by step_tam module
82   PUBLIC   dyn_hpg_adj    ! routine called by step_tam module
83   PUBLIC   dyn_hpg_adj_tst! routine called by test module
84#if defined key_tst_tlm
85   PUBLIC   dyn_hpg_tlm_tst! routine called by test module
86#endif
87
88   !!* Namelist nam_dynhpg : Choice of horizontal pressure gradient computation
89!   LOGICAL  ::   ln_hpg_zco = .TRUE.    ! z-coordinate - full steps
90!   LOGICAL  ::   ln_hpg_zps = .FALSE.   ! z-coordinate - partial steps (interpolation)
91!   LOGICAL  ::   ln_hpg_sco = .FALSE.   ! s-coordinate (standard jacobian formulation)
92!   LOGICAL  ::   ln_hpg_hel = .FALSE.   ! s-coordinate (helsinki modification)
93!   LOGICAL  ::   ln_hpg_wdj = .FALSE.   ! s-coordinate (weighted density jacobian)
94!   LOGICAL  ::   ln_hpg_djc = .FALSE.   ! s-coordinate (Density Jacobian with Cubic polynomial)
95!   LOGICAL  ::   ln_hpg_rot = .FALSE.   ! s-coordinate (ROTated axes scheme)
96!   REAL(wp) ::   gamm       = 0.e0      ! weighting coefficient
97
98!   INTEGER  ::   nhpg  =  0             ! = 0 to 6, type of pressure gradient scheme used
99      !                                 ! (deduced from ln_hpg_... flags)
100
101   !! * Substitutions
102#  include "domzgr_substitute.h90"
103#  include "vectopt_loop_substitute.h90"
104
105CONTAINS
106
107   SUBROUTINE dyn_hpg_tan( kt )
108      !!---------------------------------------------------------------------
109      !!                  ***  ROUTINE dyn_hpg_tan  ***
110      !!
111      !! ** Method of the direct routine:
112      !!              Call the hydrostatic pressure gradient routine
113      !!              using the scheme defined in the namelist
114      !!   
115      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
116      !!             - Save the trend (l_trddyn=T)
117      !!----------------------------------------------------------------------
118      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
119      !!
120      !!----------------------------------------------------------------------
121      IF( kt == nit000 )   CALL hpg_ctl_tam       ! initialisation & control of options
122
123      SELECT CASE ( nhpg )      ! Hydrastatic pressure gradient computation
124      CASE (  0 )   ;   CALL hpg_zco_tan    ( kt )      ! z-coordinate
125      CASE (  1 )   ;   CALL hpg_zps_tan    ( kt )      ! z-coordinate plus partial steps (interpolation)
126      CASE (  2 )   ;   CALL hpg_sco_tan    ( kt )      ! s-coordinate (standard jacobian formulation)
127      CASE (  3 )   ;   CALL hpg_hel_tan    ( kt )      ! s-coordinate (helsinki modification)
128      CASE (  4 )   ;   CALL hpg_wdj_tan    ( kt )      ! s-coordinate (weighted density jacobian)
129      CASE (  5 )   ;   CALL hpg_djc_tan    ( kt )      ! s-coordinate (Density Jacobian with Cubic polynomial)
130      CASE (  6 )   ;   CALL hpg_rot_tan    ( kt )      ! s-coordinate (ROTated axes scheme)
131      END SELECT
132   END SUBROUTINE dyn_hpg_tan
133   SUBROUTINE dyn_hpg_adj( kt )
134      !!---------------------------------------------------------------------
135      !!                  ***  ROUTINE dyn_hpg_adj  ***
136      !!
137      !! ** Method of the direct routine:
138      !!              call the hydrostatic pressure gradient routine
139      !!              using the scheme defined in the namelist
140      !!   
141      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
142      !!             - Save the trend (l_trddyn=T)
143      !!----------------------------------------------------------------------
144      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
145      !!
146      !!----------------------------------------------------------------------
147      IF( kt == nitend )   CALL hpg_ctl_tam      ! initialisation & control of options
148     
149      SELECT CASE ( nhpg )      ! Hydrastatic pressure gradient computation
150      CASE (  0 )   ;   CALL hpg_zco_adj    ( kt )      ! z-coordinate
151      CASE (  1 )   ;   CALL hpg_zps_adj    ( kt )      ! z-coordinate plus partial steps (interpolation)
152      CASE (  2 )   ;   CALL hpg_sco_adj    ( kt )      ! s-coordinate (standard jacobian formulation)
153      CASE (  3 )   ;   CALL hpg_hel_adj    ( kt )      ! s-coordinate (helsinki modification)
154      CASE (  4 )   ;   CALL hpg_wdj_adj    ( kt )      ! s-coordinate (weighted density jacobian)
155      CASE (  5 )   ;   CALL hpg_djc_adj    ( kt )      ! s-coordinate (Density Jacobian with Cubic polynomial)
156      CASE (  6 )   ;   CALL hpg_rot_adj    ( kt )      ! s-coordinate (ROTated axes scheme)
157      END SELECT
158   END SUBROUTINE dyn_hpg_adj
159
160   SUBROUTINE hpg_ctl_tam
161      !!----------------------------------------------------------------------
162      !!                 ***  ROUTINE hpg_ctl_tam  ***
163      !!
164      !! ** Purpose :   initializations for the hydrostatic pressure gradient
165      !!              computation and consistency control
166      !!
167      !! ** Action  :   Read the namelist namdyn_hpg and check the consistency
168      !!      with the type of vertical coordinate used (zco, zps, sco)
169      !!----------------------------------------------------------------------
170      INTEGER ::   ioptio = 0      ! temporary integer
171
172!      Namelist read in opa_flg
173!      NAMELIST/nam_dynhpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, ln_hpg_hel,   &
174!         &                 ln_hpg_wdj, ln_hpg_djc, ln_hpg_rot, gamm
175      !!----------------------------------------------------------------------
176
177!      REWIND ( numnam )               ! Read Namelist nam_dynhpg : pressure gradient calculation options
178!      READ   ( numnam, nam_dynhpg )
179
180      IF(lwp) THEN                    ! Control print
181         WRITE(numout,*)
182         WRITE(numout,*) 'dyn_ctl_tam : hydrostatic pressure gradient'
183         WRITE(numout,*) '~~~~~~~~~~~~~~~'
184         WRITE(numout,*) '   Namelist namdyn_hpg : choice of hpg scheme'
185         WRITE(numout,*) '      z-coord. - full steps                             ln_hpg_zco    = ', ln_hpg_zco
186         WRITE(numout,*) '      z-coord. - partial steps (interpolation)          ln_hpg_zps    = ', ln_hpg_zps
187         WRITE(numout,*) '      s-coord. (standard jacobian formulation)          ln_hpg_sco    = ', ln_hpg_sco
188         WRITE(numout,*) '      s-coord. (helsinki modification)                  ln_hpg_hel    = ', ln_hpg_hel
189         WRITE(numout,*) '      s-coord. (weighted density jacobian)              ln_hpg_wdj    = ', ln_hpg_wdj
190         WRITE(numout,*) '      s-coord. (Density Jacobian: Cubic polynomial)     ln_hpg_djc    = ', ln_hpg_djc
191         WRITE(numout,*) '      s-coord. (ROTated axes scheme)                    ln_hpg_rot    = ', ln_hpg_rot
192         WRITE(numout,*) '      weighting coeff. (wdj scheme)                     rn_gamma      = ', rn_gamma
193         WRITE(numout,*) '      time stepping: centered (F) or semi-implicit (T)  ln_dynhpg_imp = ', ln_dynhpg_imp
194      ENDIF
195
196      IF( lk_vvl .AND. .NOT. ln_hpg_sco )   THEN
197         CALL ctl_stop( 'hpg_ctl_tam : variable volume key_vvl compatible only with the standard jacobian formulation hpg_sco')
198      ENDIF
199
200      !                               ! Set nhpg from ln_hpg_... flags
201      IF( ln_hpg_zco )   nhpg = 0
202      IF( ln_hpg_zps )   nhpg = 1
203      IF( ln_hpg_sco )   nhpg = 2
204      IF( ln_hpg_hel )   nhpg = 3
205      IF( ln_hpg_wdj )   nhpg = 4
206      IF( ln_hpg_djc )   nhpg = 5
207      IF( ln_hpg_rot )   nhpg = 6
208
209      !                               ! Consitency check
210      ioptio = 0 
211      IF( ln_hpg_zco )   ioptio = ioptio + 1
212      IF( ln_hpg_zps )   ioptio = ioptio + 1
213      IF( ln_hpg_sco )   ioptio = ioptio + 1
214      IF( ln_hpg_hel )   ioptio = ioptio + 1
215      IF( ln_hpg_wdj )   ioptio = ioptio + 1
216      IF( ln_hpg_djc )   ioptio = ioptio + 1
217      IF( ln_hpg_rot )   ioptio = ioptio + 1
218      IF ( ioptio /= 1 )   CALL ctl_stop( ' NO or several hydrostatic pressure gradient options used' )
219
220      !
221   END SUBROUTINE hpg_ctl_tam
222   SUBROUTINE hpg_zco_tan( kt )
223      !!---------------------------------------------------------------------
224      !!                  ***  ROUTINE hpg_zco_tan  ***
225      !!
226      !! ** Method of the direct routine:
227      !!      z-coordinate case, levels are horizontal surfaces.
228      !!      The now hydrostatic pressure gradient at a given level, jk,
229      !!      is computed by taking the vertical integral of the in-situ
230      !!      density gradient along the model level from the suface to that
231      !!      level:    zhpi = grav .....
232      !!                zhpj = grav .....
233      !!      add it to the general momentum trend (ua,va).
234      !!            ua = ua - 1/e1u * zhpi
235      !!            va = va - 1/e2v * zhpj
236      !!
237      !! ** Action : - Update (ua_tl,va_tl) with the now hydrastatic pressure trend
238      !!----------------------------------------------------------------------
239      !!
240      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
241      !!
242      INTEGER  ::   ji, jj, jk       ! dummy loop indices
243      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars
244      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpitl, zhpjtl
245      !!----------------------------------------------------------------------
246     
247      IF( kt == nit000 ) THEN
248         IF(lwp) WRITE(numout,*)
249         IF(lwp) WRITE(numout,*) 'dyn:hpg_zco_tan : hydrostatic pressure gradient trend'
250         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   z-coordinate case '
251      ENDIF
252     
253      ! Local constant initialization
254      zcoef0 = - grav * 0.5_wp
255
256      ! Surface value
257      DO jj = 2, jpjm1
258         DO ji = fs_2, fs_jpim1   ! vector opt.
259            zcoef1 = zcoef0 * fse3w(ji,jj,1)
260            ! hydrostatic pressure gradient
261            zhpitl(ji,jj,1) = zcoef1 * ( rhd_tl(ji+1,jj,1) - rhd_tl(ji,jj,1) ) / e1u(ji,jj)
262            zhpjtl(ji,jj,1) = zcoef1 * ( rhd_tl(ji,jj+1,1) - rhd_tl(ji,jj,1) ) / e2v(ji,jj)
263            ! add to the general momentum trend
264            ua_tl(ji,jj,1) = ua_tl(ji,jj,1) + zhpitl(ji,jj,1)
265            va_tl(ji,jj,1) = va_tl(ji,jj,1) + zhpjtl(ji,jj,1)
266         END DO
267      END DO
268      !
269      ! interior value (2=<jk=<jpkm1)
270      DO jk = 2, jpkm1
271         DO jj = 2, jpjm1
272            DO ji = fs_2, fs_jpim1   ! vector opt.
273               zcoef1 = zcoef0 * fse3w(ji,jj,jk)
274               ! hydrostatic pressure gradient
275               zhpitl(ji,jj,jk) = zhpitl(ji,jj,jk-1)   &
276                  &           + zcoef1 * (  ( rhd_tl(ji+1,jj,jk)+rhd_tl(ji+1,jj,jk-1) )   &
277                  &                       - ( rhd_tl(ji  ,jj,jk)+rhd_tl(ji  ,jj,jk-1) )  ) / e1u(ji,jj)
278
279               zhpjtl(ji,jj,jk) = zhpjtl(ji,jj,jk-1)   &
280                  &           + zcoef1 * (  ( rhd_tl(ji,jj+1,jk)+rhd_tl(ji,jj+1,jk-1) )   &
281                  &                       - ( rhd_tl(ji,jj,  jk)+rhd_tl(ji,jj  ,jk-1) )  ) / e2v(ji,jj)
282               ! add to the general momentum trend
283               ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) + zhpitl(ji,jj,jk)
284               va_tl(ji,jj,jk) = va_tl(ji,jj,jk) + zhpjtl(ji,jj,jk)
285            END DO
286         END DO
287      END DO
288      !
289   END SUBROUTINE hpg_zco_tan
290   SUBROUTINE hpg_zco_adj( kt )
291      !!---------------------------------------------------------------------
292      !!                  ***  ROUTINE hpg_zco_tan  ***
293      !!
294      !! ** Method of the direct routine:
295      !!      z-coordinate case, levels are horizontal surfaces.
296      !!      The now hydrostatic pressure gradient at a given level, jk,
297      !!      is computed by taking the vertical integral of the in-situ
298      !!      density gradient along the model level from the suface to that
299      !!      level:    zhpi = grav .....
300      !!                zhpj = grav .....
301      !!      add it to the general momentum trend (ua,va).
302      !!            ua = ua - 1/e1u * zhpi
303      !!            va = va - 1/e2v * zhpj
304      !!
305      !! ** Action : - Update (ua_tl,va_tl) with the now hydrastatic pressure trend
306      !!----------------------------------------------------------------------
307      !!
308      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
309      !!
310      INTEGER  ::   ji, jj, jk       ! dummy loop indices
311      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars
312      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpiad, zhpjad
313      !!----------------------------------------------------------------------
314     
315      IF( kt == nitend ) THEN
316         IF(lwp) WRITE(numout,*)
317         IF(lwp) WRITE(numout,*) 'dyn:hpg_zco_adj : hydrostatic pressure gradient trend'
318         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   z-coordinate case '
319      ENDIF
320      ! adjoint variables initialization
321      zhpiad = 0.0_wp
322      zhpjad = 0.0_wp
323      ! Local constant initialization
324      zcoef0 = - grav * 0.5
325
326      ! interior value (2=<jk=<jpkm1)
327      DO jk = jpkm1, 2, -1
328         DO jj = jpjm1, 2, -1
329            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
330               zcoef1 = zcoef0 * fse3w(ji,jj,jk)
331               ! add to the general momentum trend
332               zhpiad(ji,jj,jk) = zhpiad(ji,jj,jk) + ua_ad(ji,jj,jk)
333               zhpjad(ji,jj,jk) = zhpjad(ji,jj,jk) + va_ad(ji,jj,jk)
334               ! hydrostatic pressure gradient
335               rhd_ad(ji,jj+1,jk  ) = rhd_ad(ji,jj+1,jk  ) + zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
336               rhd_ad(ji,jj+1,jk-1) = rhd_ad(ji,jj+1,jk-1) + zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
337               rhd_ad(ji,jj  ,jk  ) = rhd_ad(ji,jj  ,jk  ) - zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
338               rhd_ad(ji,jj  ,jk-1) = rhd_ad(ji,jj  ,jk-1) - zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
339               zhpjad(ji,jj  ,jk-1) = zhpjad(ji,jj  ,jk-1) + zhpjad(ji,jj,jk) 
340               zhpjad(ji,jj  ,jk  ) = 0.0_wp
341
342               rhd_ad(ji+1,jj,jk  ) = rhd_ad(ji+1,jj,jk  ) + zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
343               rhd_ad(ji+1,jj,jk-1) = rhd_ad(ji+1,jj,jk-1) + zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
344               rhd_ad(ji  ,jj,jk  ) = rhd_ad(ji  ,jj,jk  ) - zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
345               rhd_ad(ji  ,jj,jk-1) = rhd_ad(ji  ,jj,jk-1) - zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
346               zhpiad(ji  ,jj,jk-1) = zhpiad(ji  ,jj,jk-1) + zhpiad(ji,jj,jk) 
347               zhpiad(ji  ,jj,jk  ) = 0.0_wp
348
349            END DO
350         END DO
351      END DO
352      ! Surface value
353      DO jj = 2, jpjm1
354         DO ji = fs_2, fs_jpim1   ! vector opt.
355            zcoef1 = zcoef0 * fse3w(ji,jj,1)
356            ! add to the general momentum trend
357            zhpiad(ji,jj,1) = zhpiad(ji,jj,1) + ua_ad(ji,jj,1)
358            zhpjad(ji,jj,1) = zhpjad(ji,jj,1) + va_ad(ji,jj,1)
359            ! hydrostatic pressure gradient
360            rhd_ad(ji,jj+1,1) = rhd_ad(ji,jj+1,1) + zhpjad(ji,jj,1) * zcoef1 / e2v(ji,jj)
361            rhd_ad(ji,jj  ,1) = rhd_ad(ji,jj  ,1) - zhpjad(ji,jj,1) * zcoef1 / e2v(ji,jj)
362            zhpjad(ji,jj,1) = 0.0_wp
363
364            rhd_ad(ji+1,jj,1) = rhd_ad(ji+1,jj,1) + zhpiad(ji,jj,1) * zcoef1 / e1u(ji,jj)
365            rhd_ad(ji  ,jj,1) = rhd_ad(ji  ,jj,1) - zhpiad(ji,jj,1) * zcoef1 / e1u(ji,jj)
366            zhpiad(ji,jj,1) = 0.0_wp
367         END DO
368      END DO
369      !
370      !
371   END SUBROUTINE hpg_zco_adj
372   SUBROUTINE hpg_zps_tan( kt )
373      !!---------------------------------------------------------------------
374      !!                 ***  ROUTINE hpg_zps  ***
375      !!                   
376      !! ** Method of the direct routine:
377      !!              z-coordinate plus partial steps case.  blahblah...
378      !!
379      !! ** Action  : - Update (ua_tl,va_tl) with the now hydrastatic pressure trend
380      !!----------------------------------------------------------------------
381      !!
382      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
383      !!
384      INTEGER  ::   ji, jj, jk                       ! dummy loop indices
385      INTEGER  ::   iku, ikv                         ! temporary integers
386      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars
387      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpitl, zhpjtl
388      !!----------------------------------------------------------------------
389
390      IF( kt == nit000 ) THEN
391         IF(lwp) WRITE(numout,*)
392         IF(lwp) WRITE(numout,*) 'dyn:hpg_zps_tan : hydrostatic pressure gradient trend'
393         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   z-coordinate with partial steps - vector optimization'
394      ENDIF
395
396      ! Local constant initialization
397      zcoef0 = - grav * 0.5
398
399      !  Surface value
400      DO jj = 2, jpjm1
401         DO ji = fs_2, fs_jpim1   ! vector opt.
402            zcoef1 = zcoef0 * fse3w(ji,jj,1)
403            ! hydrostatic pressure gradient
404            zhpitl(ji,jj,1) = zcoef1 * ( rhd_tl(ji+1,jj  ,1) - rhd_tl(ji,jj,1) ) / e1u(ji,jj)
405            zhpjtl(ji,jj,1) = zcoef1 * ( rhd_tl(ji  ,jj+1,1) - rhd_tl(ji,jj,1) ) / e2v(ji,jj)
406            ! add to the general momentum trend
407            ua_tl(ji,jj,1) = ua_tl(ji,jj,1) + zhpitl(ji,jj,1)
408            va_tl(ji,jj,1) = va_tl(ji,jj,1) + zhpjtl(ji,jj,1)
409         END DO
410      END DO
411
412      ! interior value (2=<jk=<jpkm1)
413      DO jk = 2, jpkm1
414         DO jj = 2, jpjm1
415            DO ji = fs_2, fs_jpim1   ! vector opt.
416               zcoef1 = zcoef0 * fse3w(ji,jj,jk)
417               ! hydrostatic pressure gradient
418               zhpitl(ji,jj,jk) = zhpitl(ji,jj,jk-1)   &
419                  &           + zcoef1 * (  ( rhd_tl(ji+1,jj,jk) + rhd_tl(ji+1,jj,jk-1) )   &
420                  &                       - ( rhd_tl(ji  ,jj,jk) + rhd_tl(ji  ,jj,jk-1) )  ) / e1u(ji,jj)
421
422               zhpjtl(ji,jj,jk) = zhpjtl(ji,jj,jk-1)   &
423                  &           + zcoef1 * (  ( rhd_tl(ji,jj+1,jk) + rhd_tl(ji,jj+1,jk-1) )   &
424                  &                       - ( rhd_tl(ji,jj,  jk) + rhd_tl(ji,jj  ,jk-1) )  ) / e2v(ji,jj)
425               ! add to the general momentum trend
426               ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) + zhpitl(ji,jj,jk)
427               va_tl(ji,jj,jk) = va_tl(ji,jj,jk) + zhpjtl(ji,jj,jk)
428            END DO
429         END DO
430      END DO
431
432      ! partial steps correction at the last level  (new gradient with  intgrd.F)
433# if defined key_vectopt_loop
434         jj = 1
435         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
436# else
437      DO jj = 2, jpjm1
438         DO ji = 2, jpim1
439# endif
440            iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj) ) - 1
441            ikv = MIN ( mbathy(ji,jj), mbathy(ji,jj+1) ) - 1
442            zcoef2 = zcoef0 * MIN( fse3w(ji,jj,iku), fse3w(ji+1,jj  ,iku) )
443            zcoef3 = zcoef0 * MIN( fse3w(ji,jj,ikv), fse3w(ji  ,jj+1,ikv) )
444            ! on i-direction
445            IF ( iku > 2 ) THEN
446               ! subtract old value
447               ua_tl(ji,jj,iku) = ua_tl(ji,jj,iku) - zhpitl(ji,jj,iku)
448               ! compute the new one
449               zhpitl (ji,jj,iku) = zhpitl(ji,jj,iku-1)   &
450                  + zcoef2 * ( rhd_tl(ji+1,jj,iku-1) - rhd_tl(ji,jj,iku-1) + gru_tl(ji,jj) ) / e1u(ji,jj)
451               ! add the new one to the general momentum trend
452               ua_tl(ji,jj,iku) = ua_tl(ji,jj,iku) + zhpitl(ji,jj,iku)
453            ENDIF
454            ! on j-direction
455            IF ( ikv > 2 ) THEN
456               ! subtract old value
457               va_tl(ji,jj,ikv) = va_tl(ji,jj,ikv) - zhpjtl(ji,jj,ikv)
458               ! compute the new one
459               zhpjtl (ji,jj,ikv) = zhpjtl(ji,jj,ikv-1)   &
460                  + zcoef3 * ( rhd_tl(ji,jj+1,ikv-1) - rhd_tl(ji,jj,ikv-1) + grv_tl(ji,jj) ) / e2v(ji,jj)
461               ! add the new one to the general momentum trend
462               va_tl(ji,jj,ikv) = va_tl(ji,jj,ikv) + zhpjtl(ji,jj,ikv)
463            ENDIF
464# if ! defined key_vectopt_loop
465         END DO
466# endif
467      END DO
468      !
469   END SUBROUTINE hpg_zps_tan
470   SUBROUTINE hpg_zps_adj( kt )
471      !!---------------------------------------------------------------------
472      !!                 ***  ROUTINE hpg_zps  ***
473      !!                   
474      !! ** Method of the direct routine:
475      !!              z-coordinate plus partial steps case.  blahblah...
476      !!
477      !! ** Action  : - Update (ua_tl,va_tl) with the now hydrastatic pressure trend
478      !!----------------------------------------------------------------------
479      !!
480      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
481      !!
482      INTEGER  ::   ji, jj, jk                       ! dummy loop indices
483      INTEGER  ::   iku, ikv                         ! temporary integers
484      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars
485      REAL(wp), DIMENSION(jpi,jpj,jpk):: zhpiad, zhpjad
486      !!----------------------------------------------------------------------
487
488      IF( kt == nitend ) THEN
489         IF(lwp) WRITE(numout,*)
490         IF(lwp) WRITE(numout,*) 'dyn:hpg_zps_adj : hydrostatic pressure gradient trend'
491         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~   z-coordinate with partial steps - vector optimization'
492      ENDIF
493      zhpiad(:,:,:) = 0.0_wp
494      zhpjad(:,:,:) = 0.0_wp
495      ! Local constant initialization
496      zcoef0 = - grav * 0.5
497
498      ! partial steps correction at the last level  (new gradient with  intgrd.F)
499# if defined key_vectopt_loop
500         jj = 1
501         DO ji = jpij-jpi-1, jpi+2, -1   ! vector opt. (forced unrolling)
502# else
503      DO jj = jpjm1, 2, -1
504         DO ji = jpim1, 2, -1
505# endif
506            iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj) ) - 1
507            ikv = MIN ( mbathy(ji,jj), mbathy(ji,jj+1) ) - 1
508            zcoef2 = zcoef0 * MIN( fse3w(ji,jj,iku), fse3w(ji+1,jj  ,iku) )
509            zcoef3 = zcoef0 * MIN( fse3w(ji,jj,ikv), fse3w(ji  ,jj+1,ikv) )
510            ! on i-direction
511            IF ( iku > 2 ) THEN
512               ! add the new one to the general momentum trend
513               zhpiad(ji,jj,iku) = zhpiad(ji,jj,iku) + ua_ad(ji,jj,iku)
514               ! compute the new one
515               rhd_ad(ji+1,jj,iku-1) = rhd_ad(ji+1,jj,iku-1) + zhpiad (ji,jj,iku) * zcoef2 / e1u(ji,jj)
516               rhd_ad(ji,jj,iku-1) = rhd_ad(ji,jj,iku-1) - zhpiad (ji,jj,iku) * zcoef2 / e1u(ji,jj)
517               gru_ad(ji,jj) = gru_ad(ji,jj) + zhpiad (ji,jj,iku) * zcoef2 / e1u(ji,jj)
518               zhpiad(ji,jj,iku-1) = zhpiad(ji,jj,iku-1) + zhpiad (ji,jj,iku)
519               zhpiad (ji,jj,iku) = 0.0_wp
520               ! subtract old value
521               zhpiad(ji,jj,iku) = zhpiad(ji,jj,iku) - ua_ad(ji,jj,iku)
522            ENDIF
523            ! on j-direction
524            IF ( ikv > 2 ) THEN
525               ! add the new one to the general momentum trend
526               zhpjad(ji,jj,ikv) = zhpjad(ji,jj,ikv) + va_ad(ji,jj,ikv)
527               ! compute the new one
528               rhd_ad(ji,jj+1,ikv-1) = rhd_ad(ji,jj+1,ikv-1) + zhpjad (ji,jj,ikv) * zcoef3 / e2v(ji,jj)
529               rhd_ad(ji,jj,ikv-1) = rhd_ad(ji,jj,ikv-1) -zhpjad (ji,jj,ikv) * zcoef3 / e2v(ji,jj)
530               grv_ad(ji,jj) = grv_ad(ji,jj) +zhpjad (ji,jj,ikv) * zcoef3 / e2v(ji,jj)
531               zhpjad(ji,jj,ikv-1) = zhpjad(ji,jj,ikv-1) + zhpjad(ji,jj,ikv)
532               zhpjad (ji,jj,ikv) = 0.0_wp
533               ! subtract old value
534               zhpjad(ji,jj,ikv) = zhpjad(ji,jj,ikv) - va_ad(ji,jj,ikv)
535            ENDIF
536# if ! defined key_vectopt_loop
537         END DO
538# endif
539      END DO
540      !
541
542
543      ! interior value (2=<jk=<jpkm1)
544      DO jk = jpkm1, 2, -1
545         DO jj = jpjm1, 2, -1
546            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
547               zcoef1 = zcoef0 * fse3w(ji,jj,jk)
548               ! add to the general momentum trend
549               zhpiad(ji,jj,jk) = zhpiad(ji,jj,jk) + ua_ad(ji,jj,jk)
550               zhpjad(ji,jj,jk) = zhpjad(ji,jj,jk) + va_ad(ji,jj,jk)
551               ! hydrostatic pressure gradient
552               rhd_ad(ji,jj+1,jk  ) = rhd_ad(ji,jj+1,jk  ) + zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
553               rhd_ad(ji,jj+1,jk-1) = rhd_ad(ji,jj+1,jk-1) + zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
554               rhd_ad(ji,jj  ,jk  ) = rhd_ad(ji,jj  ,jk  ) - zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
555               rhd_ad(ji,jj  ,jk-1) = rhd_ad(ji,jj  ,jk-1) - zhpjad(ji,jj,jk) * zcoef1 / e2v(ji,jj)
556               zhpjad(ji,jj  ,jk-1) = zhpjad(ji,jj  ,jk-1) + zhpjad(ji,jj,jk)
557               zhpjad(ji,jj  ,jk  ) = 0.0_wp
558
559               rhd_ad(ji+1,jj,jk  ) = rhd_ad(ji+1,jj,jk  ) + zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
560               rhd_ad(ji+1,jj,jk-1) = rhd_ad(ji+1,jj,jk-1) + zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
561               rhd_ad(ji  ,jj,jk  ) = rhd_ad(ji  ,jj,jk  ) - zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
562               rhd_ad(ji  ,jj,jk-1) = rhd_ad(ji  ,jj,jk-1) - zhpiad(ji,jj,jk) * zcoef1 / e1u(ji,jj)
563               zhpiad(ji  ,jj,jk-1) = zhpiad(ji  ,jj,jk-1) + zhpiad(ji,jj,jk)
564               zhpiad(ji  ,jj,jk  ) = 0.0_wp
565            END DO
566         END DO
567      END DO
568      !  Surface value
569      DO jj = jpjm1, 2, -1
570         DO ji = fs_jpim1, fs_2, -1   ! vector opt.
571            zcoef1 = zcoef0 * fse3w(ji,jj,1)
572            ! add to the general momentum trend
573            zhpiad(ji,jj,1) = zhpiad(ji,jj,1) + ua_ad(ji,jj,1)
574            zhpjad(ji,jj,1) = zhpjad(ji,jj,1) + va_ad(ji,jj,1)
575            ! hydrostatic pressure gradient
576            rhd_ad(ji+1,jj  ,1) = rhd_ad(ji+1,jj  ,1) + zhpiad(ji,jj,1) * zcoef1 / e1u(ji,jj)
577            rhd_ad(ji  ,jj  ,1) = rhd_ad(ji  ,jj  ,1) - zhpiad(ji,jj,1) * zcoef1 / e1u(ji,jj)
578            rhd_ad(ji  ,jj+1,1) = rhd_ad(ji  ,jj+1,1) + zhpjad(ji,jj,1) * zcoef1 / e2v(ji,jj)
579            rhd_ad(ji  ,jj  ,1) = rhd_ad(ji  ,jj  ,1) - zhpjad(ji,jj,1) * zcoef1 / e2v(ji,jj)
580            zhpiad(ji  ,jj  ,1) = 0.0_wp
581            zhpjad(ji  ,jj  ,1) = 0.0_wp
582         END DO
583      END DO
584
585   END SUBROUTINE hpg_zps_adj
586   SUBROUTINE hpg_sco_tan( kt )
587      !!---------------------------------------------------------------------
588      !!                  ***  ROUTINE hpg_sco_tan  ***
589      !!
590      !! ** Method of the direct routine:   s-coordinate case. Jacobian scheme.
591      !!      The now hydrostatic pressure gradient at a given level, jk,
592      !!      is computed by taking the vertical integral of the in-situ
593      !!      density gradient along the model level from the suface to that
594      !!      level. s-coordinates (ln_sco): a corrective term is added
595      !!      to the horizontal pressure gradient :
596      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
597      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
598      !!      add it to the general momentum trend (ua,va).
599      !!         ua = ua - 1/e1u * zhpi
600      !!         va = va - 1/e2v * zhpj
601      !!
602      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
603      !!----------------------------------------------------------------------
604      !!
605      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
606      CALL ctl_stop( 'hpg_sco_tan not available yet')
607   END SUBROUTINE hpg_sco_tan
608   SUBROUTINE hpg_sco_adj( kt )
609      !!---------------------------------------------------------------------
610      !!                  ***  ROUTINE hpg_sco_adj  ***
611      !!
612      !! ** Method of the direct routine:   s-coordinate case. Jacobian scheme.
613      !!      The now hydrostatic pressure gradient at a given level, jk,
614      !!      is computed by taking the vertical integral of the in-situ
615      !!      density gradient along the model level from the suface to that
616      !!      level. s-coordinates (ln_sco): a corrective term is added
617      !!      to the horizontal pressure gradient :
618      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
619      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
620      !!      add it to the general momentum trend (ua,va).
621      !!         ua = ua - 1/e1u * zhpi
622      !!         va = va - 1/e2v * zhpj
623      !!
624      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
625      !!----------------------------------------------------------------------
626      !!
627      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
628      CALL ctl_stop( 'hpg_sco_adj not available yet')
629   END SUBROUTINE hpg_sco_adj
630   SUBROUTINE hpg_hel_tan( kt )
631      !!---------------------------------------------------------------------
632      !!                  ***  ROUTINE hpg_hel_tan  ***
633      !!
634      !! ** Method of the direct routine:   s-coordinate case.
635      !!      The now hydrostatic pressure gradient at a given level
636      !!      jk is computed by taking the vertical integral of the in-situ
637      !!      density gradient along the model level from the suface to that
638      !!      level. s-coordinates (ln_sco): a corrective term is added
639      !!      to the horizontal pressure gradient :
640      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
641      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
642      !!      add it to the general momentum trend (ua,va).
643      !!         ua = ua - 1/e1u * zhpi
644      !!         va = va - 1/e2v * zhpj
645      !!
646      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
647      !!             - Save the trend (l_trddyn=T)
648      !!----------------------------------------------------------------------
649      !!
650      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
651      CALL ctl_stop( 'hpg_hel_tan not available yet')
652   END SUBROUTINE hpg_hel_tan
653   SUBROUTINE hpg_hel_adj( kt )
654      !!---------------------------------------------------------------------
655      !!                  ***  ROUTINE hpg_hel_adj  ***
656      !!
657      !! ** Method of the direct routine:   s-coordinate case.
658      !!      The now hydrostatic pressure gradient at a given level
659      !!      jk is computed by taking the vertical integral of the in-situ
660      !!      density gradient along the model level from the suface to that
661      !!      level. s-coordinates (ln_sco): a corrective term is added
662      !!      to the horizontal pressure gradient :
663      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
664      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
665      !!      add it to the general momentum trend (ua,va).
666      !!         ua = ua - 1/e1u * zhpi
667      !!         va = va - 1/e2v * zhpj
668      !!
669      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend
670      !!             - Save the trend (l_trddyn=T)
671      !!----------------------------------------------------------------------
672      !!
673      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
674      CALL ctl_stop( 'hpg_hel_adj not available yet')
675   END SUBROUTINE hpg_hel_adj
676   SUBROUTINE hpg_wdj_tan( kt )
677      !!---------------------------------------------------------------------
678      !!                  ***  ROUTINE hpg_wdj_tan  ***
679      !!
680      !! ** Method of the direct roiutine:
681      !!      Weighted Density Jacobian (wdj) scheme (song 1998)
682      !!      The weighting coefficients from the namelist parameter gamm
683      !!      (alpha=0.5-gamm ; beta=1-alpha=0.5+gamm)
684      !!
685      !! Reference : Song, Mon. Wea. Rev., 126, 3213-3230, 1998.
686      !!----------------------------------------------------------------------
687      !!
688      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
689      CALL ctl_stop( 'hpg_wdj_tan not available yet')
690   END SUBROUTINE hpg_wdj_tan
691   SUBROUTINE hpg_wdj_adj( kt )
692      !!---------------------------------------------------------------------
693      !!                  ***  ROUTINE hpg_wdj_adj  ***
694      !!
695      !! ** Method of the direct roiutine:
696      !!      Weighted Density Jacobian (wdj) scheme (song 1998)
697      !!      The weighting coefficients from the namelist parameter gamm
698      !!      (alpha=0.5-gamm ; beta=1-alpha=0.5+gamm)
699      !!
700      !! Reference : Song, Mon. Wea. Rev., 126, 3213-3230, 1998.
701      !!----------------------------------------------------------------------
702      !!
703      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
704      CALL ctl_stop( 'hpg_wdj_adj not available yet')
705   END SUBROUTINE hpg_wdj_adj
706   SUBROUTINE hpg_djc_tan( kt )
707      !!---------------------------------------------------------------------
708      !!                  ***  ROUTINE hpg_djc_tan  ***
709      !!
710      !! ** Method  :   Density Jacobian with Cubic polynomial scheme
711      !!
712      !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003
713      !!----------------------------------------------------------------------
714      !!
715      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
716      !!
717      CALL ctl_stop( 'hpg_djc_tan not available yet')
718   END SUBROUTINE hpg_djc_tan
719   SUBROUTINE hpg_djc_adj( kt )
720      !!---------------------------------------------------------------------
721      !!                  ***  ROUTINE hpg_djc_adj  ***
722      !!
723      !! ** Method  :   Density Jacobian with Cubic polynomial scheme
724      !!
725      !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003
726      !!----------------------------------------------------------------------
727      !!
728      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
729      !!
730      CALL ctl_stop( 'hpg_djc_adj not available yet')
731   END SUBROUTINE hpg_djc_adj
732   SUBROUTINE hpg_rot_tan( kt )
733      !!---------------------------------------------------------------------
734      !!                  ***  ROUTINE hpg_rot_tan  ***
735      !!
736      !! ** Method  :   rotated axes scheme (Thiem and Berntsen 2005)
737      !!
738      !! Reference: Thiem & Berntsen, Ocean Modelling, In press, 2005.
739      !!----------------------------------------------------------------------
740      !!
741      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
742            !!
743      CALL ctl_stop( 'hpg_rot_tan not available yet')
744   END SUBROUTINE hpg_rot_tan
745   SUBROUTINE hpg_rot_adj( kt )
746      !!---------------------------------------------------------------------
747      !!                  ***  ROUTINE hpg_rot_adj  ***
748      !!
749      !! ** Method  :   rotated axes scheme (Thiem and Berntsen 2005)
750      !!
751      !! Reference: Thiem & Berntsen, Ocean Modelling, In press, 2005.
752      !!----------------------------------------------------------------------
753      !!
754      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
755            !!
756      CALL ctl_stop( 'hpg_rot_adj not available yet')
757   END SUBROUTINE hpg_rot_adj
758
759   SUBROUTINE dyn_hpg_adj_tst( kumadt )
760      !!-----------------------------------------------------------------------
761      !!
762      !!                  ***  ROUTINE dynhpg_adj_tst ***
763      !!
764      !! ** Purpose : Test the adjoint routine.
765      !!
766      !! ** Method  : Verify the scalar product
767      !!           
768      !!                 ( L dx )^T W dy  =  dx^T L^T W dy
769      !!
770      !!              where  L   = tangent routine
771      !!                     L^T = adjoint routine
772      !!                     W   = diagonal matrix of scale factors
773      !!                     dx  = input perturbation (random field)
774      !!                     dy  = L dx
775      !!
776      !! ** Action  : Separate tests are applied for the following dx and dy:
777      !!               
778      !!              1) dx = ( SSH ) and dy = ( SSH )
779      !!                   
780      !! History :
781      !!        ! 08-07 (A. Vidard)
782      !!-----------------------------------------------------------------------
783      !! * Modules used
784
785      !! * Arguments
786      INTEGER, INTENT(IN) :: &
787         & kumadt             ! Output unit
788
789      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   &
790         & zrhd_tlin,              &  ! in situ density anomalie
791         & zua_tlin,               &  ! after u- velocity
792         & zva_tlin,               &  ! after v- velocity
793         & zua_tlout,              &  ! after u- velocity
794         & zva_tlout                  ! after v- velocity
795      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   &
796         & zrhd_adout,             &  ! in situ density anomalie
797         & zua_adout,              &  ! after u- velocity
798         & zva_adout,              &  ! after v- velocity
799         & zua_adin,               &  ! after u- velocity
800         & zva_adin                   ! after v- velocity
801      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   &
802         & zgru_tlin,              &
803         & zgrv_tlin,              &
804         & zgru_adout,             &
805         & zgrv_adout
806         
807      REAL(KIND=wp), DIMENSION(:,:,:), ALLOCATABLE :: &
808         & zrh,          & ! 3D random field for rhd
809         & zau,          & ! 3D random field for u
810         & zav             ! 3D random field for v
811      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   &
812         & zgru,         & ! 2D random field for gru
813         & zgrv            ! 2D random field for grv
814      REAL(KIND=wp) ::   &
815         & zsp1,         & ! scalar product involving the tangent routine
816         & zsp1_1,       & !   scalar product components
817         & zsp1_2,       & 
818         & zsp2,         & ! scalar product involving the adjoint routine
819         & zsp2_1,       & !   scalar product components
820         & zsp2_2,       & 
821         & zsp2_3,       & 
822         & zsp2_4,       & 
823         & zsp2_5
824      INTEGER, DIMENSION(jpi,jpj) :: &
825         & iseed_2d           ! 2D seed for the random number generator
826      INTEGER :: &
827         & iseed, &
828         & ji, &
829         & jj, &
830         & jk
831      CHARACTER(LEN=14) :: cl_name
832
833      ! Allocate memory
834      ALLOCATE( & 
835         & zrhd_tlin(jpi,jpj,jpk),  &
836         & zua_tlin(jpi,jpj,jpk),   &
837         & zva_tlin(jpi,jpj,jpk),   &
838         & zgru_tlin(jpi,jpj),      & 
839         & zgrv_tlin(jpi,jpj),      & 
840         & zua_tlout(jpi,jpj,jpk),  &
841         & zva_tlout(jpi,jpj,jpk),  &
842         & zrhd_adout(jpi,jpj,jpk), &
843         & zua_adout(jpi,jpj,jpk),  &
844         & zva_adout(jpi,jpj,jpk),  &
845         & zgru_adout(jpi,jpj),     & 
846         & zgrv_adout(jpi,jpj),     & 
847         & zua_adin(jpi,jpj,jpk),   &
848         & zva_adin(jpi,jpj,jpk),   &
849         & zrh(jpi,jpj,jpk),        & 
850         & zau(jpi,jpj,jpk),        & 
851         & zav(jpi,jpj,jpk),        & 
852         & zgru(jpi,jpj),           &
853         & zgrv(jpi,jpj)            &
854         &     )
855 
856
857      !==================================================================
858      ! 1) dx = ( un_tl, vn_tl, hdivn_tl ) and
859      !    dy = ( hdivb_tl, hdivn_tl )
860      !==================================================================
861
862      !--------------------------------------------------------------------
863      ! Reset the tangent and adjoint variables
864      !--------------------------------------------------------------------
865      zrhd_tlin(:,:,:)  = 0.0_wp 
866      zua_tlin(:,:,:)   = 0.0_wp   
867      zva_tlin(:,:,:)   = 0.0_wp   
868      zgru_tlin(:,:)    = 0.0_wp
869      zgrv_tlin(:,:)    = 0.0_wp
870      zua_tlout(:,:,:)  = 0.0_wp 
871      zva_tlout(:,:,:)  = 0.0_wp 
872      zgru_adout(:,:)   = 0.0_wp
873      zgrv_adout(:,:)   = 0.0_wp
874      zrhd_adout(:,:,:) = 0.0_wp 
875      zua_adout(:,:,:)  = 0.0_wp 
876      zva_adout(:,:,:)  = 0.0_wp 
877      zua_adin(:,:,:)   = 0.0_wp   
878      zva_adin(:,:,:)   = 0.0_wp   
879      zrh(:,:,:)        = 0.0_wp         
880      zau(:,:,:)        = 0.0_wp         
881      zav(:,:,:)        = 0.0_wp 
882      zgru(:,:)         = 0.0_wp
883      zgrv(:,:)         = 0.0_wp
884
885
886      gru_tl(:,:)   = 0.0_wp
887      grv_tl(:,:)   = 0.0_wp
888      gru_ad(:,:)   = 0.0_wp
889      grv_ad(:,:)   = 0.0_wp
890      ua_tl(:,:,:)  = 0.0_wp
891      va_tl(:,:,:)  = 0.0_wp
892      rhd_tl(:,:,:) = 0.0_wp
893      ua_ad(:,:,:)  = 0.0_wp
894      va_ad(:,:,:)  = 0.0_wp
895      rhd_ad(:,:,:) = 0.0_wp
896
897      !--------------------------------------------------------------------
898      ! Initialize the tangent input with random noise: dx
899      !--------------------------------------------------------------------
900
901      DO jj = 1, jpj
902         DO ji = 1, jpi
903            iseed_2d(ji,jj) = - ( 596035 + &
904               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
905         END DO
906      END DO
907      CALL grid_random( iseed_2d, zau, 'U', 0.0_wp, stdu )
908
909      DO jj = 1, jpj
910         DO ji = 1, jpi
911            iseed_2d(ji,jj) = - ( 523432 + &
912               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
913         END DO
914      END DO
915      CALL grid_random( iseed_2d, zav, 'V', 0.0_wp, stdv )
916
917      DO jj = 1, jpj
918         DO ji = 1, jpi
919            iseed_2d(ji,jj) = - ( 456953 + &
920               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
921         END DO
922      END DO
923      CALL grid_random( iseed_2d, zrh, 'W', 0.0_wp, stdr )
924
925      DO jj = 1, jpj
926         DO ji = 1, jpi
927            iseed_2d(ji,jj) = - ( 432545 + &
928               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
929         END DO
930      END DO
931      CALL grid_random( iseed_2d, zgru, 'U', 0.0_wp, stdu )
932
933      DO jj = 1, jpj
934         DO ji = 1, jpi
935            iseed_2d(ji,jj) = - ( 287503 + &
936               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
937         END DO
938      END DO
939      CALL grid_random( iseed_2d, zgrv, 'V', 0.0_wp, stdv )
940
941      DO jk = 1, jpk
942         DO jj = nldj, nlej
943            DO ji = nldi, nlei
944               zrhd_tlin(ji,jj,jk) = zrh(ji,jj,jk)
945               zua_tlin(ji,jj,jk)  = zau(ji,jj,jk)
946               zva_tlin(ji,jj,jk)  = zav(ji,jj,jk)
947            END DO
948         END DO
949      END DO
950      DO jj = nldj, nlej
951         DO ji = nldi, nlei
952            zgru_tlin(ji,jj)   = zgru(ji,jj)
953            zgrv_tlin(ji,jj)   = zgrv(ji,jj)
954         END DO
955      END DO
956      ua_tl(:,:,:)  = zua_tlin(:,:,:)
957      va_tl(:,:,:)  = zva_tlin(:,:,:)
958      rhd_tl(:,:,:) = zrhd_tlin(:,:,:)
959      gru_tl(:,:)   = zgru_tlin(:,:)
960      grv_tl(:,:)   = zgrv_tlin(:,:) 
961
962      CALL dyn_hpg_tan ( nit000 )
963
964      zua_tlout(:,:,:) = ua_tl(:,:,:)
965      zva_tlout(:,:,:) = va_tl(:,:,:)
966      !--------------------------------------------------------------------
967      ! Initialize the adjoint variables: dy^* = W dy
968      !--------------------------------------------------------------------
969
970      DO jk = 1, jpk
971        DO jj = nldj, nlej
972           DO ji = nldi, nlei
973              zua_adin(ji,jj,jk) = zua_tlout(ji,jj,jk) &
974                 &               * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) &
975                 &               * umask(ji,jj,jk)
976              zva_adin(ji,jj,jk) = zva_tlout(ji,jj,jk) &
977                 &               * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) &
978                 &               * vmask(ji,jj,jk)
979            END DO
980         END DO
981      END DO
982      !--------------------------------------------------------------------
983      ! Compute the scalar product: ( L dx )^T W dy
984      !--------------------------------------------------------------------
985
986      zsp1_1 = DOT_PRODUCT( zua_tlout, zua_adin )
987      zsp1_2 = DOT_PRODUCT( zva_tlout, zva_adin )
988      zsp1   = zsp1_1 + zsp1_2
989
990      !--------------------------------------------------------------------
991      ! Call the adjoint routine: dx^* = L^T dy^*
992      !--------------------------------------------------------------------
993
994      ua_ad(:,:,:) = zua_adin(:,:,:)
995      va_ad(:,:,:) = zva_adin(:,:,:)
996
997      CALL dyn_hpg_adj ( nit000 )
998
999      zgru_adout(:,:)   = gru_ad(:,:)
1000      zgrv_adout(:,:)   = grv_ad(:,:)
1001      zrhd_adout(:,:,:) = rhd_ad(:,:,:)
1002      zua_adout(:,:,:)  = ua_ad(:,:,:)
1003      zva_adout(:,:,:)  = va_ad(:,:,:)
1004
1005      zsp2_1 = DOT_PRODUCT( zgru_tlin, zgru_adout )
1006      zsp2_2 = DOT_PRODUCT( zgrv_tlin, zgrv_adout )
1007      zsp2_3 = DOT_PRODUCT( zrhd_tlin, zrhd_adout )
1008      zsp2_4 = DOT_PRODUCT( zua_tlin, zua_adout )
1009      zsp2_5 = DOT_PRODUCT( zva_tlin, zva_adout )
1010      zsp2   = zsp2_1 + zsp2_2 + zsp2_3 + zsp2_4 + zsp2_5
1011      ! Compare the scalar products
1012
1013      cl_name = 'dyn_hpg_adj   '
1014      CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 )
1015
1016      DEALLOCATE( &
1017         & zrhd_tlin,  &
1018         & zua_tlin,   &
1019         & zva_tlin,   &
1020         & zgru_tlin,  & 
1021         & zgrv_tlin,  & 
1022         & zua_tlout,  &
1023         & zva_tlout,  &
1024         & zrhd_adout, &
1025         & zua_adout,  &
1026         & zva_adout,  &
1027         & zgru_adout, & 
1028         & zgrv_adout, & 
1029         & zua_adin,   &
1030         & zva_adin,   &
1031         & zrh,        & 
1032         & zau,        & 
1033         & zav,        & 
1034         & zgru,       &
1035         & zgrv        &
1036         &              )
1037   END SUBROUTINE dyn_hpg_adj_tst
1038#if defined key_tst_tlm
1039   SUBROUTINE dyn_hpg_tlm_tst( kumadt )
1040      !!-----------------------------------------------------------------------
1041      !!
1042      !!                  ***  ROUTINE dyn_hpg_tlm_tst ***
1043      !!
1044      !! ** Purpose : Test the adjoint routine.
1045      !!
1046      !! ** Method  : Verify the tangent with Taylor expansion
1047      !!           
1048      !!                 M(x+hdx) = M(x) + L(hdx) + O(h^2)
1049      !!
1050      !!              where  L   = tangent routine
1051      !!                     M   = direct routine
1052      !!                     dx  = input perturbation (random field)
1053      !!                     h   = ration on perturbation
1054      !!                   
1055      !! History :
1056      !!        ! 09-08 (A. Vigilant)
1057      !!-----------------------------------------------------------------------
1058      !! * Modules used
1059      USE dynhpg
1060      USE zpshde
1061      USE eosbn2,     ONLY: & ! horizontal & vertical advective trend
1062        & eos
1063      USE zpshde_tam
1064      USE eosbn2_tam,     ONLY: & ! horizontal & vertical advective trend
1065        & eos_tan
1066      USE tamtrj              ! writing out state trajectory
1067      USE par_tlm,    ONLY: &
1068        & tlm_bch,          &
1069        & cur_loop,         &
1070        & h_ratio
1071      USE istate_mod
1072      USE divcur             ! horizontal divergence and relative vorticity
1073      USE gridrandom, ONLY: &
1074        & grid_rd_sd
1075      USE trj_tam
1076      USE oce       , ONLY: & ! ocean dynamics and tracers variables
1077        & ua, va, rhd,      &
1078        & gru, grv,         &
1079        & un, vn,           &     
1080        & tn, sn, gtu, gtv, &
1081        & gsu, gsv, rhop
1082      USE tamctl,         ONLY: & ! Control parameters
1083       & numtan, numtan_sc
1084      !! * Arguments
1085      INTEGER, INTENT(IN) :: &
1086         & kumadt             ! Output unit
1087      !! * Local declarations
1088      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   &
1089         & zrd_tlin,               &  ! in situ density anomalie
1090         & zua_tlin,               &  ! after u- velocity
1091         & zva_tlin,               &  ! after v- velocity
1092         & ztn_tlin,               &  ! after u- velocity
1093         & zsn_tlin,               &  ! after v- velocity
1094         & zua_wop,                &  ! after u- velocity
1095         & zva_wop,                &  ! after v- velocity
1096         & zua_out,                &  ! after u- velocity
1097         & zva_out                    ! after v- velocity
1098
1099      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   &
1100         & zgru_tlin,              &
1101         & zgrv_tlin
1102
1103      REAL(KIND=wp), DIMENSION(:,:,:), ALLOCATABLE :: &
1104         & zrh,          & ! 3D random field for rhd
1105         & zau,          & ! 3D random field for u
1106         & zav             ! 3D random field for v
1107      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   &
1108         & zgru,         & ! 2D random field for gru
1109         & zgrv            ! 2D random field for grv
1110
1111      REAL(KIND=wp) ::   &
1112         & zsp1,         & ! scalar product
1113         & zsp1_1,       & ! scalar product
1114         & zsp1_2,       & 
1115         & zsp2,         & ! scalar product
1116         & zsp2_1,       & ! scalar product
1117         & zsp2_2,       &
1118         & zsp3,         & ! scalar product
1119         & zsp3_1,       & 
1120         & zsp3_2,       & 
1121         & zzsp,         & ! scalar product
1122         & zzsp_1,       & 
1123         & zzsp_2,       &
1124         & gamma,            &
1125         & zgsp1,            &
1126         & zgsp2,            &
1127         & zgsp3,            &
1128         & zgsp4,            &
1129         & zgsp5,            &
1130         & zgsp6,            &
1131         & zgsp7 
1132      INTEGER :: &
1133         & ji, &
1134         & jj, &
1135         & jk
1136      CHARACTER(LEN=14)   :: cl_name
1137      CHARACTER (LEN=128) :: file_out, file_wop, file_xdx
1138      CHARACTER (LEN=90)  ::  FMT
1139      REAL(KIND=wp), DIMENSION(100):: &
1140         & zscua, zscva,    &
1141         & zscerrua,        &
1142         & zscerrva
1143      INTEGER, DIMENSION(100):: &
1144         & iiposua, iiposva,    &
1145         & ijposua, ijposva,    & 
1146         & ikposua, ikposva
1147      INTEGER::             &
1148         & ii,              &
1149         & isamp=40,        &
1150         & jsamp=40,        &
1151         & ksamp=10,        &
1152         & numsctlm
1153     REAL(KIND=wp), DIMENSION(jpi,jpj,jpk) :: &
1154         & zerrua, zerrva
1155      ! Allocate memory
1156      ALLOCATE( & 
1157         & zrd_tlin(jpi,jpj,jpk),   &
1158         & zua_tlin(jpi,jpj,jpk),   &
1159         & zva_tlin(jpi,jpj,jpk),   &
1160         & ztn_tlin(jpi,jpj,jpk),   &
1161         & zsn_tlin(jpi,jpj,jpk),   &
1162         & zgru_tlin(jpi,jpj),      & 
1163         & zgrv_tlin(jpi,jpj),      & 
1164         & zua_wop  (jpi,jpj,jpk),  &
1165         & zva_wop  (jpi,jpj,jpk),  &
1166         & zua_out  (jpi,jpj,jpk),  &
1167         & zva_out  (jpi,jpj,jpk),  &
1168         & zrh(      jpi,jpj,jpk),  & 
1169         & zau(      jpi,jpj,jpk),  & 
1170         & zav(      jpi,jpj,jpk),  & 
1171         & zgru(     jpi,jpj),      &
1172         & zgrv(     jpi,jpj)       &
1173         &     )
1174
1175      !--------------------------------------------------------------------
1176      ! Reset variables
1177      !--------------------------------------------------------------------
1178      zrd_tlin( :,:,:) = 0.0_wp
1179      zgru_tlin(  :,:) = 0.0_wp
1180      zgrv_tlin(  :,:) = 0.0_wp
1181      zua_tlin( :,:,:) = 0.0_wp
1182      zva_tlin( :,:,:) = 0.0_wp
1183      ztn_tlin( :,:,:) = 0.0_wp
1184      zsn_tlin( :,:,:) = 0.0_wp
1185      zua_out ( :,:,:) = 0.0_wp
1186      zva_out ( :,:,:) = 0.0_wp
1187      zua_wop ( :,:,:) = 0.0_wp
1188      zva_wop ( :,:,:) = 0.0_wp
1189
1190      zrh(:,:,:)        = 0.0_wp         
1191      zau(:,:,:)        = 0.0_wp         
1192      zav(:,:,:)        = 0.0_wp 
1193      zgru(:,:)         = 0.0_wp
1194      zgrv(:,:)         = 0.0_wp
1195
1196      zscua(:)         = 0.0_wp
1197      zscva(:)         = 0.0_wp
1198      zscerrua(:)      = 0.0_wp
1199      zscerrva(:)      = 0.0_wp
1200      zerrua(:,:,:)    = 0.0_wp
1201      zerrva(:,:,:)    = 0.0_wp
1202      !--------------------------------------------------------------------
1203      ! Output filename Xn=F(X0)
1204      !--------------------------------------------------------------------
1205!!      CALL tlm_namrd
1206      gamma = h_ratio 
1207      file_wop='trj_wop_dynhpg'
1208      file_xdx='trj_xdx_dynhpg'
1209       !--------------------------------------------------------------------
1210      ! Initialize the tangent input with random noise: dx
1211      !--------------------------------------------------------------------
1212      IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN
1213         CALL grid_rd_sd( 596035, zau,  'U', 0.0_wp, stdu)
1214         CALL grid_rd_sd( 523432, zav,  'V', 0.0_wp, stdv)
1215         CALL grid_rd_sd( 456953, zrh,  'W', 0.0_wp, stdr)
1216         CALL grid_rd_sd( 432545, zgru, 'U', 0.0_wp, stdu)
1217         CALL grid_rd_sd( 287503, zgrv, 'V', 0.0_wp, stdv) 
1218         DO jk = 1, jpk
1219            DO jj = nldj, nlej
1220               DO ji = nldi, nlei
1221                  zrd_tlin(ji,jj,jk) = zrh(ji,jj,jk)
1222                  zua_tlin(ji,jj,jk)  = zau(ji,jj,jk)
1223                  zva_tlin(ji,jj,jk)  = zav(ji,jj,jk)
1224               END DO
1225            END DO
1226         END DO
1227
1228         DO jj = nldj, nlej
1229            DO ji = nldi, nlei
1230               zgru_tlin(ji,jj)   = zgru(ji,jj)
1231               zgrv_tlin(ji,jj)   = zgrv(ji,jj)
1232            END DO
1233         END DO
1234      ENDIF
1235      !--------------------------------------------------------------------
1236      ! Complete Init for Direct
1237      !-------------------------------------------------------------------
1238      IF ( tlm_bch /= 2 )      CALL istate_p 
1239
1240      ! *** initialize the reference trajectory
1241      ! ------------
1242      CALL  trj_rea( nit000-1, 1 )
1243      ua(:,:,:)       = un(:,:,:)
1244      va(:,:,:)       = vn(:,:,:) 
1245
1246      !  Compute rhd, gru and grv
1247      CALL eos(tn, sn, rhd, rhop)
1248      CALL zps_hde(nit000, tn, sn, rhd, gtu, gsu, gru, gtv, gsv, grv)
1249
1250
1251      IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN
1252
1253         zrd_tlin(:,:,:) = gamma * zrd_tlin(:,:,:)
1254         rhd(:,:,:)       = rhd(:,:,:) + zrd_tlin(:,:,:)
1255
1256         zua_tlin(:,:,:) = gamma * zua_tlin(:,:,:)
1257         ua(:,:,:)       = ua(:,:,:) + zua_tlin(:,:,:)
1258
1259         zva_tlin(:,:,:) = gamma * zva_tlin(:,:,:)
1260         va(:,:,:)       = va(:,:,:) + zva_tlin(:,:,:)
1261
1262         zgru_tlin(:,:) = gamma * zgru_tlin(:,:)
1263         gru(:,:)       = gru(:,:) + zgru_tlin(:,:)
1264
1265         zgrv_tlin(:,:) = gamma * zgrv_tlin(:,:)
1266         grv(:,:)       = grv(:,:) + zgrv_tlin(:,:)
1267      ENDIF 
1268      !--------------------------------------------------------------------
1269      !  Compute the direct model F(X0,t=n) = Xn
1270      !--------------------------------------------------------------------
1271      IF ( tlm_bch /= 2 ) CALL dyn_hpg(nit000)
1272      IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop)
1273      IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx)
1274      !--------------------------------------------------------------------
1275      !  Compute the Tangent
1276      !--------------------------------------------------------------------
1277      IF ( tlm_bch == 2 ) THEN
1278         !--------------------------------------------------------------------
1279         ! Initialize the tangent variables
1280         !--------------------------------------------------------------------
1281         CALL  trj_rea( nit000-1, 1 ) 
1282         ua(:,:,:)       = un(:,:,:)
1283         va(:,:,:)       = vn(:,:,:)
1284         gru_tl  (  :,:) = zgru_tlin (:,:  )
1285         grv_tl  (  :,:) = zgrv_tlin (:,:  )
1286         rhd_tl  (:,:,:) = zrd_tlin  (:,:,:)
1287         ua_tl   (:,:,:) = zua_tlin  (:,:,:)
1288         va_tl   (:,:,:) = zva_tlin  (:,:,:) 
1289         CALL dyn_hpg_tan(nit000)
1290         !--------------------------------------------------------------------
1291         ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) )
1292         !--------------------------------------------------------------------
1293         zsp2_1    = DOT_PRODUCT( ua_tl, ua_tl  )
1294         zsp2_2    = DOT_PRODUCT( va_tl, va_tl  )
1295         zsp2      = zsp2_1 + zsp2_2
1296         !--------------------------------------------------------------------
1297         !  Storing data
1298         !--------------------------------------------------------------------
1299         CALL trj_rd_spl(file_wop) 
1300         zua_wop  (:,:,:) = ua  (:,:,:)
1301         zva_wop  (:,:,:) = va  (:,:,:)
1302         CALL trj_rd_spl(file_xdx) 
1303         zua_out  (:,:,:) = ua  (:,:,:)
1304         zva_out  (:,:,:) = va  (:,:,:)
1305         !--------------------------------------------------------------------
1306         ! Compute the Linearization Error
1307         ! Nn = M( X0+gamma.dX0, t0,tn) - M(X0, t0,tn)
1308         ! and
1309         ! Compute the Linearization Error
1310         ! En = Nn -TL(gamma.dX0, t0,tn)
1311         !--------------------------------------------------------------------
1312         ! Warning: Here we re-use local variables z()_out and z()_wop
1313         ii=0
1314         DO jk = 1, jpk
1315            DO jj = 1, jpj
1316               DO ji = 1, jpi
1317                  zua_out   (ji,jj,jk) = zua_out    (ji,jj,jk) - zua_wop  (ji,jj,jk)
1318                  zua_wop   (ji,jj,jk) = zua_out    (ji,jj,jk) - ua_tl    (ji,jj,jk)
1319                  IF (  ua_tl(ji,jj,jk) .NE. 0.0_wp ) &
1320                     & zerrua(ji,jj,jk) = zua_out(ji,jj,jk)/ua_tl(ji,jj,jk)
1321                  IF( (MOD(ji, isamp) .EQ. 0) .AND. &
1322                  &   (MOD(jj, jsamp) .EQ. 0) .AND. &
1323                  &   (MOD(jk, ksamp) .EQ. 0)     ) THEN
1324                      ii = ii+1
1325                      iiposua(ii) = ji
1326                      ijposua(ii) = jj
1327                      ikposua(ii) = jk
1328                      IF ( INT(umask(ji,jj,jk)) .NE. 0)  THEN
1329                         zscua (ii) =  zua_wop(ji,jj,jk)
1330                         zscerrua (ii) =  ( zerrua(ji,jj,jk) - 1.0_wp ) /gamma
1331                      ENDIF
1332                  ENDIF
1333               END DO
1334            END DO
1335         END DO
1336         ii=0
1337         DO jk = 1, jpk
1338            DO jj = 1, jpj
1339               DO ji = 1, jpi
1340                  zva_out   (ji,jj,jk) = zva_out    (ji,jj,jk) - zva_wop  (ji,jj,jk)
1341                  zva_wop   (ji,jj,jk) = zva_out    (ji,jj,jk) - va_tl    (ji,jj,jk)
1342                  IF (  va_tl(ji,jj,jk) .NE. 0.0_wp ) &
1343                     & zerrva(ji,jj,jk) = zva_out(ji,jj,jk)/va_tl(ji,jj,jk)
1344                  IF( (MOD(ji, isamp) .EQ. 0) .AND. &
1345                  &   (MOD(jj, jsamp) .EQ. 0) .AND. &
1346                  &   (MOD(jk, ksamp) .EQ. 0)     ) THEN
1347                      ii = ii+1
1348                      iiposva(ii) = ji
1349                      ijposva(ii) = jj
1350                      ikposva(ii) = jk
1351                      IF ( INT(vmask(ji,jj,jk)) .NE. 0)  THEN
1352                         zscva (ii) =  zua_wop(ji,jj,jk)
1353                         zscerrva (ii) =  ( zerrva(ji,jj,jk) - 1.0_wp ) / gamma
1354                      ENDIF
1355                  ENDIF
1356               END DO
1357            END DO
1358         END DO
1359         zsp1_1    = DOT_PRODUCT( zua_out, zua_out )
1360         zsp1_2    = DOT_PRODUCT( zva_out, zva_out  )
1361         zsp1      = zsp1_1 + zsp1_2
1362
1363         zsp3_1    = DOT_PRODUCT( zua_wop, zua_wop )
1364         zsp3_2    = DOT_PRODUCT( zva_wop, zva_wop  )
1365         zsp3      = zsp3_1 + zsp3_2
1366         !--------------------------------------------------------------------
1367         ! Print the linearization error En - norme 2
1368         !--------------------------------------------------------------------
1369         ! 14 char:'12345678901234'
1370         cl_name  = 'dynhpg_tam:En '
1371         zzsp     = dsqrt(zsp3)
1372         zzsp_1   = dsqrt(zsp3_1)
1373         zzsp_2   = dsqrt(zsp3_2)
1374
1375         zgsp5 = zzsp
1376         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1377         !--------------------------------------------------------------------
1378         ! Compute TLM norm2
1379         !--------------------------------------------------------------------
1380         zzsp     = SQRT(zsp2)
1381         zzsp_1   = SQRT(zsp2_1)
1382         zzsp_2   = SQRT(zsp2_2)
1383         zgsp4    = zzsp
1384         cl_name  = 'dynhpg_tam:Ln2'
1385         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1386         !--------------------------------------------------------------------
1387         ! Print the linearization error Nn - norme 2
1388         !--------------------------------------------------------------------
1389         zzsp     = SQRT(zsp1)
1390         zzsp_1   = SQRT(zsp1_1)
1391         zzsp_2   = SQRT(zsp1_2)
1392         cl_name  = 'dynhpg:Mhdx-Mx'
1393         CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio )
1394         zgsp3    = SQRT( zsp3/zsp2 )
1395         zgsp7    = zgsp3/gamma
1396         zgsp1    = zzsp
1397         zgsp2    = zgsp1 / zgsp4
1398         zgsp6    = (zgsp2 - 1.0_wp)/gamma
1399
1400         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)"
1401         WRITE(numtan,FMT) 'dynhpg  ', cur_loop, h_ratio, zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, zgsp6, zgsp7
1402         !--------------------------------------------------------------------
1403         ! Unitary calculus
1404         !--------------------------------------------------------------------
1405         FMT = "(A8,2X,A8,2X,I4.4,2X,E6.1,2X,I4.4,2X,I4.4,2X,I4.4,2X,E20.13,1X)"
1406         cl_name = 'dynhpg  '
1407         IF (lwp) THEN
1408            DO ii=1, 100, 1
1409               IF ( zscua(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscua     ', &
1410                    & cur_loop, h_ratio, ii, iiposua(ii), ijposua(ii), zscua(ii)
1411            ENDDO
1412            DO ii=1, 100, 1
1413               IF ( zscva(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscva     ', &
1414                    & cur_loop, h_ratio, ii, iiposva(ii), ijposva(ii), zscva(ii)
1415            ENDDO
1416            DO ii=1, 100, 1
1417               IF ( zscerrua(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscerrua  ', &
1418                 & cur_loop, h_ratio, ii, iiposua(ii), ijposua(ii), zscerrua(ii)
1419            ENDDO
1420            DO ii=1, 100, 1
1421               IF ( zscerrva(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscerrva  ', &
1422                    & cur_loop, h_ratio, ii, iiposva(ii), ijposva(ii), zscerrva(ii)
1423            ENDDO
1424
1425           ! write separator
1426           WRITE(numtan_sc,"(A4)") '===='
1427         ENDIF
1428
1429      ENDIF
1430      DEALLOCATE(                           &
1431         & zrd_tlin, zgru_tlin, zgrv_tlin,  & 
1432         & zua_tlin, zva_tlin,              & 
1433         & ztn_tlin, zsn_tlin,              & 
1434         & zua_out, zva_out,                & 
1435         & zua_wop, zva_wop,                &
1436         & zrh,                             & 
1437         & zau,                             & 
1438         & zav,                             & 
1439         & zgru,                            &
1440         & zgrv                             &
1441         & )
1442   END SUBROUTINE dyn_hpg_tlm_tst
1443   !!======================================================================
1444#endif
1445#endif
1446END MODULE dynhpg_tam
Note: See TracBrowser for help on using the repository browser.