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 10880 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv.F90 – NEMO

Ignore:
Timestamp:
2019-04-17T12:02:14+02:00 (5 years ago)
Author:
davestorkey
Message:

branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps:

  1. Move time indices from dom_oce.F90 to step.F90.
  2. Implement time dimension for passive tracers with independent set of time indices in trcstp.F90.
  3. Update all the traadv and trcadv modules.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv.F90

    r10874 r10880  
    7575CONTAINS 
    7676 
    77    SUBROUTINE tra_adv( kt ) 
     77   SUBROUTINE tra_adv( kt, Kbb, Kmm, pts, Krhs ) 
    7878      !!---------------------------------------------------------------------- 
    7979      !!                  ***  ROUTINE tra_adv  *** 
     
    8181      !! ** Purpose :   compute the ocean tracer advection trend. 
    8282      !! 
    83       !! ** Method  : - Update (ua,va) with the advection term following nadv 
    84       !!---------------------------------------------------------------------- 
    85       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     83      !! ** Method  : - Update (uu(:,:,:,Krhs),vv(:,:,:,Krhs)) with the advection term following nadv 
     84      !!---------------------------------------------------------------------- 
     85      INTEGER                                  , INTENT(in)    :: kt             ! ocean time-step index 
     86      INTEGER                                  , INTENT(in)    :: Kbb, Kmm, Krhs ! time level indices 
     87      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers and RHS of tracer equation 
    8688      ! 
    8789      INTEGER ::   jk   ! dummy loop index 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk)        :: zun, zvn, zwn   ! 3D workspace 
     90      REAL(wp), DIMENSION(jpi,jpj,jpk)        :: zuu, zvv, zww   ! 3D workspace 
    8991      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds 
    9092      !!---------------------------------------------------------------------- 
     
    98100      ! 
    99101      !                                         !==  effective transport  ==! 
    100       zun(:,:,jpk) = 0._wp 
    101       zvn(:,:,jpk) = 0._wp 
    102       zwn(:,:,jpk) = 0._wp 
     102      zuu(:,:,jpk) = 0._wp 
     103      zvv(:,:,jpk) = 0._wp 
     104      zww(:,:,jpk) = 0._wp 
    103105      IF( ln_wave .AND. ln_sdw )  THEN 
    104106         DO jk = 1, jpkm1                                                       ! eulerian transport + Stokes Drift 
    105             zun(:,:,jk) = e2u  (:,:) * e3u_n(:,:,jk) * ( un(:,:,jk) + usd(:,:,jk) ) 
    106             zvn(:,:,jk) = e1v  (:,:) * e3v_n(:,:,jk) * ( vn(:,:,jk) + vsd(:,:,jk) ) 
    107             zwn(:,:,jk) = e1e2t(:,:)                 * ( wn(:,:,jk) + wsd(:,:,jk) ) 
     107            zuu(:,:,jk) = e2u  (:,:) * e3u(:,:,jk,Kmm) * ( uu(:,:,jk,Kmm) + usd(:,:,jk) ) 
     108            zvv(:,:,jk) = e1v  (:,:) * e3v(:,:,jk,Kmm) * ( vv(:,:,jk,Kmm) + vsd(:,:,jk) ) 
     109            zww(:,:,jk) = e1e2t(:,:)                 * ( ww(:,:,jk) + wsd(:,:,jk) ) 
    108110         END DO 
    109111      ELSE 
    110112         DO jk = 1, jpkm1 
    111             zun(:,:,jk) = e2u  (:,:) * e3u_n(:,:,jk) * un(:,:,jk)               ! eulerian transport only 
    112             zvn(:,:,jk) = e1v  (:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
    113             zwn(:,:,jk) = e1e2t(:,:)                 * wn(:,:,jk) 
     113            zuu(:,:,jk) = e2u  (:,:) * e3u(:,:,jk,Kmm) * uu(:,:,jk,Kmm)               ! eulerian transport only 
     114            zvv(:,:,jk) = e1v  (:,:) * e3v(:,:,jk,Kmm) * vv(:,:,jk,Kmm) 
     115            zww(:,:,jk) = e1e2t(:,:)                 * ww(:,:,jk) 
    114116         END DO 
    115117      ENDIF 
    116118      ! 
    117119      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN                                ! add z-tilde and/or vvl corrections 
    118          zun(:,:,:) = zun(:,:,:) + un_td(:,:,:) 
    119          zvn(:,:,:) = zvn(:,:,:) + vn_td(:,:,:) 
    120       ENDIF 
    121       ! 
    122       zun(:,:,jpk) = 0._wp                                                      ! no transport trough the bottom 
    123       zvn(:,:,jpk) = 0._wp 
    124       zwn(:,:,jpk) = 0._wp 
     120         zuu(:,:,:) = zuu(:,:,:) + un_td(:,:,:) 
     121         zvv(:,:,:) = zvv(:,:,:) + vn_td(:,:,:) 
     122      ENDIF 
     123      ! 
     124      zuu(:,:,jpk) = 0._wp                                                      ! no transport trough the bottom 
     125      zvv(:,:,jpk) = 0._wp 
     126      zww(:,:,jpk) = 0._wp 
    125127      ! 
    126128      IF( ln_ldfeiv .AND. .NOT. ln_traldf_triad )   & 
    127          &              CALL ldf_eiv_trp( kt, nit000, zun, zvn, zwn, 'TRA' )   ! add the eiv transport (if necessary) 
    128       ! 
    129       IF( ln_mle    )   CALL tra_mle_trp( kt, nit000, zun, zvn, zwn, 'TRA' )   ! add the mle transport (if necessary) 
    130       ! 
    131       CALL iom_put( "uocetr_eff", zun )                                        ! output effective transport       
    132       CALL iom_put( "vocetr_eff", zvn ) 
    133       CALL iom_put( "wocetr_eff", zwn ) 
     129         &              CALL ldf_eiv_trp( kt, nit000, zuu, zvv, zww, 'TRA' )   ! add the eiv transport (if necessary) 
     130      ! 
     131      IF( ln_mle    )   CALL tra_mle_trp( kt, nit000, zuu, zvv, zww, 'TRA' )   ! add the mle transport (if necessary) 
     132      ! 
     133      CALL iom_put( "uocetr_eff", zuu )                                        ! output effective transport       
     134      CALL iom_put( "vocetr_eff", zvv ) 
     135      CALL iom_put( "wocetr_eff", zww ) 
    134136      ! 
    135137!!gm ??? 
    136       IF( ln_diaptr )   CALL dia_ptr( zvn )                                    ! diagnose the effective MSF  
     138      IF( ln_diaptr )   CALL dia_ptr( zvv )                                    ! diagnose the effective MSF  
    137139!!gm ??? 
    138140      ! 
    139141      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
    140142         ALLOCATE( ztrdt(jpi,jpj,jpk), ztrds(jpi,jpj,jpk) ) 
    141          ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
    142          ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
     143         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 
     144         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 
    143145      ENDIF 
    144146      ! 
     
    146148      ! 
    147149      CASE ( np_CEN )                                 ! Centered scheme : 2nd / 4th order 
    148          CALL tra_adv_cen    ( kt, nit000, 'TRA',         zun, zvn, zwn     , tsn, tsa, jpts, nn_cen_h, nn_cen_v ) 
     150         CALL tra_adv_cen    ( kt, nit000, 'TRA',         zuu, zvv, zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v ) 
    149151      CASE ( np_FCT )                                 ! FCT scheme      : 2nd / 4th order 
    150          CALL tra_adv_fct    ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts, nn_fct_h, nn_fct_v ) 
     152         CALL tra_adv_fct    ( kt, nit000, 'TRA', r2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v ) 
    151153      CASE ( np_MUS )                                 ! MUSCL 
    152          CALL tra_adv_mus    ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb,      tsa, jpts        , ln_mus_ups )  
     154         CALL tra_adv_mus    ( kt, nit000, 'TRA', r2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups )  
    153155      CASE ( np_UBS )                                 ! UBS 
    154          CALL tra_adv_ubs    ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts        , nn_ubs_v   ) 
     156         CALL tra_adv_ubs    ( kt, nit000, 'TRA', r2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v   ) 
    155157      CASE ( np_QCK )                                 ! QUICKEST 
    156          CALL tra_adv_qck    ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts                    ) 
     158         CALL tra_adv_qck    ( kt, nit000, 'TRA', r2dt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs ) 
    157159      ! 
    158160      END SELECT 
     
    160162      IF( l_trdtra )   THEN                      ! save the advective trends for further diagnostics 
    161163         DO jk = 1, jpkm1 
    162             ztrdt(:,:,jk) = tsa(:,:,jk,jp_tem) - ztrdt(:,:,jk) 
    163             ztrds(:,:,jk) = tsa(:,:,jk,jp_sal) - ztrds(:,:,jk) 
     164            ztrdt(:,:,jk) = pts(:,:,jk,jp_tem,Krhs) - ztrdt(:,:,jk) 
     165            ztrds(:,:,jk) = pts(:,:,jk,jp_sal,Krhs) - ztrds(:,:,jk) 
    164166         END DO 
    165167         CALL trd_tra( kt, 'TRA', jp_tem, jptra_totad, ztrdt ) 
Note: See TracChangeset for help on using the changeset viewer.