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/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC – NEMO

source: branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/trcsub.F90 @ 6772

Last change on this file since 6772 was 6772, checked in by cbricaud, 8 years ago

clean in coarsening branch

  • Property svn:keywords set to Id
File size: 27.2 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, ONLY : jpnf90
16   USE iom_def, ONLY : jprstlib
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 divcur, ONLY : div_cur           ! hor. divergence and curl      (div & cur routines)
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   !!* 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$
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( nn_timing == 1 )  CALL timing_start('trc_sub_stp')
70      !
71      IF( kt == nit000 ) THEN
72           IF(lwp) WRITE(numout,*)
73           IF(lwp) WRITE(numout,*) 'trc_sub_stp : substepping of the passive tracers'
74           IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
75           !
76           sshb_hold  (:,:) = sshn  (:,:)
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          tsn_tm  (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
89          tsn_tm  (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
90          rhop_tm (:,:,:)        = rhop_tm (:,:,:)        + rhop (:,:,:)        * 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(:,:,:)
97          wslpj_tm(:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:)
98          uslp_tm (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:)
99          vslp_tm (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:)
100#endif
101# if defined key_trabbl
102          IF( nn_bbl_ldf == 1 ) THEN
103             ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:) 
104             ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:) 
105          ENDIF
106          IF( nn_bbl_adv == 1 ) THEN
107             utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:) 
108             vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:) 
109          ENDIF
110# endif
111          !
112          sshn_tm  (:,:)         = sshn_tm  (:,:)         + sshn  (:,:) 
113          IF( ln_rnf )THEN
114             rnf_tm   (:,:)         = rnf_tm   (:,:)         + rnf   (:,:) 
115             h_rnf_tm (:,:)         = h_rnf_tm (:,:)         + h_rnf (:,:) 
116          ENDIF
117          hmld_tm  (:,:)         = hmld_tm  (:,:)         + hmld  (:,:)
118          fr_i_tm  (:,:)         = fr_i_tm  (:,:)         + fr_i  (:,:)
119          emp_tm   (:,:)         = emp_tm   (:,:)         + emp   (:,:) 
120          fmmflx_tm(:,:)         = fmmflx_tm(:,:)         + fmmflx(:,:)
121          qsr_tm   (:,:)         = qsr_tm   (:,:)         + qsr   (:,:)
122          wndm_tm  (:,:)         = wndm_tm  (:,:)         + wndm  (:,:)
123
124      ELSE                           !  It is time to substep
125         !   1. set temporary arrays to hold physics variables
126         un_temp    (:,:,:)      = un    (:,:,:)
127         vn_temp    (:,:,:)      = vn    (:,:,:)
128         wn_temp    (:,:,:)      = wn    (:,:,:)
129         tsn_temp   (:,:,:,:)    = tsn   (:,:,:,:)
130         rhop_temp  (:,:,:)      = rhop  (:,:,:)   
131         avt_temp   (:,:,:)      = avt   (:,:,:)
132# if defined key_zdfddm
133         avs_temp   (:,:,:)      = avs   (:,:,:)
134# endif
135#if defined key_ldfslp
136         wslpi_temp (:,:,:)      = wslpi (:,:,:)
137         wslpj_temp (:,:,:)      = wslpj (:,:,:)
138         uslp_temp  (:,:,:)      = uslp  (:,:,:)
139         vslp_temp  (:,:,:)      = vslp  (:,:,:)
140#endif
141# if defined key_trabbl
142          IF( nn_bbl_ldf == 1 ) THEN
143             ahu_bbl_temp(:,:)   = ahu_bbl(:,:) 
144             ahv_bbl_temp(:,:)   = ahv_bbl(:,:) 
145          ENDIF
146          IF( nn_bbl_adv == 1 ) THEN
147             utr_bbl_temp(:,:)   = utr_bbl(:,:) 
148             vtr_bbl_temp(:,:)   = vtr_bbl(:,:) 
149          ENDIF
150# endif
151         sshn_temp  (:,:)        = sshn  (:,:)
152         sshb_temp  (:,:)        = sshb  (:,:)
153         ssha_temp  (:,:)        = ssha  (:,:)
154         rnf_temp   (:,:)        = rnf   (:,:)
155         IF( ln_rnf )THEN
156            h_rnf_temp (:,:)        = h_rnf (:,:)
157            hmld_temp  (:,:)        = hmld  (:,:)
158         ENDIF
159         fr_i_temp  (:,:)        = fr_i  (:,:)
160         emp_temp   (:,:)        = emp   (:,:)
161         emp_b_temp (:,:)        = emp_b (:,:)
162         fmmflx_temp(:,:)        = fmmflx(:,:)
163         qsr_temp   (:,:)        = qsr   (:,:)
164         wndm_temp  (:,:)        = wndm  (:,:)
165         !                                    !  Variables reset in trc_sub_ssh
166#if ! defined key_crs
167         rotn_temp  (:,:,:)      = rotn  (:,:,:)
168# endif
169         hdivn_temp (:,:,:)      = hdivn (:,:,:)
170#if ! defined key_crs
171         rotb_temp  (:,:,:)      = rotb  (:,:,:)
172# endif
173         hdivb_temp (:,:,:)      = hdivb (:,:,:)
174         !
175         ! 2. Create averages and reassign variables
176         un_tm    (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * fse3u(:,:,:) 
177         vn_tm    (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * fse3v(:,:,:) 
178         tsn_tm   (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
179         tsn_tm   (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
180         rhop_tm (:,:,:)         = rhop_tm (:,:,:)        + rhop (:,:,:)        * fse3t(:,:,:) 
181         avt_tm   (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:)        * fse3w(:,:,:) 
182# if defined key_zdfddm
183         avs_tm   (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * fse3w(:,:,:) 
184# endif
185#if defined key_ldfslp
186         wslpi_tm (:,:,:)        = wslpi_tm(:,:,:)        + wslpi(:,:,:) 
187         wslpj_tm (:,:,:)        = wslpj_tm(:,:,:)        + wslpj(:,:,:) 
188         uslp_tm  (:,:,:)        = uslp_tm (:,:,:)        + uslp (:,:,:) 
189         vslp_tm  (:,:,:)        = vslp_tm (:,:,:)        + vslp (:,:,:)
190#endif
191# if defined key_trabbl
192          IF( nn_bbl_ldf == 1 ) THEN
193             ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:) 
194             ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:) 
195          ENDIF
196          IF( nn_bbl_adv == 1 ) THEN
197             utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:) 
198             vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:) 
199          ENDIF
200# endif
201         sshn_tm  (:,:)          = sshn_tm    (:,:)       + sshn  (:,:) 
202         IF( ln_rnf )THEN
203            rnf_tm   (:,:)          = rnf_tm     (:,:)       + rnf   (:,:) 
204            h_rnf_tm (:,:)          = h_rnf_tm   (:,:)       + h_rnf (:,:) 
205         ENDIF
206         hmld_tm  (:,:)          = hmld_tm    (:,:)       + hmld  (:,:)
207         fr_i_tm  (:,:)          = fr_i_tm    (:,:)       + fr_i  (:,:)
208         emp_tm   (:,:)          = emp_tm     (:,:)       + emp   (:,:) 
209         fmmflx_tm(:,:)          = fmmflx_tm  (:,:)       + fmmflx(:,:)
210         qsr_tm   (:,:)          = qsr_tm     (:,:)       + qsr   (:,:)
211         wndm_tm  (:,:)          = wndm_tm    (:,:)       + wndm  (:,:)
212         !
213         sshn     (:,:)          = sshn_tm    (:,:) * r1_ndttrcp1 
214         sshb     (:,:)          = sshb_hold  (:,:)
215         IF( ln_rnf )THEN
216            rnf      (:,:)          = rnf_tm     (:,:) * r1_ndttrcp1 
217            h_rnf    (:,:)          = h_rnf_tm   (:,:) * r1_ndttrcp1 
218         ENDIF
219         hmld     (:,:)          = hmld_tm    (:,:) * r1_ndttrcp1 
220         !  variables that are initialized after averages
221         emp_b    (:,:) = emp_b_hold (:,:)
222         IF( kt == nittrc000 ) THEN
223            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrc 
224            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrc 
225            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrc 
226            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrc 
227            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrc
228# if defined key_trabbl
229            IF( nn_bbl_ldf == 1 ) THEN
230               ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrc 
231               ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrc 
232            ENDIF
233            IF( nn_bbl_adv == 1 ) THEN
234               utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrc 
235               vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrc 
236            ENDIF
237# endif
238         ELSE
239            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrcp1 
240            qsr   (:,:)          = qsr_tm     (:,:) * r1_ndttrcp1 
241            emp   (:,:)          = emp_tm     (:,:) * r1_ndttrcp1 
242            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrcp1 
243            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrcp1 
244# if defined key_trabbl
245            IF( nn_bbl_ldf == 1 ) THEN
246               ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrcp1 
247               ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrcp1 
248            ENDIF
249            IF( nn_bbl_adv == 1 ) THEN
250               utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrcp1 
251               vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrcp1 
252            ENDIF
253# endif
254         ENDIF
255         !
256         DO jk = 1, jpk
257            DO jj = 1, jpj
258               DO ji = 1, jpi
259                  z1_ne3t = r1_ndttrcp1  / fse3t(ji,jj,jk)
260                  z1_ne3u = r1_ndttrcp1  / fse3u(ji,jj,jk)
261                  z1_ne3v = r1_ndttrcp1  / fse3v(ji,jj,jk)
262                  z1_ne3w = r1_ndttrcp1  / fse3w(ji,jj,jk)
263                  !
264                  un   (ji,jj,jk)        = un_tm   (ji,jj,jk)        * z1_ne3u
265                  vn   (ji,jj,jk)        = vn_tm   (ji,jj,jk)        * z1_ne3v
266                  tsn  (ji,jj,jk,jp_tem) = tsn_tm  (ji,jj,jk,jp_tem) * z1_ne3t
267                  tsn  (ji,jj,jk,jp_sal) = tsn_tm  (ji,jj,jk,jp_sal) * z1_ne3t
268                  rhop (ji,jj,jk)        = rhop_tm (ji,jj,jk)        * z1_ne3t
269                  avt  (ji,jj,jk)        = avt_tm  (ji,jj,jk)        * z1_ne3w
270# if defined key_zdfddm
271                  avs  (ji,jj,jk)        = avs_tm  (ji,jj,jk)        * z1_ne3w
272# endif
273#if defined key_ldfslp
274                  wslpi(ji,jj,jk)        = wslpi_tm(ji,jj,jk) 
275                  wslpj(ji,jj,jk)        = wslpj_tm(ji,jj,jk)
276                  uslp (ji,jj,jk)        = uslp_tm (ji,jj,jk)
277                  vslp (ji,jj,jk)        = vslp_tm (ji,jj,jk)
278#endif
279               ENDDO
280            ENDDO
281         ENDDO
282         !
283         CALL trc_sub_ssh( kt )         ! after ssh & vertical velocity
284         !
285      ENDIF
286      !
287      IF( nn_timing == 1 )  CALL timing_start('trc_sub_stp')
288      !
289   END SUBROUTINE trc_sub_stp
290
291   SUBROUTINE trc_sub_ini
292      !!-------------------------------------------------------------------
293      !!                     ***  ROUTINE trc_sub_ini  ***
294      !!                     
295      !! ** Purpose : Initialize variables needed for sub-stepping passive tracers
296      !!
297      !! ** Method  :
298      !!              Compute the averages for sub-stepping
299      !!-------------------------------------------------------------------
300      INTEGER ::   ierr
301      !!-------------------------------------------------------------------
302      !
303      IF( nn_timing == 1 )  CALL timing_start('trc_sub_ini')
304      !
305      IF(lwp) WRITE(numout,*)
306      IF(lwp) WRITE(numout,*) 'trc_sub_ini : initial set up of the passive tracers substepping'
307      IF(lwp) WRITE(numout,*) '~~~~~~~'
308
309      ierr =  trc_sub_alloc    ()
310      IF( lk_mpp    )   CALL mpp_sum( ierr )
311      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'top_sub_alloc : unable to allocate standard ocean arrays' )
312
313      un_tm   (:,:,:)        = un   (:,:,:)        * fse3u(:,:,:) 
314      vn_tm   (:,:,:)        = vn   (:,:,:)        * fse3v(:,:,:) 
315      tsn_tm  (:,:,:,jp_tem) = tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
316      tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
317      rhop_tm (:,:,:)        = rhop (:,:,:)        * fse3t(:,:,:) 
318      avt_tm  (:,:,:)        = avt  (:,:,:)        * fse3w(:,:,:) 
319# if defined key_zdfddm
320      avs_tm  (:,:,:)        = avs  (:,:,:)        * fse3w(:,:,:) 
321# endif
322#if defined key_ldfslp
323      wslpi_tm(:,:,:)        = wslpi(:,:,:)
324      wslpj_tm(:,:,:)        = wslpj(:,:,:)
325      uslp_tm (:,:,:)        = uslp (:,:,:)
326      vslp_tm (:,:,:)        = vslp (:,:,:)
327#endif
328      sshn_tm  (:,:) = sshn  (:,:) 
329      IF( ln_rnf )THEN
330         rnf_tm   (:,:) = rnf   (:,:) 
331         h_rnf_tm (:,:) = h_rnf (:,:) 
332      ENDIF
333      hmld_tm  (:,:) = hmld  (:,:)
334
335      ! Physics variables that are set after initialization:
336      fr_i_tm(:,:) = 0._wp
337      emp_tm (:,:) = 0._wp
338      fmmflx_tm(:,:)  = 0._wp
339      qsr_tm (:,:) = 0._wp
340      wndm_tm(:,:) = 0._wp
341# if defined key_trabbl
342      IF( nn_bbl_ldf == 1 ) THEN
343         ahu_bbl_tm(:,:) = 0._wp
344         ahv_bbl_tm(:,:) = 0._wp
345      ENDIF
346      IF( nn_bbl_adv == 1 ) THEN
347         utr_bbl_tm(:,:) = 0._wp
348         vtr_bbl_tm(:,:) = 0._wp
349      ENDIF
350# endif
351      !
352      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_ini')
353      !
354   END SUBROUTINE trc_sub_ini
355
356   SUBROUTINE trc_sub_reset( kt )
357      !!-------------------------------------------------------------------
358      !!                     ***  ROUTINE trc_sub_reset  ***
359      !!                     
360      !! ** Purpose : Reset physics variables averaged for substepping
361      !!
362      !! ** Method  :
363      !!              Compute the averages for sub-stepping
364      !!-------------------------------------------------------------------
365      INTEGER, INTENT( in ) ::  kt  ! ocean time-step index
366      INTEGER :: jk                 ! dummy loop indices
367      !!-------------------------------------------------------------------
368      !
369      IF( nn_timing == 1 )  CALL timing_start('trc_sub_reset')
370      !
371      !   restore physics variables
372      un    (:,:,:)   =  un_temp    (:,:,:)
373      vn    (:,:,:)   =  vn_temp    (:,:,:)
374      wn    (:,:,:)   =  wn_temp    (:,:,:)
375      tsn   (:,:,:,:) =  tsn_temp   (:,:,:,:)
376      rhop  (:,:,:)   =  rhop_temp  (:,:,:)
377      avt   (:,:,:)   =  avt_temp   (:,:,:)
378# if defined key_zdfddm
379      avs   (:,:,:)   =  avs_temp   (:,:,:)
380# endif
381#if defined key_ldfslp
382      wslpi (:,:,:)   =  wslpi_temp (:,:,:)
383      wslpj (:,:,:)   =  wslpj_temp (:,:,:)
384      uslp  (:,:,:)   =  uslp_temp  (:,:,:)
385      vslp  (:,:,:)   =  vslp_temp  (:,:,:)
386#endif
387      sshn  (:,:)     =  sshn_temp  (:,:)
388      sshb  (:,:)     =  sshb_temp  (:,:)
389      ssha  (:,:)     =  ssha_temp  (:,:)
390      IF( ln_rnf )THEN
391         rnf   (:,:)     =  rnf_temp   (:,:)
392         h_rnf (:,:)     =  h_rnf_temp (:,:)
393      ENDIF
394      !
395      hmld  (:,:)     =  hmld_temp  (:,:)
396      fr_i  (:,:)     =  fr_i_temp  (:,:)
397      emp   (:,:)     =  emp_temp   (:,:)
398      fmmflx(:,:)     =  fmmflx_temp(:,:)
399      emp_b (:,:)     =  emp_b_temp (:,:)
400      qsr   (:,:)     =  qsr_temp   (:,:)
401      wndm  (:,:)     =  wndm_temp  (:,:)
402# if defined key_trabbl
403      IF( nn_bbl_ldf == 1 ) THEN
404         ahu_bbl(:,:) = ahu_bbl_temp(:,:) 
405         ahv_bbl(:,:) = ahv_bbl_temp(:,:) 
406      ENDIF
407      IF( nn_bbl_adv == 1 ) THEN
408         utr_bbl(:,:) = utr_bbl_temp(:,:) 
409         vtr_bbl(:,:) = vtr_bbl_temp(:,:) 
410      ENDIF
411# endif
412      !
413      hdivn (:,:,:)   =  hdivn_temp (:,:,:)
414      hdivb (:,:,:)   =  hdivb_temp (:,:,:)
415#if ! defined key_crs
416      rotn  (:,:,:)   =  rotn_temp  (:,:,:)
417      rotb  (:,:,:)   =  rotb_temp  (:,:,:)
418#endif
419      !                                     
420
421      ! Start new averages
422         un_tm   (:,:,:)        = un   (:,:,:)        * fse3u(:,:,:) 
423         vn_tm   (:,:,:)        = vn   (:,:,:)        * fse3v(:,:,:) 
424         tsn_tm  (:,:,:,jp_tem) = tsn  (:,:,:,jp_tem) * fse3t(:,:,:) 
425         tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * fse3t(:,:,:) 
426         rhop_tm (:,:,:)        = rhop (:,:,:)        * fse3t(:,:,:) 
427         avt_tm  (:,:,:)        = avt  (:,:,:)        * fse3w(:,:,:) 
428# if defined key_zdfddm
429         avs_tm  (:,:,:)        = avs  (:,:,:)        * fse3w(:,:,:) 
430# endif
431#if defined key_ldfslp
432         wslpi_tm(:,:,:)        = wslpi(:,:,:) 
433         wslpj_tm(:,:,:)        = wslpj(:,:,:)
434         uslp_tm (:,:,:)        = uslp (:,:,:)
435         vslp_tm (:,:,:)        = vslp (:,:,:)
436#endif
437      !
438      sshb_hold  (:,:) = sshn  (:,:)
439      emp_b_hold (:,:) = emp   (:,:)
440      sshn_tm    (:,:) = sshn  (:,:) 
441      IF( ln_rnf )THEN
442         rnf_tm     (:,:) = rnf   (:,:) 
443         h_rnf_tm   (:,:) = h_rnf (:,:) 
444      ENDIF
445      hmld_tm    (:,:) = hmld  (:,:)
446      fr_i_tm    (:,:) = fr_i  (:,:)
447      emp_tm     (:,:) = emp   (:,:)
448      fmmflx_tm  (:,:) = fmmflx(:,:)
449      qsr_tm     (:,:) = qsr   (:,:)
450      wndm_tm    (:,:) = wndm  (:,:)
451# if defined key_trabbl
452      IF( nn_bbl_ldf == 1 ) THEN
453         ahu_bbl_tm(:,:) = ahu_bbl(:,:) 
454         ahv_bbl_tm(:,:) = ahv_bbl(:,:) 
455      ENDIF
456      IF( nn_bbl_adv == 1 ) THEN
457         utr_bbl_tm(:,:) = utr_bbl(:,:) 
458         vtr_bbl_tm(:,:) = vtr_bbl(:,:) 
459      ENDIF
460# endif
461      !
462      !
463      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_reset')
464      !
465   END SUBROUTINE trc_sub_reset
466
467
468   SUBROUTINE trc_sub_ssh( kt ) 
469      !!----------------------------------------------------------------------
470      !!                ***  ROUTINE trc_sub_ssh  ***
471      !!                   
472      !! ** Purpose :   compute the after ssh (ssha), the now vertical velocity
473      !!              and update the now vertical coordinate (lk_vvl=T).
474      !!
475      !! ** Method  : - Using the incompressibility hypothesis, the vertical
476      !!      velocity is computed by integrating the horizontal divergence 
477      !!      from the bottom to the surface minus the scale factor evolution.
478      !!        The boundary conditions are w=0 at the bottom (no flux) and.
479      !!
480      !! ** action  :   ssha    : after sea surface height
481      !!                wn      : now vertical velocity
482      !!                sshu_a, sshv_a, sshf_a  : after sea surface height (lk_vvl=T)
483      !!
484      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
485      !!----------------------------------------------------------------------
486      !
487      INTEGER, INTENT(in) ::   kt   ! time step
488      !
489      INTEGER  ::   ji, jj, jk   ! dummy loop indices
490      REAL(wp) ::   zcoefu, zcoefv, zcoeff, z2dt, z1_2dt, z1_rau0   ! local scalars
491      REAL(wp), POINTER, DIMENSION(:,:) :: zhdiv
492      !!---------------------------------------------------------------------
493      !
494      IF( nn_timing == 1 )  CALL timing_start('trc_sub_ssh')
495      !
496      ! Allocate temporary workspace
497      CALL wrk_alloc( jpi, jpj, zhdiv )
498
499      IF( kt == nittrc000 ) THEN
500         !
501         IF(lwp) WRITE(numout,*)
502         IF(lwp) WRITE(numout,*) 'trc_sub_ssh : after sea surface height and now vertical velocity '
503         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
504         !
505         wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
506         !
507      ENDIF
508      !
509      CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity
510      !
511      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog)
512      IF( neuler == 0 .AND. kt == nittrc000 )   z2dt = rdt
513
514      !                                           !------------------------------!
515      !                                           !   After Sea Surface Height   !
516      !                                           !------------------------------!
517      zhdiv(:,:) = 0._wp
518      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports
519        zhdiv(:,:) = zhdiv(:,:) + fse3t(:,:,jk) * hdivn(:,:,jk)
520      END DO
521      !                                                ! Sea surface elevation time stepping
522      ! In forward Euler time stepping case, the same formulation as in the leap-frog case can be used
523      ! because emp_b field is initialized with the vlaues of emp field. Hence, 0.5 * ( emp + emp_b ) = emp
524      z1_rau0 = 0.5 / rau0
525      ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * tmask(:,:,1)
526#if ! defined key_dynspg_ts
527      ! These lines are not necessary with time splitting since
528      ! boundary condition on sea level is set during ts loop
529#if defined key_agrif
530      CALL agrif_ssh( kt )
531#endif
532#if defined key_bdy
533      ssha(:,:) = ssha(:,:) * bdytmask(:,:)
534      CALL lbc_lnk( ssha, 'T', 1. ) 
535#endif
536#endif
537
538
539      !                                           !------------------------------!
540      !                                           !     Now Vertical Velocity    !
541      !                                           !------------------------------!
542      z1_2dt = 1.e0 / z2dt
543      DO jk = jpkm1, 1, -1                             ! integrate from the bottom the hor. divergence
544         ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise
545         wn(:,:,jk) = wn(:,:,jk+1) -   fse3t_n(:,:,jk) * hdivn(:,:,jk)        &
546            &                      - ( fse3t_a(:,:,jk) - fse3t_b(:,:,jk) )    &
547            &                         * tmask(:,:,jk) * z1_2dt
548#if defined key_bdy
549         wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:)
550#endif
551      END DO
552
553      !
554      CALL wrk_dealloc( jpi, jpj, zhdiv )
555      !
556      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_ssh')
557      !
558   END SUBROUTINE trc_sub_ssh
559
560   INTEGER FUNCTION trc_sub_alloc()
561      !!-------------------------------------------------------------------
562      !!                    *** ROUTINE trc_sub_alloc ***
563      !!-------------------------------------------------------------------
564      USE lib_mpp, ONLY: ctl_warn
565      INTEGER ::  ierr
566      !!-------------------------------------------------------------------
567      !
568      ALLOCATE( un_temp(jpi,jpj,jpk)        ,  vn_temp(jpi,jpj,jpk)  ,   &
569         &      wn_temp(jpi,jpj,jpk)        ,  avt_temp(jpi,jpj,jpk) ,   &
570         &      rhop_temp(jpi,jpj,jpk)      ,  rhop_tm(jpi,jpj,jpk) ,   &
571         &      sshn_temp(jpi,jpj)          ,  sshb_temp(jpi,jpj) ,      &
572         &      ssha_temp(jpi,jpj)          ,                           &
573#if defined key_ldfslp
574         &      wslpi_temp(jpi,jpj,jpk)     ,  wslpj_temp(jpi,jpj,jpk),  &
575         &      uslp_temp(jpi,jpj,jpk)      ,  vslp_temp(jpi,jpj,jpk),   &
576#endif
577#if defined key_trabbl
578         &      ahu_bbl_temp(jpi,jpj)       ,  ahv_bbl_temp(jpi,jpj),    &
579         &      utr_bbl_temp(jpi,jpj)       ,  vtr_bbl_temp(jpi,jpj),    &
580#endif
581         &      rnf_temp(jpi,jpj)           ,  h_rnf_temp(jpi,jpj) ,     &
582         &      tsn_temp(jpi,jpj,jpk,2)     ,  emp_b_temp(jpi,jpj),      &
583         &      emp_temp(jpi,jpj)           ,  fmmflx_temp(jpi,jpj),     &
584         &      hmld_temp(jpi,jpj)          ,  qsr_temp(jpi,jpj) ,       &
585         &      fr_i_temp(jpi,jpj)          ,  fr_i_tm(jpi,jpj) ,        &
586         &      wndm_temp(jpi,jpj)          ,  wndm_tm(jpi,jpj) ,        &
587# if defined key_zdfddm
588         &      avs_tm(jpi,jpj,jpk)         ,  avs_temp(jpi,jpj,jpk) ,   &
589# endif
590         &      hdivn_temp(jpi,jpj,jpk)     ,  hdivb_temp(jpi,jpj,jpk),  &
591         &      rotn_temp(jpi,jpj,jpk)      ,  rotb_temp(jpi,jpj,jpk),   &
592         &      un_tm(jpi,jpj,jpk)          ,  vn_tm(jpi,jpj,jpk)  ,     &
593         &      avt_tm(jpi,jpj,jpk)                                ,     &
594         &      sshn_tm(jpi,jpj)            ,  sshb_hold(jpi,jpj) ,      &
595         &      tsn_tm(jpi,jpj,jpk,2)       ,                            &
596         &      emp_tm(jpi,jpj)             ,  fmmflx_tm(jpi,jpj)  ,     &
597         &      emp_b_hold(jpi,jpj)         ,                            &
598         &      hmld_tm(jpi,jpj)            ,  qsr_tm(jpi,jpj) ,         &
599#if defined key_ldfslp
600         &      wslpi_tm(jpi,jpj,jpk)       ,  wslpj_tm(jpi,jpj,jpk),    &
601         &      uslp_tm(jpi,jpj,jpk)        ,  vslp_tm(jpi,jpj,jpk),     &
602#endif
603#if defined key_trabbl
604         &      ahu_bbl_tm(jpi,jpj)         ,  ahv_bbl_tm(jpi,jpj),      &
605         &      utr_bbl_tm(jpi,jpj)         ,  vtr_bbl_tm(jpi,jpj),      &
606#endif
607         &      rnf_tm(jpi,jpj)             ,  h_rnf_tm(jpi,jpj) ,       &
608         &                                    STAT=trc_sub_alloc ) 
609      IF( trc_sub_alloc /= 0 )   CALL ctl_warn('trc_sub_alloc: failed to allocate arrays')
610
611      !
612   END FUNCTION trc_sub_alloc
613
614#else
615   !!----------------------------------------------------------------------
616   !!   Default key                                     NO passive tracers
617   !!----------------------------------------------------------------------
618CONTAINS
619   SUBROUTINE trc_sub_stp( kt )        ! Empty routine
620      WRITE(*,*) 'trc_sub_stp: You should not have seen this print! error?', kt
621   END SUBROUTINE trc_sub_stp
622   SUBROUTINE trc_sub_ini        ! Empty routine
623      WRITE(*,*) 'trc_sub_ini: You should not have seen this print! error?', kt
624   END SUBROUTINE trc_sub_ini
625
626#endif
627
628   !!======================================================================
629END MODULE trcsub
Note: See TracBrowser for help on using the repository browser.