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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90

    r5385 r6808  
    99 
    1010   !!---------------------------------------------------------------------- 
    11    !!   tra_zdf      : Update the tracer trend with the vertical diffusion 
    12    !!   tra_zdf_init : initialisation of the computation 
     11   !!   tra_zdf       : Update the tracer trend with the vertical diffusion 
     12   !!   tra_zdf_init  : initialisation of the computation 
    1313   !!---------------------------------------------------------------------- 
    14    USE oce             ! ocean dynamics and tracers variables 
    15    USE dom_oce         ! ocean space and time domain variables  
    16    USE domvvl          ! variable volume 
    17    USE phycst          ! physical constant 
    18    USE zdf_oce         ! ocean vertical physics variables 
    19    USE sbc_oce         ! surface boundary condition: ocean 
    20    USE dynspg_oce 
    21    USE trazdf_exp      ! vertical diffusion: explicit (tra_zdf_exp     routine) 
    22    USE trazdf_imp      ! vertical diffusion: implicit (tra_zdf_imp    routine) 
    23    USE ldftra_oce      ! ocean active tracers: lateral physics 
    24    USE trd_oce         ! trends: ocean variables 
    25    USE trdtra          ! trends manager: tracers  
     14   USE oce            ! ocean dynamics and tracers variables 
     15   USE dom_oce        ! ocean space and time domain variables  
     16   USE domvvl         ! variable volume 
     17   USE phycst         ! physical constant 
     18   USE zdf_oce        ! ocean vertical physics variables 
     19   USE sbc_oce        ! surface boundary condition: ocean 
     20   USE ldftra         ! lateral diffusion: eddy diffusivity 
     21   USE ldfslp         ! lateral diffusion: iso-neutral slope  
     22   USE trazdf_exp     ! vertical diffusion: explicit (tra_zdf_exp routine) 
     23   USE trazdf_imp     ! vertical diffusion: implicit (tra_zdf_imp routine) 
     24   USE trd_oce        ! trends: ocean variables 
     25   USE trdtra         ! trends: tracer trend manager 
    2626   ! 
    27    USE in_out_manager  ! I/O manager 
    28    USE prtctl          ! Print control 
    29    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    30    USE lib_mpp         ! MPP library 
    31    USE wrk_nemo        ! Memory allocation 
    32    USE timing          ! Timing 
     27   USE in_out_manager ! I/O manager 
     28   USE prtctl         ! Print control 
     29   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     30   USE lib_mpp        ! MPP library 
     31   USE wrk_nemo       ! Memory allocation 
     32   USE timing         ! Timing 
    3333 
    3434   IMPLICIT NONE 
     
    4141 
    4242   !! * Substitutions 
    43 #  include "domzgr_substitute.h90" 
    4443#  include "zdfddm_substitute.h90" 
    4544#  include "vectopt_loop_substitute.h90" 
    4645   !!---------------------------------------------------------------------- 
    47    !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
     46   !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
    4847   !! $Id$ 
    4948   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5857      !!--------------------------------------------------------------------- 
    5958      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    60       !! 
     59      ! 
    6160      INTEGER  ::   jk                   ! Dummy loop indices 
    6261      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrdt, ztrds   ! 3D workspace 
     
    6665      ! 
    6766      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000 
    68          r2dtra(:) =  rdttra(:)                          ! = rdtra (restarting with Euler time stepping) 
     67         r2dt =  rdt                          ! = rdt (restarting with Euler time stepping) 
    6968      ELSEIF( kt <= nit000 + 1) THEN                ! at nit000 or nit000+1 
    70          r2dtra(:) = 2. * rdttra(:)                      ! = 2 rdttra (leapfrog) 
     69         r2dt = 2. * rdt                      ! = 2 rdt (leapfrog) 
    7170      ENDIF 
    72  
     71      ! 
    7372      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
    7473         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
     
    7675         ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
    7776      ENDIF 
    78  
     77      ! 
    7978      SELECT CASE ( nzdf )                       ! compute lateral mixing trend and add it to the general trend 
    80       CASE ( 0 )    ;    CALL tra_zdf_exp( kt, nit000, 'TRA', r2dtra, nn_zdfexp, tsb, tsa, jpts )  !   explicit scheme  
    81       CASE ( 1 )    ;    CALL tra_zdf_imp( kt, nit000, 'TRA', r2dtra,            tsb, tsa, jpts )  !   implicit scheme  
    82       CASE ( -1 )                                       ! esopa: test all possibility with control print 
    83          CALL tra_zdf_exp( kt, nit000, 'TRA', r2dtra, nn_zdfexp, tsb, tsa, jpts ) 
    84          CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf0 - Ta: ', mask1=tmask,               & 
    85          &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    86          CALL tra_zdf_imp( kt, nit000, 'TRA', r2dtra,            tsb, tsa, jpts )  
    87          CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf1 - Ta: ', mask1=tmask,               & 
    88          &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     79      CASE ( 0 )    ;    CALL tra_zdf_exp( kt, nit000, 'TRA', r2dt, nn_zdfexp, tsb, tsa, jpts )  !   explicit scheme  
     80      CASE ( 1 )    ;    CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt,            tsb, tsa, jpts )  !   implicit scheme  
    8981      END SELECT 
     82!!gm WHY here !   and I don't like that ! 
    9083      ! DRAKKAR SSS control { 
    9184      ! JMM avoid negative salinities near river outlet ! Ugly fix 
    9285      ! JMM : restore negative salinities to small salinities: 
    93       WHERE ( tsa(:,:,:,jp_sal) < 0._wp )   tsa(:,:,:,jp_sal) = 0.1_wp 
     86      WHERE( tsa(:,:,:,jp_sal) < 0._wp )   tsa(:,:,:,jp_sal) = 0.1_wp 
     87!!gm 
    9488 
    9589      IF( l_trdtra )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    9690         DO jk = 1, jpkm1 
    97             ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / r2dtra(jk) ) - ztrdt(:,:,jk) 
    98             ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / r2dtra(jk) ) - ztrds(:,:,jk) 
     91            ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / r2dt ) - ztrdt(:,:,jk) 
     92            ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / r2dt ) - ztrds(:,:,jk) 
    9993         END DO 
     94!!gm this should be moved in trdtra.F90 and done on all trends 
    10095         CALL lbc_lnk( ztrdt, 'T', 1. ) 
    10196         CALL lbc_lnk( ztrds, 'T', 1. ) 
     97!!gm 
    10298         CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 
    10399         CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 
    104100         CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    105101      ENDIF 
    106  
    107102      !                                          ! print mean trends (used for debugging) 
    108103      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf  - Ta: ', mask1=tmask,               & 
     
    123118      !!      nzdf = 0   explicit (time-splitting) scheme (ln_zdfexp=T) 
    124119      !!           = 1   implicit (euler backward) scheme (ln_zdfexp=F) 
    125       !!      NB: rotation of lateral mixing operator or TKE or KPP scheme, 
    126       !!      the implicit scheme is required. 
     120      !!      NB: rotation of lateral mixing operator or TKE & GLS schemes, 
     121      !!          an implicit scheme is required. 
    127122      !!---------------------------------------------------------------------- 
    128123      USE zdftke 
    129124      USE zdfgls 
    130       USE zdfkpp 
    131125      !!---------------------------------------------------------------------- 
    132  
     126      ! 
    133127      ! Choice from ln_zdfexp already read in namelist in zdfini module 
    134128      IF( ln_zdfexp ) THEN   ;   nzdf = 0           ! use explicit scheme 
    135129      ELSE                   ;   nzdf = 1           ! use implicit scheme 
    136130      ENDIF 
    137  
     131      ! 
    138132      ! Force implicit schemes 
    139       IF( lk_zdftke .OR. lk_zdfgls .OR. lk_zdfkpp )   nzdf = 1      ! TKE, GLS or KPP physics 
    140       IF( ln_traldf_iso                           )   nzdf = 1      ! iso-neutral lateral physics 
    141       IF( ln_traldf_hor .AND. ln_sco              )   nzdf = 1      ! horizontal lateral physics in s-coordinate 
     133      IF( lk_zdftke .OR. lk_zdfgls   )   nzdf = 1   ! TKE, or GLS physics 
     134      IF( ln_traldf_iso              )   nzdf = 1   ! iso-neutral lateral physics 
     135      IF( ln_traldf_hor .AND. ln_sco )   nzdf = 1   ! horizontal lateral physics in s-coordinate 
    142136      IF( ln_zdfexp .AND. nzdf == 1 )   CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator',   & 
    143             &                         ' TKE or KPP scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 
    144  
    145       ! Test: esopa 
    146       IF( lk_esopa )    nzdf = -1                      ! All schemes used 
    147  
     137            &                         ' GLS or TKE scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 
     138            ! 
    148139      IF(lwp) THEN 
    149140         WRITE(numout,*) 
    150141         WRITE(numout,*) 'tra_zdf_init : vertical tracer physics scheme' 
    151142         WRITE(numout,*) '~~~~~~~~~~~' 
    152          IF( nzdf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used' 
    153143         IF( nzdf ==  0 )   WRITE(numout,*) '              Explicit time-splitting scheme' 
    154144         IF( nzdf ==  1 )   WRITE(numout,*) '              Implicit (euler backward) scheme' 
Note: See TracChangeset for help on using the changeset viewer.