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 7872 – NEMO

Changeset 7872


Ignore:
Timestamp:
2017-04-05T09:45:03+02:00 (7 years ago)
Author:
cetlod
Message:

Bugfix in trunk:add missing piece of code for offline with non linear free surface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90

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