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 13427 for NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/stpMLF.F90 – NEMO

Ignore:
Timestamp:
2020-08-21T18:26:57+02:00 (4 years ago)
Author:
techene
Message:

debug in order to pass non linear SETTE test when agrif in not activated see #2385

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/stpMLF.F90

    r13237 r13427  
    3232   !!            4.0  !  2017-05  (G. Madec)  introduction of the vertical physics manager (zdfphy) 
    3333   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rewrite in preparation for new timestepping scheme 
    34    !!---------------------------------------------------------------------- 
    35  
    36    !!---------------------------------------------------------------------- 
    37    !!   stp_MLF       : OPA system time-stepping 
     34   !!            4.x  !  2020-08  (S. Techene, G. Madec)  quasi eulerian coordinate time stepping  
     35   !!---------------------------------------------------------------------- 
     36 
     37#if defined key_qco 
     38   !!---------------------------------------------------------------------- 
     39   !!   'key_qco'       Quasi-Eulerian vertical coordonate 
     40   !!---------------------------------------------------------------------- 
     41    
     42   !!---------------------------------------------------------------------- 
     43   !!   stp_MLF       : NEMO modified Leap Frog time-stepping with qco 
    3844   !!---------------------------------------------------------------------- 
    3945   USE step_oce       ! time stepping definition modules 
     
    4349   USE traatfqco      ! time filtering                   (tra_atf_qco routine) 
    4450   USE dynatfqco      ! time filtering                   (dyn_atf_qco routine) 
    45    USE dynspg_ts      ! surface pressure gradient: split-explicit scheme (define un_adv) 
     51    
    4652   USE bdydyn         ! ocean open boundary conditions (define bdy_dyn) 
    4753 
     
    4955   PRIVATE 
    5056    
    51 #if ! defined key_qco 
    52    !!---------------------------------------------------------------------- 
    53    !!   'key_qco'      EMPTY MODULE      Quasi-Eulerian vertical coordonate 
    54    !!---------------------------------------------------------------------- 
    55 #else 
    5657   PUBLIC   stp_MLF   ! called by nemogcm.F90 
    5758 
     
    195196         zgdept(:,:,jk) = gdept(:,:,jk,Nnn) 
    196197      END DO 
    197                             CALL ssh_nxt       ( kstp, Nbb, Nnn, ssh,  Naa )   ! after ssh (includes call to div_hor) 
    198       IF( .NOT.ln_linssh )  CALL dom_qco_r3c    ( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa) )   ! "after" ssh./h._0 ratio 
    199                             CALL wzv           ( kstp, Nbb, Nnn, Naa, ww  )    ! Nnn cross-level velocity 
    200       IF( ln_zad_Aimp )     CALL wAimp         ( kstp,      Nnn           )    ! Adaptive-implicit vertical advection partitioning 
    201                             CALL eos    ( ts(:,:,:,:,Nnn), rhd, rhop, zgdept ) ! now in situ density for hpg computation 
     198                            CALL ssh_nxt    ( kstp, Nbb, Nnn, ssh,  Naa )   ! after ssh (includes call to div_hor) 
     199      IF( .NOT.ln_linssh )  THEN 
     200                             CALL dom_qco_r3c( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa)           )   ! "after" ssh/h_0 ratio at t,u,v pts 
     201         IF( ln_dynspg_exp ) CALL dom_qco_r3c( ssh(:,:,Nnn), r3t(:,:,Nnn), r3u(:,:,Nnn), r3v(:,:,Nnn), r3f(:,:) )   ! spg_exp : needed only for "now" ssh/h_0 ratio at f point 
     202      ENDIF 
     203                            CALL wzv        ( kstp, Nbb, Nnn, Naa, ww  )    ! Nnn cross-level velocity 
     204      IF( ln_zad_Aimp )     CALL wAimp      ( kstp,      Nnn           )    ! Adaptive-implicit vertical advection partitioning 
     205                            CALL eos        ( ts(:,:,:,:,Nnn), rhd, rhop, zgdept ) ! now in situ density for hpg computation 
    202206 
    203207 
     
    218222                         CALL dyn_hpg( kstp,      Nnn      , uu, vv, Nrhs )  ! horizontal gradient of Hydrostatic pressure 
    219223                         CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa )  ! surface pressure gradient 
    220  
    221224                                                      ! With split-explicit free surface, since now transports have been updated and ssh(:,:,Nrhs) as well 
     225 
    222226      IF( ln_dynspg_ts ) THEN                         ! vertical scale factors and vertical velocity need to be updated 
    223227                            CALL div_hor    ( kstp, Nbb, Nnn )                ! Horizontal divergence  (2nd call in time-split case) 
    224          IF(.NOT.ln_linssh) CALL dom_qco_r3c ( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) )   ! "after" ssh./h._0 ratio 
     228         IF(.NOT.ln_linssh) CALL dom_qco_r3c ( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) )   ! update ssh/h_0 ratio at t,u,v,f pts  
    225229      ENDIF 
    226230                            CALL dyn_zdf    ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa  )  ! vertical diffusion 
     
    305309!!    place. 
    306310!! 
    307                          CALL mlf_baro_corr ( Nnn, Naa, uu, vv )                    ! barotrope ajustment 
    308                          CALL finalize_sbc  ( kstp, Nbb, Naa, uu, vv, ts )          ! boundary condifions 
    309                          CALL tra_atf_qco   ( kstp, Nbb, Nnn, Naa, ts )             ! time filtering of "now" tracer arrays 
    310                          CALL dyn_atf_qco   ( kstp, Nbb, Nnn, Naa, uu, vv  )        ! time filtering of "now" velocities and scale factors 
    311                          r3t(:,:,Nnn) = r3t_f(:,:) 
     311      IF( ln_dynspg_ts ) CALL mlf_baro_corr (            Nnn, Naa, uu, vv     )   ! barotrope adjustment 
     312                         CALL finalize_lbc  ( kstp, Nbb     , Naa, uu, vv, ts )   ! boundary conditions 
     313                         CALL tra_atf_qco   ( kstp, Nbb, Nnn, Naa        , ts )   ! time filtering of "now" tracer arrays 
     314                         CALL dyn_atf_qco   ( kstp, Nbb, Nnn, Naa, uu, vv     )   ! time filtering of "now" velocities  
     315                         r3t(:,:,Nnn) = r3t_f(:,:)                                ! update now ssh/h_0 with time filtered values 
    312316                         r3u(:,:,Nnn) = r3u_f(:,:) 
    313317                         r3v(:,:,Nnn) = r3v_f(:,:) 
     
    347351      ! Control 
    348352      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    349                          CALL stp_ctl      ( kstp, Nbb, Nnn, indic ) 
     353                         CALL stp_ctl      ( kstp, Nnn ) 
    350354 
    351355      IF( kstp == nit000 ) THEN                          ! 1st time step only 
     
    364368      IF( kstp == nitend .OR. indic < 0 ) THEN 
    365369                      CALL iom_context_finalize(      cxios_context          ) ! needed for XIOS+AGRIF 
    366          IF(lrxios) CALL iom_context_finalize(      crxios_context          ) 
     370         IF( lrxios ) CALL iom_context_finalize(      crxios_context          ) 
    367371         IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) ! 
    368372      ENDIF 
     
    380384 
    381385 
    382    SUBROUTINE mlf_baro_corr (Kmm, Kaa, puu, pvv) 
     386   SUBROUTINE mlf_baro_corr( Kmm, Kaa, puu, pvv ) 
    383387      !!---------------------------------------------------------------------- 
    384388      !!                  ***  ROUTINE mlf_baro_corr  *** 
     
    389393      !!             estimate (ln_dynspg_ts=T) 
    390394      !! 
    391       !! ** Action :   puu(Kmm),pvv(Kmm),puu(Kaa),pvv(Kaa)   now and after horizontal velocity 
    392       !!---------------------------------------------------------------------- 
    393       INTEGER                             , INTENT(in   ) :: Kmm, Kaa    ! before and after time level indices 
    394       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities 
    395       ! 
    396       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve 
     395      !! ** Action :   puu(Kmm),pvv(Kmm)   updated now horizontal velocity (ln_bt_fw=F) 
     396      !!               puu(Kaa),pvv(Kaa)   after horizontal velocity 
     397      !!---------------------------------------------------------------------- 
     398      USE dynspg_ts, ONLY : un_adv, vn_adv   ! updated Kmm barotropic transport  
     399      !! 
     400      INTEGER                             , INTENT(in   ) ::   Kmm, Kaa   ! before and after time level indices 
     401      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv   ! velocities 
    397402      ! 
    398403      INTEGER  ::   jk   ! dummy loop indices 
    399       !!---------------------------------------------------------------------- 
    400  
    401       IF ( ln_dynspg_ts ) THEN 
    402          ALLOCATE( zue(jpi,jpj)     , zve(jpi,jpj)     ) 
    403          ! Ensure below that barotropic velocities match time splitting estimate 
    404          ! Compute actual transport and replace it with ts estimate at "after" time step 
    405          zue(:,:) = e3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1) 
    406          zve(:,:) = e3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1) 
    407          DO jk = 2, jpkm1 
    408             zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk) 
    409             zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk) 
     404      REAL(wp), DIMENSION(jpi,jpj) ::   zue, zve 
     405      !!---------------------------------------------------------------------- 
     406 
     407      ! Ensure below that barotropic velocities match time splitting estimate 
     408      ! Compute actual transport and replace it with ts estimate at "after" time step 
     409      zue(:,:) = e3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1) 
     410      zve(:,:) = e3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1) 
     411      DO jk = 2, jpkm1 
     412         zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk) 
     413         zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk) 
     414      END DO 
     415      DO jk = 1, jpkm1 
     416         puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zue(:,:) * r1_hu(:,:,Kaa) + uu_b(:,:,Kaa) ) * umask(:,:,jk) 
     417         pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zve(:,:) * r1_hv(:,:,Kaa) + vv_b(:,:,Kaa) ) * vmask(:,:,jk) 
     418      END DO 
     419      ! 
     420      IF( .NOT.ln_bt_fw ) THEN 
     421         ! Remove advective velocity from "now velocities" 
     422         ! prior to asselin filtering 
     423         ! In the forward case, this is done below after asselin filtering 
     424         ! so that asselin contribution is removed at the same time 
     425         DO jk = 1, jpkm1 
     426            puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm) + uu_b(:,:,Kmm) )*umask(:,:,jk) 
     427            pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm) + vv_b(:,:,Kmm) )*vmask(:,:,jk) 
    410428         END DO 
    411          DO jk = 1, jpkm1 
    412             puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zue(:,:) * r1_hu(:,:,Kaa) + uu_b(:,:,Kaa) ) * umask(:,:,jk) 
    413             pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zve(:,:) * r1_hv(:,:,Kaa) + vv_b(:,:,Kaa) ) * vmask(:,:,jk) 
    414          END DO 
    415          ! 
    416          IF( .NOT.ln_bt_fw ) THEN 
    417             ! Remove advective velocity from "now velocities" 
    418             ! prior to asselin filtering 
    419             ! In the forward case, this is done below after asselin filtering 
    420             ! so that asselin contribution is removed at the same time 
    421             DO jk = 1, jpkm1 
    422                puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm) + uu_b(:,:,Kmm) )*umask(:,:,jk) 
    423                pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm) + vv_b(:,:,Kmm) )*vmask(:,:,jk) 
    424             END DO 
    425          ENDIF 
    426          ! 
    427          DEALLOCATE( zue, zve ) 
    428          ! 
    429429      ENDIF 
    430430      ! 
     
    432432 
    433433 
    434    SUBROUTINE finalize_sbc (kt, Kbb, Kaa, puu, pvv, pts) 
    435       !!---------------------------------------------------------------------- 
    436       !!                  ***  ROUTINE finalize_sbc  *** 
     434   SUBROUTINE finalize_lbc( kt, Kbb, Kaa, puu, pvv, pts ) 
     435      !!---------------------------------------------------------------------- 
     436      !!                  ***  ROUTINE finalize_lbc  *** 
    437437      !! 
    438438      !! ** Purpose :   Apply the boundary condition on the after velocity 
     
    445445      !! ** Action :   puu(Kaa),pvv(Kaa)   after horizontal velocity and tracers 
    446446      !!---------------------------------------------------------------------- 
    447       INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index 
    448       INTEGER                             , INTENT(in   ) :: Kbb, Kaa    ! before and after time level indices 
    449       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered 
    450       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers 
     447      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index 
     448      INTEGER                                  , INTENT(in   ) ::   Kbb, Kaa   ! before and after time level indices 
     449      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt)     , INTENT(inout) ::   puu, pvv   ! velocities to be time filtered 
     450      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts        ! active tracers 
     451      !!---------------------------------------------------------------------- 
    451452      ! 
    452453      ! Update after tracer and velocity on domain lateral boundaries 
    453454      ! 
    454 #if defined key_agrif 
    455             CALL Agrif_tra                     ! AGRIF zoom boundaries 
    456             CALL Agrif_dyn( kt )               !* AGRIF zoom boundaries 
    457 #endif 
     455# if defined key_agrif 
     456            CALL Agrif_tra                     !* AGRIF zoom boundaries 
     457            CALL Agrif_dyn( kt ) 
     458# endif 
    458459      !                                        ! local domain boundaries  (T-point, unchanged sign) 
    459       CALL lbc_lnk_multi( 'finalize_sbc', puu(:,:,:,       Kaa), 'U', -1., pvv(:,:,:       ,Kaa), 'V', -1.   & 
    460                        &                , pts(:,:,:,jp_tem,Kaa), 'T',  1., pts(:,:,:,jp_sal,Kaa), 'T',  1. )     !* local domain boundaries 
     460      CALL lbc_lnk_multi( 'finalize_lbc', puu(:,:,:,       Kaa), 'U', -1., pvv(:,:,:       ,Kaa), 'V', -1.   & 
     461                       &                , pts(:,:,:,jp_tem,Kaa), 'T',  1., pts(:,:,:,jp_sal,Kaa), 'T',  1. ) 
    461462      ! 
    462463      !                                        !* BDY open boundaries 
     
    467468      ENDIF 
    468469      ! 
    469    END SUBROUTINE finalize_sbc 
    470 #endif 
    471    ! 
     470   END SUBROUTINE finalize_lbc 
     471 
     472#else 
     473   !!---------------------------------------------------------------------- 
     474   !!   default option             EMPTY MODULE           qco not activated 
     475   !!---------------------------------------------------------------------- 
     476#endif 
     477    
    472478   !!====================================================================== 
    473479END MODULE stepMLF 
Note: See TracChangeset for help on using the changeset viewer.