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.
Changeset 10115 for NEMO/branches/2018/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90 – NEMO

Ignore:
Timestamp:
2018-09-12T15:59:13+02:00 (6 years ago)
Author:
cbricaud
Message:

phase 3.6 coarsening branch with nemo_3.6_rev9192

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2018/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90

    r8754 r10115  
    4949 
    5050   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::   r2dt 
    51  
     51   REAL(wp)  ::  rfact1, rfact2 
     52 
     53   !! * Substitutions 
     54#  include "domzgr_substitute.h90" 
     55#  include "vectopt_loop_substitute.h90" 
    5256   !!---------------------------------------------------------------------- 
    5357   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
     
    145149         !                                               
    146150      ELSE 
    147          ! Leap-Frog + Asselin filter time stepping 
    148          IF( lk_vvl ) THEN    
    149  
    150             IF( ln_crs_top )THEN  
    151                CALL tra_nxt_vvl_crs( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
    152               &                                              sbc_trc, sbc_trc_b, jptra )      ! variable volume level (vvl)  
    153             ELSE 
    154                CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
    155               &                                          sbc_trc, sbc_trc_b, jptra )      ! variable volume level (vvl)  
     151         IF( .NOT. lk_offline ) THEN ! Leap-Frog + Asselin filter time stepping 
     152 
     153            IF( lk_vvl ) THEN    
     154               IF( ln_crs_top )THEN  
     155                  CALL tra_nxt_vvl_crs( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
     156                 &                                              sbc_trc, sbc_trc_b, jptra )      ! variable volume level (vvl)  
     157               ELSE 
     158                  CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
     159                 &                                          sbc_trc, sbc_trc_b, jptra )      ! variable volume level (vvl)  
     160               ENDIF 
     161            ELSE                    
     162               CALL tra_nxt_fix( kt, nittrc000,         'TRC', trb, trn, tra, jptra )      ! fixed    volume level  
    156163            ENDIF 
    157          ELSE                   ;   CALL tra_nxt_fix( kt, nittrc000,         'TRC', trb, trn, tra, jptra )      ! fixed    volume level  
     164 
     165         ELSE 
     166                                    CALL trc_nxt_off( kt )       ! offline 
    158167         ENDIF 
     168 
     169 
    159170      ENDIF 
    160171 
     
    181192   END SUBROUTINE trc_nxt 
    182193 
     194   SUBROUTINE trc_nxt_off( kt ) 
     195      !!---------------------------------------------------------------------- 
     196      !!                   ***  ROUTINE tra_nxt_vvl  *** 
     197      !! 
     198      !! ** Purpose :   Time varying volume: apply the Asselin time filter   
     199      !!                and swap the tracer fields. 
     200      !!  
     201      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields. 
     202      !!              - save in (ta,sa) a thickness weighted average over the three  
     203      !!             time levels which will be used to compute rdn and thus the semi- 
     204      !!             implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 
     205      !!              - swap tracer fields to prepare the next time_step. 
     206      !!                This can be summurized for tempearture as: 
     207      !!             ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] )   ln_dynhpg_imp = T 
     208      !!                  /( e3t_n    + rbcp*[ e3t_b    - 2 e3t_n    + e3t_a    ] )    
     209      !!             ztm = 0                                                       otherwise 
     210      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
     211      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
     212      !!             tn  = ta  
     213      !!             ta  = zt        (NB: reset to 0 after eos_bn2 call) 
     214      !! 
     215      !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
     216      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
     217      !!---------------------------------------------------------------------- 
     218      INTEGER         , INTENT(in   )                               ::  kt       ! ocean time-step index 
     219      !!      
     220      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
     221      REAL(wp) ::   ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
     222      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
     223      !!---------------------------------------------------------------------- 
     224      ! 
     225      IF( kt == nittrc000 )  THEN 
     226         IF(lwp) WRITE(numout,*) 
     227         IF(lwp) WRITE(numout,*) 'trc_nxt_off : time stepping' 
     228         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     229         IF( lk_vvl ) THEN 
     230           rfact1 = atfp * rdttrc(1) 
     231           rfact2 = rfact1 / rau0 
     232         ENDIF 
     233      ENDIF 
     234      ! 
     235      DO jn = 1, jptra 
     236         DO jk = 1, jpkm1 
     237            DO jj = 1, jpj 
     238               DO ji = 1, jpi 
     239                  ze3t_b = fse3t_b(ji,jj,jk) 
     240                  ze3t_n = fse3t_n(ji,jj,jk) 
     241                  ze3t_a = fse3t_a(ji,jj,jk) 
     242                  !                                         ! tracer content at Before, now and after 
     243                  ztc_b  = trb(ji,jj,jk,jn) * ze3t_b 
     244                  ztc_n  = trn(ji,jj,jk,jn) * ze3t_n 
     245                  ztc_a  = tra(ji,jj,jk,jn) * ze3t_a 
     246                  ! 
     247                  ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 
     248                  ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b 
     249                  ! 
     250                  ze3t_f = ze3t_n + atfp * ze3t_d 
     251                  ztc_f  = ztc_n  + atfp * ztc_d 
     252                  ! 
     253                  IF( lk_vvl .AND. jk == mikt(ji,jj) ) THEN           ! first level  
     254                     ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj)      - emp(ji,jj)   ) 
     255                     ztc_f  = ztc_f  - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 
     256                  ENDIF 
     257 
     258                  ze3t_f = 1.e0 / ze3t_f 
     259                  trb(ji,jj,jk,jn) = ztc_f * ze3t_f       ! ptb <-- ptn filtered 
     260                  trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn)     ! ptn <-- pta 
     261                  ! 
     262               END DO 
     263            END DO 
     264         END DO 
     265         !  
     266      END DO 
     267      ! 
     268   END SUBROUTINE trc_nxt_off 
     269 
    183270#else 
    184271   !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.