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.
trcsub.F90 in branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/TOP_SRC – NEMO

source: branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/TOP_SRC/trcsub.F90 @ 4617

Last change on this file since 4617 was 4617, checked in by gm, 10 years ago

#1260 : TOP fixes, see the associated wiki page for explanation

File size: 37.7 KB
Line 
1MODULE trcsub
2   !!======================================================================
3   !!                       ***  MODULE trcsubstp  ***
4   !!TOP :   Averages physics variables for TOP substepping.
5   !!======================================================================
6   !! History :  1.0  !  2011-10  (K. Edwards)  Original
7   !!----------------------------------------------------------------------
8#if defined key_top
9   !!----------------------------------------------------------------------
10   !!   trc_sub    : passive tracer system sub-stepping
11   !!----------------------------------------------------------------------
12   USE oce_trc          ! ocean dynamics and active tracers variables
13   USE trc
14   USE prtctl_trc       ! Print control for debbuging
15   USE iom
16   USE in_out_manager
17   USE lbclnk
18#if defined key_zdftke
19   USE zdftke          ! twice TKE (en)
20#endif
21#if defined key_zdfgls
22   USE zdfgls, ONLY: en
23#endif
24   USE trabbl
25   USE zdf_oce
26   USE domvvl
27   USE divhor          ! hor. divergence
28   USE sbcrnf, ONLY: h_rnf, nk_rnf   ! River runoff
29   USE bdy_oce
30#if defined key_agrif
31   USE agrif_opa_update
32   USE agrif_opa_interp
33#endif
34
35   IMPLICIT NONE
36
37   PUBLIC   trc_sub_stp      ! called by trc_stp
38   PUBLIC   trc_sub_ini      ! called by trc_ini to initialize substepping arrays.
39   PUBLIC   trc_sub_reset    ! called by trc_stp to reset physics variables
40   PUBLIC   trc_sub_ssh      ! called by trc_stp to reset physics variables
41
42   REAL(wp)  :: r1_ndttrc     !    1 /  nn_dttrc
43   REAL(wp)  :: r1_ndttrcp1   !    1 / (nn_dttrc+1)
44
45   !!* Substitution
46#  include "top_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/TOP 3.7 , NEMO Consortium (2014)
49   !! $Id: trcstp.F90 2528 2010-12-27 17:33:53Z rblod $
50   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52CONTAINS
53
54   SUBROUTINE trc_sub_stp( kt )
55      !!-------------------------------------------------------------------
56      !!                     ***  ROUTINE trc_stp  ***
57      !!                     
58      !! ** Purpose : Average variables needed for sub-stepping passive tracers
59      !!
60      !! ** Method  : Called every timestep to increment _tm (time mean) variables
61      !!              on TOP steps, calculate averages.
62      !!-------------------------------------------------------------------
63      INTEGER, INTENT( in ) ::  kt        ! ocean time-step index
64      INTEGER               ::  ji,jj,jk  ! dummy loop indices
65      REAL(wp)              ::  z1_ne3t, z1_ne3u, z1_ne3v, z1_ne3w
66      !!-------------------------------------------------------------------
67      !
68      IF( nn_timing == 1 )  CALL timing_start('trc_sub_stp')
69      !
70      IF( kt == nit000 ) THEN
71           IF(lwp) WRITE(numout,*)
72           IF(lwp) WRITE(numout,*) 'trc_sub_stp : substepping of the passive tracers'
73           IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
74           !
75           sshb_hold  (:,:) = sshn  (:,:)
76!!Z~       sshu_b_hold(:,:) = sshu_n(:,:)
77!!Z~       sshv_b_hold(:,:) = sshv_n(:,:)
78           emp_b_hold (:,:) = emp_b (:,:)
79           !
80           r1_ndttrc        = 1._wp / REAL( nn_dttrc    , wp ) 
81           r1_ndttrcp1      = 1._wp / REAL( nn_dttrc + 1, wp )
82           !
83      ENDIF 
84
85       IF( MOD( kt , nn_dttrc ) /= 0 ) THEN
86          !
87          un_tm   (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * fse3u(:,:,:) 
88          vn_tm   (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * fse3v(:,:,:) 
89          tsn_tm  (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
90          tsn_tm  (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
91          rhop_tm (:,:,:)        = rhop_tm (:,:,:)        + rhop (:,:,:)        * fse3t(:,:,:) 
92          avt_tm  (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:) 
93# if defined key_zdfddm
94          avs_tm  (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:) 
95# endif
96#if defined key_ldfslp
97          wslpi_tm(:,:,:)        = wslpi_tm(:,:,:)        + wslpi(:,:,:) 
98          wslpj_tm(:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:)
99          uslp_tm (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:) 
100          vslp_tm (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:)
101#endif
102# if defined key_trabbl
103          IF( nn_bbl_ldf == 1 ) THEN
104             ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:) 
105             ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:) 
106          ENDIF
107          IF( nn_bbl_adv == 1 ) THEN
108             utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:) 
109             vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:) 
110          ENDIF
111# endif
112          !
113          sshn_tm  (:,:)         = sshn_tm  (:,:)         + sshn  (:,:) 
114!!Z~      sshu_n_tm(:,:)         = sshu_n_tm(:,:)         + sshu_n(:,:)
115!!Z~      sshv_n_tm(:,:)         = sshv_n_tm(:,:)         + sshv_n(:,:)
116          rnf_tm   (:,:)         = rnf_tm   (:,:)         + rnf   (:,:) 
117          h_rnf_tm (:,:)         = h_rnf_tm (:,:)         + h_rnf (:,:) 
118          hmld_tm  (:,:)         = hmld_tm  (:,:)         + hmld  (:,:)
119          fr_i_tm  (:,:)         = fr_i_tm  (:,:)         + fr_i  (:,:)
120          emp_tm   (:,:)         = emp_tm   (:,:)         + emp   (:,:) 
121          fmmflx_tm(:,:)         = fmmflx_tm(:,:)         + fmmflx(:,:)
122          qsr_tm   (:,:)         = qsr_tm   (:,:)         + qsr   (:,:)
123          wndm_tm  (:,:)         = wndm_tm  (:,:)         + wndm  (:,:)
124          !
125          ahtu_tm  (:,:,:)       = ahtu_tm  (:,:,:)       + ahtu(:,:,:)
126          ahtv_tm  (:,:,:)       = ahtv_tm  (:,:,:)       + ahtv(:,:,:)
127          IF( ln_ldfeiv ) THEN
128            aeiu_tm  (:,:,:)     = aeiu_tm  (:,:,:)       + aeiu(:,:,:)
129            aeiv_tm  (:,:,:)     = aeiv_tm  (:,:,:)       + aeiv(:,:,:)
130          ENDIF
131
132      ELSE                           !  It is time to substep
133         !   1. set temporary arrays to hold physics variables
134         un_temp    (:,:,:)      = un    (:,:,:)
135         vn_temp    (:,:,:)      = vn    (:,:,:)
136         wn_temp    (:,:,:)      = wn    (:,:,:)
137         tsn_temp   (:,:,:,:)    = tsn   (:,:,:,:)
138         rhop_temp  (:,:,:)      = rhop  (:,:,:)   
139         avt_temp   (:,:,:)      = avt   (:,:,:)
140# if defined key_zdfddm
141         avs_temp   (:,:,:)      = avs   (:,:,:)
142# endif
143         IF( l_ldfslp ) THEN
144            uslp_temp  (:,:,:)      = uslp  (:,:,:)
145            vslp_temp  (:,:,:)      = vslp  (:,:,:)
146            wslpi_temp (:,:,:)      = wslpi (:,:,:)
147            wslpj_temp (:,:,:)      = wslpj (:,:,:)
148         ENDIF
149# if defined key_trabbl
150          IF( nn_bbl_ldf == 1 ) THEN
151             ahu_bbl_temp(:,:)   = ahu_bbl(:,:) 
152             ahv_bbl_temp(:,:)   = ahv_bbl(:,:) 
153          ENDIF
154          IF( nn_bbl_adv == 1 ) THEN
155             utr_bbl_temp(:,:)   = utr_bbl(:,:) 
156             vtr_bbl_temp(:,:)   = vtr_bbl(:,:) 
157          ENDIF
158# endif
159         sshn_temp  (:,:)        = sshn  (:,:)
160!!Z~     sshu_n_temp(:,:)        = sshu_n(:,:)
161!!Z~     sshv_n_temp(:,:)        = sshv_n(:,:)
162!!Z~     sshf_n_temp(:,:)        = sshf_n(:,:)
163         sshb_temp  (:,:)        = sshb  (:,:)
164!!Z~     sshu_b_temp(:,:)        = sshu_b(:,:)
165!!Z~     sshv_b_temp(:,:)        = sshv_b(:,:)
166         ssha_temp  (:,:)        = ssha  (:,:)
167!!Z~     sshu_a_temp(:,:)        = sshu_a(:,:)
168!!Z~     sshv_a_temp(:,:)        = sshv_a(:,:)
169         rnf_temp   (:,:)        = rnf   (:,:)
170         h_rnf_temp (:,:)        = h_rnf (:,:)
171         hmld_temp  (:,:)        = hmld  (:,:)
172         fr_i_temp  (:,:)        = fr_i  (:,:)
173         emp_temp   (:,:)        = emp   (:,:)
174         emp_b_temp (:,:)        = emp_b (:,:)
175         fmmflx_temp(:,:)        = fmmflx(:,:)
176         qsr_temp   (:,:)        = qsr   (:,:)
177         wndm_temp  (:,:)        = wndm  (:,:)
178         !
179         ahtu_temp  (:,:,:)      = ahtu  (:,:,:)
180         ahtv_temp  (:,:,:)      = ahtv  (:,:,:)
181         IF( ln_ldfeiv ) THEN
182            aeiu_temp  (:,:,:)   = aeiu(:,:,:)
183            aeiv_temp  (:,:,:)   = aeiv(:,:,:)
184         ENDIF
185         !                                    !  Variables reset in trc_sub_ssh
186         hdivn_temp (:,:,:)      = hdivn (:,:,:)
187         hu_temp    (:,:)        = hu    (:,:)
188         hv_temp    (:,:)        = hv    (:,:)
189         hur_temp   (:,:)        = hur   (:,:)
190         hvr_temp   (:,:)        = hvr   (:,:)
191         !
192         DO jk = 1, jpk
193            e3t_temp(:,:,jk)     = fse3t(:,:,jk)
194            e3u_temp(:,:,jk)     = fse3u(:,:,jk)
195            e3v_temp(:,:,jk)     = fse3v(:,:,jk)
196            e3w_temp(:,:,jk)     = fse3w(:,:,jk)
197         ENDDO
198         IF( lk_vvl ) THEN                      !  Update Now Vertical coord.  !   (only in vvl case)
199           !                                    !------------------------------!
200           DO jk = 1, jpk
201              fse3t (:,:,jk)     = fse3t_n (:,:,jk)   ! vertical scale factors stored in fse3. arrays
202              fse3u (:,:,jk)     = fse3u_n (:,:,jk)
203              fse3v (:,:,jk)     = fse3v_n (:,:,jk)
204              fse3w (:,:,jk)     = fse3w_n (:,:,jk)
205           END DO
206         ENDIF
207
208         ! 2. Create averages and reassign variables
209         un_tm    (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * e3u_temp(:,:,:) 
210         vn_tm    (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * e3v_temp(:,:,:) 
211         tsn_tm   (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * e3t_temp(:,:,:) 
212         tsn_tm   (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * e3t_temp(:,:,:) 
213         rhop_tm (:,:,:)         = rhop_tm (:,:,:)        + rhop (:,:,:)        * e3t_temp(:,:,:) 
214         avt_tm   (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:) 
215# if defined key_zdfddm
216         avs_tm   (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:) 
217# endif
218         IF( l_ldfslp ) THEN
219            wslpi_tm (:,:,:)        = wslpi_tm(:,:,:)        + wslpi(:,:,:)
220            wslpj_tm (:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:)
221            uslp_tm  (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:)
222            vslp_tm  (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:) 
223         ENDIF
224# if defined key_trabbl
225          IF( nn_bbl_ldf == 1 ) THEN
226             ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:) 
227             ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:) 
228          ENDIF
229          IF( nn_bbl_adv == 1 ) THEN
230             utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:) 
231             vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:) 
232          ENDIF
233# endif
234         sshn_tm  (:,:)          = sshn_tm    (:,:)       + sshn  (:,:) 
235!!Z~     sshu_n_tm(:,:)          = sshu_n_tm  (:,:)       + sshu_n(:,:)
236!!Z~     sshv_n_tm(:,:)          = sshv_n_tm  (:,:)       + sshv_n(:,:)
237         rnf_tm   (:,:)          = rnf_tm     (:,:)       + rnf   (:,:) 
238         h_rnf_tm (:,:)          = h_rnf_tm   (:,:)       + h_rnf (:,:) 
239         hmld_tm  (:,:)          = hmld_tm    (:,:)       + hmld  (:,:)
240         fr_i_tm  (:,:)          = fr_i_tm    (:,:)       + fr_i  (:,:)
241         emp_tm   (:,:)          = emp_tm     (:,:)       + emp   (:,:) 
242         fmmflx_tm(:,:)          = fmmflx_tm  (:,:)       + fmmflx(:,:)
243         qsr_tm   (:,:)          = qsr_tm     (:,:)       + qsr   (:,:)
244         wndm_tm  (:,:)          = wndm_tm    (:,:)       + wndm  (:,:)
245         !
246         sshn     (:,:)          = sshn_tm    (:,:) * r1_ndttrcp1 
247!!Z~     sshu_n   (:,:)          = sshu_n_tm  (:,:) * r1_ndttrcp1 
248!!Z~     sshv_n   (:,:)          = sshv_n_tm  (:,:) * r1_ndttrcp1 
249         sshb     (:,:)          = sshb_hold  (:,:)
250!!Z~     sshu_b   (:,:)          = sshu_b_hold(:,:)
251!!Z~     sshv_b   (:,:)          = sshv_b_hold(:,:)
252         rnf      (:,:)          = rnf_tm     (:,:) * r1_ndttrcp1 
253         h_rnf    (:,:)          = h_rnf_tm   (:,:) * r1_ndttrcp1 
254         hmld     (:,:)          = hmld_tm    (:,:) * r1_ndttrcp1 
255         !  variables that are initialized after averages initialized
256         emp_b    (:,:) = emp_b_hold (:,:)
257         IF( kt == nittrc000 ) THEN
258            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrc 
259            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrc 
260            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrc 
261            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrc 
262            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrc
263# if defined key_trabbl
264            IF( nn_bbl_ldf == 1 ) THEN
265               ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrc 
266               ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrc 
267            ENDIF
268            IF( nn_bbl_adv == 1 ) THEN
269               utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrc 
270               vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrc 
271            ENDIF
272# endif
273         ELSE
274            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrcp1 
275            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrcp1 
276            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrcp1 
277            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrcp1 
278            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrcp1 
279# if defined key_trabbl
280            IF( nn_bbl_ldf == 1 ) THEN
281               ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrcp1 
282               ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrcp1 
283            ENDIF
284            IF( nn_bbl_adv == 1 ) THEN
285               utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrcp1 
286               vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrcp1 
287            ENDIF
288# endif
289         ENDIF
290         !
291         DO jk = 1, jpk
292            DO jj = 1, jpj
293               DO ji = 1, jpi
294                  z1_ne3t = r1_ndttrcp1  / fse3t(ji,jj,jk)
295                  z1_ne3u = r1_ndttrcp1  / fse3u(ji,jj,jk)
296                  z1_ne3v = r1_ndttrcp1  / fse3v(ji,jj,jk)
297                  z1_ne3w = r1_ndttrcp1  / fse3w(ji,jj,jk)
298                  !
299                  un   (ji,jj,jk)        = un_tm   (ji,jj,jk)        * z1_ne3u
300                  vn   (ji,jj,jk)        = vn_tm   (ji,jj,jk)        * z1_ne3v
301                  tsn  (ji,jj,jk,jp_tem) = tsn_tm  (ji,jj,jk,jp_tem) * z1_ne3t
302                  tsn  (ji,jj,jk,jp_sal) = tsn_tm  (ji,jj,jk,jp_sal) * z1_ne3t
303                  rhop (ji,jj,jk)        = rhop_tm (ji,jj,jk)        * z1_ne3t
304                  avt  (ji,jj,jk)        = avt_tm  (ji,jj,jk)        * r1_ndttrcp1
305# if defined key_zdfddm
306                  avs  (ji,jj,jk)        = avs_tm  (ji,jj,jk)        * r1_ndttrcp1
307# endif
308               END DO
309            END DO
310         END DO
311         IF( l_ldfslp ) THEN
312            wslpi(:,:,:)        = wslpi_tm(:,:,:)        * r1_ndttrcp1 
313            wslpj(:,:,:)        = wslpj_tm(:,:,:)        * r1_ndttrcp1 
314            uslp (:,:,:)        = uslp_tm (:,:,:)        * r1_ndttrcp1 
315            vslp (:,:,:)        = vslp_tm (:,:,:)        * r1_ndttrcp1 
316         ENDIF
317         !
318         ahtu_tm(:,:,:) = ahtu_tm(:,:,:) + ahtu(:,:,:)
319         ahtv_tm(:,:,:) = ahtv_tm(:,:,:) + ahtv(:,:,:)
320         !
321         ahtu   (:,:,:) = ahtu_tm(:,:,:) * r1_ndttrcp1
322         ahtv   (:,:,:) = ahtv_tm(:,:,:) * r1_ndttrcp1
323         IF( ln_ldfeiv ) THEN
324            aeiu_tm(:,:,:) = aeiu_tm(:,:,:) + aeiu(:,:,:)
325            aeiv_tm(:,:,:) = aeiv_tm(:,:,:) + aeiv(:,:,:)
326            !
327            aeiu   (:,:,:) = aeiu_tm(:,:,:) * r1_ndttrcp1
328            aeiv   (:,:,:) = aeiv_tm(:,:,:) * r1_ndttrcp1
329         ENDIF
330
331!!gm  All those lbc_lnk are useless since the averaging is done over full arrays !
332         CALL lbc_lnk( un    (:,:,:)       , 'U',-1. ) 
333         CALL lbc_lnk( vn    (:,:,:)       , 'V',-1. ) 
334         CALL lbc_lnk( tsn   (:,:,:,jp_tem), 'T', 1. ) 
335         CALL lbc_lnk( tsn   (:,:,:,jp_sal), 'T', 1. ) 
336         CALL lbc_lnk( rhop  (:,:,:)       , 'T', 1. ) 
337         CALL lbc_lnk( avt   (:,:,:)       , 'W', 1. ) 
338# if defined key_zdfddm
339          CALL lbc_lnk( avs  (:,:,:)       , 'W', 1. ) 
340# endif
341         IF( l_ldfslp ) THEN
342            CALL lbc_lnk( uslp  (:,:,:)       , 'U',-1. ) 
343            CALL lbc_lnk( vslp  (:,:,:)       , 'V',-1. ) 
344            CALL lbc_lnk( wslpi (:,:,:)       , 'W',-1. ) 
345            CALL lbc_lnk( wslpj (:,:,:)       , 'W',-1. ) 
346         ENDIF
347         CALL lbc_lnk( sshn  (:,:)         , 'T', 1. ) 
348!!Z~     CALL lbc_lnk( sshu_n(:,:)         , 'U', 1. )
349!!Z~     CALL lbc_lnk( sshv_n(:,:)         , 'V', 1. )
350!!Z~     CALL lbc_lnk( sshf_n(:,:)         , 'F', 1. )
351         CALL lbc_lnk( sshb  (:,:)         , 'T', 1. ) 
352!!Z~     CALL lbc_lnk( sshu_b(:,:)         , 'U', 1. )
353!!Z~     CALL lbc_lnk( sshv_b(:,:)         , 'V', 1. )
354         CALL lbc_lnk( ssha  (:,:)         , 'T', 1. ) 
355!!Z~     CALL lbc_lnk( sshu_a(:,:)         , 'U', 1. )
356!!Z~     CALL lbc_lnk( sshv_a(:,:)         , 'V', 1. )
357         CALL lbc_lnk( rnf   (:,:)         , 'T', 1. ) 
358         CALL lbc_lnk( h_rnf (:,:)         , 'T', 1. ) 
359         CALL lbc_lnk( hmld  (:,:)         , 'T', 1. ) 
360         CALL lbc_lnk( fr_i  (:,:)         , 'T', 1. ) 
361         CALL lbc_lnk( emp   (:,:)         , 'T', 1. ) 
362         CALL lbc_lnk( emp_b (:,:)         , 'T', 1. ) 
363         CALL lbc_lnk( fmmflx(:,:)         , 'T', 1. ) 
364         CALL lbc_lnk( qsr   (:,:)         , 'T', 1. ) 
365         CALL lbc_lnk( wndm  (:,:)         , 'T', 1. ) 
366# if defined key_trabbl
367         IF( nn_bbl_ldf == 1 ) THEN
368            CALL lbc_lnk( ahu_bbl(:,:)     , 'U', 1. ) 
369            CALL lbc_lnk( ahv_bbl(:,:)     , 'v', 1. ) 
370         ENDIF
371         IF( nn_bbl_adv == 1 ) THEN
372            CALL lbc_lnk( utr_bbl(:,:)     , 'U', 1. ) 
373            CALL lbc_lnk( vtr_bbl(:,:)     , 'U', 1. ) 
374         ENDIF
375# endif
376         CALL lbc_lnk( ahtu  (:,:,:)       , 'U', 1. ) 
377         CALL lbc_lnk( ahtv  (:,:,:)       , 'V', 1. ) 
378         IF( ln_ldfeiv ) THEN
379            CALL lbc_lnk( aeiu  (:,:,:)    , 'U', 1. ) 
380            CALL lbc_lnk( aeiv  (:,:,:)    , 'V', 1. ) 
381         ENDIF
382         !
383         CALL trc_sub_ssh( kt )         ! after ssh & vertical velocity
384         !
385         CALL lbc_lnk( wn    (:,:,:)       , 'W',-1. ) 
386         CALL lbc_lnk( hdivn (:,:,:)       , 'T', 1. ) 
387         CALL lbc_lnk( hu    (:,:)         , 'U', 1. ) 
388         CALL lbc_lnk( hv    (:,:)         , 'V', 1. ) 
389         CALL lbc_lnk( hur   (:,:)         , 'U', 1. ) 
390         CALL lbc_lnk( hvr   (:,:)         , 'V', 1. ) 
391      ENDIF
392      !
393      IF( nn_timing == 1 )  CALL timing_start('trc_sub_stp')
394      !
395   END SUBROUTINE trc_sub_stp
396
397
398   SUBROUTINE trc_sub_ini
399      !!-------------------------------------------------------------------
400      !!                     ***  ROUTINE trc_sub_ini  ***
401      !!                     
402      !! ** Purpose :   Initialize variables needed for sub-stepping passive tracers
403      !!
404      !! ** Method  :   Compute the averages for sub-stepping
405      !!-------------------------------------------------------------------
406      INTEGER ::   ierr
407      !!-------------------------------------------------------------------
408      !
409      IF( nn_timing == 1 )  CALL timing_start('trc_sub_ini')
410      !
411      IF(lwp) WRITE(numout,*)
412      IF(lwp) WRITE(numout,*) 'trc_sub_ini : initial set up of the passive tracers substepping'
413      IF(lwp) WRITE(numout,*) '~~~~~~~'
414
415      ierr =  trc_sub_alloc    ()
416      IF( lk_mpp    )   CALL mpp_sum( ierr )
417      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'top_sub_alloc : unable to allocate standard ocean arrays' )
418
419      un_tm   (:,:,:)        = un   (:,:,:)        * fse3u(:,:,:) 
420      vn_tm   (:,:,:)        = vn   (:,:,:)        * fse3v(:,:,:) 
421      tsn_tm  (:,:,:,jp_tem) = tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
422      tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
423      rhop_tm (:,:,:)        = rhop (:,:,:)        * fse3t(:,:,:) 
424      avt_tm  (:,:,:)        = avt  (:,:,:) 
425# if defined key_zdfddm
426      avs_tm  (:,:,:)        = avs  (:,:,:) 
427# endif
428      IF( l_ldfslp ) THEN
429         wslpi_tm(:,:,:)        = wslpi(:,:,:)
430         wslpj_tm(:,:,:)        = wslpj(:,:,:)
431         uslp_tm (:,:,:)        = uslp (:,:,:)
432         vslp_tm (:,:,:)        = vslp (:,:,:)
433      ENDIF
434      sshn_tm  (:,:) = sshn  (:,:) 
435!!Z~  sshu_n_tm(:,:) = sshu_n(:,:)
436!!Z~  sshv_n_tm(:,:) = sshv_n(:,:)
437      rnf_tm   (:,:) = rnf   (:,:) 
438      h_rnf_tm (:,:) = h_rnf (:,:) 
439      hmld_tm  (:,:) = hmld  (:,:)
440
441      ! Physics variables that are set after initialization:
442      fr_i_tm(:,:) = 0._wp
443      emp_tm (:,:) = 0._wp
444      fmmflx_tm(:,:)  = 0._wp
445      qsr_tm (:,:) = 0._wp
446      wndm_tm(:,:) = 0._wp
447# if defined key_trabbl
448      IF( nn_bbl_ldf == 1 ) THEN
449         ahu_bbl_tm(:,:) = 0._wp
450         ahv_bbl_tm(:,:) = 0._wp
451      ENDIF
452      IF( nn_bbl_adv == 1 ) THEN
453         utr_bbl_tm(:,:) = 0._wp
454         vtr_bbl_tm(:,:) = 0._wp
455      ENDIF
456# endif
457      !
458      ahtu_tm(:,:,:) = ahtu(:,:,:)
459      ahtv_tm(:,:,:) = ahtv(:,:,:)
460      !
461      IF( ln_ldfeiv ) THEN
462         aeiu_tm(:,:,:) = aeiu(:,:,:)
463         aeiv_tm(:,:,:) = aeiv(:,:,:)
464      ENDIF
465      !
466      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_ini')
467      !
468   END SUBROUTINE trc_sub_ini
469
470
471   SUBROUTINE trc_sub_reset( kt )
472      !!-------------------------------------------------------------------
473      !!                     ***  ROUTINE trc_sub_reset  ***
474      !!                     
475      !! ** Purpose : Reset physics variables averaged for substepping
476      !!
477      !! ** Method  :
478      !!              Compute the averages for sub-stepping
479      !!-------------------------------------------------------------------
480      INTEGER, INTENT( in ) ::  kt  ! ocean time-step index
481      INTEGER :: jk                 ! dummy loop indices
482      !!-------------------------------------------------------------------
483      !
484      IF( nn_timing == 1 )  CALL timing_start('trc_sub_reset')
485      !
486      !   restore physics variables
487      un    (:,:,:)   =  un_temp    (:,:,:)
488      vn    (:,:,:)   =  vn_temp    (:,:,:)
489      wn    (:,:,:)   =  wn_temp    (:,:,:)
490      tsn   (:,:,:,:) =  tsn_temp   (:,:,:,:)
491      rhop  (:,:,:)   =  rhop_temp  (:,:,:)
492      avt   (:,:,:)   =  avt_temp   (:,:,:)
493# if defined key_zdfddm
494      avs   (:,:,:)   =  avs_temp   (:,:,:)
495# endif
496      IF( l_ldfslp ) THEN
497         wslpi (:,:,:)   =  wslpi_temp (:,:,:)
498         wslpj (:,:,:)   =  wslpj_temp (:,:,:)
499         uslp  (:,:,:)   =  uslp_temp  (:,:,:)
500         vslp  (:,:,:)   =  vslp_temp  (:,:,:)
501      ENDIF
502      sshn  (:,:)     =  sshn_temp  (:,:)
503      sshb  (:,:)     =  sshb_temp  (:,:)
504      ssha  (:,:)     =  ssha_temp  (:,:)
505!!Z~  sshu_n(:,:)     =  sshu_n_temp(:,:)
506!!Z~  sshu_b(:,:)     =  sshu_b_temp(:,:)
507!!Z~  sshu_a(:,:)     =  sshu_a_temp(:,:)
508!!Z~  sshv_n(:,:)     =  sshv_n_temp(:,:)
509!!Z~  sshv_b(:,:)     =  sshv_b_temp(:,:)
510!!Z~  sshv_a(:,:)     =  sshv_a_temp(:,:)
511!!Z~  sshf_n(:,:)     =  sshf_n_temp(:,:)
512      rnf   (:,:)     =  rnf_temp   (:,:)
513      h_rnf (:,:)     =  h_rnf_temp (:,:)
514      !
515      hmld  (:,:)     =  hmld_temp  (:,:)
516      fr_i  (:,:)     =  fr_i_temp  (:,:)
517      emp   (:,:)     =  emp_temp   (:,:)
518      fmmflx(:,:)     =  fmmflx_temp(:,:)
519      emp_b (:,:)     =  emp_b_temp (:,:)
520      qsr   (:,:)     =  qsr_temp   (:,:)
521      wndm  (:,:)     =  wndm_temp  (:,:)
522# if defined key_trabbl
523      IF( nn_bbl_ldf == 1 ) THEN
524         ahu_bbl(:,:) = ahu_bbl_temp(:,:) 
525         ahv_bbl(:,:) = ahv_bbl_temp(:,:) 
526      ENDIF
527      IF( nn_bbl_adv == 1 ) THEN
528         utr_bbl(:,:) = utr_bbl_temp(:,:) 
529         vtr_bbl(:,:) = vtr_bbl_temp(:,:) 
530      ENDIF
531# endif
532      !
533      ahtu  (:,:,:)   =  ahtu_temp  (:,:,:)
534      ahtv  (:,:,:)   =  ahtv_temp  (:,:,:)
535      !
536      IF( ln_ldfeiv ) THEN
537         aeiu  (:,:,:)  =  aeiu_temp(:,:,:)
538         aeiv  (:,:,:)  =  aeiv_temp(:,:,:)
539      ENDIF
540      hdivn (:,:,:)   =  hdivn_temp (:,:,:)
541      hu    (:,:)     =  hu_temp    (:,:)
542      hv    (:,:)     =  hv_temp    (:,:)
543      hur   (:,:)     =  hur_temp   (:,:)
544      hvr   (:,:)     =  hvr_temp   (:,:)
545      !                                     
546      DO jk = 1, jpk
547         fse3t(:,:,jk) = e3t_temp(:,:,jk) 
548         fse3u(:,:,jk) = e3u_temp(:,:,jk) 
549         fse3v(:,:,jk) = e3v_temp(:,:,jk) 
550         fse3w(:,:,jk) = e3w_temp(:,:,jk) 
551      END DO
552      !                                           !------------------------------!
553      IF( lk_vvl ) THEN                           !  Update Now Vertical coord.  !   (only in vvl case)
554        !                                         !------------------------------!
555         DO jk = 1, jpkm1
556            fsdept(:,:,jk) = fsdept_n(:,:,jk)          ! now local depths stored in fsdep. arrays
557            fsdepw(:,:,jk) = fsdepw_n(:,:,jk)
558            fsde3w(:,:,jk) = fsde3w_n(:,:,jk)
559            !
560            fse3t (:,:,jk) = fse3t_n (:,:,jk)          ! vertical scale factors stored in fse3. arrays
561            fse3u (:,:,jk) = fse3u_n (:,:,jk)
562            fse3v (:,:,jk) = fse3v_n (:,:,jk)
563            fse3f (:,:,jk) = fse3f_n (:,:,jk)
564            fse3w (:,:,jk) = fse3w_n (:,:,jk)
565            fse3uw(:,:,jk) = fse3uw_n(:,:,jk)
566            fse3vw(:,:,jk) = fse3vw_n(:,:,jk)
567         END DO
568         !
569      ENDIF
570
571      ! Start new averages
572         un_tm   (:,:,:)        = un   (:,:,:)        * fse3u(:,:,:) 
573         vn_tm   (:,:,:)        = vn   (:,:,:)        * fse3v(:,:,:) 
574         tsn_tm  (:,:,:,jp_tem) = tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
575         tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
576         rhop_tm (:,:,:)        = rhop (:,:,:)        * fse3t(:,:,:) 
577         avt_tm  (:,:,:)        = avt  (:,:,:) 
578# if defined key_zdfddm
579         avs_tm  (:,:,:)        = avs  (:,:,:)
580# endif
581      IF( l_ldfslp ) THEN
582         wslpi_tm(:,:,:)        = wslpi(:,:,:)
583         wslpj_tm(:,:,:)        = wslpj(:,:,:)
584         uslp_tm (:,:,:)        = uslp (:,:,:)
585         vslp_tm (:,:,:)        = vslp (:,:,:)
586      ENDIF
587      !
588      sshb_hold  (:,:) = sshn  (:,:)
589!!Z~  sshu_b_hold(:,:) = sshu_n(:,:)
590!!Z~  sshv_b_hold(:,:) = sshv_n(:,:)
591      emp_b_hold (:,:) = emp   (:,:)
592      sshn_tm    (:,:) = sshn  (:,:) 
593!!Z~  sshu_n_tm  (:,:) = sshu_n(:,:)
594!!Z~  sshv_n_tm  (:,:) = sshv_n(:,:)
595      rnf_tm     (:,:) = rnf   (:,:) 
596      h_rnf_tm   (:,:) = h_rnf (:,:) 
597      hmld_tm    (:,:) = hmld  (:,:)
598      fr_i_tm    (:,:) = fr_i  (:,:)
599      emp_tm     (:,:) = emp   (:,:)
600      fmmflx_tm  (:,:) = fmmflx(:,:)
601      qsr_tm     (:,:) = qsr   (:,:)
602      wndm_tm    (:,:) = wndm  (:,:)
603# if defined key_trabbl
604      IF( nn_bbl_ldf == 1 ) THEN
605         ahu_bbl_tm(:,:) = ahu_bbl(:,:) 
606         ahv_bbl_tm(:,:) = ahv_bbl(:,:) 
607      ENDIF
608      IF( nn_bbl_adv == 1 ) THEN
609         utr_bbl_tm(:,:) = utr_bbl(:,:) 
610         vtr_bbl_tm(:,:) = vtr_bbl(:,:) 
611      ENDIF
612# endif
613      !
614      DO jk = 1, jpkm1
615         ahtu_tm(:,:,jk) = ahtu(:,:,jk)
616         ahtv_tm(:,:,jk) = ahtv(:,:,jk)
617         IF( ln_ldfeiv ) THEN
618            aeiu_tm(:,:,jk) = aeiu(:,:,jk) * fse3u(:,:,jk)
619            aeiv_tm(:,:,jk) = aeiv(:,:,jk) * fse3v(:,:,jk)
620         ENDIF
621      END DO
622      !
623      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_reset')
624      !
625   END SUBROUTINE trc_sub_reset
626
627
628   SUBROUTINE trc_sub_ssh( kt ) 
629      !!----------------------------------------------------------------------
630      !!                ***  ROUTINE trc_sub_ssh  ***
631      !!                   
632      !! ** Purpose :   compute the after ssh (ssha), the now vertical velocity
633      !!              and update the now vertical coordinate (lk_vvl=T).
634      !!
635      !! ** Method  : - Using the incompressibility hypothesis, the vertical
636      !!      velocity is computed by integrating the horizontal divergence 
637      !!      from the bottom to the surface minus the scale factor evolution.
638      !!        The boundary conditions are w=0 at the bottom (no flux) and.
639      !!
640      !! ** action  :   ssha    : after sea surface height
641      !!                wn      : now vertical velocity
642      !!                sshu_a, sshv_a, sshf_a  : after sea surface height (lk_vvl=T)
643      !!                hu, hv, hur, hvr        : ocean depth and its inverse at u-,v-points
644      !!
645      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
646      !!----------------------------------------------------------------------
647      !
648      INTEGER, INTENT(in) ::   kt   ! time step
649      !
650      INTEGER  ::   ji, jj, jk   ! dummy loop indices
651      REAL(wp) ::   zcoefu, zcoefv, zcoeff, z2dt, z1_2dt, z1_rau0   ! local scalars
652      REAL(wp), POINTER, DIMENSION(:,:) :: zhdiv
653      !!---------------------------------------------------------------------
654      !
655      IF( nn_timing == 1 )  CALL timing_start('trc_sub_ssh')
656      !
657      ! Allocate temporary workspace
658      CALL wrk_alloc( jpi, jpj, zhdiv )
659
660      IF( kt == nittrc000 ) THEN
661         !
662         IF(lwp) WRITE(numout,*)
663         IF(lwp) WRITE(numout,*) 'trc_sub_ssh : after sea surface height and now vertical velocity '
664         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
665         !
666         wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
667         !
668      ENDIF
669
670      !                                           !------------------------------------------!
671      IF( lk_vvl ) THEN                           !  Regridding: Update Now Vertical coord.  !   (only in vvl case)
672         !                                        !------------------------------------------!
673         DO jk = 1, jpkm1
674            fsdept(:,:,jk) = fsdept_n(:,:,jk)         ! now local depths stored in fsdep. arrays
675            fsdepw(:,:,jk) = fsdepw_n(:,:,jk)
676            fsde3w(:,:,jk) = fsde3w_n(:,:,jk)
677            !
678            fse3t (:,:,jk) = fse3t_n (:,:,jk)         ! vertical scale factors stored in fse3. arrays
679            fse3u (:,:,jk) = fse3u_n (:,:,jk)
680            fse3v (:,:,jk) = fse3v_n (:,:,jk)
681            fse3f (:,:,jk) = fse3f_n (:,:,jk)
682            fse3w (:,:,jk) = fse3w_n (:,:,jk)
683            fse3uw(:,:,jk) = fse3uw_n(:,:,jk)
684            fse3vw(:,:,jk) = fse3vw_n(:,:,jk)
685         END DO
686         !
687!!Z~     hu(:,:) = hu_0(:,:) + sshu_n(:,:)            ! now ocean depth (at u- and v-points)
688!!Z~     hv(:,:) = hv_0(:,:) + sshv_n(:,:)
689         !                                            ! now masked inverse of the ocean depth (at u- and v-points)
690         hur(:,:) = umask(:,:,1) / ( hu(:,:) + 1._wp - umask(:,:,1) )
691         hvr(:,:) = vmask(:,:,1) / ( hv(:,:) + 1._wp - vmask(:,:,1) )
692         !
693      ENDIF
694      !
695!!gm BUG here  the recomputed divergence will includes the wrong river runoff.....
696      CALL div_hor( kt )                              ! Horizontal divergence
697      !
698      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog)
699      IF( neuler == 0 .AND. kt == nittrc000 )   z2dt = rdt
700
701      !                                           !------------------------------!
702      !                                           !   After Sea Surface Height   !
703      !                                           !------------------------------!
704      zhdiv(:,:) = 0._wp
705      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports
706        zhdiv(:,:) = zhdiv(:,:) + fse3t(:,:,jk) * hdivn(:,:,jk)
707      END DO
708      !                                                ! Sea surface elevation time stepping
709      ! In forward Euler time stepping case, the same formulation as in the leap-frog case can be used
710      ! because emp_b field is initialized with the vlaues of emp field. Hence, 0.5 * ( emp + emp_b ) = emp
711      z1_rau0 = 0.5 / rau0
712      ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * tmask(:,:,1)
713
714#if defined key_agrif
715      CALL agrif_ssh( kt )
716#endif
717#if defined key_bdy
718      ssha(:,:) = ssha(:,:) * bdytmask(:,:)
719      CALL lbc_lnk( ssha, 'T', 1. ) 
720#endif
721      !
722      !                                                ! Sea Surface Height at u-,v- and f-points (vvl case only)
723!!Z~  IF( lk_vvl ) THEN                                ! (required only in key_vvl case)
724!!Z~     DO jj = 1, jpjm1
725!!Z~        DO ji = 1, jpim1      ! NO Vector Opt.
726!!Z~           sshu_a(ji,jj) = 0.5  * umask(ji,jj,1) * r1_e1e2u(ji  ,jj) * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)   &
727!!Z~              &                                                        + e1e2t(ji+1,jj) * ssha(ji+1,jj) )
728!!Z~           sshv_a(ji,jj) = 0.5  * vmask(ji,jj,1) * r1_e1e2v(ji,jj  ) * ( e1e2t(ji,jj  ) * ssha(ji,jj  )     &
729!!Z~              &                                                        + e1e2t(ji,jj+1) * ssha(ji,jj+1) )
730!!Z~        END DO
731!!Z~     END DO
732!!Z~     CALL lbc_lnk( sshu_a, 'U', 1. )   ;   CALL lbc_lnk( sshv_a, 'V', 1. )      ! Boundaries conditions
733!!Z~  ENDIF
734      !
735      !                                           !------------------------------!
736      !                                           !     Now Vertical Velocity    !
737      !                                           !------------------------------!
738      z1_2dt = 1.e0 / z2dt
739      DO jk = jpkm1, 1, -1                             ! integrate from the bottom the hor. divergence
740         ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise
741         wn(:,:,jk) = wn(:,:,jk+1) -   fse3t_n(:,:,jk) * hdivn(:,:,jk)        &
742            &                      - ( fse3t_a(:,:,jk) - fse3t_b(:,:,jk) )    &
743            &                         * tmask(:,:,jk) * z1_2dt
744#if defined key_bdy
745         wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:)
746#endif
747      END DO
748      !
749      CALL wrk_dealloc( jpi, jpj, zhdiv )
750      !
751      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_ssh')
752      !
753   END SUBROUTINE trc_sub_ssh
754
755   INTEGER FUNCTION trc_sub_alloc()
756      !!-------------------------------------------------------------------
757      !!                    *** ROUTINE trc_sub_alloc ***
758      !!-------------------------------------------------------------------
759      USE lib_mpp, ONLY: ctl_warn
760      INTEGER ::  ierr
761      !!-------------------------------------------------------------------
762      !
763      ALLOCATE( un_temp(jpi,jpj,jpk)        ,  vn_temp(jpi,jpj,jpk)  ,   &
764         &      wn_temp(jpi,jpj,jpk)        ,  avt_temp(jpi,jpj,jpk) ,   &
765         &      rhop_temp(jpi,jpj,jpk)      ,  rhop_tm(jpi,jpj,jpk) ,   &
766         &      sshn_temp(jpi,jpj)          ,  sshb_temp(jpi,jpj) ,      &
767         &      ssha_temp(jpi,jpj)          ,  sshu_a_temp(jpi,jpj),     &
768         &      sshu_n_temp(jpi,jpj)        ,  sshu_b_temp(jpi,jpj),     &
769         &      sshv_n_temp(jpi,jpj)        ,  sshv_b_temp(jpi,jpj),     &
770         &      sshv_a_temp(jpi,jpj)        ,  sshf_n_temp(jpi,jpj) ,   &
771         &      e3t_temp(jpi,jpj,jpk)       ,  e3u_temp(jpi,jpj,jpk),    &
772         &      e3v_temp(jpi,jpj,jpk)       ,  e3w_temp(jpi,jpj,jpk),    &
773!!gm here define these arrays only if l_ldfslp = True
774         &      wslpi_temp(jpi,jpj,jpk)     ,  wslpj_temp(jpi,jpj,jpk),  &
775         &      uslp_temp(jpi,jpj,jpk)      ,  vslp_temp(jpi,jpj,jpk),   &
776         &      wslpi_tm(jpi,jpj,jpk)       ,  wslpj_tm(jpi,jpj,jpk),    &
777         &      uslp_tm(jpi,jpj,jpk)        ,  vslp_tm(jpi,jpj,jpk),     &
778!!gm
779#if defined key_trabbl
780         &      ahu_bbl_temp(jpi,jpj)       ,  ahv_bbl_temp(jpi,jpj),    &
781         &      utr_bbl_temp(jpi,jpj)       ,  vtr_bbl_temp(jpi,jpj),    &
782         &      ahu_bbl_tm(jpi,jpj)         ,  ahv_bbl_tm(jpi,jpj),      &
783         &      utr_bbl_tm(jpi,jpj)         ,  vtr_bbl_tm(jpi,jpj),      &
784#endif
785         &      rnf_temp(jpi,jpj)           ,  h_rnf_temp(jpi,jpj) ,     &
786         &      tsn_temp(jpi,jpj,jpk,2)     ,  emp_b_temp(jpi,jpj),      &
787         &      emp_temp(jpi,jpj)           ,  fmmflx_temp(jpi,jpj),     &
788         &      hmld_temp(jpi,jpj)          ,  qsr_temp(jpi,jpj) ,       &
789         &      fr_i_temp(jpi,jpj)          ,  fr_i_tm(jpi,jpj) ,        &
790         &      wndm_temp(jpi,jpj)          ,  wndm_tm(jpi,jpj) ,        &
791# if defined key_zdfddm
792         &      avs_tm(jpi,jpj,jpk)         ,  avs_temp(jpi,jpj,jpk) ,   &
793# endif
794!!gm here define these arrays only if l_ldftra_time = True
795         &      ahtu_tm(jpi,jpj,jpk)        ,  ahtu_temp(jpi,jpj,jpk),   &
796         &      ahtv_tm(jpi,jpj,jpk)        ,  ahtv_temp(jpi,jpj,jpk),   &
797!!gm here define these arrays only if l_ldfeiv_time = True
798         &      aeiu_tm(jpi,jpj,jpk)        ,  aeiu_temp(jpi,jpj,jpk),   &
799         &      aeiv_tm(jpi,jpj,jpk)        ,  aeiv_temp(jpi,jpj,jpk),   &
800!!gm end
801         &      hdivn_temp(jpi,jpj,jpk)     ,                            &
802         &      hu_temp(jpi,jpj)            ,  hv_temp(jpi,jpj),         &
803         &      hur_temp(jpi,jpj)           ,  hvr_temp(jpi,jpj),        &
804         &      un_tm(jpi,jpj,jpk)          ,  vn_tm(jpi,jpj,jpk)  ,     &
805         &      avt_tm(jpi,jpj,jpk)                                ,     &
806         &      sshn_tm(jpi,jpj)            ,  sshb_hold(jpi,jpj) ,      &
807         &      sshu_n_tm(jpi,jpj)          ,  sshu_b_hold(jpi,jpj),     &
808         &      sshv_n_tm(jpi,jpj)          ,  sshv_b_hold(jpi,jpj),     &
809         &      tsn_tm(jpi,jpj,jpk,2)       ,                            &
810         &      emp_tm(jpi,jpj)             ,  fmmflx_tm(jpi,jpj)  ,     &
811         &      emp_b_hold(jpi,jpj)         ,                            &
812         &      hmld_tm(jpi,jpj)            ,  qsr_tm(jpi,jpj) ,         &
813         &      rnf_tm(jpi,jpj)             ,  h_rnf_tm(jpi,jpj) ,       &
814         &                                    STAT=trc_sub_alloc ) 
815      IF( trc_sub_alloc /= 0 )   CALL ctl_warn('trc_sub_alloc: failed to allocate arrays')
816
817      !
818   END FUNCTION trc_sub_alloc
819
820#else
821   !!----------------------------------------------------------------------
822   !!   Default key                                     NO passive tracers
823   !!----------------------------------------------------------------------
824CONTAINS
825   SUBROUTINE trc_sub_stp( kt )        ! Empty routine
826      WRITE(*,*) 'trc_sub_stp: You should not have seen this print! error?', kt
827   END SUBROUTINE trc_sub_stp
828   SUBROUTINE trc_sub_ini        ! Empty routine
829      WRITE(*,*) 'trc_sub_ini: You should not have seen this print! error?', kt
830   END SUBROUTINE trc_sub_ini
831
832#endif
833
834   !!======================================================================
835END MODULE trcsub
Note: See TracBrowser for help on using the repository browser.