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.
sbcssm_tam.F90 in branches/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/SBC – NEMO

source: branches/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/SBC/sbcssm_tam.F90 @ 3277

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

first import of NEMOTAM 3.2.2

File size: 30.0 KB
Line 
1MODULE sbcssm_tam
2#ifdef key_tam
3   !!======================================================================
4   !!                       ***  MODULE  sbcssm_tam  ***
5   !! Surface module :  provide time-mean ocean surface variables
6   !!                   Tangent and adjoint module
7   !!======================================================================
8   !! History of the direct module:
9   !!            9.0   !  06-07  (G. Madec)  Original code
10   !! History of the TAM module:
11   !!            9.0   !  08-11  (A. Vidard) Original code
12   !!            9.0   !  10-04  (A. Vidard) Nemo3.2 update
13   !!----------------------------------------------------------------------
14
15   !!----------------------------------------------------------------------
16   !!   sbc_ssm_[tan adj]: calculate sea surface mean currents, temperature, 
17   !!                    and salinity over nn_fsbc time-step
18   !!----------------------------------------------------------------------
19   USE par_oce       , ONLY: & ! Ocean space and time domain variables
20      & jpi,                 &
21      & jpj,                 &
22      & jpiglo
23   USE par_kind      , ONLY: & ! Precision variables
24      & wp
25   USE oce_tam       , ONLY: & ! ocean dynamics and tracers
26      & ub_tl,               &
27      & vb_tl,               &
28      & tn_tl,               &
29      & sn_tl,               &
30      & sshn_tl,             &
31      & ub_ad,               &
32      & vb_ad,               &
33      & tn_ad,               &
34      & sn_ad,               &
35      & sshn_ad
36   USE dom_oce       , ONLY: & ! Ocean space and time domain
37      & e2u,                 &
38      & e1u,                 &
39      & e2v,                 &
40      & e1v,                 &
41      & e1t,                 &
42      & e2t,                 &
43# if defined key_vvl
44      & e3t_1,               &
45# else
46#  if defined key_zco
47      & e3t_0,               &
48#  else
49      & e3t,                 &
50#  endif
51# endif
52# if defined key_zco
53      & e3t_0,               &
54# else
55      & e3u,                 &
56      & e3v,                 &
57# endif
58      & tmask,               &
59      & umask,               &
60      & mig,                 &
61      & mjg,                 &
62      & nldi,                &
63      & nldj,                &
64      & nlei,                &
65      & nlej
66   USE sbc_oce       , ONLY: & !
67      & nn_fsbc                ! Surface boundary condition: frequency of sbc computation (as well as sea-ice model)
68   USE sbc_oce_tam   , ONLY: & ! Surface boundary condition: ocean fields
69      & ssu_m_tl,            & ! mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
70      & ssv_m_tl,            & ! mean (nn_fsbc time-step) surface sea j-current (U-point) [m/s]
71      & sst_m_tl,            & ! mean (nn_fsbc time-step) surface sea temperature     [Celsius]
72      & sss_m_tl,            & ! mean (nn_fsbc time-step) surface sea salinity            [psu]
73      & ssh_m_tl,            & ! mean (nn_fsbc time-step) surface sea height                [m]
74      & ssu_m_ad,            & ! mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
75      & ssv_m_ad,            & ! mean (nn_fsbc time-step) surface sea j-current (U-point) [m/s]
76      & sst_m_ad,            & ! mean (nn_fsbc time-step) surface sea temperature     [Celsius]
77      & sss_m_ad,            & ! mean (nn_fsbc time-step) surface sea salinity            [psu]
78      & ssh_m_ad
79   USE in_out_manager, ONLY: & ! I/O manager
80      & lwp,                 &
81      & numout,              & 
82      & nit000,              & 
83      & nitend,              & 
84      & ln_rstart
85   USE gridrandom    , ONLY: & ! Random Gaussian noise on grids
86      & grid_random
87   USE dotprodfld,     ONLY: & ! Computes dot product for 3D and 2D fields
88      & dot_product
89   USE paresp        , ONLY: & ! Weights for an energy-type scalar product
90      & wesp_t,              &
91      & wesp_s
92   USE tstool_tam    , ONLY: &
93      & stdu,                &
94      & stdv,                &
95      & stdt,                &
96      & stds,                &
97      & stdssh,              &
98      & prntst_adj
99
100   IMPLICIT NONE
101   PRIVATE
102
103   PUBLIC   sbc_ssm_tan     ! routine called by step_tam.F90
104   PUBLIC   sbc_ssm_adj     ! routine called by step_tam.F90
105   PUBLIC   sbc_ssm_adj_tst ! routine called by tst.F90
106   
107   !! * Substitutions
108#  include "domzgr_substitute.h90"
109   !!----------------------------------------------------------------------
110   !!   OPA 9.0 , LOCEAN-IPSL (2006)
111   !! $Id: sbcssm.F90 1196 2008-09-19 07:07:00Z ctlod $
112   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
113   !!----------------------------------------------------------------------
114
115CONTAINS
116
117   SUBROUTINE sbc_ssm_tan( kt )
118      !!---------------------------------------------------------------------
119      !!                     ***  ROUTINE sbc_ssm_tan  ***
120      !!                     
121      !! ** Purpose of the direct routine:
122      !!                provide ocean surface variable to sea-surface boundary
123      !!                condition computation
124      !!               
125      !! ** Method of the direct routine:
126      !!      compute mean surface velocity (2 components at U and
127      !!      V-points) [m/s], temperature [Celcius] and salinity [psu] over
128      !!      the periode (kt - nn_fsbc) to kt
129      !!---------------------------------------------------------------------
130      INTEGER, INTENT(in) ::   kt        ! ocean time step
131      !
132      REAL(wp) ::   zcoef       ! temporary scalar
133      REAL(wp) ::   zf_sbc      ! read sbc frequency
134      !!---------------------------------------------------------------------
135      !                                                   ! ---------------------------------------- !
136      IF( nn_fsbc == 1 ) THEN                             !      Instantaneous surface fields        !
137         !                                                ! ---------------------------------------- !
138         IF( kt == nit000 ) THEN
139            IF(lwp) WRITE(numout,*)
140            IF(lwp) WRITE(numout,*) 'sbc_ssm_tan: sea surface mean fields, nn_fsbc=1 : instantaneous values'
141            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
142         ENDIF
143         !
144         ssu_m_tl(:,:) = ub_tl(:,:,1)
145         ssv_m_tl(:,:) = vb_tl(:,:,1)
146         sst_m_tl(:,:) = tn_tl(:,:,1)
147         sss_m_tl(:,:) = sn_tl(:,:,1)
148         ssh_m_tl(:,:) = sshn_tl(:,:)
149         !
150      ELSE
151         !                                                ! ---------------------------------------- !
152         IF( kt == nit000) THEN                           !       Initialisation: 1st time-step      !
153            !                                             ! ---------------------------------------- !
154            IF(lwp) WRITE(numout,*)
155            IF(lwp) WRITE(numout,*) 'sbc_ssm_tan : sea surface mean fields'
156            !
157            IF( ln_rstart ) THEN
158                  ssu_m_tl(:,:) = 0.0_wp
159                  ssv_m_tl(:,:) = 0.0_wp
160                  sst_m_tl(:,:) = 0.0_wp
161                  sss_m_tl(:,:) = 0.0_wp
162                  ssh_m_tl(:,:) = 0.0_wp
163             ELSE
164               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields initialised to instantaneous values'
165               zcoef = REAL( nn_fsbc - 1, wp )
166               ssu_m_tl(:,:) = zcoef * ub_tl(:,:,1)
167               ssv_m_tl(:,:) = zcoef * vb_tl(:,:,1)
168               sst_m_tl(:,:) = zcoef * tn_tl(:,:,1)
169               sss_m_tl(:,:) = zcoef * sn_tl(:,:,1)
170               ssh_m_tl(:,:) = zcoef * sshn_tl(:,:)
171            ENDIF
172            !                                             ! ---------------------------------------- !
173         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   !
174            !                                             ! ---------------------------------------- !
175            ssu_m_tl(:,:) = 0.0_wp      ! reset to zero ocean mean sbc fields
176            ssv_m_tl(:,:) = 0.0_wp
177            sst_m_tl(:,:) = 0.0_wp
178            sss_m_tl(:,:) = 0.0_wp
179            ssh_m_tl(:,:) = 0.0_wp
180         ENDIF
181         !                                                ! ---------------------------------------- !
182         !                                                !        Cumulate at each time step        !
183         !                                                ! ---------------------------------------- !
184         ssu_m_tl(:,:) = ssu_m_tl(:,:) + ub_tl(:,:,1)
185         ssv_m_tl(:,:) = ssv_m_tl(:,:) + vb_tl(:,:,1)
186         sst_m_tl(:,:) = sst_m_tl(:,:) + tn_tl(:,:,1)
187         sss_m_tl(:,:) = sss_m_tl(:,:) + sn_tl(:,:,1)
188         ssh_m_tl(:,:) = ssh_m_tl(:,:) + sshn_tl(:,:)
189         !                                                ! ---------------------------------------- !
190         IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   !
191            !                                             ! ---------------------------------------- !
192            zcoef = 1. / REAL( nn_fsbc, wp )
193            sst_m_tl(:,:) = sst_m_tl(:,:) * zcoef           ! mean SST             [Celcius]
194            sss_m_tl(:,:) = sss_m_tl(:,:) * zcoef           ! mean SSS             [psu]
195            ssu_m_tl(:,:) = ssu_m_tl(:,:) * zcoef           ! mean suface current  [m/s]
196            ssv_m_tl(:,:) = ssv_m_tl(:,:) * zcoef           !
197            ssh_m_tl(:,:) = ssh_m_tl(:,:) * zcoef           !
198            !
199         ENDIF
200         !
201      ENDIF
202      !
203   END SUBROUTINE sbc_ssm_tan
204
205   SUBROUTINE sbc_ssm_adj( kt )
206      !!---------------------------------------------------------------------
207      !!                     ***  ROUTINE sbc_ssm_adj  ***
208      !!                     
209      !! ** Purpose of the direct routine:
210      !!                provide ocean surface variable to sea-surface boundary
211      !!                condition computation
212      !!               
213      !! ** Method of the direct routine:
214      !!      compute mean surface velocity (2 components at U and
215      !!      V-points) [m/s], temperature [Celcius] and salinity [psu] over
216      !!      the periode (kt - nn_fsbc) to kt
217      !!---------------------------------------------------------------------
218      INTEGER, INTENT(in) ::   kt        ! ocean time step
219      !
220      REAL(wp) ::   zcoef       ! temporary scalar
221      REAL(wp) ::   zf_sbc      ! read sbc frequency
222      !!---------------------------------------------------------------------
223      !                                                   ! ---------------------------------------- !
224      IF( nn_fsbc == 1 ) THEN                             !      Instantaneous surface fields        !
225         !                                                ! ---------------------------------------- !
226         IF( kt == nitend) THEN
227            IF(lwp) WRITE(numout,*)
228            IF(lwp) WRITE(numout,*) 'sbc_ssm_adj: sea surface mean fields, nn_fsbc=1 : instantaneous values'
229            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
230         ENDIF
231         !
232         ub_ad(:,:,1)  = ub_ad(:,:,1) + ssu_m_ad(:,:)
233         vb_ad(:,:,1)  = vb_ad(:,:,1) + ssv_m_ad(:,:)
234         tn_ad(:,:,1)  = tn_ad(:,:,1) + sst_m_ad(:,:)
235         sn_ad(:,:,1)  = sn_ad(:,:,1) + sss_m_ad(:,:)
236         sshn_ad(:,:)  = sshn_ad(:,:) + ssh_m_ad(:,:)
237         ssu_m_ad(:,:) = 0.0_wp
238         ssv_m_ad(:,:) = 0.0_wp
239         sst_m_ad(:,:) = 0.0_wp
240         sss_m_ad(:,:) = 0.0_wp
241         ssh_m_ad(:,:) = 0.0_wp
242         !
243      ELSE
244         !                                                ! ---------------------------------------- !
245         IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   !
246            !                                             ! ---------------------------------------- !
247            zcoef = 1. / REAL( nn_fsbc, wp )
248            sst_m_ad(:,:) = sst_m_ad(:,:) * zcoef           ! mean SST             [Celcius]
249            sss_m_ad(:,:) = sss_m_ad(:,:) * zcoef           ! mean SSS             [psu]
250            ssu_m_ad(:,:) = ssu_m_ad(:,:) * zcoef           ! mean suface current  [m/s]
251            ssv_m_ad(:,:) = ssv_m_ad(:,:) * zcoef           !
252            ssh_m_ad(:,:) = ssh_m_ad(:,:) * zcoef           !
253            !
254         ENDIF
255         !                                                ! ---------------------------------------- !
256         !                                                !        Cumulate at each time step        !
257         !                                                ! ---------------------------------------- !
258         ub_ad(:,:,1) = ssu_m_ad(:,:) + ub_ad(:,:,1)
259         vb_ad(:,:,1) = ssv_m_ad(:,:) + vb_ad(:,:,1)
260         tn_ad(:,:,1) = sst_m_ad(:,:) + tn_ad(:,:,1)
261         sn_ad(:,:,1) = sss_m_ad(:,:) + sn_ad(:,:,1)
262         sshn_ad(:,:) = ssh_m_ad(:,:) + sshn_ad(:,:) 
263         !                                                ! ---------------------------------------- !
264         IF( kt == nitend) THEN                           !       Initialisation: 1st time-step      !
265            !                                             ! ---------------------------------------- !
266            IF(lwp) WRITE(numout,*)
267            IF(lwp) WRITE(numout,*) 'sbc_ssm_adj : sea surface mean fields'
268            !
269         ENDIF
270         !                                                ! ---------------------------------------- !
271         IF( kt == nit000) THEN                           !       Initialisation: 1st time-step      !
272            !                                             ! ---------------------------------------- !
273
274            IF( ln_rstart ) THEN
275                  ssu_m_ad(:,:) = 0.0_wp
276                  ssv_m_ad(:,:) = 0.0_wp
277                  sst_m_ad(:,:) = 0.0_wp
278                  sss_m_ad(:,:) = 0.0_wp
279                  ssh_m_ad(:,:) = 0.0_wp
280             ELSE
281               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields initialised to instantaneous values'
282               zcoef = REAL( nn_fsbc - 1, wp )
283               ub_ad(:,:,1)  = ub_ad(:,:,1) + zcoef * ssu_m_ad(:,:)
284               vb_ad(:,:,1)  = vb_ad(:,:,1) + zcoef * ssv_m_ad(:,:)
285               tn_ad(:,:,1)  = tn_ad(:,:,1) + zcoef * sst_m_ad(:,:)
286               sn_ad(:,:,1)  = sn_ad(:,:,1) + zcoef * sss_m_ad(:,:)
287               sshn_ad(:,:)  = sshn_ad(:,:) + zcoef * ssh_m_ad(:,:) 
288               ssu_m_ad(:,:) = 0.0_wp
289               ssv_m_ad(:,:) = 0.0_wp
290               sst_m_ad(:,:) = 0.0_wp
291               sss_m_ad(:,:) = 0.0_wp
292               ssh_m_ad(:,:) = 0.0_wp
293            ENDIF
294            !                                             ! ---------------------------------------- !
295         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   !
296            !                                             ! ---------------------------------------- !
297            ssu_m_ad(:,:) = 0.0_wp      ! reset to zero ocean mean sbc fields
298            ssv_m_ad(:,:) = 0.0_wp
299            sst_m_ad(:,:) = 0.0_wp
300            sss_m_ad(:,:) = 0.0_wp
301            ssh_m_ad(:,:) = 0.0_wp
302         ENDIF
303
304         !
305      ENDIF
306      !
307   END SUBROUTINE sbc_ssm_adj
308
309   SUBROUTINE sbc_ssm_adj_tst( kumadt )
310      !!-----------------------------------------------------------------------
311      !!
312      !!                  ***  ROUTINE sbc_ssm_adj_tst ***
313      !!
314      !! ** Purpose : Test the adjoint routine.
315      !!
316      !! ** Method  : Verify the scalar product
317      !!           
318      !!                 ( L dx )^T W dy  =  dx^T L^T W dy
319      !!
320      !!              where  L   = tangent routine
321      !!                     L^T = adjoint routine
322      !!                     W   = diagonal matrix of scale factors
323      !!                     dx  = input perturbation (random field)
324      !!                     dy  = L dx
325      !!
326      !! ** Action
327      !!              dx = ( un_tl, vn_tl, tn_tl, sn_tl )
328      !!              dy = ( ssu_m_tl, ssv_m_tl, sst_m_tl, sss_m_tl )
329      !!
330      !! History :
331      !!        ! 08-08 (A. Vidard)
332      !!        ! 09-01 (A. Weaver) cleaning
333      !!-----------------------------------------------------------------------
334      !! * Modules used
335
336      !! * Arguments
337      INTEGER, INTENT(IN) :: &
338         & kumadt             ! Output unit
339 
340      INTEGER ::  &
341         & ji,    &        ! dummy loop indices
342         & jj
343      INTEGER, DIMENSION(jpi,jpj) :: &
344         & iseed_2d        ! 2D seed for the random number generator
345      REAL(KIND=wp) :: &
346         & zsp1,         & ! scalar product involving the tangent routine
347         & zsp2            ! scalar product involving the adjoint routine
348      REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: &
349         & zub_tlin   ,     & ! Tangent input
350         & zvb_tlin   ,     & ! Tangent input
351         & ztn_tlin   ,     & ! Tangent input
352         & zsn_tlin   ,     & ! Tangent input
353         & zsshn_tlin ,     & ! Adjoint output
354         & zssum_tlin ,     & ! Tangent input
355         & zssvm_tlin ,     & ! Tangent input
356         & zsstm_tlin ,     & ! Tangent input
357         & zsssm_tlin ,     & ! Tangent input
358         & zsshm_tlin ,     & ! Tangent input
359         & zssum_tlout,     & ! Tangent output
360         & zssvm_tlout,     & ! Tangent output
361         & zsstm_tlout,     & ! Tangent output
362         & zsssm_tlout,     & ! Tangent output
363         & zsshm_tlout,     & ! Tangent output
364         & zub_adout  ,     & ! Adjoint input
365         & zvb_adout  ,     & ! Adjoint input
366         & ztn_adout  ,     & ! Adjoint input
367         & zsn_adout  ,     & ! Adjoint input
368         & zsshn_adout,     & ! Adjoint output
369         & zssum_adout,     & ! Adjoint input
370         & zssvm_adout,     & ! Adjoint input
371         & zsstm_adout,     & ! Adjoint input
372         & zsssm_adout,     & ! Adjoint input
373         & zsshm_adout,     & ! Adjoint input
374         & zssum_adin ,     & ! Adjoint output
375         & zssvm_adin ,     & ! Adjoint output
376         & zsstm_adin ,     & ! Adjoint output
377         & zsssm_adin ,     & ! Adjoint output
378         & zsshm_adin ,     & ! Adjoint output
379         & zr                 ! 2D random field
380      CHARACTER(LEN=14) :: cl_name
381      ! Allocate memory
382
383      ALLOCATE(                      &
384         & zub_tlin   (jpi,jpj),     &
385         & zvb_tlin   (jpi,jpj),     &
386         & ztn_tlin   (jpi,jpj),     &
387         & zsn_tlin   (jpi,jpj),     &
388         & zsshn_tlin (jpi,jpj),     &
389         & zssum_tlin (jpi,jpj),     &
390         & zssvm_tlin (jpi,jpj),     &
391         & zsstm_tlin (jpi,jpj),     &
392         & zsssm_tlin (jpi,jpj),     &
393         & zsshm_tlin (jpi,jpj),     &
394         & zssum_tlout(jpi,jpj),     &
395         & zssvm_tlout(jpi,jpj),     &
396         & zsstm_tlout(jpi,jpj),     &
397         & zsssm_tlout(jpi,jpj),     &
398         & zsshm_tlout(jpi,jpj),     &
399         & zub_adout  (jpi,jpj),     &
400         & zvb_adout  (jpi,jpj),     &
401         & ztn_adout  (jpi,jpj),     &
402         & zsn_adout  (jpi,jpj),     &
403         & zsshn_adout(jpi,jpj),     &
404         & zssum_adout(jpi,jpj),     &
405         & zssvm_adout(jpi,jpj),     &
406         & zsstm_adout(jpi,jpj),     &
407         & zsssm_adout(jpi,jpj),     &
408         & zsshm_adout(jpi,jpj),     &
409         & zssum_adin (jpi,jpj),     &
410         & zssvm_adin (jpi,jpj),     &
411         & zsstm_adin (jpi,jpj),     &
412         & zsssm_adin (jpi,jpj),     &
413         & zsshm_adin (jpi,jpj),     &
414         & zr         (jpi,jpj)      &
415         & )
416      !==================================================================
417      ! 1) dx = ( un_tl, vn_tl, tn_tl, sn_tl ) and
418      !    dy = ( ssu_m_tl, ssv_m_tl, sst_m_tl, sss_m_tl )
419      !==================================================================
420
421      !--------------------------------------------------------------------
422      ! Reset the tangent and adjoint variables
423      !--------------------------------------------------------------------
424      zub_tlin   (:,:) = 0.0_wp     
425      zvb_tlin   (:,:) = 0.0_wp     
426      ztn_tlin   (:,:) = 0.0_wp     
427      zsn_tlin   (:,:) = 0.0_wp     
428      zssum_tlin (:,:) = 0.0_wp     
429      zssvm_tlin (:,:) = 0.0_wp     
430      zsstm_tlin (:,:) = 0.0_wp     
431      zsssm_tlin (:,:) = 0.0_wp     
432      zsshm_tlin (:,:) = 0.0_wp     
433      zssum_tlout(:,:) = 0.0_wp     
434      zssvm_tlout(:,:) = 0.0_wp     
435      zsstm_tlout(:,:) = 0.0_wp     
436      zsssm_tlout(:,:) = 0.0_wp     
437      zsshm_tlout(:,:) = 0.0_wp     
438      zub_adout  (:,:) = 0.0_wp     
439      zvb_adout  (:,:) = 0.0_wp     
440      ztn_adout  (:,:) = 0.0_wp     
441      zsn_adout  (:,:) = 0.0_wp     
442      zsshn_adout(:,:) = 0.0_wp     
443      zssum_adout(:,:) = 0.0_wp     
444      zssvm_adout(:,:) = 0.0_wp     
445      zsstm_adout(:,:) = 0.0_wp     
446      zsssm_adout(:,:) = 0.0_wp     
447      zsshm_adout(:,:) = 0.0_wp     
448      zssum_adin (:,:) = 0.0_wp     
449      zssvm_adin (:,:) = 0.0_wp     
450      zsstm_adin (:,:) = 0.0_wp     
451      zsssm_adin (:,:) = 0.0_wp     
452      zsshm_adin (:,:) = 0.0_wp     
453      zr         (:,:) = 0.0_wp     
454
455      !--------------------------------------------------------------------
456      ! Initialize the tangent input with random noise: dx
457      !--------------------------------------------------------------------
458
459      DO jj = 1, jpj
460         DO ji = 1, jpi
461            iseed_2d(ji,jj) = - ( 596035 + &
462               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
463         END DO
464      END DO
465      CALL grid_random( iseed_2d, zr, 'U', 0.0_wp, stdu )
466      DO jj = nldj, nlej
467         DO ji = nldi, nlei
468            zub_tlin(ji,jj) = zr(ji,jj) 
469         END DO
470      END DO
471
472      DO jj = 1, jpj
473         DO ji = 1, jpi
474            iseed_2d(ji,jj) = - ( 234789 + &
475               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
476         END DO
477      END DO
478      CALL grid_random( iseed_2d, zr, 'V', 0.0_wp, stdv ) 
479      DO jj = nldj, nlej
480         DO ji = nldi, nlei
481            zvb_tlin(ji,jj) = zr(ji,jj) 
482         END DO
483      END DO
484
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, zr, 'T', 0.0_wp, stds )
492      DO jj = nldj, nlej
493         DO ji = nldi, nlei
494            zsn_tlin(ji,jj) = zr(ji,jj) 
495         END DO
496      END DO 
497
498      DO jj = 1, jpj
499         DO ji = 1, jpi
500            iseed_2d(ji,jj) = - ( 153859 + &
501               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
502         END DO
503      END DO
504      CALL grid_random( iseed_2d, zr, 'T', 0.0_wp, stdt )
505      DO jj = nldj, nlej
506         DO ji = nldi, nlei
507            ztn_tlin(ji,jj) = zr(ji,jj) 
508         END DO
509      END DO
510      DO jj = 1, jpj
511         DO ji = 1, jpi
512            iseed_2d(ji,jj) = - ( 237570 + &
513               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
514         END DO
515      END DO
516      CALL grid_random( iseed_2d, zr, 'T', 0.0_wp, stdssh ) 
517      DO jj = nldj, nlej
518         DO ji = nldi, nlei
519            zsshn_tlin(ji,jj) = zr(ji,jj) 
520         END DO
521      END DO
522
523      DO jj = 1, jpj
524         DO ji = 1, jpi
525            iseed_2d(ji,jj) = - ( 572840 + &
526               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
527         END DO
528      END DO
529      CALL grid_random( iseed_2d, zr, 'U', 0.0_wp, stdu )
530      DO jj = nldj, nlej
531         DO ji = nldi, nlei
532            zssum_tlin(ji,jj) = zr(ji,jj) 
533         END DO
534      END DO
535      DO jj = 1, jpj
536         DO ji = 1, jpi
537            iseed_2d(ji,jj) = - ( 225179 + &
538               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
539         END DO
540      END DO
541      CALL grid_random( iseed_2d, zr, 'V', 0.0_wp, stdv )
542      DO jj = nldj, nlej
543         DO ji = nldi, nlei
544            zssvm_tlin(ji,jj) = zr(ji,jj) 
545         END DO
546      END DO
547      DO jj = 1, jpj
548         DO ji = 1, jpi
549            iseed_2d(ji,jj) = - ( 264801 + &
550               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
551         END DO
552      END DO
553      CALL grid_random( iseed_2d, zr, 'T', 0.0_wp, stdt ) 
554      DO jj = nldj, nlej
555         DO ji = nldi, nlei
556            zsstm_tlin(ji,jj) = zr(ji,jj) 
557         END DO
558      END DO
559
560      DO jj = 1, jpj
561         DO ji = 1, jpi
562            iseed_2d(ji,jj) = - ( 142859 + &
563               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
564         END DO
565      END DO
566      CALL grid_random( iseed_2d, zr, 'T', 0.0_wp, stds ) 
567      DO jj = nldj, nlej
568         DO ji = nldi, nlei
569            zsssm_tlin(ji,jj) = zr(ji,jj) 
570         END DO
571      END DO
572      DO jj = 1, jpj
573         DO ji = 1, jpi
574            iseed_2d(ji,jj) = - ( 644869 + &
575               &                  mig(ji) + ( mjg(jj) - 1 ) * jpiglo )
576         END DO
577      END DO
578      CALL grid_random( iseed_2d, zr, 'T', 0.0_wp, stdssh ) 
579      DO jj = nldj, nlej
580         DO ji = nldi, nlei
581            zsshm_tlin(ji,jj) = zr(ji,jj) 
582         END DO
583      END DO
584
585      ub_tl (:,:,1) = zub_tlin  (:,:) 
586      vb_tl (:,:,1) = zvb_tlin  (:,:) 
587      tn_tl (:,:,1) = ztn_tlin  (:,:) 
588      sn_tl (:,:,1) = zsn_tlin  (:,:) 
589      sshn_tl (:,:) = zsshn_tlin(:,:) 
590      ssu_m_tl(:,:) = zssum_tlin(:,:) 
591      ssv_m_tl(:,:) = zssvm_tlin(:,:) 
592      sst_m_tl(:,:) = zsstm_tlin(:,:) 
593      sss_m_tl(:,:) = zsssm_tlin(:,:)
594      ssh_m_tl(:,:) = zsshm_tlin(:,:)
595     
596      CALL sbc_ssm_tan( nit000 + 1 )
597
598      zssum_tlout (:,:) = ssu_m_tl(:,:)
599      zssvm_tlout (:,:) = ssv_m_tl(:,:)
600      zsstm_tlout (:,:) = sst_m_tl(:,:)
601      zsssm_tlout (:,:) = sss_m_tl(:,:)
602      zsshm_tlout (:,:) = ssh_m_tl(:,:)
603
604      !--------------------------------------------------------------------
605      ! Initialize the adjoint variables: dy^* = W dy
606      !--------------------------------------------------------------------
607
608      DO jj = nldj, nlej
609         DO ji = nldi, nlei
610            zssum_adin(ji,jj) = zssum_tlout(ji,jj) &
611               &               * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) &
612               &               * umask(ji,jj,1)
613            zssvm_adin(ji,jj) = zssvm_tlout(ji,jj) &
614               &               * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) &
615               &               * umask(ji,jj,1)
616            zsstm_adin(ji,jj) = zsstm_tlout(ji,jj) &
617               &               * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) &
618               &               * tmask(ji,jj,1) * wesp_t(1)
619            zsssm_adin(ji,jj) = zsssm_tlout(ji,jj) &
620               &               * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) &
621               &               * tmask(ji,jj,1) * wesp_s(1)
622            zsshm_adin(ji,jj) = zsshm_tlout(ji,jj) &
623               &               * e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) &
624               &               * tmask(ji,jj,1) * wesp_s(1)
625         END DO
626      END DO
627
628      !--------------------------------------------------------------------
629      ! Compute the scalar product: ( L dx )^T W dy
630      !--------------------------------------------------------------------
631
632      zsp1 = DOT_PRODUCT( zssum_tlout, zssum_adin ) &
633         & + DOT_PRODUCT( zssvm_tlout, zssvm_adin ) &
634         & + DOT_PRODUCT( zsstm_tlout, zsstm_adin ) &
635         & + DOT_PRODUCT( zsssm_tlout, zsssm_adin ) &
636         & + DOT_PRODUCT( zsshm_tlout, zsshm_adin )
637 
638      !--------------------------------------------------------------------
639      ! Call the adjoint routine: dx^* = L^T dy^*
640      !--------------------------------------------------------------------
641
642      ssu_m_ad(:,:) = zssum_adin(:,:) 
643      ssv_m_ad(:,:) = zssvm_adin(:,:) 
644      sst_m_ad(:,:) = zsstm_adin(:,:) 
645      sss_m_ad(:,:) = zsssm_adin(:,:)
646      ssh_m_ad(:,:) = zsshm_adin(:,:)
647      ub_ad(:,:,1)  = 0.0_wp     
648      vb_ad(:,:,1)  = 0.0_wp     
649      tn_ad(:,:,1)  = 0.0_wp     
650      sn_ad(:,:,1)  = 0.0_wp     
651      sshn_ad(:,:)  = 0.0_wp     
652
653      CALL sbc_ssm_adj( nit000 + 1 )
654
655      zub_adout  (:,:) = ub_ad(:,:,1) 
656      zvb_adout  (:,:) = vb_ad(:,:,1) 
657      ztn_adout  (:,:) = tn_ad(:,:,1) 
658      zsn_adout  (:,:) = sn_ad(:,:,1) 
659      zsshn_adout(:,:) = sshn_ad(:,:)
660      zssum_adout(:,:) = ssu_m_ad(:,:) 
661      zssvm_adout(:,:) = ssv_m_ad(:,:)
662      zsstm_adout(:,:) = sst_m_ad(:,:)
663      zsssm_adout(:,:) = sss_m_ad(:,:)
664      zsshm_adout(:,:) = ssh_m_ad(:,:)
665
666      !--------------------------------------------------------------------
667      ! Compute the scalar product: dx^T dx^*
668      !--------------------------------------------------------------------
669
670      zsp2 = DOT_PRODUCT( zub_tlin  , zub_adout   ) &
671         & + DOT_PRODUCT( zvb_tlin  , zvb_adout   ) &
672         & + DOT_PRODUCT( ztn_tlin  , ztn_adout   ) &
673         & + DOT_PRODUCT( zsn_tlin  , zsn_adout   ) &
674         & + DOT_PRODUCT( zsshn_tlin, zsshn_adout ) &
675         & + DOT_PRODUCT( zssum_tlin, zssum_adout ) &
676         & + DOT_PRODUCT( zssvm_tlin, zssvm_adout ) &
677         & + DOT_PRODUCT( zsstm_tlin, zsstm_adout ) &
678         & + DOT_PRODUCT( zsssm_tlin, zsssm_adout ) &
679         & + DOT_PRODUCT( zsshm_tlin, zsshm_adout )
680
681      ! 14 char:'12345678901234'
682      cl_name = 'sbc_ssm_adj   '
683      CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 )
684
685      DEALLOCATE(           &
686         & zub_tlin   ,     & ! Tangent input
687         & zvb_tlin   ,     & ! Tangent input
688         & ztn_tlin   ,     & ! Tangent input
689         & zsn_tlin   ,     & ! Tangent input
690         & zssum_tlin ,     & ! Tangent input
691         & zssvm_tlin ,     & ! Tangent input
692         & zsstm_tlin ,     & ! Tangent input
693         & zsssm_tlin ,     & ! Tangent input
694         & zsshm_tlin ,     & ! Tangent input
695         & zssum_tlout,     & ! Tangent output
696         & zssvm_tlout,     & ! Tangent output
697         & zsstm_tlout,     & ! Tangent output
698         & zsssm_tlout,     & ! Tangent output
699         & zsshm_tlout,     & ! Tangent output
700         & zub_adout  ,     & ! Adjoint input
701         & zvb_adout  ,     & ! Adjoint input
702         & ztn_adout  ,     & ! Adjoint input
703         & zsn_adout  ,     & ! Adjoint input
704         & zssum_adout,     & ! Adjoint input
705         & zssvm_adout,     & ! Adjoint input
706         & zsstm_adout,     & ! Adjoint input
707         & zsssm_adout,     & ! Adjoint input
708         & zsshm_adout,     & ! Adjoint input
709         & zssum_adin ,     & ! Adjoint output
710         & zssvm_adin ,     & ! Adjoint output
711         & zsstm_adin ,     & ! Adjoint output
712         & zsssm_adin ,     & ! Adjoint output
713         & zsshm_adin ,     & ! Adjoint output
714         & zr               &
715         & )
716
717   END SUBROUTINE sbc_ssm_adj_tst
718#endif
719   !!======================================================================
720END MODULE sbcssm_tam
Note: See TracBrowser for help on using the repository browser.