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 12581 for NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traatfLF.F90 – NEMO

Ignore:
Timestamp:
2020-03-20T23:26:56+01:00 (4 years ago)
Author:
techene
Message:

OCE/DOM/domqe.F90: make dom_qe_r3c public, OCE/DYN/dynatfLF.F90: duplicate dynatf and replace dom_qe_interpol calls by the ssh scaling method to compute and update e3t/u/v at time Kmm, OCE/TRA/traatfLF.F90: duplicate traatf and replace dom_qe_interpol by the ssh scaling method to compute internal ze3t, OCE/steplf.F90: change the order of atf routines ssh_atf is called first then dom_qe_r3c to computed filtered ssh to h ratios at T-, U-, V-points finally tra_atf_lf and dyn_atf_lf

File:
1 copied

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traatfLF.F90

    r12481 r12581  
    1 MODULE traatf 
     1MODULE traatfLF 
    22   !!====================================================================== 
    3    !!                       ***  MODULE  traatf  *** 
     3   !!                       ***  MODULE  traatfLF  *** 
    44   !! Ocean active tracers:  Asselin time filtering for temperature and salinity 
    55   !!====================================================================== 
     
    1717   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  semi-implicit hpg with asselin filter + modified LF-RA 
    1818   !!             -   !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA 
    19    !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename tranxt.F90 -> traatf.F90. Now only does time filtering. 
     19   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename tranxt.F90 -> traatfLF.F90. Now only does time filtering. 
    2020   !!---------------------------------------------------------------------- 
    2121 
     
    2626   !!---------------------------------------------------------------------- 
    2727   USE oce             ! ocean dynamics and tracers variables 
    28    USE dom_oce         ! ocean space and time domain variables  
     28   USE dom_oce         ! ocean space and time domain variables 
    2929   USE sbc_oce         ! surface boundary condition: ocean 
    3030   USE sbcrnf          ! river runoffs 
     
    3333   USE domvvl          ! variable volume 
    3434   USE trd_oce         ! trends: ocean variables 
    35    USE trdtra          ! trends manager: tracers  
     35   USE trdtra          ! trends manager: tracers 
    3636   USE traqsr          ! penetrative solar radiation (needed for nksr) 
    3737   USE phycst          ! physical constant 
     
    5252   PRIVATE 
    5353 
    54    PUBLIC   tra_atf       ! routine called by step.F90 
    55    PUBLIC   tra_atf_fix   ! to be used in trcnxt 
    56    PUBLIC   tra_atf_vvl   ! to be used in trcnxt 
     54   PUBLIC   tra_atf_lf       ! routine called by step.F90 
     55   PUBLIC   tra_atf_fix_lf   ! to be used in trcnxt !!st WARNING discrepancy here interpol is used 
     56   PUBLIC   tra_atf_qe_lf    ! to be used in trcnxt !!st WARNING discrepancy here interpol is used 
    5757 
    5858   !! * Substitutions 
     
    6565CONTAINS 
    6666 
    67    SUBROUTINE tra_atf( kt, Kbb, Kmm, Kaa, pts ) 
    68       !!---------------------------------------------------------------------- 
    69       !!                   ***  ROUTINE traatf  *** 
    70       !! 
    71       !! ** Purpose :   Apply the boundary condition on the after temperature   
     67   SUBROUTINE tra_atf_lf( kt, Kbb, Kmm, Kaa, pts ) 
     68      !!---------------------------------------------------------------------- 
     69      !!                   ***  ROUTINE traatfLF  *** 
     70      !! 
     71      !! ** Purpose :   Apply the boundary condition on the after temperature 
    7272      !!             and salinity fields and add the Asselin time filter on now fields. 
    73       !!  
    74       !! ** Method  :   At this stage of the computation, ta and sa are the  
     73      !! 
     74      !! ** Method  :   At this stage of the computation, ta and sa are the 
    7575      !!             after temperature and salinity as the time stepping has 
    7676      !!             been performed in trazdf_imp or trazdf_exp module. 
    7777      !! 
    78       !!              - Apply lateral boundary conditions on (ta,sa)  
    79       !!             at the local domain   boundaries through lbc_lnk call,  
    80       !!             at the one-way open boundaries (ln_bdy=T),  
     78      !!              - Apply lateral boundary conditions on (ta,sa) 
     79      !!             at the local domain   boundaries through lbc_lnk call, 
     80      !!             at the one-way open boundaries (ln_bdy=T), 
    8181      !!             at the AGRIF zoom   boundaries (lk_agrif=T) 
    8282      !! 
     
    8888      INTEGER                                  , INTENT(in   ) :: kt             ! ocean time-step index 
    8989      INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Kaa  ! time level indices 
    90       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers  
     90      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers 
    9191      !! 
    9292      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     
    9595      !!---------------------------------------------------------------------- 
    9696      ! 
    97       IF( ln_timing )   CALL timing_start( 'tra_atf') 
     97      IF( ln_timing )   CALL timing_start( 'tra_atf_lf') 
    9898      ! 
    9999      IF( kt == nit000 ) THEN 
    100100         IF(lwp) WRITE(numout,*) 
    101          IF(lwp) WRITE(numout,*) 'tra_atf : apply Asselin time filter to "now" fields' 
     101         IF(lwp) WRITE(numout,*) 'tra_atf_lf : apply Asselin time filter to "now" fields' 
    102102         IF(lwp) WRITE(numout,*) '~~~~~~~' 
    103103      ENDIF 
    104104 
    105105      ! Update after tracer on domain lateral boundaries 
    106       !  
     106      ! 
    107107#if defined key_agrif 
    108108      CALL Agrif_tra                     ! AGRIF zoom boundaries 
    109109#endif 
    110110      !                                              ! local domain boundaries  (T-point, unchanged sign) 
    111       CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 
     111      CALL lbc_lnk_multi( 'traatfLF', pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 
    112112      ! 
    113113      IF( ln_bdy )   CALL bdy_tra( kt, Kbb, pts, Kaa )  ! BDY open boundaries 
    114   
     114 
    115115      ! set time step size (Euler/Leapfrog) 
    116116      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;   r2dt =        rdt   ! at nit000             (Euler) 
     
    119119 
    120120      ! trends computation initialisation 
    121       IF( l_trdtra )   THEN                     
     121      IF( l_trdtra )   THEN 
    122122         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 
    123123         ztrdt(:,:,jpk) = 0._wp 
    124124         ztrds(:,:,jpk) = 0._wp 
    125          IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend  
     125         IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend 
    126126            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_zdfp, ztrdt ) 
    127127            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_zdfp, ztrds ) 
    128128         ENDIF 
    129          ! total trend for the non-time-filtered variables.  
     129         ! total trend for the non-time-filtered variables. 
    130130         zfact = 1.0 / rdt 
    131131         ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms 
     
    137137         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_tot, ztrds ) 
    138138         IF( ln_linssh ) THEN       ! linear sea surface height only 
    139             ! Store now fields before applying the Asselin filter  
     139            ! Store now fields before applying the Asselin filter 
    140140            ! in order to calculate Asselin filter trend later. 
    141             ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kmm)  
     141            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kmm) 
    142142            ztrds(:,:,:) = pts(:,:,:,jp_sal,Kmm) 
    143143         ENDIF 
    144144      ENDIF 
    145145 
    146       IF( neuler == 0 .AND. kt == nit000 ) THEN       ! Euler time-stepping  
     146      IF( neuler == 0 .AND. kt == nit000 ) THEN       ! Euler time-stepping 
    147147         ! 
    148148         IF (l_trdtra .AND. .NOT. ln_linssh ) THEN   ! Zero Asselin filter contribution must be explicitly written out since for vvl 
     
    156156      ELSE                                            ! Leap-Frog + Asselin filter time stepping 
    157157         ! 
    158          IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000,      'TRA', pts, jpts )  ! linear free surface  
    159          ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rdt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface 
    160          ENDIF 
    161          ! 
    162          CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kbb) , 'T', 1., pts(:,:,:,jp_sal,Kbb) , 'T', 1., & 
     158         IF( ln_linssh ) THEN   ;   CALL tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, nit000,      'TRA', pts, jpts )  ! linear free surface 
     159         ELSE                   ;   CALL tra_atf_qe_lf( kt, Kbb, Kmm, Kaa, nit000, rdt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface 
     160         ENDIF 
     161         ! 
     162         CALL lbc_lnk_multi( 'traatfLF', pts(:,:,:,jp_tem,Kbb) , 'T', 1., pts(:,:,:,jp_sal,Kbb) , 'T', 1., & 
    163163                  &                    pts(:,:,:,jp_tem,Kmm) , 'T', 1., pts(:,:,:,jp_sal,Kmm) , 'T', 1., & 
    164164                  &                    pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1.  ) 
    165165         ! 
    166       ENDIF      
    167       ! 
    168       IF( l_trdtra .AND. ln_linssh ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt      
    169          zfact = 1._wp / r2dt              
     166      ENDIF 
     167      ! 
     168      IF( l_trdtra .AND. ln_linssh ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt 
     169         zfact = 1._wp / r2dt 
    170170         DO jk = 1, jpkm1 
    171171            ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * zfact 
     
    181181         &                                  tab3d_2=pts(:,:,:,jp_sal,Kmm), clinfo2=       ' Sn: ', mask2=tmask ) 
    182182      ! 
    183       IF( ln_timing )   CALL timing_stop('tra_atf') 
    184       ! 
    185    END SUBROUTINE tra_atf 
    186  
    187  
    188    SUBROUTINE tra_atf_fix( kt, Kbb, Kmm, Kaa, kit000, cdtype, pt, kjpt ) 
     183      IF( ln_timing )   CALL timing_stop('tra_atf_lf') 
     184      ! 
     185   END SUBROUTINE tra_atf_lf 
     186 
     187 
     188   SUBROUTINE tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, kit000, cdtype, pt, kjpt ) 
    189189      !!---------------------------------------------------------------------- 
    190190      !!                   ***  ROUTINE tra_atf_fix  *** 
    191191      !! 
    192192      !! ** Purpose :   fixed volume: apply the Asselin time filter to the "now" field 
    193       !!  
     193      !! 
    194194      !! ** Method  : - Apply a Asselin time filter on now fields. 
    195195      !! 
     
    209209      IF( kt == kit000 )  THEN 
    210210         IF(lwp) WRITE(numout,*) 
    211          IF(lwp) WRITE(numout,*) 'tra_atf_fix : time filtering', cdtype 
     211         IF(lwp) WRITE(numout,*) 'tra_atf_fix_lf : time filtering', cdtype 
    212212         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    213213      ENDIF 
     
    216216         ! 
    217217         DO_3D_00_00( 1, jpkm1 ) 
    218             ztn = pt(ji,jj,jk,jn,Kmm)                                     
     218            ztn = pt(ji,jj,jk,jn,Kmm) 
    219219            ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb)  ! time laplacian on tracers 
    220220            ! 
     
    224224      END DO 
    225225      ! 
    226    END SUBROUTINE tra_atf_fix 
    227  
    228  
    229    SUBROUTINE tra_atf_vvl( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt ) 
     226   END SUBROUTINE tra_atf_fix_lf 
     227 
     228 
     229   SUBROUTINE tra_atf_qe_lf( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt ) 
    230230      !!---------------------------------------------------------------------- 
    231231      !!                   ***  ROUTINE tra_atf_vvl  *** 
    232232      !! 
    233       !! ** Purpose :   Time varying volume: apply the Asselin time filter   
    234       !!  
     233      !! ** Purpose :   Time varying volume: apply the Asselin time filter 
     234      !! 
    235235      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields. 
    236236      !!             pt(Kmm)  = ( e3t(Kmm)*pt(Kmm) + atfp*[ e3t(Kbb)*pt(Kbb) - 2 e3t(Kmm)*pt(Kmm) + e3t_a*pt(Kaa) ] ) 
     
    252252      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    253253      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
    254       REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d, zscale  !   -      - 
     254      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d  !   -      - 
    255255      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrd_atf 
    256256      !!---------------------------------------------------------------------- 
     
    262262      ENDIF 
    263263      ! 
    264       IF( cdtype == 'TRA' )  THEN    
     264      IF( cdtype == 'TRA' )  THEN 
    265265         ll_traqsr  = ln_traqsr        ! active  tracers case  and  solar penetration 
    266266         ll_rnf     = ln_rnf           ! active  tracers case  and  river runoffs 
     
    268268      ELSE                          ! passive tracers case 
    269269         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 ??  
     270         ll_rnf     = .FALSE.          ! NO river runoffs ????          !!gm BUG ? 
     271         ll_isf     = .FALSE.          ! NO ice shelf melting/freezing  !!gm BUG ?? 
    272272      ENDIF 
    273273      ! 
     
    279279      zfact1 = atfp * p2dt 
    280280      zfact2 = zfact1 * r1_rau0 
    281       DO jn = 1, kjpt       
     281      DO jn = 1, kjpt 
    282282         DO_3D_00_00( 1, jpkm1 ) 
    283283            ze3t_b = e3t(ji,jj,jk,Kbb) 
     
    292292            ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b 
    293293            ! 
    294             ze3t_f = ze3t_n + atfp * ze3t_d 
    295294            ztc_f  = ztc_n  + atfp * ztc_d 
    296295            ! 
    297             ! Add asselin correction on scale factors: 
    298             zscale = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) )  
    299             ze3t_f = ze3t_f - zfact2 * zscale * ( emp_b(ji,jj) - emp(ji,jj) )  
    300             IF ( ll_rnf ) ze3t_f = ze3t_f + zfact2 * zscale * (    rnf_b(ji,jj) -    rnf(ji,jj) )  
    301             IF ( ll_isf ) THEN 
    302                IF ( ln_isfcav_mlt ) ze3t_f = ze3t_f - zfact2 * zscale * ( fwfisf_cav_b(ji,jj) - fwfisf_cav(ji,jj) ) 
    303                IF ( ln_isfpar_mlt ) ze3t_f = ze3t_f - zfact2 * zscale * ( fwfisf_par_b(ji,jj) - fwfisf_par(ji,jj) ) 
    304             ENDIF 
    305             ! 
    306             IF( jk == mikt(ji,jj) ) THEN           ! first level  
     296            ! Asselin correction on scale factors is done via ssh in r3t_f 
     297            ze3t_f = e3t_0(ji,jj,jk) * ( 1._wp + r3t_f(ji,jj) * tmask(ji,jj,jk) ) 
     298 
     299            ! 
     300            IF( jk == mikt(ji,jj) ) THEN           ! first level 
    307301               ztc_f  = ztc_f  - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 
    308302            ENDIF 
    309303            ! 
    310304            ! solar penetration (temperature only) 
    311             IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            &  
    312                &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )  
     305            IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            & 
     306               &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) ) 
    313307               ! 
    314308            ! 
    315309            IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) )                                          & 
    316                &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) &  
     310               &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) & 
    317311               &                              * e3t(ji,jj,jk,Kmm) / h_rnf(ji,jj) 
    318312 
     
    328322                        &                     * e3t(ji,jj,jk,Kmm) / rhisf_tbl_cav(ji,jj) 
    329323                  END IF 
    330                   ! level partially include in Losch_2008 ice shelf boundary layer  
     324                  ! level partially include in Losch_2008 ice shelf boundary layer 
    331325                  IF ( jk == misfkb_cav(ji,jj) ) THEN 
    332326                     ztc_f  = ztc_f  - zfact1 * ( risf_cav_tsc(ji,jj,jn) - risf_cav_tsc_b(ji,jj,jn) )  & 
     
    342336                            &                 * e3t(ji,jj,jk,Kmm) / rhisf_tbl_par(ji,jj) 
    343337                  END IF 
    344                   ! level partially include in Losch_2008 ice shelf boundary layer  
     338                  ! level partially include in Losch_2008 ice shelf boundary layer 
    345339                  IF ( jk == misfkb_par(ji,jj) ) THEN 
    346340                     ztc_f  = ztc_f  - zfact1 * ( risf_par_tsc(ji,jj,jn) - risf_par_tsc_b(ji,jj,jn) )  & 
     
    356350                     ztc_f  = ztc_f  + zfact1 * risfcpl_tsc(ji,jj,jk,jn) * r1_e1e2t(ji,jj) 
    357351                     ! Shouldn't volume increment be spread according thanks to zscale  ? 
    358                      ze3t_f = ze3t_f - zfact1 * risfcpl_vol(ji,jj,jk   ) * r1_e1e2t(ji,jj) 
    359352                  END IF 
    360353                  ! 
     
    371364            ! 
    372365         END_3D 
    373          !  
     366         ! 
    374367      END DO 
    375368      ! 
    376369      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN 
    377          IF( l_trdtra .AND. cdtype == 'TRA' ) THEN  
     370         IF( l_trdtra .AND. cdtype == 'TRA' ) THEN 
    378371            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) ) 
    379372            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) ) 
     
    387380      ENDIF 
    388381      ! 
    389    END SUBROUTINE tra_atf_vvl 
     382   END SUBROUTINE tra_atf_qe_lf 
    390383 
    391384   !!====================================================================== 
    392 END MODULE traatf 
     385END MODULE traatfLF 
Note: See TracChangeset for help on using the changeset viewer.