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/2011/dev_r2802_TOP_substepping/NEMOGCM/NEMO/TOP_SRC – NEMO

source: branches/2011/dev_r2802_TOP_substepping/NEMOGCM/NEMO/TOP_SRC/trcsub.F90 @ 2914

Last change on this file since 2914 was 2914, checked in by kpedwards, 13 years ago

Fix typos to variables names.

File size: 47.1 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 zdf_oce
25   USE domvvl
26   USE divcur          ! hor. divergence and curl      (div & cur routines)
27   USE sbcrnf, ONLY: h_rnf, nk_rnf   ! River runoff
28   USE sbc_oce         ! surface boundary condition: ocean
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   !!* Module variables
43   REAL(wp)  :: r1_ndttrc     !    1 /  nn_dttrc
44   REAL(wp)  :: r1_ndttrcp1   !    1 / (nn_dttrc+1)
45
46   !!* Substitution
47#  include "top_substitute.h90"
48   !!----------------------------------------------------------------------
49   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
50   !! $Id: trcstp.F90 2528 2010-12-27 17:33:53Z rblod $
51   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
52   !!----------------------------------------------------------------------
53CONTAINS
54
55   SUBROUTINE trc_sub_stp( kt )
56      !!-------------------------------------------------------------------
57      !!                     ***  ROUTINE trc_stp  ***
58      !!                     
59      !! ** Purpose : Average variables needed for sub-stepping passive tracers
60      !!
61      !! ** Method  : Called every timestep to increment _tm (time mean) variables
62      !!              on TOP steps, calculate averages.
63      !!-------------------------------------------------------------------
64      INTEGER, INTENT( in ) ::  kt        ! ocean time-step index
65      INTEGER               ::  ji,jj,jk  ! dummy loop indices
66      REAL(wp)              ::  z1_ne3t, z1_ne3u, z1_ne3v, z1_ne3w
67      !!-------------------------------------------------------------------
68
69       IF (kt == nit000) THEN
70           IF(lwp) WRITE(numout,*)
71           IF(lwp) WRITE(numout,*) 'trc_sub_stp : substepping of the passive tracers'
72           IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
73           !
74           sshb_hold  (:,:) = sshn  (:,:)
75           sshu_b_hold(:,:) = sshu_n(:,:)
76           sshv_b_hold(:,:) = sshv_n(:,:)
77           emp_b_hold (:,:) = emp_b (:,:)
78           !
79           r1_ndttrc        = 1._wp / REAL( nn_dttrc    , wp ) 
80           r1_ndttrcp1      = 1._wp / REAL( nn_dttrc + 1, wp )
81           !
82       ENDIF 
83
84       IF( MOD( kt , nn_dttrc ) /= 0 ) THEN
85          !
86          un_tm   (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * fse3u(:,:,:) 
87          vn_tm   (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * fse3v(:,:,:) 
88          wn_tm   (:,:,:)        = wn_tm   (:,:,:)        + wn   (:,:,:)        * fse3w(:,:,:) 
89          tsn_tm  (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
90          tsn_tm  (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
91          avt_tm  (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:)        * fse3w(:,:,:) 
92# if defined key_zdfddm
93          avs_tm  (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * fse3w(:,:,:) 
94# endif
95#if defined key_ldfslp
96          wslpi_tm(:,:,:)        = wslpi_tm(:,:,:)        + wslpi(:,:,:)        * fse3w(:,:,:) 
97          wslpj_tm(:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:)        * fse3w(:,:,:) 
98          uslp_tm (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:)        * fse3u(:,:,:) 
99          vslp_tm (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:)        * fse3v(:,:,:) 
100#endif
101          !
102          sshn_tm  (:,:)         = sshn_tm  (:,:)         + sshn  (:,:) 
103          sshu_n_tm(:,:)         = sshu_n_tm(:,:)         + sshu_n(:,:) 
104          sshv_n_tm(:,:)         = sshv_n_tm(:,:)         + sshv_n(:,:) 
105          rnf_tm   (:,:)         = rnf_tm   (:,:)         + rnf   (:,:) 
106          h_rnf_tm (:,:)         = h_rnf_tm (:,:)         + h_rnf (:,:) 
107          hmld_tm  (:,:)         = hmld_tm  (:,:)         + hmld  (:,:)
108          fr_i_tm  (:,:)         = fr_i_tm  (:,:)         + fr_i  (:,:)
109          emp_tm   (:,:)         = emp_tm   (:,:)         + emp   (:,:) 
110          emps_tm  (:,:)         = emps_tm  (:,:)         + emps  (:,:)
111          qsr_tm   (:,:)         = qsr_tm   (:,:)         + qsr   (:,:)
112          wndm_tm  (:,:)         = wndm_tm  (:,:)         + wndm  (:,:)
113          !
114#if defined key_traldf_c3d
115          ahtt_tm  (:,:,:)       = ahtt_tm  (:,:,:)       + ahtt(:,:,:)         * fse3t(:,:,:)
116          ahtu_tm  (:,:,:)       = ahtu_tm  (:,:,:)       + ahtu(:,:,:)         * fse3u(:,:,:)
117          ahtv_tm  (:,:,:)       = ahtv_tm  (:,:,:)       + ahtv(:,:,:)         * fse3v(:,:,:)
118          ahtw_tm  (:,:,:)       = ahtw_tm  (:,:,:)       + ahtw(:,:,:)         * fse3w(:,:,:)
119#elif defined key_traldf_c2d
120          ahtt_tm  (:,:)         = ahtt_tm  (:,:)         + ahtt(:,:)
121          ahtu_tm  (:,:)         = ahtu_tm  (:,:)         + ahtu(:,:)
122          ahtv_tm  (:,:)         = ahtv_tm  (:,:)         + ahtv(:,:)
123          ahtw_tm  (:,:)         = ahtw_tm  (:,:)         + ahtw(:,:)
124#elif defined key_traldf_c1d
125          ahtt_tm  (:)           = ahtt_tm  (:,:)         + ahtt(:)
126          ahtu_tm  (:)           = ahtu_tm  (:,:)         + ahtu(:)
127          ahtv_tm  (:)           = ahtv_tm  (:,:)         + ahtv(:)
128          ahtw_tm  (:)           = ahtw_tm  (:,:)         + ahtw(:)
129#else
130          ahtt_tm                = ahtt_tm                + ahtt
131          ahtu_tm                = ahtu_tm                + ahtu
132          ahtv_tm                = ahtv_tm                + ahtv
133          ahtw_tm                = ahtw_tm                + ahtw
134#endif
135#if defined key_traldf_eiv
136#  if defined key_traldf_c3d
137          aeiu_tm  (:,:,:)       = aeiu_tm  (:,:,:)       + aeiu(:,:,:)         * fse3u(:,:,:)
138          aeiv_tm  (:,:,:)       = aeiv_tm  (:,:,:)       + aeiv(:,:,:)         * fse3v(:,:,:)
139          aeiw_tm  (:,:,:)       = aeiw_tm  (:,:,:)       + aeiw(:,:,:)         * fse3w(:,:,:)
140#  elif defined key_traldf_c2d
141          aeiu_tm  (:,:)         = aeiu_tm  (:,:)         + aeiu(:,:)
142          aeiv_tm  (:,:)         = aeiv_tm  (:,:)         + aeiv(:,:)
143          aeiw_tm  (:,:)         = aeiw_tm  (:,:)         + aeiw(:,:)
144#  elif defined key_traldf_c1d
145          aeiu_tm  (:)           = aeiu_tm  (:,:)         + aeiu(:)
146          aeiv_tm  (:)           = aeiv_tm  (:,:)         + aeiv(:)
147          aeiw_tm  (:)           = aeiw_tm  (:,:)         + aeiw(:)
148#  else
149          aeiu_tm                = aeiu_tm                + aeiu
150          aeiv_tm                = aeiv_tm                + aeiv
151          aeiw_tm                = aeiw_tm                + aeiw
152#  endif
153#endif
154
155      ELSE                           !  It is time to substep
156         !   1. set temporary arrays to hold physics variables
157         sshn_temp  (:,:)        = sshn  (:,:)
158         sshu_n_temp(:,:)        = sshu_n(:,:)
159         sshv_n_temp(:,:)        = sshv_n(:,:)
160         sshf_n_temp(:,:)        = sshf_n(:,:)
161         sshb_temp  (:,:)        = sshb  (:,:)
162         sshu_b_temp(:,:)        = sshu_b(:,:)
163         sshv_b_temp(:,:)        = sshv_b(:,:)
164         ssha_temp  (:,:)        = ssha  (:,:)
165         sshu_a_temp(:,:)        = sshu_a(:,:)
166         sshv_a_temp(:,:)        = sshv_a(:,:)
167         rnf_temp   (:,:)        = rnf   (:,:)
168         h_rnf_temp (:,:)        = h_rnf (:,:)
169         rotn_temp  (:,:,:)      = rotn  (:,:,:)
170         hdivn_temp (:,:,:)      = hdivn (:,:,:)
171         rotb_temp  (:,:,:)      = rotb  (:,:,:)
172         hdivb_temp (:,:,:)      = hdivb (:,:,:)
173         un_temp    (:,:,:)      = un    (:,:,:)
174         vn_temp    (:,:,:)      = vn    (:,:,:)
175         wn_temp    (:,:,:)      = wn    (:,:,:)
176         tsn_temp   (:,:,:,:)    = tsn   (:,:,:,:)
177         avt_temp   (:,:,:)      = avt   (:,:,:)
178# if defined key_zdfddm
179         avs_temp(:,:,:)         = avs   (:,:,:)
180# endif
181         hmld_temp  (:,:)        = hmld  (:,:)
182         qsr_temp   (:,:)        = qsr   (:,:)
183         wndm_temp  (:,:)        = wndm  (:,:)
184         emp_temp   (:,:)        = emp   (:,:)
185         emp_b_temp (:,:)        = emp_b (:,:)
186         emps_temp  (:,:)        = emps  (:,:)
187#if defined key_ldfslp
188         wslpi_temp (:,:,:)      = wslpi (:,:,:)
189         wslpj_temp (:,:,:)      = wslpj (:,:,:)
190         uslp_temp  (:,:,:)      = uslp  (:,:,:)
191         vslp_temp  (:,:,:)      = vslp  (:,:,:)
192#endif
193         hu_temp    (:,:)        = hu    (:,:)
194         hv_temp    (:,:)        = hv    (:,:)
195         hur_temp   (:,:)        = hur   (:,:)
196         hvr_temp   (:,:)        = hvr   (:,:)
197#if defined key_traldf_c3d
198         ahtu_temp  (:,:,:)      = ahtu  (:,:,:)
199         ahtv_temp  (:,:,:)      = ahtv  (:,:,:)
200         ahtw_temp  (:,:,:)      = ahtw  (:,:,:)
201         ahtt_temp  (:,:,:)      = ahtt  (:,:,:)
202#elif defined key_traldf_c2d
203         ahtu_temp  (:,:)        = ahtu  (:,:)
204         ahtv_temp  (:,:)        = ahtv  (:,:)
205         ahtw_temp  (:,:)        = ahtw  (:,:)
206         ahtt_temp  (:,:)        = ahtt  (:,:)
207#elif defined key_traldf_c1d
208         ahtu_temp  (:)          = ahtu  (:)
209         ahtv_temp  (:)          = ahtv  (:)
210         ahtw_temp  (:)          = ahtw  (:)
211         ahtt_temp  (:)          = ahtt  (:)
212#else
213         ahtu_temp               = ahtu
214         ahtv_temp               = ahtv
215         ahtw_temp               = ahtw
216         ahtt_temp               = ahtt
217#endif
218
219#if defined key_traldf_eiv
220# if defined key_traldf_c3d
221         aeiu_temp  (:,:,:)      = aeiu(:,:,:)
222         aeiv_temp  (:,:,:)      = aeiv(:,:,:)
223         aeiw_temp  (:,:,:)      = aeiw(:,:,:)
224# elif defined key_traldf_c2d
225         aeiu_temp  (:,:)        = aeiu(:,:)
226         aeiv_temp  (:,:)        = aeiv(:,:)
227         aeiw_temp  (:,:)        = aeiw(:,:)
228# elif defined key_traldf_c1d
229         aeiu_temp  (:)          = aeiu(:)
230         aeiv_temp  (:)          = aeiv(:)
231         aeiw_temp  (:)          = aeiw(:)
232# else
233         aeiu_temp               = aeiu
234         aeiv_temp               = aeiv
235         aeiw_temp               = aeiw
236# endif
237#endif
238         !
239         DO jk = 1, jpk
240            e3t_temp(:,:,jk)     = fse3t(:,:,jk)
241            e3u_temp(:,:,jk)     = fse3u(:,:,jk)
242            e3v_temp(:,:,jk)     = fse3v(:,:,jk)
243            e3w_temp(:,:,jk)     = fse3w(:,:,jk)
244         ENDDO
245         IF( lk_vvl ) THEN                      !  Update Now Vertical coord.  !   (only in vvl case)
246           !                                    !------------------------------!
247           DO jk = 1, jpk
248              fse3t (:,:,jk)     = fse3t_n (:,:,jk)   ! vertical scale factors stored in fse3. arrays
249              fse3u (:,:,jk)     = fse3u_n (:,:,jk)
250              fse3v (:,:,jk)     = fse3v_n (:,:,jk)
251              fse3w (:,:,jk)     = fse3w_n (:,:,jk)
252           END DO
253         ENDIF
254
255         ! 2. Create averages and reassign variables
256         sshn_tm  (:,:)          = sshn_tm    (:,:)       + sshn  (:,:) 
257         sshu_n_tm(:,:)          = sshu_n_tm  (:,:)       + sshu_n(:,:) 
258         sshv_n_tm(:,:)          = sshv_n_tm  (:,:)       + sshv_n(:,:) 
259         rnf_tm   (:,:)          = rnf_tm     (:,:)       + rnf   (:,:) 
260         h_rnf_tm (:,:)          = h_rnf_tm   (:,:)       + h_rnf (:,:) 
261         hmld_tm  (:,:)          = hmld_tm    (:,:)       + hmld  (:,:)
262         fr_i_tm  (:,:)          = fr_i_tm    (:,:)       + fr_i  (:,:)
263         emp_tm   (:,:)          = emp_tm     (:,:)       + emp   (:,:) 
264         emps_tm  (:,:)          = emps_tm    (:,:)       + emps  (:,:)
265         qsr_tm   (:,:)          = qsr_tm     (:,:)       + qsr   (:,:)
266         wndm_tm  (:,:)          = wndm_tm    (:,:)       + wndm  (:,:)
267         !
268         sshn     (:,:)          = sshn_tm    (:,:) * r1_ndttrcp1 
269         sshu_n   (:,:)          = sshu_n_tm  (:,:) * r1_ndttrcp1 
270         sshv_n   (:,:)          = sshv_n_tm  (:,:) * r1_ndttrcp1 
271         sshb     (:,:)          = sshb_hold  (:,:)
272         sshu_b   (:,:)          = sshu_b_hold(:,:)
273         sshv_b   (:,:)          = sshv_b_hold(:,:)
274         rnf      (:,:)          = rnf_tm     (:,:) * r1_ndttrcp1 
275         h_rnf    (:,:)          = h_rnf_tm   (:,:) * r1_ndttrcp1 
276         hmld     (:,:)          = hmld_tm    (:,:) * r1_ndttrcp1 
277         fr_i     (:,:)          = fr_i_tm    (:,:) * r1_ndttrcp1 
278         !  variables that are initialized after averages initialized
279         emp_b    (:,:) = emp_b_hold (:,:)
280         IF( kt == nittrc000 ) THEN
281            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrc 
282            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrc 
283            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrc 
284            emps  (:,:)          = emps_tm    (:,:) * r1_ndttrc 
285         ELSE
286            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrcp1 
287            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrcp1 
288            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrcp1 
289            emps  (:,:)          = emps_tm    (:,:) * r1_ndttrcp1 
290         ENDIF
291
292         un_tm    (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * e3u_temp(:,:,:) 
293         vn_tm    (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * e3v_temp(:,:,:) 
294         wn_tm    (:,:,:)        = wn_tm   (:,:,:)        + wn   (:,:,:)        * e3w_temp(:,:,:) 
295         tsn_tm   (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * e3t_temp(:,:,:) 
296         tsn_tm   (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_sal) * e3t_temp(:,:,:) 
297         avt_tm   (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:)        * e3w_temp(:,:,:) 
298# if defined key_zdfddm
299         avs_tm   (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * e3w_temp(:,:,:) 
300# endif
301#if defined key_ldfslp
302         wslpi_tm (:,:,:)        = wslpi_tm(:,:,:)        + wslpi(:,:,:)        * e3w_temp(:,:,:) 
303         wslpj_tm (:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:)        * e3w_temp(:,:,:) 
304         uslp_tm  (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:)        * e3u_temp(:,:,:) 
305         vslp_tm  (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:)        * e3v_temp(:,:,:) 
306#endif
307         !
308         DO jk = 1, jpk
309            DO jj = 1, jpj
310               DO ji = 1, jpi
311                  z1_ne3t = r1_ndttrcp1  / fse3t(ji,jj,jk)
312                  z1_ne3u = r1_ndttrcp1  / fse3u(ji,jj,jk)
313                  z1_ne3v = r1_ndttrcp1  / fse3v(ji,jj,jk)
314                  z1_ne3w = r1_ndttrcp1  / fse3w(ji,jj,jk)
315                  !
316                  un   (ji,jj,jk)        = un_tm   (ji,jj,jk)        * z1_ne3u
317                  vn   (ji,jj,jk)        = vn_tm   (ji,jj,jk)        * z1_ne3v
318                  wn   (ji,jj,jk)        = wn_tm   (ji,jj,jk)        * z1_ne3w
319                  tsn  (ji,jj,jk,jp_tem) = tsn_tm  (ji,jj,jk,jp_tem) * z1_ne3t
320                  tsn  (ji,jj,jk,jp_sal) = tsn_tm  (ji,jj,jk,jp_sal) * z1_ne3t
321                  avt  (ji,jj,jk)        = avt_tm  (ji,jj,jk)        * z1_ne3w
322# if defined key_zdfddm
323                  avs  (ji,jj,jk)        = avs_tm  (ji,jj,jk)        * z1_ne3w
324# endif
325#if defined key_ldfslp
326                  wslpi(ji,jj,jk)        = wslpi_tm(ji,jj,jk)        * z1_ne3w 
327                  wslpj(ji,jj,jk)        = wslpj_tm(ji,jj,jk)        * z1_ne3w 
328                  uslp (ji,jj,jk)        = uslp_tm (ji,jj,jk)        * z1_ne3u 
329                  vslp (ji,jj,jk)        = vslp_tm (ji,jj,jk)        * z1_ne3v 
330#endif
331               ENDDO
332            ENDDO
333         ENDDO
334
335#if defined key_traldf_c3d
336          ahtt_tm  (:,:,:)       = ahtt_tm  (:,:,:)       + ahtt(:,:,:)         * e3t_temp(:,:,:)
337          ahtu_tm  (:,:,:)       = ahtu_tm  (:,:,:)       + ahtu(:,:,:)         * e3u_temp(:,:,:)
338          ahtv_tm  (:,:,:)       = ahtv_tm  (:,:,:)       + ahtv(:,:,:)         * e3v_temp(:,:,:)
339          ahtw_tm  (:,:,:)       = ahtw_tm  (:,:,:)       + ahtw(:,:,:)         * e3w_temp(:,:,:)
340          !
341          ahtt     (:,:,:)       = ahtt_tm  (:,:,:) * r1_ndttrcp1  / fse3t(:,:,:)
342          ahtu     (:,:,:)       = ahtu_tm  (:,:,:) * r1_ndttrcp1  / fse3u(:,:,:)
343          ahtv     (:,:,:)       = ahtv_tm  (:,:,:) * r1_ndttrcp1  / fse3v(:,:,:)
344          ahtw     (:,:,:)       = ahtw_tm  (:,:,:) * r1_ndttrcp1  / fse3w(:,:,:)
345#elif defined key_traldf_c2d
346          ahtt_tm  (:,:)         = ahtt_tm  (:,:)         + ahtt(:,:)
347          ahtu_tm  (:,:)         = ahtu_tm  (:,:)         + ahtu(:,:)
348          ahtv_tm  (:,:)         = ahtv_tm  (:,:)         + ahtv(:,:)
349          ahtw_tm  (:,:)         = ahtw_tm  (:,:)         + ahtw(:,:)
350          !
351          ahtt     (:,:)         = ahtt_tm  (:,:)   * r1_ndttrcp1
352          ahtu     (:,:)         = ahtu_tm  (:,:)   * r1_ndttrcp1
353          ahtv     (:,:)         = ahtv_tm  (:,:)   * r1_ndttrcp1
354          ahtw     (:,:)         = ahtw_tm  (:,:)   * r1_ndttrcp1
355#elif defined key_traldf_c1d
356          ahtt_tm  (:)           = ahtt_tm  (:,:)         + ahtt(:)
357          ahtu_tm  (:)           = ahtu_tm  (:,:)         + ahtu(:)
358          ahtv_tm  (:)           = ahtv_tm  (:,:)         + ahtv(:)
359          ahtw_tm  (:)           = ahtw_tm  (:,:)         + ahtw(:)
360          !
361          ahtt     (:)           = ahtt_tm  (:)     * r1_ndttrcp1
362          ahtu     (:)           = ahtu_tm  (:)     * r1_ndttrcp1
363          ahtv     (:)           = ahtv_tm  (:)     * r1_ndttrcp1
364          ahtw     (:)           = ahtw_tm  (:)     * r1_ndttrcp1
365#else
366          ahtt_tm                = ahtt_tm                + ahtt
367          ahtu_tm                = ahtu_tm                + ahtu
368          ahtv_tm                = ahtv_tm                + ahtv
369          ahtw_tm                = ahtw_tm                + ahtw
370          !
371          ahtt                   = ahtt_tm          * r1_ndttrcp1
372          ahtu                   = ahtu_tm          * r1_ndttrcp1
373          ahtv                   = ahtv_tm          * r1_ndttrcp1
374          ahtw                   = ahtw_tm          * r1_ndttrcp1
375#endif
376
377#if defined key_traldf_eiv
378# if defined key_traldf_c3d
379          aeiu_tm  (:,:,:)       = aeiu_tm  (:,:,:)       + aeiu(:,:,:)         * e3u_temp(:,:,:)
380          aeiv_tm  (:,:,:)       = aeiv_tm  (:,:,:)       + aeiv(:,:,:)         * e3v_temp(:,:,:)
381          aeiw_tm  (:,:,:)       = aeiw_tm  (:,:,:)       + aeiw(:,:,:)         * e3w_temp(:,:,:)
382          !
383          aeiu     (:,:,:)       = aeiu_tm  (:,:,:) * r1_ndttrcp1  / fse3u(:,:,:)
384          aeiv     (:,:,:)       = aeiv_tm  (:,:,:) * r1_ndttrcp1  / fse3v(:,:,:)
385          aeiw     (:,:,:)       = aeiw_tm  (:,:,:) * r1_ndttrcp1  / fse3w(:,:,:)
386# elif defined key_traldf_c2d
387          aeiu_tm  (:,:)         = aeiu_tm  (:,:)         + aeiu(:,:)
388          aeiv_tm  (:,:)         = aeiv_tm  (:,:)         + aeiv(:,:)
389          aeiw_tm  (:,:)         = aeiw_tm  (:,:)         + aeiw(:,:)
390          !
391          aeiu     (:,:)         = aeiu_tm  (:,:)   * r1_ndttrcp1
392          aeiv     (:,:)         = aeiv_tm  (:,:)   * r1_ndttrcp1
393          aeiw     (:,:)         = aeiw_tm  (:,:)   * r1_ndttrcp1
394# elif defined key_traldf_c1d
395          aeiu_tm  (:)           = aeiu_tm  (:,:)         + aeiu(:)
396          aeiv_tm  (:)           = aeiv_tm  (:,:)         + aeiv(:)
397          aeiw_tm  (:)           = aeiw_tm  (:,:)         + aeiw(:)
398          !
399          aeiu     (:)           = aeiu_tm  (:)     * r1_ndttrcp1
400          aeiv     (:)           = aeiv_tm  (:)     * r1_ndttrcp1
401          aeiw     (:)           = aeiw_tm  (:)     * r1_ndttrcp1
402# else
403          aeiu_tm                = aeiu_tm                + aeiu
404          aeiv_tm                = aeiv_tm                + aeiv
405          aeiw_tm                = aeiw_tm                + aeiw
406          !
407          aeiu                   = aeiu_tm          * r1_ndttrcp1
408          aeiv                   = aeiv_tm          * r1_ndttrcp1
409          aeiw                   = aeiw_tm          * r1_ndttrcp1
410# endif
411#endif
412
413         CALL lbc_lnk( sshn  (:,:)         , 'T', 1. ) 
414         CALL lbc_lnk( sshu_n(:,:)         , 'U', 1. ) 
415         CALL lbc_lnk( sshv_n(:,:)         , 'V', 1. ) 
416         CALL lbc_lnk( sshf_n(:,:)         , 'F', 1. ) 
417         CALL lbc_lnk( sshb  (:,:)         , 'T', 1. ) 
418         CALL lbc_lnk( sshu_b(:,:)         , 'U', 1. ) 
419         CALL lbc_lnk( sshv_b(:,:)         , 'V', 1. ) 
420         CALL lbc_lnk( ssha  (:,:)         , 'T', 1. ) 
421         CALL lbc_lnk( sshu_a(:,:)         , 'U', 1. ) 
422         CALL lbc_lnk( sshv_a(:,:)         , 'V', 1. ) 
423         CALL lbc_lnk( rnf   (:,:)         , 'T', 1. ) 
424         CALL lbc_lnk( h_rnf (:,:)         , 'T', 1. ) 
425         CALL lbc_lnk( rotn  (:,:,:)       , 'F', 1. ) 
426         CALL lbc_lnk( hdivn (:,:,:)       , 'T', 1. ) 
427         CALL lbc_lnk( rotb  (:,:,:)       , 'F', 1. ) 
428         CALL lbc_lnk( hdivb (:,:,:)       , 'T', 1. ) 
429         CALL lbc_lnk( un    (:,:,:)       , 'U', 1. ) 
430         CALL lbc_lnk( vn    (:,:,:)       , 'V', 1. ) 
431         CALL lbc_lnk( wn    (:,:,:)       , 'V', 1. ) 
432         CALL lbc_lnk( tsn   (:,:,:,jp_tem), 'T', 1. ) 
433         CALL lbc_lnk( tsn   (:,:,:,jp_sal), 'T', 1. ) 
434         CALL lbc_lnk( avt   (:,:,:)       , 'W', 1. ) 
435         CALL lbc_lnk( hmld  (:,:)         , 'T', 1. ) 
436         CALL lbc_lnk( qsr   (:,:)         , 'T', 1. ) 
437         CALL lbc_lnk( wndm  (:,:)         , 'T', 1. ) 
438         CALL lbc_lnk( emp   (:,:)         , 'T', 1. ) 
439         CALL lbc_lnk( emp_b (:,:)         , 'T', 1. ) 
440         CALL lbc_lnk( emps  (:,:)         , 'T', 1. ) 
441#if defined key_traldf_c3d
442         CALL lbc_lnk( ahtt  (:,:,:)       , 'T', 1. ) 
443         CALL lbc_lnk( ahtu  (:,:,:)       , 'U', 1. ) 
444         CALL lbc_lnk( ahtv  (:,:,:)       , 'V', 1. ) 
445         CALL lbc_lnk( ahtw  (:,:,:)       , 'W', 1. ) 
446#elif defined key_traldf_c2d
447         CALL lbc_lnk( ahtt  (:,:)         , 'T', 1. ) 
448         CALL lbc_lnk( ahtu  (:,:)         , 'U', 1. ) 
449         CALL lbc_lnk( ahtv  (:,:)         , 'V', 1. ) 
450         CALL lbc_lnk( ahtw  (:,:)         , 'W', 1. ) 
451#endif
452# if defined key_zdfddm
453          CALL lbc_lnk( avs  (:,:,:)       , 'W', 1. ) 
454# endif
455#if defined key_traldf_eiv
456#if defined key_traldf_c3d
457         CALL lbc_lnk( aeiu  (:,:,:)       , 'U', 1. ) 
458         CALL lbc_lnk( aeiv  (:,:,:)       , 'V', 1. ) 
459         CALL lbc_lnk( aeiw  (:,:,:)       , 'W', 1. ) 
460#elif defined key_traldf_c2d
461         CALL lbc_lnk( aeiu  (:,:)         , 'U', 1. ) 
462         CALL lbc_lnk( aeiv  (:,:)         , 'V', 1. ) 
463         CALL lbc_lnk( aeiw  (:,:)         , 'W', 1. ) 
464#endif
465#endif
466#if defined key_ldfslp
467         CALL lbc_lnk( uslp  (:,:,:)       , 'U', 1. ) 
468         CALL lbc_lnk( vslp  (:,:,:)       , 'V', 1. ) 
469         CALL lbc_lnk( wslpi (:,:,:)       , 'W', 1. ) 
470         CALL lbc_lnk( wslpj (:,:,:)       , 'W', 1. ) 
471#endif
472         CALL lbc_lnk( hu    (:,:)         , 'U', 1. ) 
473         CALL lbc_lnk( hv    (:,:)         , 'V', 1. ) 
474         CALL lbc_lnk( hur   (:,:)         , 'U', 1. ) 
475         CALL lbc_lnk( hvr   (:,:)         , 'V', 1. ) 
476         !
477         CALL trc_sub_ssh( kt )         ! after ssh & vertical velocity
478         !
479      ENDIF
480
481
482   END SUBROUTINE trc_sub_stp
483
484   SUBROUTINE trc_sub_ini
485      !!-------------------------------------------------------------------
486      !!                     ***  ROUTINE trc_sub_ini  ***
487      !!                     
488      !! ** Purpose : Initialize variables needed for sub-stepping passive tracers
489      !!
490      !! ** Method  :
491      !!              Compute the averages for sub-stepping
492      !!-------------------------------------------------------------------
493      INTEGER ::   ierr
494      !!-------------------------------------------------------------------
495
496      IF(lwp) WRITE(numout,*)
497      IF(lwp) WRITE(numout,*) 'trc_sub_ini : initial set up of the passive tracers substepping'
498      IF(lwp) WRITE(numout,*) '~~~~~~~'
499
500      ierr =  trc_sub_alloc    ()
501      IF( lk_mpp    )   CALL mpp_sum( ierr )
502      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'top_sub_alloc : unable to allocate standard ocean arrays' )
503
504      un_tm   (:,:,:)        = un   (:,:,:)        * fse3u(:,:,:) 
505      vn_tm   (:,:,:)        = vn   (:,:,:)        * fse3v(:,:,:) 
506      wn_tm   (:,:,:)        = wn   (:,:,:)        * fse3w(:,:,:) 
507      tsn_tm  (:,:,:,jp_tem) = tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
508      tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
509      avt_tm  (:,:,:)        = avt  (:,:,:)        * fse3w(:,:,:) 
510# if defined key_zdfddm
511      avs_tm  (:,:,:)        = avs  (:,:,:)        * fse3w(:,:,:) 
512# endif
513#if defined key_ldfslp
514      wslpi_tm(:,:,:)        = wslpi(:,:,:)        * fse3w(:,:,:) 
515      wslpj_tm(:,:,:)        = wslpj(:,:,:)        * fse3w(:,:,:) 
516      uslp_tm (:,:,:)        = uslp (:,:,:)        * fse3u(:,:,:) 
517      vslp_tm (:,:,:)        = vslp (:,:,:)        * fse3v(:,:,:) 
518#endif
519
520      ! Physics variables that are set after initialization:
521      emp_tm (:,:) = 0.
522      emps_tm(:,:) = 0.
523      qsr_tm (:,:) = 0.
524      wndm_tm(:,:) = 0.
525      !
526      sshn_tm  (:,:) = sshn  (:,:) 
527      sshu_n_tm(:,:) = sshu_n(:,:) 
528      sshv_n_tm(:,:) = sshv_n(:,:) 
529      rnf_tm   (:,:) = rnf   (:,:) 
530      h_rnf_tm (:,:) = h_rnf (:,:) 
531      hmld_tm  (:,:) = hmld  (:,:)
532      fr_i_tm  (:,:) = fr_i  (:,:)
533      !
534#if defined key_traldf_c3d
535      ahtt_tm(:,:,:) = ahtt(:,:,:) * fse3t(:,:,:)
536      ahtu_tm(:,:,:) = ahtu(:,:,:) * fse3u(:,:,:)
537      ahtv_tm(:,:,:) = ahtv(:,:,:) * fse3v(:,:,:)
538      ahtw_tm(:,:,:) = ahtw(:,:,:) * fse3w(:,:,:)
539#elif defined key_traldf_c2d
540      ahtt_tm(:,:)   = ahtt(:,:)
541      ahtu_tm(:,:)   = ahtu(:,:)
542      ahtv_tm(:,:)   = ahtv(:,:)
543      ahtw_tm(:,:)   = ahtw(:,:)
544#elif defined key_traldf_c1d
545      ahtt_tm(:)     = ahtt(:)
546      ahtu_tm(:)     = ahtu(:)
547      ahtv_tm(:)     = ahtv(:)
548      ahtw_tm(:)     = ahtw(:)
549#else
550      ahtt_tm        = ahtt
551      ahtu_tm        = ahtu
552      ahtv_tm        = ahtv
553      ahtw_tm        = ahtw
554#endif
555      !
556#if defined key_traldf_eiv
557#  if defined key_traldf_c3d
558      aeiu_tm(:,:,:) = aeiu(:,:,:) * fse3u(:,:,:)
559      aeiv_tm(:,:,:) = aeiv(:,:,:) * fse3v(:,:,:)
560      aeiw_tm(:,:,:) = aeiw(:,:,:) * fse3w(:,:,:)
561#  elif defined key_traldf_c2d
562      aeiu_tm(:,:)   = aeiu(:,:)
563      aeiv_tm(:,:)   = aeiv(:,:)
564      aeiw_tm(:,:)   = aeiw(:,:)
565#  elif defined key_traldf_c1d
566      aeiu_tm(:)     = aeiu(:)
567      aeiv_tm(:)     = aeiv(:)
568      aeiw_tm(:)     = aeiw(:)
569#  else
570      aeiu_tm        = aeiu
571      aeiv_tm        = aeiv
572      aeiw_tm        = aeiw
573#  endif
574#endif
575      !
576   END SUBROUTINE trc_sub_ini
577
578   SUBROUTINE trc_sub_reset( kt )
579      !!-------------------------------------------------------------------
580      !!                     ***  ROUTINE trc_sub_reset  ***
581      !!                     
582      !! ** Purpose : Reset physics variables averaged for substepping
583      !!
584      !! ** Method  :
585      !!              Compute the averages for sub-stepping
586      !!-------------------------------------------------------------------
587      INTEGER, INTENT( in ) ::  kt  ! ocean time-step index
588      INTEGER :: jk                 ! dummy loop indices
589      !!-------------------------------------------------------------------
590
591      !   restore physics variables
592      avt   (:,:,:)   =  avt_temp   (:,:,:)
593      un    (:,:,:)   =  un_temp    (:,:,:)
594      vn    (:,:,:)   =  vn_temp    (:,:,:)
595      wn    (:,:,:)   =  wn_temp    (:,:,:)
596      sshn  (:,:)     =  sshn_temp  (:,:)
597      sshb  (:,:)     =  sshb_temp  (:,:)
598      ssha  (:,:)     =  ssha_temp  (:,:)
599      sshu_n(:,:)     =  sshu_n_temp(:,:)
600      sshu_b(:,:)     =  sshu_b_temp(:,:)
601      sshu_a(:,:)     =  sshu_a_temp(:,:)
602      sshv_n(:,:)     =  sshv_n_temp(:,:)
603      sshv_b(:,:)     =  sshv_b_temp(:,:)
604      sshv_a(:,:)     =  sshv_a_temp(:,:)
605      sshf_n(:,:)     =  sshf_n_temp(:,:)
606#if defined key_ldfslp
607      wslpi (:,:,:)   =  wslpi_temp (:,:,:)
608      wslpj (:,:,:)   =  wslpj_temp (:,:,:)
609      uslp  (:,:,:)   =  uslp_temp  (:,:,:)
610      vslp  (:,:,:)   =  vslp_temp  (:,:,:)
611#endif
612      rnf   (:,:)     =  rnf_temp   (:,:)
613      h_rnf (:,:)     =  h_rnf_temp (:,:)
614      hdivn (:,:,:)   =  hdivn_temp (:,:,:)
615      rotn  (:,:,:)   =  rotn_temp  (:,:,:)
616      hdivb (:,:,:)   =  hdivb_temp (:,:,:)
617      rotb  (:,:,:)   =  rotb_temp  (:,:,:)
618      hu    (:,:)     =  hu_temp    (:,:)
619      hv    (:,:)     =  hv_temp    (:,:)
620      hur   (:,:)     =  hur_temp   (:,:)
621      hvr   (:,:)     =  hvr_temp   (:,:)
622      !
623      tsn   (:,:,:,:) =  tsn_temp   (:,:,:,:)
624# if defined key_zdfddm
625      avs   (:,:,:)   =  avs_temp   (:,:,:)
626# endif
627      hmld  (:,:)     =  hmld_temp  (:,:)
628      qsr   (:,:)     =  qsr_temp   (:,:)
629      fr_i  (:,:)     =  fr_i_temp  (:,:)
630      wndm  (:,:)     =  wndm_temp  (:,:)
631      emp   (:,:)     =  emp_temp   (:,:)
632      emps  (:,:)     =  emps_temp  (:,:)
633      emp_b (:,:)     =  emp_b_temp (:,:)
634      !
635#if defined key_traldf_c3d
636      ahtu  (:,:,:)   =  ahtu_temp  (:,:,:)
637      ahtv  (:,:,:)   =  ahtv_temp  (:,:,:)
638      ahtw  (:,:,:)   =  ahtw_temp  (:,:,:)
639      ahtt  (:,:,:)   =  ahtt_temp  (:,:,:)
640#elif defined key_traldf_c2d
641      ahtu  (:,:)     =  ahtu_temp  (:,:)
642      ahtv  (:,:)     =  ahtv_temp  (:,:)
643      ahtw  (:,:)     =  ahtw_temp  (:,:)
644      ahtt  (:,:)     =  ahtt_temp  (:,:)
645#elif defined key_traldf_c1d
646      ahtu  (:)       =  ahtu_temp  (:)
647      ahtv  (:)       =  ahtv_temp  (:)
648      ahtw  (:)       =  ahtw_temp  (:)
649      ahtt  (:)       =  ahtt_temp  (:)
650#else
651      ahtu            =  ahtu_temp
652      ahtv            =  ahtv_temp
653      ahtw            =  ahtw_temp
654      ahtt            =  ahtt_temp
655#endif
656      !
657#if defined key_traldf_eiv
658#if defined key_traldf_c3d
659      aeiu  (:,:,:)  =  aeiu_temp(:,:,:)
660      aeiv  (:,:,:)  =  aeiv_temp(:,:,:)
661      aeiw  (:,:,:)  =  aeiw_temp(:,:,:)
662#elif defined key_traldf_c2d
663      aeiu  (:,:)    =  aeiu_temp(:,:)
664      aeiv  (:,:)    =  aeiv_temp(:,:)
665      aeiw  (:,:)    =  aeiw_temp(:,:)
666#elif defined key_traldf_c1d
667      aeiu  (:)      =  aeiu_temp(:)
668      aeiv  (:)      =  aeiv_temp(:)
669      aeiw  (:)      =  aeiw_temp(:)
670#else
671      aeiu           =  aeiu_temp
672      aeiv           =  aeiv_temp
673      aeiw           =  aeiw_temp
674#endif
675#endif 
676      !                                     
677      DO jk = 1, jpk
678         fse3t(:,:,jk)= e3t_temp(:,:,jk) 
679         fse3u(:,:,jk)= e3u_temp(:,:,jk) 
680         fse3v(:,:,jk)= e3v_temp(:,:,jk) 
681         fse3w(:,:,jk)= e3w_temp(:,:,jk) 
682      END DO
683      !                                           !------------------------------!
684      IF( lk_vvl ) THEN                           !  Update Now Vertical coord.  !   (only in vvl case)
685        !                                           !------------------------------!
686         DO jk = 1, jpkm1
687            fsdept(:,:,jk) = fsdept_n(:,:,jk)          ! now local depths stored in fsdep. arrays
688            fsdepw(:,:,jk) = fsdepw_n(:,:,jk)
689            fsde3w(:,:,jk) = fsde3w_n(:,:,jk)
690            !
691            fse3t (:,:,jk) = fse3t_n (:,:,jk)          ! vertical scale factors stored in fse3. arrays
692            fse3u (:,:,jk) = fse3u_n (:,:,jk)
693            fse3v (:,:,jk) = fse3v_n (:,:,jk)
694            fse3f (:,:,jk) = fse3f_n (:,:,jk)
695            fse3w (:,:,jk) = fse3w_n (:,:,jk)
696            fse3uw(:,:,jk) = fse3uw_n(:,:,jk)
697            fse3vw(:,:,jk) = fse3vw_n(:,:,jk)
698         END DO
699         !
700      ENDIF
701
702      ! Start new averages
703      DO jk = 1, jpk
704         un_tm   (:,:,jk)        = un   (:,:,jk)        * fse3u(:,:,jk) 
705         vn_tm   (:,:,jk)        = vn   (:,:,jk)        * fse3v(:,:,jk) 
706         wn_tm   (:,:,jk)        = wn   (:,:,jk)        * fse3w(:,:,jk) 
707         tsn_tm  (:,:,jk,jp_tem) = tsn  (:,:,jk,jp_tem) * fse3t(:,:,jk) 
708         tsn_tm  (:,:,jk,jp_sal) = tsn  (:,:,jk,jp_sal) * fse3t(:,:,jk) 
709         avt_tm  (:,:,jk)        = avt  (:,:,jk)        * fse3w(:,:,jk) 
710# if defined key_zdfddm
711         avs_tm  (:,:,jk)        = avs  (:,:,jk)        * fse3w(:,:,jk) 
712# endif
713#if defined key_ldfslp
714         wslpi_tm(:,:,jk)        = wslpi(:,:,jk)        * fse3w(:,:,jk) 
715         wslpj_tm(:,:,jk)        = wslpj(:,:,jk)        * fse3w(:,:,jk) 
716         uslp_tm (:,:,jk)        = uslp (:,:,jk)        * fse3u(:,:,jk) 
717         vslp_tm (:,:,jk)        = vslp (:,:,jk)        * fse3v(:,:,jk) 
718#endif
719      END DO
720      !
721      sshn_tm    (:,:) = sshn  (:,:) 
722      sshu_n_tm  (:,:) = sshu_n(:,:) 
723      sshv_n_tm  (:,:) = sshv_n(:,:) 
724      rnf_tm     (:,:) = rnf   (:,:) 
725      h_rnf_tm   (:,:) = h_rnf (:,:) 
726      hmld_tm    (:,:) = hmld  (:,:)
727      fr_i_tm    (:,:) = fr_i  (:,:)
728      sshb_hold  (:,:) = sshn  (:,:)
729      sshu_b_hold(:,:) = sshu_n(:,:)
730      sshv_b_hold(:,:) = sshv_n(:,:)
731      emp_b_hold (:,:) = emp   (:,:)
732      emp_tm     (:,:) = emp   (:,:)
733      emps_tm    (:,:) = emps  (:,:)
734      qsr_tm     (:,:) = qsr   (:,:)
735      wndm_tm    (:,:) = wndm  (:,:)
736      !
737#if defined key_traldf_c3d
738      DO jk = 1, jpkm1
739         ahtt_tm(:,:,jk) = ahtt(:,:,jk) * fse3t(:,:,jk)
740         ahtu_tm(:,:,jk) = ahtu(:,:,jk) * fse3u(:,:,jk)
741         ahtv_tm(:,:,jk) = ahtv(:,:,jk) * fse3v(:,:,jk)
742         ahtw_tm(:,:,jk) = ahtw(:,:,jk) * fse3w(:,:,jk)
743      END DO
744#elif defined key_traldf_c2d
745      ahtt_tm(:,:)   = ahtt(:,:)
746      ahtu_tm(:,:)   = ahtu(:,:)
747      ahtv_tm(:,:)   = ahtv(:,:)
748      ahtw_tm(:,:)   = ahtw(:,:)
749#elif defined key_traldf_c1d
750      ahtt_tm(:)     = ahtt(:)
751      ahtu_tm(:)     = ahtu(:)
752      ahtv_tm(:)     = ahtv(:)
753      ahtw_tm(:)     = ahtw(:)
754#else
755      ahtt_tm        = ahtt
756      ahtu_tm        = ahtu
757      ahtv_tm        = ahtv
758      ahtw_tm        = ahtw
759#endif
760      !
761#if defined key_traldf_eiv
762#  if defined key_traldf_c3d
763      DO jk = 1, jpk
764         aeiu_tm(:,:,jk) = aeiu(:,:,jk) * fse3u(:,:,jk)
765         aeiv_tm(:,:,jk) = aeiv(:,:,jk) * fse3v(:,:,jk)
766         aeiw_tm(:,:,jk) = aeiw(:,:,jk) * fse3w(:,:,jk)
767      END DO
768#  elif defined key_traldf_c2d
769      aeiu_tm(:,:)   = aeiu(:,:)
770      aeiv_tm(:,:)   = aeiv(:,:)
771      aeiw_tm(:,:)   = aeiw(:,:)
772#  elif defined key_traldf_c1d
773      aeiu_tm(:)     = aeiu(:)
774      aeiv_tm(:)     = aeiv(:)
775      aeiw_tm(:)     = aeiw(:)
776#  else
777      aeiu_tm        = aeiu
778      aeiv_tm        = aeiv
779      aeiw_tm        = aeiw
780#  endif
781#endif
782      !
783   END SUBROUTINE trc_sub_reset
784
785
786   SUBROUTINE trc_sub_ssh( kt ) 
787      !!----------------------------------------------------------------------
788      !!                ***  ROUTINE trc_sub_ssh  ***
789      !!                   
790      !! ** Purpose :   compute the after ssh (ssha), the now vertical velocity
791      !!              and update the now vertical coordinate (lk_vvl=T).
792      !!
793      !! ** Method  : - Using the incompressibility hypothesis, the vertical
794      !!      velocity is computed by integrating the horizontal divergence 
795      !!      from the bottom to the surface minus the scale factor evolution.
796      !!        The boundary conditions are w=0 at the bottom (no flux) and.
797      !!
798      !! ** action  :   ssha    : after sea surface height
799      !!                wn      : now vertical velocity
800      !!                sshu_a, sshv_a, sshf_a  : after sea surface height (lk_vvl=T)
801      !!                hu, hv, hur, hvr        : ocean depth and its inverse at u-,v-points
802      !!
803      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
804      !!----------------------------------------------------------------------
805      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
806      USE wrk_nemo, ONLY:   zhdiv => wrk_2d_1 , z2d => wrk_2d_2   ! 2D workspace
807      USE wrk_nemo, ONLY:   z3d => wrk_3d_10                      ! 3D workspace
808      !
809      INTEGER, INTENT(in) ::   kt   ! time step
810      !
811      INTEGER  ::   ji, jj, jk   ! dummy loop indices
812      REAL(wp) ::   zcoefu, zcoefv, zcoeff, z2dt, z1_2dt, z1_rau0   ! local scalars
813      !!----------------------------------------------------------------------
814
815      IF( wrk_in_use(2, 1,2) .OR. wrk_in_use(3,10) ) THEN
816         CALL ctl_stop('trc_sub_ssh: requested workspace arrays unavailable')   ;   RETURN
817      ENDIF
818
819
820      IF( kt == nittrc000 ) THEN
821         !
822         IF(lwp) WRITE(numout,*)
823         IF(lwp) WRITE(numout,*) 'trc_sub_ssh : after sea surface height and now vertical velocity '
824         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
825         !
826         wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
827         !
828      ENDIF
829
830      !                                           !------------------------------------------!
831      IF( lk_vvl ) THEN                           !  Regridding: Update Now Vertical coord.  !   (only in vvl case)
832         !                                        !------------------------------------------!
833         DO jk = 1, jpkm1
834            fsdept(:,:,jk) = fsdept_n(:,:,jk)         ! now local depths stored in fsdep. arrays
835            fsdepw(:,:,jk) = fsdepw_n(:,:,jk)
836            fsde3w(:,:,jk) = fsde3w_n(:,:,jk)
837            !
838            fse3t (:,:,jk) = fse3t_n (:,:,jk)         ! vertical scale factors stored in fse3. arrays
839            fse3u (:,:,jk) = fse3u_n (:,:,jk)
840            fse3v (:,:,jk) = fse3v_n (:,:,jk)
841            fse3f (:,:,jk) = fse3f_n (:,:,jk)
842            fse3w (:,:,jk) = fse3w_n (:,:,jk)
843            fse3uw(:,:,jk) = fse3uw_n(:,:,jk)
844            fse3vw(:,:,jk) = fse3vw_n(:,:,jk)
845         END DO
846         !
847         hu(:,:) = hu_0(:,:) + sshu_n(:,:)            ! now ocean depth (at u- and v-points)
848         hv(:,:) = hv_0(:,:) + sshv_n(:,:)
849         !                                            ! now masked inverse of the ocean depth (at u- and v-points)
850         hur(:,:) = umask(:,:,1) / ( hu(:,:) + 1._wp - umask(:,:,1) )
851         hvr(:,:) = vmask(:,:,1) / ( hv(:,:) + 1._wp - vmask(:,:,1) )
852         !
853      ENDIF
854      !
855      CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity
856      !
857      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog)
858      IF( neuler == 0 .AND. kt == nittrc000 )   z2dt = rdt
859
860      !                                           !------------------------------!
861      !                                           !   After Sea Surface Height   !
862      !                                           !------------------------------!
863      zhdiv(:,:) = 0._wp
864      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports
865        zhdiv(:,:) = zhdiv(:,:) + fse3t(:,:,jk) * hdivn(:,:,jk)
866      END DO
867      !                                                ! Sea surface elevation time stepping
868      ! In forward Euler time stepping case, the same formulation as in the leap-frog case can be used
869      ! because emp_b field is initialized with the vlaues of emp field. Hence, 0.5 * ( emp + emp_b ) = emp
870      z1_rau0 = 0.5 / rau0
871      ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * tmask(:,:,1)
872
873#if defined key_agrif
874      CALL agrif_ssh( kt )
875#endif
876#if defined key_obc
877      IF( Agrif_Root() ) THEN
878         ssha(:,:) = ssha(:,:) * obctmsk(:,:)
879         CALL lbc_lnk( ssha, 'T', 1. )                 ! absolutly compulsory !! (jmm)
880      ENDIF
881#endif
882#if defined key_bdy
883      ssha(:,:) = ssha(:,:) * bdytmask(:,:)
884      CALL lbc_lnk( ssha, 'T', 1. ) 
885#endif
886
887      !                                                ! Sea Surface Height at u-,v- and f-points (vvl case only)
888      IF( lk_vvl ) THEN                                ! (required only in key_vvl case)
889         DO jj = 1, jpjm1
890            DO ji = 1, jpim1      ! NO Vector Opt.
891               sshu_a(ji,jj) = 0.5  * umask(ji,jj,1) / ( e1u(ji  ,jj) * e2u(ji  ,jj) )                   &
892                  &                                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)     &
893                  &                                    + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) )
894               sshv_a(ji,jj) = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj  ) * e2v(ji,jj  ) )                   &
895                  &                                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )     &
896                  &                                    + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) )
897            END DO
898         END DO
899         CALL lbc_lnk( sshu_a, 'U', 1. )   ;   CALL lbc_lnk( sshv_a, 'V', 1. )      ! Boundaries conditions
900      ENDIF
901     
902
903      !                                           !------------------------------!
904      !                                           !     Now Vertical Velocity    !
905      !                                           !------------------------------!
906      z1_2dt = 1.e0 / z2dt
907      DO jk = jpkm1, 1, -1                             ! integrate from the bottom the hor. divergence
908         ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise
909         wn(:,:,jk) = wn(:,:,jk+1) -   fse3t_n(:,:,jk) * hdivn(:,:,jk)        &
910            &                      - ( fse3t_a(:,:,jk) - fse3t_b(:,:,jk) )    &
911            &                         * tmask(:,:,jk) * z1_2dt
912#if defined key_bdy
913         wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:)
914#endif
915      END DO
916
917      !
918      IF( wrk_not_released(2, 1,2) .OR. wrk_not_released(3, 10) ) THEN
919          CALL ctl_stop('ssh_wzv: failed to release workspace arrays')
920      ENDIF
921      !
922   END SUBROUTINE trc_sub_ssh
923
924   INTEGER FUNCTION trc_sub_alloc()
925      !!-------------------------------------------------------------------
926      !!                    *** ROUTINE trc_sub_alloc ***
927      !!-------------------------------------------------------------------
928      USE lib_mpp, ONLY: ctl_warn
929      INTEGER ::  ierr
930      !!-------------------------------------------------------------------
931      !
932      ALLOCATE( un_temp(jpi,jpj,jpk)        ,  vn_temp(jpi,jpj,jpk)  ,   &
933         &      wn_temp(jpi,jpj,jpk)        ,  avt_temp(jpi,jpj,jpk) ,   &
934         &      sshn_temp(jpi,jpj)          ,  sshb_temp(jpi,jpj) ,      &
935         &      ssha_temp(jpi,jpj)          ,  sshu_a_temp(jpi,jpj),     &
936         &      sshu_n_temp(jpi,jpj)        ,  sshu_b_temp(jpi,jpj),     &
937         &      sshv_n_temp(jpi,jpj)        ,  sshv_b_temp(jpi,jpj),     &
938         &      sshv_a_temp(jpi,jpj)        ,  sshf_a_temp(jpi,jpj),     &
939         &      sshf_n_temp(jpi,jpj)        ,  sshf_b_temp(jpi,jpj),     &
940         &      e3t_temp(jpi,jpj,jpk)       ,  e3u_temp(jpi,jpj,jpk),    &
941         &      e3v_temp(jpi,jpj,jpk)       ,  e3w_temp(jpi,jpj,jpk),    &
942#if defined key_ldfslp
943         &      wslpi_temp(jpi,jpj,jpk)     ,  wslpj_temp(jpi,jpj,jpk),  &
944         &      uslp_temp(jpi,jpj,jpk)      ,  vslp_temp(jpi,jpj,jpk),   &
945#endif
946         &      rnf_temp(jpi,jpj)           ,  h_rnf_temp(jpi,jpj) ,     &
947         &      tsn_temp(jpi,jpj,jpk,2)     ,                            &
948         &      emp_temp(jpi,jpj)           ,  emps_temp(jpi,jpj) ,      &
949         &      hmld_temp(jpi,jpj)          ,  qsr_temp(jpi,jpj) ,       &
950         &      fr_i_temp(jpi,jpj)          ,  fr_i_tm(jpi,jpj) ,        &
951         &      wndm_temp(jpi,jpj)          ,  wndm_tm(jpi,jpj) ,        &
952# if defined key_zdfddm
953         &      avt_tm(jpi,jpj,jpk)         ,  avt_temp(jpi,jpj,jpk) ,   &
954# endif
955#if defined key_traldf_c3d
956         &      ahtt_tm(jpi,jpj,jpk)        ,  ahtt_temp(jpi,jpj,jpk),   &
957         &      ahtu_tm(jpi,jpj,jpk)        ,  ahtu_temp(jpi,jpj,jpk),   &
958         &      ahtv_tm(jpi,jpj,jpk)        ,  ahtv_temp(jpi,jpj,jpk),   &
959         &      ahtw_tm(jpi,jpj,jpk)        ,  ahtw_temp(jpi,jpj,jpk),   &
960#elif defined key_traldf_c2d
961         &      ahtt_tm(jpi,jpj)            ,  ahtt_temp(jpi,jpj),       &
962         &      ahtu_tm(jpi,jpj)            ,  ahtu_temp(jpi,jpj),       &
963         &      ahtv_tm(jpi,jpj)            ,  ahtv_temp(jpi,jpj),       &
964         &      ahtw_tm(jpi,jpj)            ,  ahtw_temp(jpi,jpj),       &
965#elif defined key_traldf_c1d
966         &      ahtt_tm(jpk)                ,  ahtt_temp(jpk),           &
967         &      ahtu_tm(jpk)                ,  ahtu_temp(jpk),           &
968         &      ahtv_tm(jpk)                ,  ahtv_temp(jpk),           &
969         &      ahtw_tm(jpk)                ,  ahtw_temp(jpk),           &
970#endif
971#if defined key_traldf_eiv
972# if defined key_traldf_c3d
973         &      aeiu_tm(jpi,jpj,jpk)        ,  aeiu_temp(jpi,jpj,jpk),   &
974         &      aeiv_tm(jpi,jpj,jpk)        ,  aeiv_temp(jpi,jpj,jpk),   &
975         &      aeiw_tm(jpi,jpj,jpk)        ,  aeiw_temp(jpi,jpj,jpk),   &
976# elif defined key_traldf_c2d
977         &      aeiu_tm(jpi,jpj)            ,  aeiu_temp(jpi,jpj),       &
978         &      aeiv_tm(jpi,jpj)            ,  aeiv_temp(jpi,jpj),       &
979         &      aeiw_tm(jpi,jpj)            ,  aeiw_temp(jpi,jpj),       &
980# elif defined key_traldf_c1d
981         &      aeiu_tm(jpk)                ,  aeiu_temp(jpk),           &
982         &      aeiv_tm(jpk)                ,  aeiv_temp(jpk),           &
983         &      aeiw_tm(jpk)                ,  aeiw_temp(jpk),           &
984# endif
985# endif
986         &      hdivn_temp(jpi,jpj,jpk)     ,  hdivb_temp(jpi,jpj,jpk),  &
987         &      rotn_temp(jpi,jpj,jpk)      ,  rotb_temp(jpi,jpj,jpk),   &
988         &      hu_temp(jpi,jpj)            ,  hv_temp(jpi,jpj),         &
989         &      hur_temp(jpi,jpj)           ,  hvr_temp(jpi,jpj),        &
990         &      un_tm(jpi,jpj,jpk)          ,  vn_tm(jpi,jpj,jpk)  ,     &
991         &      wn_tm(jpi,jpj,jpk)          ,  avt_tm(jpi,jpj,jpk) ,     &
992         &      sshn_tm(jpi,jpj)            ,  sshb_hold(jpi,jpj) ,      &
993         &      sshu_n_tm(jpi,jpj)          ,  sshu_b_hold(jpi,jpj),     &
994         &      sshv_n_tm(jpi,jpj)          ,  sshv_b_hold(jpi,jpj),     &
995         &      tsn_tm(jpi,jpj,jpk,2)       ,                            &
996         &      emp_tm(jpi,jpj)             ,  emps_tm(jpi,jpj) ,        &
997         &      emp_b_hold(jpi,jpj)         ,                            &
998         &      hmld_tm(jpi,jpj)            ,  qsr_tm(jpi,jpj) ,         &
999#if defined key_ldfslp
1000         &      wslpi_tm(jpi,jpj,jpk)       ,  wslpj_tm(jpi,jpj,jpk),    &
1001         &      uslp_tm(jpi,jpj,jpk)        ,  vslp_tm(jpi,jpj,jpk),     &
1002#endif
1003         &      rnf_tm(jpi,jpj)             ,  h_rnf_tm(jpi,jpj) ,       &
1004         &                                    STAT=trc_sub_alloc ) 
1005      IF( trc_sub_alloc /= 0 )   CALL ctl_warn('trc_sub_alloc: failed to allocate arrays')
1006
1007      !
1008   END FUNCTION trc_sub_alloc
1009
1010#else
1011   !!----------------------------------------------------------------------
1012   !!   Default key                                     NO passive tracers
1013   !!----------------------------------------------------------------------
1014CONTAINS
1015   SUBROUTINE trc_sub_stp( kt )        ! Empty routine
1016      WRITE(*,*) 'trc_sub_stp: You should not have seen this print! error?', kt
1017   END SUBROUTINE trc_sub_stp
1018   SUBROUTINE trc_sub_ini        ! Empty routine
1019      WRITE(*,*) 'trc_sub_ini: You should not have seen this print! error?', kt
1020   END SUBROUTINE trc_sub_ini
1021
1022#endif
1023
1024   !!======================================================================
1025END MODULE trcsub
Note: See TracBrowser for help on using the repository browser.