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 8841 for branches/UKMO/ROMS_WAD_7832/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90 – NEMO

Ignore:
Timestamp:
2017-11-29T05:08:05+01:00 (6 years ago)
Author:
deazer
Message:

Bring in Trunk Changes at version 8814
This revision wont run as is, requires next revision with merged changes
This revision serves as a reference point to what changes from the trunk at brought in by the merge
in the next revision

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/ROMS_WAD_7832/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90

    r7753 r8841  
    4444   PUBLIC   trc_nxt          ! routine called by step.F90 
    4545 
     46   REAL(wp) ::   rfact1, rfact2 
     47 
    4648   !!---------------------------------------------------------------------- 
    4749   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
     
    104106      ENDIF 
    105107      !                                ! Leap-Frog + Asselin filter time stepping 
    106       IF( neuler == 0 .AND. kt == nittrc000 ) THEN    ! Euler time-stepping at first time-step (only swap) 
     108      IF( (neuler == 0 .AND. kt == nittrc000) .OR. ln_top_euler ) THEN    ! Euler time-stepping (only swap) 
    107109         DO jn = 1, jptra 
    108110            DO jk = 1, jpkm1 
    109111               trn(:,:,jk,jn) = tra(:,:,jk,jn) 
     112               trb(:,:,jk,jn) = trn(:,:,jk,jn)   
    110113            END DO 
    111114         END DO 
    112       ELSE                                            ! Asselin filter + swap 
    113          IF( ln_linssh ) THEN   ;   CALL tra_nxt_fix( kt, nittrc000,         'TRC', trb, trn, tra, jptra )  !     linear ssh 
    114          ELSE                   ;   CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
    115            &                                                                   sbc_trc, sbc_trc_b, jptra )  ! non-linear ssh 
     115      ELSE      
     116         IF( .NOT. l_offline ) THEN ! Leap-Frog + Asselin filter time stepping 
     117            IF( ln_linssh ) THEN   ;   CALL tra_nxt_fix( kt, nittrc000,         'TRC', trb, trn, tra, jptra )  !     linear ssh 
     118            ELSE                   ;   CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra,      & 
     119              &                                                                   sbc_trc, sbc_trc_b, jptra )  ! non-linear ssh 
     120            ENDIF 
     121         ELSE 
     122                                       CALL trc_nxt_off( kt )       ! offline  
    116123         ENDIF 
    117124         ! 
     
    143150      ! 
    144151   END SUBROUTINE trc_nxt 
     152 
     153 
     154   SUBROUTINE trc_nxt_off( kt ) 
     155      !!---------------------------------------------------------------------- 
     156      !!                   ***  ROUTINE tra_nxt_vvl  *** 
     157      !! 
     158      !! ** Purpose :   Time varying volume: apply the Asselin time filter   
     159      !!                and swap the tracer fields. 
     160      !!  
     161      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields. 
     162      !!              - save in (ta,sa) a thickness weighted average over the three  
     163      !!             time levels which will be used to compute rdn and thus the semi- 
     164      !!             implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 
     165      !!              - swap tracer fields to prepare the next time_step. 
     166      !!                This can be summurized for tempearture as: 
     167      !!             ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] )   ln_dynhpg_imp = T 
     168      !!                  /( e3t_n    + rbcp*[ e3t_b    - 2 e3t_n    + e3t_a    ] )    
     169      !!             ztm = 0                                                       otherwise 
     170      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
     171      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
     172      !!             tn  = ta  
     173      !!             ta  = zt        (NB: reset to 0 after eos_bn2 call) 
     174      !! 
     175      !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
     176      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
     177      !!---------------------------------------------------------------------- 
     178      INTEGER , INTENT(in   )   ::  kt       ! ocean time-step index 
     179      !!      
     180      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
     181      REAL(wp) ::   ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
     182      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
     183      !!---------------------------------------------------------------------- 
     184      ! 
     185      IF( kt == nittrc000 )  THEN 
     186         IF(lwp) WRITE(numout,*) 
     187         IF(lwp) WRITE(numout,*) 'trc_nxt_off : time stepping' 
     188         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     189         IF( .NOT. ln_linssh ) THEN 
     190            rfact1 = atfp * rdttrc 
     191            rfact2 = rfact1 / rau0 
     192         ENDIF 
     193        !   
     194      ENDIF 
     195      ! 
     196      DO jn = 1, jptra       
     197         DO jk = 1, jpkm1 
     198            DO jj = 1, jpj 
     199               DO ji = 1, jpi 
     200                  ze3t_b = e3t_b(ji,jj,jk) 
     201                  ze3t_n = e3t_n(ji,jj,jk) 
     202                  ze3t_a = e3t_a(ji,jj,jk) 
     203                  !                                         ! tracer content at Before, now and after 
     204                  ztc_b  = trb(ji,jj,jk,jn) * ze3t_b 
     205                  ztc_n  = trn(ji,jj,jk,jn) * ze3t_n 
     206                  ztc_a  = tra(ji,jj,jk,jn) * ze3t_a 
     207                  ! 
     208                  ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 
     209                  ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b 
     210                  ! 
     211                  ze3t_f = ze3t_n + atfp * ze3t_d 
     212                  ztc_f  = ztc_n  + atfp * ztc_d 
     213                  ! 
     214                  IF( .NOT. ln_linssh .AND. jk == mikt(ji,jj) ) THEN           ! first level  
     215                     ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj)      - emp(ji,jj)   )  
     216                     ztc_f  = ztc_f  - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 
     217                  ENDIF 
     218 
     219                  ze3t_f = 1.e0 / ze3t_f 
     220                  trb(ji,jj,jk,jn) = ztc_f * ze3t_f       ! ptb <-- ptn filtered 
     221                  trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn)     ! ptn <-- pta 
     222                  ! 
     223               END DO 
     224            END DO 
     225         END DO 
     226         !  
     227      END DO 
     228      ! 
     229   END SUBROUTINE trc_nxt_off 
    145230 
    146231#else 
Note: See TracChangeset for help on using the changeset viewer.