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.
istate_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/istate_tam.F90 @ 1885

Last change on this file since 1885 was 1885, checked in by rblod, 14 years ago

add TAM sources

File size: 28.5 KB
Line 
1MODULE istate_tam
2#ifdef key_tam
3   !!======================================================================
4   !!                     ***  MODULE  istate_tam  ***
5   !! Ocean state   :  initial state setting
6   !!                  Tangent and Adjoint Module
7   !!=====================================================================
8   !! History of the direct module:
9   !!             4.0  !  89-12  (P. Andrich)  Original code
10   !!             5.0  !  91-11  (G. Madec)  rewritting
11   !!             6.0  !  96-01  (G. Madec)  terrain following coordinates
12   !!             8.0  !  01-09  (M. Levy, M. Ben Jelloul)  istate_eel
13   !!             8.0  !  01-09  (M. Levy, M. Ben Jelloul)  istate_uvg
14   !!             9.0  !  03-08  (G. Madec)  F90: Free form, modules
15   !!             9.0  !  03-09  (G. Madec, C. Talandier)  add EEL R5
16   !!             9.0  !  04-05  (A. Koch-Larrouy)  istate_gyre
17   !!             9.0  !  06-07  (S. Masson)  distributed restart using iom
18   !! History of the T&A module:
19   !!             9.0  !  09-04  (F. Vigilant) TAM of the 06-07 version
20   !!----------------------------------------------------------------------
21
22   !!----------------------------------------------------------------------
23   !!   istate_init_tan : initial state setting for the tangent model
24   !!----------------------------------------------------------------------
25   USE par_kind      , ONLY: & ! Precision variables
26      & wp
27  USE par_oce        , ONLY: & ! Ocean space and time domain variables
28      & jpi, jpj, jpk, jpiglo
29   USE oce_tam ! ocean dynamics and active tracers
30   USE oce           , ONLY: & ! ocean dynamics and active tracers
31      & tb, sb
32   USE dom_oce       , ONLY: & ! ocean space and time domain
33      & neuler, ln_zps, mig, &
34      & mjg , nldi, nldj,    &
35      & nlei, nlej, lk_vvl,  &
36      & e1t, e2t, e1u, e2u,  &
37      & e1v, e2v,            &
38# if defined key_vvl
39      & e3t_1,               &
40# else
41#  if defined key_zco
42      & e3t_0, e3w_0,        &
43#  else
44      & e3u, e3v, e3t, e3w,  &
45#  endif
46# endif
47      & tmask, umask, vmask
48   USE daymod        , ONLY: &
49      & day_init
50   USE c1d           , ONLY: &
51      & lk_c1d
52   USE restart       , ONLY: & ! ocean restart
53      & numror             
54   USE in_out_manager, ONLY: & ! I/O manager
55      & numout, lwp, nit000
56   USE wzvmod_tam    , ONLY: & ! verctical velocity               (wzv     routine)
57      & wzv_tan, wzv_adj
58   USE zpshde_tam    , ONLY: & ! partial step: hor. derivative (zps_hde routine)
59      & zps_hde_tan,         &
60      & zps_hde_adj
61   USE eosbn2_tam    , ONLY: &
62      & eos_tan, eos_adj
63   USE tstool_tam    , ONLY: &
64      & prntst_adj,          &
65      & stds  , stdt, stdr,  &
66      & stdssh, stdu, stdv
67   USE gridrandom    , ONLY: & ! Random Gaussian noise on grids
68      & grid_random
69   USE dotprodfld,     ONLY: & ! Computes dot product for 3D and 2D fields
70      & dot_product
71   USE paresp        , ONLY: & ! Normalized energy weights           
72      & wesp_ssh
73
74   IMPLICIT NONE
75   PRIVATE
76
77   PUBLIC   istate_init_tan       ! routine called by step.F90
78   PUBLIC   istate_init_adj       ! routine called by step.F90
79   PUBLIC   istate_init_adj_tst   ! routine called by tst.F90
80   
81   !! * Substitutions
82#  include "domzgr_substitute.h90"
83#  include "vectopt_loop_substitute.h90"
84   !!----------------------------------------------------------------------
85   !!   OPA 9.0 , LOCEAN-IPSL (2006)
86   !! $Id: istate.F90 1200 2008-09-24 13:05:20Z rblod $
87   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
88   !!----------------------------------------------------------------------
89
90CONTAINS
91
92   SUBROUTINE istate_init_tan
93      !!----------------------------------------------------------------------
94      !!                   ***  ROUTINE istate_init Tangent ***
95      !!
96      !! ** Purpose :   Initialization of the dynamics and tracer fields.
97      !!----------------------------------------------------------------------
98      USE eosbn2_tam          ! eq. of state, Brunt Vaisala frequency (eos     routine)
99
100      IF(lwp) WRITE(numout,*)
101      IF(lwp) WRITE(numout,*) 'istate_ini_tan : Initialization of the dynamics and tracers'
102      IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
103
104      rhd_tl  (:,:,:) = 0.e0
105      rhop_tl (:,:,:) = 0.e0
106      rn2_tl  (:,:,:) = 0.e0 
107
108      !                                    ! Start from rest
109      !                                    ! ---------------
110      numror = 0                              ! define numror = 0 -> no restart file to read
111      neuler = 0                              ! Set time-step indicator at nit000 (euler forward)
112      CALL day_init                           ! model calendar (using both namelist and restart infos)
113      !                                       ! Initialization of ocean to zero
114
115      !     before fields       !       now fields         
116      ub_tl   (:,:,:) = un_tl   (:,:,:)   
117      vb_tl   (:,:,:) = vn_tl   (:,:,:)   
118      tb_tl   (:,:,:) = tn_tl   (:,:,:)
119      sb_tl   (:,:,:) = sn_tl   (:,:,:)
120      sshb_tl (  :,:) = sshn_tl (  :,:)
121      rotb_tl (:,:,:) = rotn_tl (:,:,:) 
122      hdivb_tl(:,:,:) = hdivn_tl(:,:,:) 
123      !
124
125
126      CALL eos_tan( tb, sb, tb_tl, sb_tl, rhd_tl, rhop_tl )        ! before potential and in situ densities
127         
128      IF( ln_zps .AND. .NOT. lk_c1d )   &
129            &             CALL zps_hde_tan( nit000, tb, sb, tb_tl, sb_tl, rhd_tl,  &  ! Partial steps: before Horizontal DErivative
130            &                                  gtu_tl, gsu_tl, gru_tl,             &  ! of t, s, rd at the bottom ocean level
131            &                                  gtv_tl, gsv_tl, grv_tl )
132         
133
134
135
136      !                                       ! Vertical velocity
137      !                                       ! -----------------
138
139      IF( .NOT. lk_vvl )    CALL wzv_tan( nit000 )                         ! from horizontal divergence
140      !
141   END SUBROUTINE istate_init_tan
142
143   SUBROUTINE istate_init_adj
144      !!----------------------------------------------------------------------
145      !!                   ***  ROUTINE istate_init  Adjoint Module ***
146      !!
147      !! ** Purpose :   Initialization of the dynamics and tracer fields.
148      !!----------------------------------------------------------------------
149      !! * Modules used
150      USE eosbn2_tam          ! eq. of state, Brunt Vaisala frequency (eos     routine)
151
152      !! * Local declarations
153      INTEGER ::             &
154         & ji,               &  ! dummy loop indices
155         & jj,               &       
156         & jk
157
158      IF(lwp) WRITE(numout,*)
159      IF(lwp) WRITE(numout,*) 'istate_ini_adj : Initialization of the dynamics and tracers'
160      IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
161
162
163      !                                       ! Vertical velocity
164      !                                       ! -----------------
165
166      IF( .NOT. lk_vvl )    CALL wzv_adj( nit000 )                         ! from horizontal divergence
167
168      IF( ln_zps .AND. .NOT. lk_c1d )   &
169            &             CALL zps_hde_adj( nit000, tb, sb, tb_ad, sb_ad, rhd_ad,  &  ! Partial steps: before Horizontal DErivative
170            &                                  gtu_ad, gsu_ad, gru_ad,             &  ! of t, s, rd at the bottom ocean level
171            &                                  gtv_ad, gsv_ad, grv_ad )
172         
173
174      CALL eos_adj( tb, sb, tb_ad, sb_ad, rhd_ad, rhop_ad )        ! before potential and in situ densities
175
176      !     before fields       !       now fields         
177      DO jk = 1, jpk
178         DO jj = 1, jpj
179            DO ji = 1, jpi         
180               un_ad   (ji, jj, jk) = un_ad(ji, jj, jk) + ub_ad (ji, jj, jk)
181               ub_ad   (ji, jj, jk) = 0.0_wp
182            END DO
183         END DO   
184      END DO
185      DO jk = 1, jpk
186         DO jj = 1, jpj
187            DO ji = 1, jpi         
188               vn_ad   (ji, jj, jk) = vn_ad(ji, jj, jk) + vb_ad (ji, jj, jk)
189               vb_ad   (ji, jj, jk) = 0.0_wp
190            END DO
191         END DO   
192      END DO
193      DO jk = 1, jpk
194         DO jj = 1, jpj
195            DO ji = 1, jpi         
196               tn_ad   (ji, jj, jk) = tn_ad(ji, jj, jk) + tb_ad (ji, jj, jk)
197               tb_ad   (ji, jj, jk) = 0.0_wp
198            END DO
199         END DO   
200      END DO
201      DO jk = 1, jpk
202         DO jj = 1, jpj
203            DO ji = 1, jpi         
204               sn_ad   (ji, jj, jk) = sn_ad(ji, jj, jk) + sb_ad (ji, jj, jk)
205               sb_ad   (ji, jj, jk) = 0.0_wp
206            END DO
207         END DO   
208      END DO
209      DO jj = 1, jpj
210         DO ji = 1, jpi         
211             sshn_ad   (ji, jj    ) = sshn_ad(ji, jj  ) + sshb_ad (ji, jj  )
212             sshb_ad   (ji, jj    ) = 0.0_wp
213         END DO   
214      END DO
215      DO jk = 1, jpk
216         DO jj = 1, jpj
217            DO ji = 1, jpi         
218               rotn_ad (ji, jj, jk) = rotn_ad(ji, jj, jk) + rotb_ad (ji, jj, jk)
219               rotb_ad (ji, jj, jk) = 0.0_wp
220            END DO
221         END DO   
222      END DO
223      DO jk = 1, jpk
224         DO jj = 1, jpj
225            DO ji = 1, jpi         
226               hdivn_ad(ji, jj, jk) = hdivn_ad(ji, jj, jk) + hdivb_ad (ji, jj, jk)
227               hdivb_ad(ji, jj, jk) = 0.0_wp
228            END DO
229         END DO   
230      END DO
231      !
232
233
234      rhd_ad  (:,:,:) = 0.0_wp
235      rhop_ad (:,:,:) = 0.0_wp
236      rn2_ad  (:,:,:) = 0.0_wp 
237
238      !
239   END SUBROUTINE istate_init_adj
240
241   SUBROUTINE istate_init_adj_tst( kumadt )
242      !!-----------------------------------------------------------------------
243      !!
244      !!                  ***  ROUTINE istate_init_adj_tst ***
245      !!
246      !! ** Purpose : Test the adjoint routine.
247      !!
248      !! ** Method  : Verify the scalar product
249      !!           
250      !!                 ( L dx )^T W dy  =  dx^T L^T W dy
251      !!
252      !!              where  L   = tangent routine
253      !!                     L^T = adjoint routine
254      !!                     W   = diagonal matrix of scale factors
255      !!                     dx  = input perturbation (random field)
256      !!                     dy  = L dx
257      !!
258      !!                   
259      !! History :
260      !!        ! 09-05 (F. Vigilant)
261      !!-----------------------------------------------------------------------
262      !! * Modules used
263
264      !! * Arguments
265      INTEGER, INTENT(IN) :: &
266         & kumadt             ! Output unit
267
268      INTEGER ::         &
269         & ji,           &        ! dummy loop indices
270         & jj,           &       
271         & jk,           & 
272         & kt
273      INTEGER, DIMENSION(jpi,jpj) :: &
274         & iseed_2d        ! 2D seed for the random number generator
275
276      !! * Local declarations
277      REAL(KIND=wp), DIMENSION(:,:,:), ALLOCATABLE :: &
278         & ztn_tlin,     & ! Tangent input: temperature
279         & zsn_tlin,     & ! Tangent input: salinity
280         & zun_tlin,     & ! Tangent input: velocity
281         & zvn_tlin,     & ! Tangent input: velocity
282         & zrd_tlin,     & ! Tangent input:
283         & ztn_adout,    & ! Adjoint output: temperature
284         & zsn_adout,    & ! Adjoint output: salinity
285         & zun_adout,    & ! Adjoint input: velocity
286         & zvn_adout,    & ! Adjoint input: velocity
287         & ztb_tlout,    & ! Tangent output: temperature
288         & zsb_tlout,    & ! Tangent output: salinity
289         & zub_tlout,    & ! Tangent output: velocity
290         & zvb_tlout,    & ! Tangent output: velocity
291         & zrd_tlout,    & ! Tangent output:
292         & zrhop_tlout,  & ! Tangent output:
293         & zrd_adin,     & ! Adjoint input:
294         & zrhop_adin,   & ! Adjoint input:
295         & ztb_adin,     & ! Adjoint input: temperature
296         & zsb_adin,     & ! Adjoint input: salinity
297         & zub_adin,     & ! Adjoint input: velocity
298         & zvb_adin,     & ! Adjoint input: velocity
299         & zrd_adout,    & ! Adjoint output:
300         & z3r             ! 3D random field
301
302      REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: &
303         & zsshn_tlin,   & ! Tangent input : horizontal gradient
304         & zsshb_tlout,  & ! Tangent ouput : horizontal gradient
305         & zgtu_tlout,   & ! Tangent output: horizontal gradient
306         & zgtv_tlout,   & ! Tangent output: horizontal gradient
307         & zgsu_tlout,   & ! Tangent output: horizontal gradient
308         & zgsv_tlout,   & ! Tangent output: horizontal gradient
309         & zgru_tlout,   & ! Tangent output: horizontal gradient
310         & zgrv_tlout,   & ! Tangent output: horizontal gradient
311         & zgtu_adin,    & ! Adjoint input : horizontal gradient
312         & zgtv_adin,    & ! Adjoint input : horizontal gradient
313         & zgsu_adin,    & ! Adjoint input : horizontal gradient
314         & zgsv_adin,    & ! Adjoint input : horizontal gradient
315         & zgru_adin,    & ! Adjoint input : horizontal gradient
316         & zgrv_adin,    & ! Adjoint input : horizontal gradient
317         & zsshb_adin,   & ! Adjoint input : horizontal gradient
318         & zsshn_adout,  & ! Adjoint output : horizontal gradient
319         & z2r             ! 3D random field
320
321      REAL(KIND=wp) ::   &
322                           ! random field standard deviation for:
323         & zsp1,         & ! scalar product involving the tangent routine
324         & zsp1_1,       & !   scalar product components
325         & zsp1_2,       & 
326         & zsp1_3,       & !   scalar product components
327         & zsp1_4,       & 
328         & zsp1_5,       & !   scalar product components
329         & zsp1_6,       & 
330         & zsp1_7,       & !   scalar product components
331         & zsp1_8,       &
332         & zsp1_9,       &
333         & zsp1_10,      &
334         & zsp1_11,      &
335         & zsp1_12,      &
336         & zsp1_13,      &
337         & zsp2,         & ! scalar product involving the adjoint routine
338         & zsp2_1,       & !   scalar product components
339         & zsp2_2,       & 
340         & zsp2_3,       &
341         & zsp2_4,       &
342         & zsp2_5,       &
343         & zsp2_6
344
345      CHARACTER (LEN=14) :: &
346         & cl_name
347
348      ! Allocate memory
349      ALLOCATE( &
350         & ztn_tlin(jpi,jpj,jpk),     & 
351         & zsn_tlin(jpi,jpj,jpk),     & 
352         & zun_tlin(jpi,jpj,jpk),     & 
353         & zvn_tlin(jpi,jpj,jpk),     &
354         & zrd_tlin(jpi,jpj,jpk),     &
355         & zsshn_tlin(jpi,jpj),       & 
356         & ztn_adout(jpi,jpj,jpk),    & 
357         & zsn_adout(jpi,jpj,jpk),    &
358         & zun_adout(jpi,jpj,jpk),    & 
359         & zvn_adout(jpi,jpj,jpk),    &
360         & zrd_adout(jpi,jpj,jpk),    &
361         & zsshn_adout(jpi, jpj),     & 
362         & z3r(jpi,jpj,jpk),          & 
363         & z2r(jpi,jpj),              &       
364         & zub_tlout(jpi,jpj,jpk),    & 
365         & zvb_tlout(jpi,jpj,jpk),    &
366         & zsb_tlout(jpi,jpj,jpk),    & 
367         & ztb_tlout(jpi,jpj,jpk),    &
368         & zsshb_tlout(jpi,jpj),      &
369         & zgtu_tlout(jpi,jpj),       & 
370         & zgtv_tlout(jpi,jpj),       & 
371         & zgsu_tlout(jpi,jpj),       & 
372         & zgsv_tlout(jpi,jpj),       & 
373         & zgru_tlout(jpi,jpj),       & 
374         & zgrv_tlout(jpi,jpj),       &
375         & zrd_tlout(jpi,jpj,jpk),    & 
376         & zrhop_tlout(jpi,jpj,jpk),  &
377         & zub_adin(jpi,jpj,jpk),     & 
378         & zvb_adin(jpi,jpj,jpk),     &
379         & zsb_adin(jpi,jpj,jpk),     & 
380         & ztb_adin(jpi,jpj,jpk),     &
381         & zsshb_adin(jpi,jpj),       &
382         & zgtu_adin(jpi,jpj),        & 
383         & zgtv_adin(jpi,jpj),        & 
384         & zgsu_adin(jpi,jpj),        & 
385         & zgsv_adin(jpi,jpj),        & 
386         & zgru_adin(jpi,jpj),        & 
387         & zgrv_adin(jpi,jpj),        &
388         & zrd_adin(jpi,jpj,jpk),     &
389         & zrhop_adin(jpi,jpj,jpk)    &
390         & ) 
391
392
393      !=============================================================
394      ! 1) dx = ( T ) and dy = ( T )
395      !=============================================================
396
397      !--------------------------------------------------------------------
398      ! Reset the tangent and adjoint variables
399      !--------------------------------------------------------------------
400      ztn_tlin   (:,:,:)  = 0.0_wp     
401      zsn_tlin   (:,:,:)  = 0.0_wp     
402      zrd_tlin   (:,:,:)  = 0.0_wp     
403      ztn_adout  (:,:,:)  = 0.0_wp   
404      zsn_adout  (:,:,:)  = 0.0_wp   
405      zrd_adout  (:,:,:)  = 0.0_wp   
406      zgtu_tlout (:,:  )  = 0.0_wp   
407      zgtv_tlout (:,:  )  = 0.0_wp   
408      zgsu_tlout (:,:  )  = 0.0_wp   
409      zgsv_tlout (:,:  )  = 0.0_wp   
410      zgru_tlout (:,:  )  = 0.0_wp   
411      zgrv_tlout (:,:  )  = 0.0_wp
412      zrd_tlout  (:,:,:) = 0.0_wp
413      zrhop_tlout(:,:,:) = 0.0_wp   
414      zgtu_adin  (:,:  ) = 0.0_wp     
415      zgtv_adin  (:,:  ) = 0.0_wp     
416      zgsu_adin  (:,:  ) = 0.0_wp     
417      zgsv_adin  (:,:  ) = 0.0_wp     
418      zgru_adin  (:,:  ) = 0.0_wp     
419      zgrv_adin  (:,:  ) = 0.0_wp
420      zrd_adin   (:,:,:) = 0.0_wp
421      zrhop_adin (:,:,:) = 0.0_wp
422
423      tn_tl      (:,:,:) = 0.0_wp
424      sn_tl      (:,:,:) = 0.0_wp
425      un_tl      (:,:,:) = 0.0_wp
426      vn_tl      (:,:,:) = 0.0_wp
427      sshn_tl    (:,:  ) = 0.0_wp
428      tb_tl      (:,:,:) = 0.0_wp
429      sb_tl      (:,:,:) = 0.0_wp
430      ub_tl      (:,:,:) = 0.0_wp
431      vb_tl      (:,:,:) = 0.0_wp
432      sshb_tl    (:,:  ) = 0.0_wp
433      rhd_tl     (:,:,:) = 0.0_wp
434      rhop_tl    (:,:,:) = 0.0_wp
435      gtu_tl     (:,:  ) = 0.0_wp
436      gsu_tl     (:,:  ) = 0.0_wp
437      gru_tl     (:,:  ) = 0.0_wp
438      gtv_tl     (:,:  ) = 0.0_wp
439      gsv_tl     (:,:  ) = 0.0_wp
440      grv_tl     (:,:  ) = 0.0_wp
441      tb_ad      (:,:,:) = 0.0_wp
442      sb_ad      (:,:,:) = 0.0_wp
443      ub_ad      (:,:,:) = 0.0_wp
444      vb_ad      (:,:,:) = 0.0_wp
445      sshb_ad    (:,:  ) = 0.0_wp
446      tn_ad      (:,:,:) = 0.0_wp
447      sn_ad      (:,:,:) = 0.0_wp
448      un_ad      (:,:,:) = 0.0_wp
449      vn_ad      (:,:,:) = 0.0_wp
450      sshn_ad    (:,:  ) = 0.0_wp
451      gtu_ad     (:,:  ) = 0.0_wp
452      gsu_ad     (:,:  ) = 0.0_wp
453      gtv_ad     (:,:  ) = 0.0_wp
454      gsv_ad     (:,:  ) = 0.0_wp
455
456      ! Warning, following variables used by istate
457      hdivn_tl           = 0.0_wp
458      hdivb_tl           = 0.0_wp
459      rotn_tl            = 0.0_wp
460      rotb_tl            = 0.0_wp
461      hdivn_ad           = 0.0_wp
462      hdivb_ad           = 0.0_wp
463      rotn_ad            = 0.0_wp
464      rotb_ad            = 0.0_wp
465
466      DO jj = 1, jpj
467         DO ji = 1, jpi
468            iseed_2d(ji,jj) = - ( 284035 + &
469               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
470         END DO
471      END DO
472      CALL grid_random( iseed_2d, z3r, 'T', 0.0_wp, stdt )
473      DO jk = 1, jpk
474         DO jj = nldj, nlej
475            DO ji = nldi, nlei
476               ztn_tlin(ji,jj,jk) = z3r(ji,jj,jk) 
477            END DO
478         END DO
479      END DO
480      DO jj = 1, jpj
481         DO ji = 1, jpi
482            iseed_2d(ji,jj) = - (  471426 + &
483               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
484         END DO
485      END DO
486      CALL grid_random( iseed_2d, z3r, 'T', 0.0_wp, stds )
487      DO jk = 1, jpk
488         DO jj = nldj, nlej
489            DO ji = nldi, nlei
490               zsn_tlin(ji,jj,jk) = z3r(ji,jj,jk) 
491            END DO
492         END DO
493      END DO
494      DO jj = 1, jpj
495         DO ji = 1, jpi
496            iseed_2d(ji,jj) = - ( 395703 + &
497               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
498         END DO
499      END DO
500      CALL grid_random( iseed_2d, z3r, 'T', 0.0_wp, stdr )
501      DO jk = 1, jpk
502         DO jj = nldj, nlej
503            DO ji = nldi, nlei
504               zrd_tlin(ji,jj,jk) = z3r(ji,jj,jk) 
505            END DO
506         END DO
507      END DO
508      DO jj = 1, jpj
509         DO ji = 1, jpi
510            iseed_2d(ji,jj) = - ( 12672456 + &
511               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
512         END DO
513      END DO
514      CALL grid_random( iseed_2d, z2r, 'T', 0.0_wp, stdssh )
515      DO jj = nldj, nlej
516         DO ji = nldi, nlei
517            zsshn_tlin(ji,jj) = z2r(ji,jj) 
518         END DO
519      END DO
520      DO jj = 1, jpj
521         DO ji = 1, jpi
522            iseed_2d(ji,jj) = - ( 456953 + &
523              &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
524         END DO
525      END DO
526      CALL grid_random( iseed_2d, z3r, 'U', 0.0_wp, stdu )
527      DO jk = 1, jpk
528         DO jj = nldj, nlej
529            DO ji = nldi, nlei
530               zun_tlin(ji,jj,jk) = z3r(ji,jj,jk) 
531            END DO
532         END DO
533      END DO
534      DO jj = 1, jpj
535         DO ji = 1, jpi
536            iseed_2d(ji,jj) = - ( 3434334 + &
537              &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
538         END DO
539      END DO
540      CALL grid_random( iseed_2d, z3r, 'V', 0.0_wp, stdv )
541      DO jk = 1, jpk
542         DO jj = nldj, nlej
543            DO ji = nldi, nlei
544               zvn_tlin(ji,jj,jk) = z3r(ji,jj,jk) 
545            END DO
546         END DO
547      END DO
548
549      tn_tl  (:,:,:) = ztn_tlin  (:,:,:)
550      sn_tl  (:,:,:) = zsn_tlin  (:,:,:)
551      rhd_tl (:,:,:) = zrd_tlin  (:,:,:)
552      sshn_tl(:,:  ) = zsshn_tlin(:,:  )
553      un_tl  (:,:,:) = zun_tlin  (:,:,:)
554      vn_tl  (:,:,:) = zvn_tlin  (:,:,:)
555
556     !--------------------------------------------------------------------
557     ! Call the tangent routine: dy = L dx
558     !--------------------------------------------------------------------
559
560     CALL istate_init_tan
561
562     zrd_tlout   (:,:,:) = rhd_tl  (:,:,:)
563     zrhop_tlout (:,:,:) = rhop_tl (:,:,:)
564     zgtu_tlout  (:,:  ) = gtu_tl  (:,:  )
565     zgtv_tlout  (:,:  ) = gtv_tl  (:,:  )
566     zgru_tlout  (:,:  ) = gru_tl  (:,:  )
567     zgrv_tlout  (:,:  ) = grv_tl  (:,:  )
568     zgsu_tlout  (:,:  ) = gsu_tl  (:,:  )
569     zgsv_tlout  (:,:  ) = gsv_tl  (:,:  )
570     zsshb_tlout (:,:  ) = sshb_tl (:,:  )
571     ztb_tlout   (:,:,:) = tb_tl   (:,:,:)
572     zsb_tlout   (:,:,:) = sb_tl   (:,:,:)
573     zub_tlout   (:,:,:) = ub_tl   (:,:,:)
574     zvb_tlout   (:,:,:) = vb_tl   (:,:,:)
575     zsshb_tlout (:,:  ) = sshb_tl (:,:  )
576
577     !--------------------------------------------------------------------
578     ! Initialize the adjoint variables: dy^* = W dy
579     !--------------------------------------------------------------------
580
581     DO jk = 1, jpk
582        DO jj = nldj, nlej
583           DO ji = nldi, nlei
584              zrd_adin(ji,jj,jk)   = zrd_tlout(ji,jj,jk) &
585                 &                 * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)&
586                 &                 * tmask(ji,jj,jk)
587              zrhop_adin(ji,jj,jk) = zrhop_tlout(ji,jj,jk) &
588                 &                 * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)&
589                 &                 * tmask(ji,jj,jk)
590           END DO
591        END DO
592     END DO
593     DO jj = nldj, nlej
594        DO ji = nldi, nlei
595           zgtu_adin(ji,jj) = zgtu_tlout(ji,jj) &
596              &             * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) &
597              &             * umask(ji,jj,1)
598           zgsu_adin(ji,jj) = zgsu_tlout(ji,jj) &
599              &             * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) &
600              &             * umask(ji,jj,1)
601           zgru_adin(ji,jj) = zgru_tlout(ji,jj) &
602              &             * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) &
603              &             * umask(ji,jj,1)
604           zgtv_adin(ji,jj) = zgtv_tlout(ji,jj) &
605              &             * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,1) &
606              &             * vmask(ji,jj,1)
607           zgsv_adin(ji,jj) = zgsv_tlout(ji,jj) &
608              &             * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,1) &
609              &             * vmask(ji,jj,1)
610           zgrv_adin(ji,jj) = zgrv_tlout(ji,jj) &
611              &             * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,1) &
612              &             * vmask(ji,jj,1)
613        END DO
614     END DO
615     DO jk = 1, jpk
616        DO jj = nldj, nlej
617           DO ji = nldi, nlei
618              ztb_adin(ji,jj,jk)   = ztb_tlout(ji,jj,jk) &
619                 &                 * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)&
620                 &                 * tmask(ji,jj,jk)
621           END DO
622        END DO
623     END DO
624     DO jk = 1, jpk
625        DO jj = nldj, nlej
626           DO ji = nldi, nlei
627              zub_adin(ji,jj,jk)   = zub_tlout(ji,jj,jk) &
628                 &                 * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk)&
629                 &                 * umask(ji,jj,jk)
630           END DO
631        END DO
632     END DO
633     DO jk = 1, jpk
634        DO jj = nldj, nlej
635           DO ji = nldi, nlei
636              zvb_adin(ji,jj,jk)   = zvb_tlout(ji,jj,jk) &
637                 &                 * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk)&
638                 &                 * vmask(ji,jj,jk)
639           END DO
640        END DO
641     END DO
642     DO jj = nldj, nlej
643        DO ji = nldi, nlei
644           zsshb_adin(ji,jj)      = zsshb_tlout(ji,jj) &
645              &                 * e1t(ji,jj) * e2t(ji,jj) * wesp_ssh &
646              &                 * tmask(ji,jj,1)
647        END DO
648     END DO
649
650      !--------------------------------------------------------------------
651      ! Compute the scalar product: ( L dx )^T W dy
652      !--------------------------------------------------------------------
653
654      zsp1_1    = DOT_PRODUCT( zrd_tlout    , zrd_adin    )
655      zsp1_2    = DOT_PRODUCT( zrhop_tlout  , zrhop_adin  )
656      zsp1_3    = DOT_PRODUCT( zgtu_tlout   , zgtu_adin   )
657      zsp1_4    = DOT_PRODUCT( zgru_tlout   , zgru_adin   )
658      zsp1_5    = DOT_PRODUCT( zgsu_tlout   , zgsu_adin   )
659      zsp1_6    = DOT_PRODUCT( zgtv_tlout   , zgtv_adin   )
660      zsp1_7    = DOT_PRODUCT( zgrv_tlout   , zgrv_adin   )
661      zsp1_8    = DOT_PRODUCT( zgsv_tlout   , zgsv_adin   )
662      zsp1_9    = DOT_PRODUCT( zub_tlout    , zub_adin    )
663      zsp1_10   = DOT_PRODUCT( zvb_tlout    , zvb_adin    )
664      zsp1_11   = DOT_PRODUCT( ztb_tlout    , ztb_adin    )
665      zsp1_12   = DOT_PRODUCT( zsb_tlout    , zsb_adin    )
666      zsp1_13   = DOT_PRODUCT( zsshb_tlout  , zsshb_adin  )
667
668      zsp1      = zsp1_1 + zsp1_2  + zsp1_3  + zsp1_4  + &
669                & zsp1_5 + zsp1_6  + zsp1_7  + zsp1_8  + &
670                & zsp1_9 + zsp1_10 + zsp1_11 + zsp1_12 + zsp1_13 
671
672      !--------------------------------------------------------------------
673      ! Call the adjoint routine: dx^* = L^T dy^*
674      !--------------------------------------------------------------------
675
676      rhd_ad  (:,:,:) = zrd_adin   (:,:,:)
677      rhop_ad (:,:,:) = zrhop_adin (:,:,:)
678      gtu_ad  (:,:  ) = zgtu_adin  (:,:  )
679      gtv_ad  (:,:  ) = zgtv_adin  (:,:  )
680      gru_ad  (:,:  ) = zgru_adin  (:,:  )
681      grv_ad  (:,:  ) = zgrv_adin  (:,:  )
682      gsu_ad  (:,:  ) = zgsu_adin  (:,:  )
683      gsv_ad  (:,:  ) = zgsv_adin  (:,:  )
684      ub_ad   (:,:,:) = zub_adin   (:,:,:)
685      vb_ad   (:,:,:) = zvb_adin   (:,:,:)
686      tb_ad   (:,:,:) = ztb_adin   (:,:,:)
687      sb_ad   (:,:,:) = zsb_adin   (:,:,:)
688      sshb_ad (:,:  ) = zsshb_adin (:,:  ) 
689     
690      CALL istate_init_adj
691
692      ztn_adout  (:,:,:) = tn_ad   (:,:,:)
693      zsn_adout  (:,:,:) = sn_ad   (:,:,:)
694      zrd_adout  (:,:,:) = rhd_ad  (:,:,:)
695      zun_adout  (:,:,:) = un_ad   (:,:,:)
696      zvn_adout  (:,:,:) = vn_ad   (:,:,:)
697      zsshn_adout(:,:  ) = sshn_ad (:,:  )
698
699      !--------------------------------------------------------------------
700      ! Compute the scalar product: dx^T L^T W dy
701      !--------------------------------------------------------------------
702       
703      zsp2_1    = DOT_PRODUCT( ztn_tlin  , ztn_adout    )
704      zsp2_2    = DOT_PRODUCT( zsn_tlin  , zsn_adout    )
705      zsp2_3    = DOT_PRODUCT( zrd_tlin  , zrd_adout    )
706      zsp2_4    = DOT_PRODUCT( zun_tlin  , zun_adout    )
707      zsp2_5    = DOT_PRODUCT( zvn_tlin  , zvn_adout    )
708      zsp2_6    = DOT_PRODUCT( zsshn_tlin, zsshn_adout  )
709
710      zsp2      = zsp2_1 + zsp2_2 + zsp2_3 + zsp2_4 + zsp2_5 + zsp2_6
711
712      ! Compare the scalar products
713
714      ! 14 char:'12345678901234'
715      cl_name = 'istate_tst    '
716      CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 )
717
718      ! Deallocate memory
719      DEALLOCATE(        &
720         & ztn_tlin,     & 
721         & zsn_tlin,     & 
722         & zrd_tlin,     & 
723         & ztn_adout,    & 
724         & zsn_adout,    &
725         & zrd_adout,    & 
726         & z3r,          & 
727         & z2r,          &
728         & zub_tlout,    & 
729         & zvb_tlout,    &
730         & zsb_tlout,    & 
731         & ztb_tlout,    &
732         & zsshb_tlout,  &       
733         & zgtu_tlout,   & 
734         & zgtv_tlout,   & 
735         & zgsu_tlout,   & 
736         & zgsv_tlout,   & 
737         & zgru_tlout,   & 
738         & zgrv_tlout,   &
739         & zrd_tlout,    & 
740         & zrhop_tlout,  &
741         & zub_adin,     & 
742         & zvb_adin,     &
743         & zsb_adin,     & 
744         & ztb_adin,     &
745         & zsshb_adin,   &
746         & zgtu_adin,    & 
747         & zgtv_adin,    & 
748         & zgsu_adin,    & 
749         & zgsv_adin,    & 
750         & zgru_adin,    & 
751         & zgrv_adin,    &
752         & zrd_adin,     &
753         & zrhop_adin    &
754         & )
755
756   END SUBROUTINE istate_init_adj_tst
757
758   !!=====================================================================
759#endif
760END MODULE istate_tam
Note: See TracBrowser for help on using the repository browser.