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 @ 3400

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

refer to ticket #798

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