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

source: branches/2010_and_older/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/istate_tam.F90 @ 7797

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

first import of NEMOTAM 3.2.2

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