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 6004 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90 – NEMO

Ignore:
Timestamp:
2015-12-04T17:05:58+01:00 (8 years ago)
Author:
gm
Message:

#1613: vvl by default, step III: Merge with the trunk (free surface simplification) (see wiki)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90

    r5916 r6004  
    3131   USE zdf_oce         ! ocean vertical mixing 
    3232   USE domvvl          ! variable volume 
    33    USE dynspg_oce      ! surface     pressure gradient variables 
    34    USE dynhpg          ! hydrostatic pressure gradient  
    3533   USE trd_oce         ! trends: ocean variables 
    3634   USE trdtra          ! trends manager: tracers  
     
    5048   USE agrif_opa_interp 
    5149#endif 
    52 #  include "vectopt_loop_substitute.h90" 
    5350 
    5451   IMPLICIT NONE 
     
    5956   PUBLIC   tra_nxt_vvl   ! to be used in trcnxt 
    6057 
    61    REAL(wp) ::   rbcp   ! Brown & Campana parameters for semi-implicit hpg 
    62  
     58   !! * Substitutions 
     59#  include "vectopt_loop_substitute.h90" 
    6360   !!---------------------------------------------------------------------- 
    6461   !! NEMO/OPA 3.3 , NEMO-Consortium (2010)  
     
    8885      !!             domains (lk_agrif=T) 
    8986      !! 
    90       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    91       !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
     87      !! ** Action  : - tsb & tsn ready for the next time step 
    9288      !!---------------------------------------------------------------------- 
    9389      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     
    104100         IF(lwp) WRITE(numout,*) 'tra_nxt : achieve the time stepping by Asselin filter and array swap' 
    105101         IF(lwp) WRITE(numout,*) '~~~~~~~' 
    106          ! 
    107          rbcp = 0.25_wp * (1._wp + atfp) * (1._wp + atfp) * ( 1._wp - atfp)      ! Brown & Campana parameter for semi-implicit hpg 
    108102      ENDIF 
    109103 
     
    154148            CALL lbc_lnk( tsb(:,:,:,jn), 'T', 1._wp )  
    155149            CALL lbc_lnk( tsn(:,:,:,jn), 'T', 1._wp ) 
    156             CALL lbc_lnk( tsa(:,:,:,jn), 'T', 1._wp ) 
    157150         END DO 
    158151      ENDIF      
    159152      ! 
    160       ! trends computation 
    161153      IF( l_trdtra ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt      
    162154         DO jk = 1, jpkm1 
     
    187179      !!  
    188180      !! ** Method  : - Apply a Asselin time filter on now fields. 
    189       !!              - save in (ta,sa) an average over the three time levels  
    190       !!             which will be used to compute rdn and thus the semi-implicit 
    191       !!             hydrostatic pressure gradient (ln_dynhpg_imp = T) 
    192181      !!              - swap tracer fields to prepare the next time_step. 
    193       !!                This can be summurized for tempearture as: 
    194       !!             ztm = tn + rbcp * [ta -2 tn + tb ]       ln_dynhpg_imp = T 
    195       !!             ztm = 0                                   otherwise 
    196       !!                   with rbcp=1/4 * (1-atfp^4) / (1-atfp) 
    197       !!             tb  = tn + atfp*[ tb - 2 tn + ta ] 
    198       !!             tn  = ta   
    199       !!             ta  = ztm       (NB: reset to 0 after eos_bn2 call) 
    200       !! 
    201       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    202       !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    203       !!---------------------------------------------------------------------- 
    204       INTEGER         , INTENT(in   )                               ::   kt       ! ocean time-step index 
    205       INTEGER         , INTENT(in   )                               ::   kit000   ! first time step index 
    206       CHARACTER(len=3), INTENT(in   )                               ::   cdtype   ! =TRA or TRC (tracer indicator) 
    207       INTEGER         , INTENT(in   )                               ::   kjpt     ! number of tracers 
    208       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   ptb      ! before tracer fields 
    209       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   ptn      ! now tracer fields 
    210       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   pta      ! tracer trend 
     182      !! 
     183      !! ** Action  : - tsb & tsn ready for the next time step 
     184      !!---------------------------------------------------------------------- 
     185      INTEGER                              , INTENT(in   ) ::  kt        ! ocean time-step index 
     186      INTEGER                              , INTENT(in   ) ::  kit000    ! first time step index 
     187      CHARACTER(len=3)                     , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator) 
     188      INTEGER                              , INTENT(in   ) ::  kjpt      ! number of tracers 
     189      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptb       ! before tracer fields 
     190      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptn       ! now tracer fields 
     191      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  pta       ! tracer trend 
    211192      ! 
    212193      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    213       LOGICAL  ::   ll_tra_hpg       ! local logical 
    214194      REAL(wp) ::   ztn, ztd         ! local scalars 
    215195      !!---------------------------------------------------------------------- 
     
    221201      ENDIF 
    222202      ! 
    223       IF( cdtype == 'TRA' )  THEN   ;   ll_tra_hpg = ln_dynhpg_imp    ! active  tracers case  and  semi-implicit hpg     
    224       ELSE                          ;   ll_tra_hpg = .FALSE.          ! passive tracers case or NO semi-implicit hpg 
    225       ENDIF 
    226       ! 
    227203      DO jn = 1, kjpt 
    228204         ! 
     
    231207               DO ji = fs_2, fs_jpim1 
    232208                  ztn = ptn(ji,jj,jk,jn)                                     
    233                   ztd = pta(ji,jj,jk,jn) - 2. * ztn + ptb(ji,jj,jk,jn)      ! time laplacian on tracers 
    234                   ! 
    235                   ptb(ji,jj,jk,jn) = ztn + atfp * ztd                       ! ptb <-- filtered ptn  
    236                   ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                       ! ptn <-- pta 
    237                   ! 
    238                   IF( ll_tra_hpg )   pta(ji,jj,jk,jn) = ztn + rbcp * ztd    ! pta <-- Brown & Campana average 
     209                  ztd = pta(ji,jj,jk,jn) - 2._wp * ztn + ptb(ji,jj,jk,jn)  ! time laplacian on tracers 
     210                  ! 
     211                  ptb(ji,jj,jk,jn) = ztn + atfp * ztd                      ! ptb <-- filtered ptn  
     212                  ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                      ! ptn <-- pta 
    239213               END DO 
    240214           END DO 
     
    254228      !!  
    255229      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields. 
    256       !!              - save in (ta,sa) a thickness weighted average over the three  
    257       !!             time levels which will be used to compute rdn and thus the semi- 
    258       !!             implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 
    259230      !!              - swap tracer fields to prepare the next time_step. 
    260       !!                This can be summurized for tempearture as: 
    261       !!             ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] )   ln_dynhpg_imp = T 
    262       !!                  /( e3t_n    + rbcp*[ e3t_b    - 2 e3t_n    + e3t_a    ] )    
    263       !!             ztm = 0                                                       otherwise 
    264231      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
    265232      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
    266233      !!             tn  = ta  
    267       !!             ta  = zt        (NB: reset to 0 after eos_bn2 call) 
    268       !! 
    269       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    270       !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    271       !!---------------------------------------------------------------------- 
    272       INTEGER         , INTENT(in   )                               ::  kt       ! ocean time-step index 
    273       INTEGER         , INTENT(in   )                               ::  kit000   ! first time step index 
    274       REAL(wp)        , INTENT(in   ), DIMENSION(jpk)               ::  p2dt     ! time-step 
    275       CHARACTER(len=3), INTENT(in   )                               ::  cdtype   ! =TRA or TRC (tracer indicator) 
    276       INTEGER         , INTENT(in   )                               ::  kjpt     ! number of tracers 
    277       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
    278       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
    279       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    280       REAL(wp)        , INTENT(in   ), DIMENSION(jpi,jpj,kjpt)      ::  psbc_tc   ! surface tracer content 
    281       REAL(wp)        , INTENT(in   ), DIMENSION(jpi,jpj,kjpt)      ::  psbc_tc_b ! before surface tracer content 
    282       !   
    283       LOGICAL  ::   ll_tra_hpg, ll_traqsr, ll_rnf, ll_isf   ! local logical 
     234      !! 
     235      !! ** Action  : - tsb & tsn ready for the next time step 
     236      !!---------------------------------------------------------------------- 
     237      INTEGER                              , INTENT(in   ) ::  kt        ! ocean time-step index 
     238      INTEGER                              , INTENT(in   ) ::  kit000    ! first time step index 
     239      REAL(wp), DIMENSION(jpk)             , INTENT(in   ) ::  p2dt      ! time-step 
     240      CHARACTER(len=3)                     , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator) 
     241      INTEGER                              , INTENT(in   ) ::  kjpt      ! number of tracers 
     242      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptb       ! before tracer fields 
     243      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptn       ! now tracer fields 
     244      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  pta       ! tracer trend 
     245      REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::  psbc_tc   ! surface tracer content 
     246      REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::  psbc_tc_b ! before surface tracer content 
     247      ! 
     248      LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical 
    284249      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    285250      REAL(wp) ::   zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
     
    293258      ENDIF 
    294259      ! 
    295       IF( cdtype == 'TRA' )  THEN    
    296          ll_tra_hpg = ln_dynhpg_imp    ! active  tracers case  and  semi-implicit hpg 
    297          ll_traqsr  = ln_traqsr        ! active  tracers case  and  solar penetration 
    298          ll_rnf     = ln_rnf           ! active  tracers case  and  river runoffs 
     260      IF( cdtype == 'TRA' )  THEN   ! active  tracers case  
     261         ll_traqsr  = ln_traqsr        ! solar penetration 
     262         ll_rnf     = ln_rnf           ! river runoffs 
    299263         IF( nn_isf >= 1 ) THEN  
    300             ll_isf = .TRUE.            ! active  tracers case  and  ice shelf melting/freezing 
     264            ll_isf = .TRUE.            ! ice shelf melting/freezing 
    301265         ELSE 
    302266            ll_isf = .FALSE. 
    303267         END IF 
    304       ELSE                           
    305          ll_tra_hpg = .FALSE.          ! passive tracers case or NO semi-implicit hpg 
    306          ll_traqsr  = .FALSE.          ! active  tracers case and NO solar penetration 
    307          ll_rnf     = .FALSE.          ! passive tracers or NO river runoffs 
    308          ll_isf     = .FALSE.          ! passive tracers or NO ice shelf melting/freezing 
     268      ELSE                          ! passive tracers case 
     269         ll_traqsr  = .FALSE.          ! NO solar penetration 
     270         ll_rnf     = .FALSE.          ! NO river runoffs ????          !!gm BUG ?   
     271         ll_isf     = .FALSE.          ! NO ice shelf melting/freezing  !!gm BUG ??  
    309272      ENDIF 
    310273      ! 
     
    312275         DO jk = 1, jpkm1 
    313276            zfact1 = atfp * p2dt(jk) 
    314             zfact2 = zfact1 / rau0 
     277            zfact2 = zfact1 * r1_rau0 
    315278            DO jj = 2, jpjm1 
    316279               DO ji = fs_2, fs_jpim1 
     
    335298                     ztc_f  = ztc_f  - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 
    336299                  ENDIF 
    337  
     300                  ! 
    338301                  ! solar penetration (temperature only) 
    339302                  IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            &  
    340303                     &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )  
    341  
     304                     ! 
    342305                  ! river runoff 
    343306                  IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) )                                          & 
    344307                     &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) &  
    345308                     &                              * e3t_n(ji,jj,jk) / h_rnf(ji,jj) 
    346  
     309                     ! 
    347310                  ! ice shelf 
    348311                  IF( ll_isf ) THEN 
     
    356319                               &                 * e3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) * ralpha(ji,jj) 
    357320                  END IF 
    358  
     321                  ! 
    359322                  ze3t_f = 1.e0 / ze3t_f 
    360323                  ptb(ji,jj,jk,jn) = ztc_f * ze3t_f       ! ptb <-- ptn filtered 
    361324                  ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)     ! ptn <-- pta 
    362325                  ! 
    363                   IF( ll_tra_hpg ) THEN        ! semi-implicit hpg (T & S only) 
    364                      ze3t_d           = 1.e0   / ( ze3t_n + rbcp * ze3t_d ) 
    365                      pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n  + rbcp * ztc_d  )   ! ta <-- Brown & Campana average 
    366                   ENDIF 
    367326               END DO 
    368327            END DO 
Note: See TracChangeset for help on using the changeset viewer.