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.
traatf.F90 in NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/TRA – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/TRA/traatf.F90 @ 11057

Last change on this file since 11057 was 11057, checked in by davestorkey, 5 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap : Rewrite time filtering of tracers and SSH. This version now bit compares with the base code for ORCA1 starting from a restart.
To do:

  1. Check that it bit compares with an Euler timestep.
  2. Full SETTE tests.
  3. Check that it compiles with C1D.
  4. Check that TOP works (see 1).
  • Property svn:keywords set to Id
File size: 19.7 KB
RevLine 
[11057]1MODULE traatf
[3]2   !!======================================================================
[11057]3   !!                       ***  MODULE  traatf  ***
[3]4   !! Ocean active tracers:  time stepping on temperature and salinity
5   !!======================================================================
[1110]6   !! History :  OPA  !  1991-11  (G. Madec)  Original code
7   !!            7.0  !  1993-03  (M. Guyon)  symetrical conditions
8   !!            8.0  !  1996-02  (G. Madec & M. Imbard)  opa release 8.0
9   !!             -   !  1996-04  (A. Weaver)  Euler forward step
10   !!            8.2  !  1999-02  (G. Madec, N. Grima)  semi-implicit pressure grad.
11   !!  NEMO      1.0  !  2002-08  (G. Madec)  F90: Free form and module
12   !!             -   !  2002-11  (C. Talandier, A-M Treguier) Open boundaries
13   !!             -   !  2005-04  (C. Deltel) Add Asselin trend in the ML budget
14   !!            2.0  !  2006-02  (L. Debreu, C. Mazauric) Agrif implementation
15   !!            3.0  !  2008-06  (G. Madec)  time stepping always done in trazdf
[1438]16   !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option
[2528]17   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  semi-implicit hpg with asselin filter + modified LF-RA
18   !!             -   !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA
[3]19   !!----------------------------------------------------------------------
[503]20
21   !!----------------------------------------------------------------------
[11057]22   !!   tra_atf       : time stepping on tracers
23   !!   tra_atf_fix   : time stepping on tracers : fixed    volume case
24   !!   tra_atf_vvl   : time stepping on tracers : variable volume case
[3]25   !!----------------------------------------------------------------------
26   USE oce             ! ocean dynamics and tracers variables
27   USE dom_oce         ! ocean space and time domain variables
[2528]28   USE sbc_oce         ! surface boundary condition: ocean
[5467]29   USE sbcrnf          ! river runoffs
[6140]30   USE sbcisf          ! ice shelf melting
[4990]31   USE zdf_oce         ! ocean vertical mixing
[1438]32   USE domvvl          ! variable volume
[4990]33   USE trd_oce         ! trends: ocean variables
34   USE trdtra          ! trends manager: tracers
35   USE traqsr          ! penetrative solar radiation (needed for nksr)
36   USE phycst          ! physical constant
[9019]37   USE ldftra          ! lateral physics : tracers
38   USE ldfslp          ! lateral physics : slopes
39   USE bdy_oce  , ONLY : ln_bdy
[3294]40   USE bdytra          ! open boundary condition (bdy_tra routine)
[4990]41   !
[3]42   USE in_out_manager  ! I/O manager
43   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
[258]44   USE prtctl          ! Print control
[4990]45   USE timing          ! Timing
[2528]46#if defined key_agrif
[9570]47   USE agrif_oce_interp
[2528]48#endif
[3]49
50   IMPLICIT NONE
51   PRIVATE
52
[11057]53   PUBLIC   tra_atf       ! routine called by step.F90
54   PUBLIC   tra_atf_fix   ! to be used in trcnxt
55   PUBLIC   tra_atf_vvl   ! to be used in trcnxt
[592]56
57   !! * Substitutions
[6140]58#  include "vectopt_loop_substitute.h90"
[3]59   !!----------------------------------------------------------------------
[10068]60   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[2715]61   !! $Id$
[10068]62   !! Software governed by the CeCILL license (see ./LICENSE)
[3]63   !!----------------------------------------------------------------------
64CONTAINS
65
[11057]66   SUBROUTINE tra_atf( kt, Kbb, Kmm, Kaa, pts )
[3]67      !!----------------------------------------------------------------------
[11057]68      !!                   ***  ROUTINE traatf  ***
[3]69      !!
[11057]70      !!       !!!!!!!!!!!!!!!!!  REWRITE HEADER COMMENTS !!!!!!!!!!!!!!!
71      !!
[1110]72      !! ** Purpose :   Apply the boundary condition on the after temperature 
73      !!             and salinity fields, achieved the time stepping by adding
74      !!             the Asselin filter on now fields and swapping the fields.
[3]75      !!
[1110]76      !! ** Method  :   At this stage of the computation, ta and sa are the
77      !!             after temperature and salinity as the time stepping has
78      !!             been performed in trazdf_imp or trazdf_exp module.
[3]79      !!
[1110]80      !!              - Apply lateral boundary conditions on (ta,sa)
81      !!             at the local domain   boundaries through lbc_lnk call,
[7646]82      !!             at the one-way open boundaries (ln_bdy=T),
[4990]83      !!             at the AGRIF zoom   boundaries (lk_agrif=T)
[1110]84      !!
[1438]85      !!              - Update lateral boundary conditions on AGRIF children
86      !!             domains (lk_agrif=T)
[1110]87      !!
[10954]88      !! ** Action  : - ts(Kbb) & ts(Kmm) ready for the next time step
[503]89      !!----------------------------------------------------------------------
[11057]90      INTEGER                                  , INTENT(in   ) :: kt             ! ocean time-step index
91      INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Kaa  ! time level indices
92      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
[503]93      !!
[6140]94      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
95      REAL(wp) ::   zfact            ! local scalars
[9019]96      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
[3]97      !!----------------------------------------------------------------------
[3294]98      !
[11057]99      IF( ln_timing )   CALL timing_start( 'tra_atf')
[3294]100      !
[1110]101      IF( kt == nit000 ) THEN
102         IF(lwp) WRITE(numout,*)
[11057]103         IF(lwp) WRITE(numout,*) 'tra_atf : achieve the time stepping by Asselin filter and array swap'
[1110]104         IF(lwp) WRITE(numout,*) '~~~~~~~'
[592]105      ENDIF
106
[1110]107      ! Update after tracer on domain lateral boundaries
108      !
[5656]109#if defined key_agrif
110      CALL Agrif_tra                     ! AGRIF zoom boundaries
111#endif
[9094]112      !                                              ! local domain boundaries  (T-point, unchanged sign)
[11057]113      CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. )
[5656]114      !
[11057]115      IF( ln_bdy )   CALL bdy_tra( kt, Kbb, pts, Kaa )  ! BDY open boundaries
[1438]116 
117      ! set time step size (Euler/Leapfrog)
[9019]118      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;   r2dt =        rdt   ! at nit000             (Euler)
[6140]119      ELSEIF( kt <= nit000 + 1 )           THEN   ;   r2dt = 2._wp* rdt   ! at nit000 or nit000+1 (Leapfrog)
[1438]120      ENDIF
[3]121
[1110]122      ! trends computation initialisation
[7646]123      IF( l_trdtra )   THEN                   
[9019]124         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) )
[8698]125         ztrdt(:,:,jpk) = 0._wp
126         ztrds(:,:,jpk) = 0._wp
[4990]127         IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend
[11057]128            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_zdfp, ztrdt )
129            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_zdfp, ztrds )
[4990]130         ENDIF
[7646]131         ! total trend for the non-time-filtered variables.
[8698]132         zfact = 1.0 / rdt
[11057]133         ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms
[7646]134         DO jk = 1, jpkm1
[11057]135            ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_tem,Kmm)) * zfact
136            ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_sal,Kmm)) * zfact
[7646]137         END DO
[11057]138         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_tot, ztrdt )
139         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_tot, ztrds )
[9019]140         IF( ln_linssh ) THEN       ! linear sea surface height only
[8698]141            ! Store now fields before applying the Asselin filter
142            ! in order to calculate Asselin filter trend later.
[11057]143            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kmm) 
144            ztrds(:,:,:) = pts(:,:,:,jp_sal,Kmm)
[8698]145         ENDIF
[1110]146      ENDIF
147
[2528]148      IF( neuler == 0 .AND. kt == nit000 ) THEN       ! Euler time-stepping at first time-step (only swap)
149         DO jn = 1, jpts
150            DO jk = 1, jpkm1
[11057]151               pts(:,:,jk,jn,Kmm) = pts(:,:,jk,jn,Kaa)   
[2528]152            END DO
153         END DO
[9019]154         IF (l_trdtra .AND. .NOT. ln_linssh ) THEN   ! Zero Asselin filter contribution must be explicitly written out since for vvl
[11057]155            !                                        ! Asselin filter is output by tra_atf_vvl that is not called on this time step
[8698]156            ztrdt(:,:,:) = 0._wp
157            ztrds(:,:,:) = 0._wp
[11057]158            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt )
159            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds )
[8698]160         END IF
[6140]161         !
[2528]162      ELSE                                            ! Leap-Frog + Asselin filter time stepping
163         !
[11057]164         IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000,      'TRA', pts, jpts )  ! linear free surface
165         ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rdt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface
[2528]166         ENDIF
[6140]167         !
[11057]168         CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kbb) , 'T', 1., pts(:,:,:,jp_sal,Kbb) , 'T', 1., &
169                  &                    pts(:,:,:,jp_tem,Kmm) , 'T', 1., pts(:,:,:,jp_sal,Kmm) , 'T', 1., &
170                  &                    pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1.  )
[9094]171         !
[5656]172      ENDIF     
[2715]173      !
[8698]174      IF( l_trdtra .AND. ln_linssh ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt     
175         zfact = 1._wp / r2dt             
[1110]176         DO jk = 1, jpkm1
[11057]177            ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kbb) - ztrdt(:,:,jk) ) * zfact
178            ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kbb) - ztrds(:,:,jk) ) * zfact
[1110]179         END DO
[11057]180         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt )
181         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds )
[1438]182      END IF
[9019]183      IF( l_trdtra )   DEALLOCATE( ztrdt , ztrds )
[2715]184      !
[1438]185      !                        ! control print
[11057]186      IF(ln_ctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Kmm), clinfo1=' nxt  - Tn: ', mask1=tmask,   &
187         &                       tab3d_2=pts(:,:,:,jp_sal,Kmm), clinfo2=       ' Sn: ', mask2=tmask )
[1438]188      !
[11057]189      IF( ln_timing )   CALL timing_stop('tra_atf')
[3294]190      !
[11057]191   END SUBROUTINE tra_atf
[1438]192
193
[11057]194   SUBROUTINE tra_atf_fix( kt, kit000, Kbb, Kmm, Kaa, cdtype, pt, kjpt )
[1438]195      !!----------------------------------------------------------------------
[11057]196      !!                   ***  ROUTINE tra_atf_fix  ***
[1438]197      !!
198      !! ** Purpose :   fixed volume: apply the Asselin time filter and
199      !!                swap the tracer fields.
200      !!
201      !! ** Method  : - Apply a Asselin time filter on now fields.
202      !!              - swap tracer fields to prepare the next time_step.
203      !!
[10954]204      !! ** Action  : - ptb & ptn ready for the next time step
[1438]205      !!----------------------------------------------------------------------
[11057]206      INTEGER                                  , INTENT(in   ) ::  kt            ! ocean time-step index
207      INTEGER                                  , INTENT(in   ) ::  Kbb, Kmm, Kaa ! time level indices
208      INTEGER                                  , INTENT(in   ) ::  kit000        ! first time step index
209      CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype        ! =TRA or TRC (tracer indicator)
210      INTEGER                                  , INTENT(in   ) ::  kjpt          ! number of tracers
211      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
[2715]212      !
[2528]213      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
214      REAL(wp) ::   ztn, ztd         ! local scalars
[1438]215      !!----------------------------------------------------------------------
[6140]216      !
[3294]217      IF( kt == kit000 )  THEN
[1438]218         IF(lwp) WRITE(numout,*)
[11057]219         IF(lwp) WRITE(numout,*) 'tra_atf_fix : time stepping', cdtype
[1438]220         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
221      ENDIF
222      !
[2528]223      DO jn = 1, kjpt
[1438]224         !
[2528]225         DO jk = 1, jpkm1
[6140]226            DO jj = 2, jpjm1
227               DO ji = fs_2, fs_jpim1
[11057]228                  ztn = pt(ji,jj,jk,jn,Kmm)                                   
229                  ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb)  ! time laplacian on tracers
[2528]230                  !
[11057]231                  pt(ji,jj,jk,jn,Kmm) = ztn + atfp * ztd                      ! ptb <-- filtered ptn
[3]232               END DO
[2528]233           END DO
234         END DO
[1110]235         !
[2528]236      END DO
[1438]237      !
[11057]238   END SUBROUTINE tra_atf_fix
[3]239
[1110]240
[11057]241   SUBROUTINE tra_atf_vvl( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt )
[1438]242      !!----------------------------------------------------------------------
[11057]243      !!                   ***  ROUTINE tra_atf_vvl  ***
[1438]244      !!
245      !! ** Purpose :   Time varying volume: apply the Asselin time filter 
246      !!                and swap the tracer fields.
247      !!
248      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields.
249      !!              - swap tracer fields to prepare the next time_step.
[10954]250      !!             tb  = ( e3t(Kmm)*tn + atfp*[ e3t(Kbb)*tb - 2 e3t(Kmm)*tn + e3t_a*ta ] )
[11057]251      !!                  /( e3t(Kmm)    + atfp*[ e3t(Kbb)    - 2 e3t(Kmm)    + e3t(Kaa)    ] )
[6140]252      !!             tn  = ta
[1438]253      !!
[10954]254      !! ** Action  : - ptb & ptn ready for the next time step
[1438]255      !!----------------------------------------------------------------------
[11057]256      INTEGER                                  , INTENT(in   ) ::  kt        ! ocean time-step index
257      INTEGER                                  , INTENT(in   ) ::  Kbb, Kmm, Kaa ! time level indices
258      INTEGER                                  , INTENT(in   ) ::  kit000    ! first time step index
259      REAL(wp)                                 , INTENT(in   ) ::  p2dt      ! time-step
260      CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator)
261      INTEGER                                  , INTENT(in   ) ::  kjpt      ! number of tracers
262      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
263      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
264      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
[6140]265      !
[5930]266      LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical
[2528]267      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices
[8698]268      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar
[2715]269      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      -
[9019]270      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrd_atf
[1438]271      !!----------------------------------------------------------------------
[3294]272      !
273      IF( kt == kit000 )  THEN
[1438]274         IF(lwp) WRITE(numout,*)
[11057]275         IF(lwp) WRITE(numout,*) 'tra_atf_vvl : time stepping', cdtype
[1438]276         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
277      ENDIF
[2528]278      !
279      IF( cdtype == 'TRA' )  THEN   
280         ll_traqsr  = ln_traqsr        ! active  tracers case  and  solar penetration
[5467]281         ll_rnf     = ln_rnf           ! active  tracers case  and  river runoffs
[6140]282         ll_isf     = ln_isf           ! active  tracers case  and  ice shelf melting
283      ELSE                          ! passive tracers case
284         ll_traqsr  = .FALSE.          ! NO solar penetration
285         ll_rnf     = .FALSE.          ! NO river runoffs ????          !!gm BUG ? 
286         ll_isf     = .FALSE.          ! NO ice shelf melting/freezing  !!gm BUG ??
[2528]287      ENDIF
288      !
[9019]289      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN
290         ALLOCATE( ztrd_atf(jpi,jpj,jpk,kjpt) )
[8698]291         ztrd_atf(:,:,:,:) = 0.0_wp
292      ENDIF
[10095]293      zfact = 1._wp / p2dt
[9019]294      zfact1 = atfp * p2dt
295      zfact2 = zfact1 * r1_rau0
[2528]296      DO jn = 1, kjpt     
297         DO jk = 1, jpkm1
[6140]298            DO jj = 2, jpjm1
299               DO ji = fs_2, fs_jpim1
[10954]300                  ze3t_b = e3t(ji,jj,jk,Kbb)
301                  ze3t_n = e3t(ji,jj,jk,Kmm)
[11057]302                  ze3t_a = e3t(ji,jj,jk,Kaa)
[2528]303                  !                                         ! tracer content at Before, now and after
[11057]304                  ztc_b  = pt(ji,jj,jk,jn,Kbb) * ze3t_b
305                  ztc_n  = pt(ji,jj,jk,jn,Kmm) * ze3t_n
306                  ztc_a  = pt(ji,jj,jk,jn,Kaa) * ze3t_a
[2528]307                  !
308                  ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b
309                  ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b
310                  !
311                  ze3t_f = ze3t_n + atfp * ze3t_d
312                  ztc_f  = ztc_n  + atfp * ztc_d
313                  !
[5643]314                  IF( jk == mikt(ji,jj) ) THEN           ! first level
315                     ze3t_f = ze3t_f - zfact2 * ( (emp_b(ji,jj)    - emp(ji,jj)   )  &
316                            &                   + (fwfisf_b(ji,jj) - fwfisf(ji,jj))  )
[5385]317                     ztc_f  = ztc_f  - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) )
[2528]318                  ENDIF
[9023]319                  IF( ln_rnf_depth ) THEN
320                     ! Rivers are not just at the surface must go down to nk_rnf(ji,jj)
321                     IF( mikt(ji,jj) <=jk .and. jk <= nk_rnf(ji,jj)  ) THEN
322                        ze3t_f = ze3t_f - zfact2 * ( - (rnf_b(ji,jj) - rnf(ji,jj)   )  ) &
[10954]323                    &                            * ( e3t(ji,jj,jk,Kmm) / h_rnf(ji,jj) ) 
[9023]324                     ENDIF
325                  ELSE
326                     IF( jk == mikt(ji,jj) ) THEN           ! first level
327                        ze3t_f = ze3t_f - zfact2 * ( - (rnf_b(ji,jj)    - rnf(ji,jj)   ) ) 
328                     ENDIF
329                  ENDIF
330
[6140]331                  !
[5643]332                  ! solar penetration (temperature only)
333                  IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            & 
[2528]334                     &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) ) 
[6140]335                     !
[5643]336                  ! river runoff
337                  IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) )                                          &
[5467]338                     &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) & 
[10954]339                     &                              * e3t(ji,jj,jk,Kmm) / h_rnf(ji,jj)
[6140]340                     !
[5643]341                  ! ice shelf
342                  IF( ll_isf ) THEN
343                     ! level fully include in the Losch_2008 ice shelf boundary layer
344                     IF ( jk >= misfkt(ji,jj) .AND. jk < misfkb(ji,jj) )                          &
345                        ztc_f  = ztc_f  - zfact1 * ( risf_tsc(ji,jj,jn) - risf_tsc_b(ji,jj,jn) )  &
[10954]346                               &                 * e3t(ji,jj,jk,Kmm) * r1_hisf_tbl (ji,jj)
[5643]347                     ! level partially include in Losch_2008 ice shelf boundary layer
348                     IF ( jk == misfkb(ji,jj) )                                                   &
349                        ztc_f  = ztc_f  - zfact1 * ( risf_tsc(ji,jj,jn) - risf_tsc_b(ji,jj,jn) )  &
[10954]350                               &                 * e3t(ji,jj,jk,Kmm) * r1_hisf_tbl (ji,jj) * ralpha(ji,jj)
[5643]351                  END IF
[6140]352                  !
[5467]353                  ze3t_f = 1.e0 / ze3t_f
[11057]354                  pt(ji,jj,jk,jn,Kmm) = ztc_f * ze3t_f    ! time filtered "now" field
[5467]355                  !
[8698]356                  IF( ( l_trdtra .and. cdtype == 'TRA' ) .OR. ( l_trdtrc .and. cdtype == 'TRC' ) ) THEN
357                     ztrd_atf(ji,jj,jk,jn) = (ztc_f - ztc_n) * zfact/ze3t_n
358                  ENDIF
359                  !
[1438]360               END DO
361            END DO
[2528]362         END DO
363         !
364      END DO
[503]365      !
[9019]366      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN
367         IF( l_trdtra .AND. cdtype == 'TRA' ) THEN
[11057]368            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) )
369            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) )
[9019]370         ENDIF
371         IF( l_trdtrc .AND. cdtype == 'TRC' ) THEN
372            DO jn = 1, kjpt
[11057]373               CALL trd_tra( kt, Kmm, Kaa, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) )
[9019]374            END DO
375         ENDIF
376         DEALLOCATE( ztrd_atf )
[8698]377      ENDIF
378      !
[11057]379   END SUBROUTINE tra_atf_vvl
[3]380
381   !!======================================================================
[11057]382END MODULE traatf
Note: See TracBrowser for help on using the repository browser.