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 2024 for branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf_exp.F90 – NEMO

Ignore:
Timestamp:
2010-07-29T12:57:35+02:00 (14 years ago)
Author:
cetlod
Message:

Merge of active and passive tracer advection/diffusion modules, see ticket:693

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf_exp.F90

    r1537 r2024  
    22   !!============================================================================== 
    33   !!                    ***  MODULE  trazdf_exp  *** 
    4    !! Ocean active tracers:  vertical component of the tracer mixing trend using 
    5    !!                        a split-explicit time-stepping  
     4   !! Ocean tracers:  vertical component of the tracer mixing trend using 
     5   !!                  a split-explicit time-stepping  
    66   !!============================================================================== 
    77   !! History :  OPA  !  1990-10  (B. Blanke)  Original code 
     
    1616   !!             -   !  2005-11  (G. Madec)  New organisation 
    1717   !!            3.0  !  2008-04  (G. Madec)  leap-frog time stepping done in trazdf 
     18   !!            3.3  !  2010-06  (C. Ethe, G. Madec) Merge TRA-TRC 
    1819   !!---------------------------------------------------------------------- 
    1920 
     
    2425   USE oce             ! ocean dynamics and active tracers  
    2526   USE dom_oce         ! ocean space and time domain  
    26    USE domvvl          ! variablevolume levels 
    27    USE trdmod          ! ocean active tracers trends  
    28    USE trdmod_oce      ! ocean variables trends 
     27   USE domvvl          ! variable volume levels 
    2928   USE zdf_oce         ! ocean vertical physics 
    3029   USE zdfddm          ! ocean vertical physics: double diffusion 
    3130   USE in_out_manager  ! I/O manager 
    32    USE prtctl          ! Print control 
    3331 
    3432   IMPLICIT NONE 
     
    4947CONTAINS 
    5048 
    51    SUBROUTINE tra_zdf_exp( kt, p2dt ) 
     49   SUBROUTINE tra_zdf_exp( kt    , cdtype, p2dt, kn_zdfexp,  & 
     50      &                    ptrab , ptraa , kjpt              ) 
    5251      !!---------------------------------------------------------------------- 
    5352      !!                  ***  ROUTINE tra_zdf_exp  *** 
     
    5857      !! ** Method  : - The after tracer fields due to the vertical diffusion 
    5958      !!      of tracers alone is given by: 
    60       !!                zwx = tb + p2dt difft 
    61       !!      where difft = dz( avt dz(tb) ) = 1/e3t dk+1( avt/e3w dk(tb) ) 
    62       !!           (if lk_zdfddm=T use avs on salinity instead of avt) 
     59      !!                zwx = ptrab + p2dt difft 
     60      !!      where difft = dz( avt dz(ptrab) ) = 1/e3t dk+1( avt/e3w dk(ptrab) ) 
     61      !!           (if lk_zdfddm=T use avs on salinity and passive tracers instead of avt) 
    6362      !!      difft is evaluated with an Euler split-explit scheme using a 
    6463      !!      no flux boundary condition at both surface and bottomi boundaries. 
     
    6665      !!              - the after tracer fields due to the whole trend is  
    6766      !!      obtained in leap-frog environment by : 
    68       !!          ta = zwx + p2dt ta 
     67      !!          ptraa = zwx + p2dt ptraa 
    6968      !!              - in case of variable level thickness (lk_vvl=T) the  
    7069      !!     the leap-frog is applied on thickness weighted tracer. That is: 
    71       !!          ta = [ tb*e3tb + e3tn*( zwx - tb + p2dt ta ) ] / e3tn 
     70      !!          ptraa = [ ptrab*e3tb + e3tn*( zwx - ptrab + p2dt ptraa ) ] / e3tn 
    7271      !! 
    73       !! ** Action : - after tracer fields (ta,sa)  
     72      !! ** Action : - after tracer fields pta 
    7473      !!--------------------------------------------------------------------- 
    75       INTEGER , INTENT(in)                 ::   kt     ! ocean time-step index 
    76       REAL(wp), INTENT(in), DIMENSION(jpk) ::   p2dt   ! vertical profile of tracer time-step 
    77       !! 
    78       INTEGER  ::   ji, jj, jk, jl            ! dummy loop indices 
    79       REAL(wp) ::   zlavmr, zave3r, ze3tr     ! temporary scalars 
    80       REAL(wp) ::   zta, zsa, ze3tb           ! temporary scalars 
    81       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwx, zwy, zwz, zww   ! 3D workspace 
     74      !! * Arguments 
     75      INTEGER         , INTENT(in   )                                ::   kt          ! ocean time-step index 
     76      CHARACTER(len=3), INTENT(in   )                                ::   cdtype      ! =TRA or TRC (tracer indicator) 
     77      INTEGER         , INTENT(in   )                                ::   kjpt        ! number of tracers 
     78      INTEGER         , INTENT(in   )                                ::   kn_zdfexp   ! number of sub-time step 
     79      REAL(wp)        , INTENT(in   ), DIMENSION(jpk)                ::   p2dt        ! vertical profile of tracer time-step 
     80      REAL(wp)        , INTENT(in   ), DIMENSION(jpi,jpj,jpk,kjpt)   ::   ptrab       ! before and now tracer fields 
     81      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)   ::   ptraa       ! tracer trend  
     82      !! * Local declarations 
     83      INTEGER  ::  ji, jj, jk, jn, jl        ! dummy loop indices 
     84      REAL(wp) ::  zlavmr, zave3r, ze3tr     ! temporary scalars 
     85      REAL(wp) ::  ztra, ze3tb               ! temporary scalars 
     86      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwx, zwy   ! 3D workspace 
    8287      !!--------------------------------------------------------------------- 
    8388 
     
    9095      ! Initializations 
    9196      ! --------------- 
    92       zlavmr = 1. / float( nn_zdfexp )                           ! Local constant 
     97      zlavmr = 1. / float( kn_zdfexp )                           ! Local constant 
    9398      ! 
    94       zwy(:,:, 1 ) = 0.e0        ;   zww(:,:, 1 ) = 0.e0        ! surface boundary conditions: no flux 
    95       zwy(:,:,jpk) = 0.e0        ;   zww(:,:,jpk) = 0.e0        ! bottom  boundary conditions: no flux 
    9699      ! 
    97       zwx(:,:,:)   = tb(:,:,:)   ;   zwz(:,:,:)   = sb(:,:,:)   ! zwx and zwz arrays set to before tracer values 
     100      DO jn = 1, kjpt 
     101         ! 
     102         zwy(:,:, 1 ) = 0.e0     ! surface boundary conditions: no flux 
     103         zwy(:,:,jpk) = 0.e0     ! bottom  boundary conditions: no flux 
     104         ! 
     105         zwx(:,:,:)   = ptrab(:,:,:,jn)  ! zwx array set to before tracer values 
    98106 
    99       ! Split-explicit loop  (after tracer due to the vertical diffusion alone) 
    100       ! ------------------- 
    101       ! 
    102       DO jl = 1, nn_zdfexp 
    103          !                     ! first vertical derivative 
    104          DO jk = 2, jpk 
    105             DO jj = 2, jpjm1  
    106                DO ji = fs_2, fs_jpim1   ! vector opt. 
    107                   zave3r = 1.e0 / fse3w_n(ji,jj,jk)  
    108                   zwy(ji,jj,jk) =   avt(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 
    109                   zww(ji,jj,jk) = fsavs(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) * zave3r 
     107         ! Split-explicit loop  (after tracer due to the vertical diffusion alone) 
     108         ! ------------------- 
     109         ! 
     110         DO jl = 1, kn_zdfexp 
     111            !                     ! first vertical derivative 
     112            DO jk = 2, jpk 
     113               DO jj = 2, jpjm1  
     114                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     115                     zave3r = 1.e0 / fse3w_n(ji,jj,jk)  
     116                     IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN  ! temperature : use of avt 
     117                        zwy(ji,jj,jk) =   avt(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 
     118                     ELSE                                           ! salinity or pass. tracer : use of avs 
     119                        zwy(ji,jj,jk) = fsavs(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 
     120                     END IF 
     121                  END DO 
    110122               END DO 
    111123            END DO 
    112          END DO 
    113          ! 
    114          DO jk = 1, jpkm1      ! second vertical derivative   ==> tracer at kt+l*2*rdt/nn_zdfexp 
    115             DO jj = 2, jpjm1  
    116                DO ji = fs_2, fs_jpim1   ! vector opt. 
    117                   ze3tr = zlavmr / fse3t_n(ji,jj,jk) 
    118                   zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr 
    119                   zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt(jk) * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) * ze3tr 
     124            ! 
     125            DO jk = 1, jpkm1      ! second vertical derivative   ==> tracer at kt+l*2*rdt/nn_zdfexp 
     126               DO jj = 2, jpjm1  
     127                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     128                     ze3tr = zlavmr / fse3t_n(ji,jj,jk) 
     129                     zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr 
     130                  END DO 
    120131               END DO 
    121132            END DO 
     133            ! 
    122134         END DO 
     135 
     136         ! After tracer due to all trends 
     137         ! ------------------------------ 
     138         IF( lk_vvl ) THEN          ! variable level thickness : leap-frog on tracer*e3t 
     139            DO jk = 1, jpkm1 
     140               DO jj = 2, jpjm1  
     141                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     142                     ze3tb = fse3t_b(ji,jj,jk) / fse3t(ji,jj,jk)                          ! before e3t 
     143                     ztra  = zwx(ji,jj,jk) - ptrab(ji,jj,jk,jn) + p2dt(jk) * ptraa(ji,jj,jk,jn)       ! total trends * 2*rdt  
     144                     ptraa(ji,jj,jk,jn) = ( ze3tb * ptrab(ji,jj,jk,jn) + ztra ) * tmask(ji,jj,jk) 
     145                  END DO 
     146               END DO 
     147            END DO 
     148         ELSE                       ! fixed level thickness : leap-frog on tracers 
     149            DO jk = 1, jpkm1 
     150               DO jj = 2, jpjm1  
     151                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     152                     ptraa(ji,jj,jk,jn) = ( zwx(ji,jj,jk) + p2dt(jk) * ptraa(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
     153                  END DO 
     154               END DO 
     155            END DO 
     156         ENDIF 
    123157         ! 
    124158      END DO 
    125  
    126       ! After tracer due to all trends 
    127       ! ------------------------------ 
    128       IF( lk_vvl ) THEN          ! variable level thickness : leap-frog on tracer*e3t 
    129          DO jk = 1, jpkm1 
    130             DO jj = 2, jpjm1  
    131                DO ji = fs_2, fs_jpim1   ! vector opt. 
    132                   ze3tb = fse3t_b(ji,jj,jk) / fse3t(ji,jj,jk)                          ! before e3t 
    133                   zta   = zwx(ji,jj,jk) - tb(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk)       ! total trends * 2*rdt 
    134                   zsa   = zwz(ji,jj,jk) - sb(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk)      
    135                   ta(ji,jj,jk) = (  ze3tb * tb(ji,jj,jk) + zta  ) * tmask(ji,jj,jk) 
    136                   sa(ji,jj,jk) = (  ze3tb * sb(ji,jj,jk) + zsa  ) * tmask(ji,jj,jk) 
    137                END DO 
    138             END DO 
    139          END DO 
    140       ELSE                       ! fixed level thickness : leap-frog on tracers 
    141          DO jk = 1, jpkm1 
    142             DO jj = 2, jpjm1  
    143                DO ji = fs_2, fs_jpim1   ! vector opt. 
    144                   ta(ji,jj,jk) = ( zwx(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk) ) * tmask(ji,jj,jk) 
    145                   sa(ji,jj,jk) = ( zwz(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk) ) * tmask(ji,jj,jk) 
    146                END DO 
    147             END DO 
    148          END DO 
    149       ENDIF 
    150159      ! 
    151160   END SUBROUTINE tra_zdf_exp 
Note: See TracChangeset for help on using the changeset viewer.