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 13727 for NEMO/branches/2020/dev_12905_xios_restart/tests/VORTEX/MY_SRC/domvvl.F90 – NEMO

Ignore:
Timestamp:
2020-11-05T15:18:53+01:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2462: Upate to trunk rev 13688

Location:
NEMO/branches/2020/dev_12905_xios_restart
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_12905_xios_restart

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
        88 
        99# SETTE 
        10 ^/utils/CI/sette@HEAD         sette 
         10^/utils/CI/sette@13559        sette 
  • NEMO/branches/2020/dev_12905_xios_restart/tests/VORTEX/MY_SRC/domvvl.F90

    r12950 r13727  
    99   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    1010   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename dom_vvl_sf_swp -> dom_vvl_sf_update for new timestepping 
     11   !!            4.x  ! 2020-02  (G. Madec, S. Techene) introduce ssh to h0 ratio 
    1112   !!---------------------------------------------------------------------- 
    1213 
    13    !!---------------------------------------------------------------------- 
    14    !!   dom_vvl_init     : define initial vertical scale factors, depths and column thickness 
    15    !!   dom_vvl_sf_nxt   : Compute next vertical scale factors 
    16    !!   dom_vvl_sf_update   : Swap vertical scale factors and update the vertical grid 
    17    !!   dom_vvl_interpol : Interpolate vertical scale factors from one grid point to another 
    18    !!   dom_vvl_rst      : read/write restart file 
    19    !!   dom_vvl_ctl      : Check the vvl options 
    20    !!---------------------------------------------------------------------- 
    2114   USE oce             ! ocean dynamics and tracers 
    2215   USE phycst          ! physical constant 
     
    3629   PRIVATE 
    3730 
    38    PUBLIC  dom_vvl_init       ! called by domain.F90 
    39    PUBLIC  dom_vvl_zgr        ! called by isfcpl.F90 
    40    PUBLIC  dom_vvl_sf_nxt     ! called by step.F90 
    41    PUBLIC  dom_vvl_sf_update  ! called by step.F90 
    42    PUBLIC  dom_vvl_interpol   ! called by dynnxt.F90 
    43  
    4431   !                                                      !!* Namelist nam_vvl 
    4532   LOGICAL , PUBLIC :: ln_vvl_zstar           = .FALSE.    ! zstar  vertical coordinate 
     
    6350   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: frq_rst_hdv                 ! retoring period for low freq. divergence 
    6451 
     52#if defined key_qco 
     53   !!---------------------------------------------------------------------- 
     54   !!   'key_qco'      EMPTY MODULE      Quasi-Eulerian vertical coordonate 
     55   !!---------------------------------------------------------------------- 
     56#else 
     57   !!---------------------------------------------------------------------- 
     58   !!   Default key      Old management of time varying vertical coordinate 
     59   !!---------------------------------------------------------------------- 
     60    
     61   !!---------------------------------------------------------------------- 
     62   !!   dom_vvl_init     : define initial vertical scale factors, depths and column thickness 
     63   !!   dom_vvl_sf_nxt   : Compute next vertical scale factors 
     64   !!   dom_vvl_sf_update   : Swap vertical scale factors and update the vertical grid 
     65   !!   dom_vvl_interpol : Interpolate vertical scale factors from one grid point to another 
     66   !!   dom_vvl_rst      : read/write restart file 
     67   !!   dom_vvl_ctl      : Check the vvl options 
     68   !!---------------------------------------------------------------------- 
     69 
     70   PUBLIC  dom_vvl_init       ! called by domain.F90 
     71   PUBLIC  dom_vvl_zgr        ! called by isfcpl.F90 
     72   PUBLIC  dom_vvl_sf_nxt     ! called by step.F90 
     73   PUBLIC  dom_vvl_sf_update  ! called by step.F90 
     74   PUBLIC  dom_vvl_interpol   ! called by dynnxt.F90 
     75    
    6576   !! * Substitutions 
    6677#  include "do_loop_substitute.h90" 
     
    135146      ! 
    136147   END SUBROUTINE dom_vvl_init 
    137    ! 
     148 
     149 
    138150   SUBROUTINE dom_vvl_zgr(Kbb, Kmm, Kaa) 
    139151      !!---------------------------------------------------------------------- 
     
    190202      gdept(:,:,1,Kbb) = 0.5_wp * e3w(:,:,1,Kbb) 
    191203      gdepw(:,:,1,Kbb) = 0.0_wp 
    192       DO_3D_11_11( 2, jpk ) 
     204      DO_3D( 1, 1, 1, 1, 2, jpk ) 
    193205         !    zcoef = tmask - wmask    ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
    194206         !                             ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf) 
     
    238250         ENDIF 
    239251         IF ( ln_vvl_zstar_at_eqtor ) THEN   ! use z-star in vicinity of the Equator 
    240             DO_2D_11_11 
     252            DO_2D( 1, 1, 1, 1 ) 
    241253!!gm  case |gphi| >= 6 degrees is useless   initialized just above by default 
    242254               IF( ABS(gphit(ji,jj)) >= 6.) THEN 
     
    261273            IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN 
    262274               IF( nn_cfg == 3 ) THEN   ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2 
    263                   ii0 = 103   ;   ii1 = 111        
    264                   ij0 = 128   ;   ij1 = 135   ;    
     275                  ii0 = 103 + nn_hls - 1   ;   ii1 = 111 + nn_hls - 1       
     276                  ij0 = 128 + nn_hls       ;   ij1 = 135 + nn_hls 
    265277                  frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp 
    266278                  frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rn_Dt 
     
    304316      LOGICAL                ::   ll_do_bclinic         ! local logical 
    305317      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv 
    306       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze3t 
     318      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3t 
     319      LOGICAL , DIMENSION(:,:,:), ALLOCATABLE ::   llmsk 
    307320      !!---------------------------------------------------------------------- 
    308321      ! 
     
    389402         zwu(:,:) = 0._wp 
    390403         zwv(:,:) = 0._wp 
    391          DO_3D_10_10( 1, jpkm1 ) 
     404         DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    392405            un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj)           & 
    393406               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) ) 
     
    397410            zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 
    398411         END_3D 
    399          DO_2D_11_11 
     412         DO_2D( 1, 1, 1, 1 ) 
    400413            un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj) 
    401414            vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj) 
    402415         END_2D 
    403          DO_3D_00_00( 1, jpkm1 ) 
     416         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    404417            tilde_e3t_a(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) + (   un_td(ji-1,jj  ,jk) - un_td(ji,jj,jk)    & 
    405418               &                                          +     vn_td(ji  ,jj-1,jk) - vn_td(ji,jj,jk)    & 
     
    417430         ! Maximum deformation control 
    418431         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    419          ze3t(:,:,jpk) = 0._wp 
    420          DO jk = 1, jpkm1 
    421             ze3t(:,:,jk) = tilde_e3t_a(:,:,jk) / e3t_0(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 
    422          END DO 
    423          z_tmax = MAXVAL( ze3t(:,:,:) ) 
    424          CALL mpp_max( 'domvvl', z_tmax )                 ! max over the global domain 
    425          z_tmin = MINVAL( ze3t(:,:,:) ) 
    426          CALL mpp_min( 'domvvl', z_tmin )                 ! min over the global domain 
     432         ALLOCATE( ze3t(jpi,jpj,jpk), llmsk(jpi,jpj,jpk) ) 
     433         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     434            ze3t(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) / e3t_0(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 
     435         END_3D 
     436         ! 
     437         llmsk(   1:Nis1,:,:) = .FALSE.   ! exclude halos from the checked region 
     438         llmsk(Nie1: jpi,:,:) = .FALSE. 
     439         llmsk(:,   1:Njs1,:) = .FALSE. 
     440         llmsk(:,Nje1: jpj,:) = .FALSE. 
     441         ! 
     442         llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp                  ! define only the inner domain 
     443         z_tmax = MAXVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_max( 'domvvl', z_tmax )   ! max over the global domain 
     444         z_tmin = MINVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_min( 'domvvl', z_tmin )   ! min over the global domain 
    427445         ! - ML - test: for the moment, stop simulation for too large e3_t variations 
    428446         IF( ( z_tmax >  rn_zdef_max ) .OR. ( z_tmin < - rn_zdef_max ) ) THEN 
    429             IF( lk_mpp ) THEN 
    430                CALL mpp_maxloc( 'domvvl', ze3t, tmask, z_tmax, ijk_max ) 
    431                CALL mpp_minloc( 'domvvl', ze3t, tmask, z_tmin, ijk_min ) 
    432             ELSE 
    433                ijk_max = MAXLOC( ze3t(:,:,:) ) 
    434                ijk_max(1) = ijk_max(1) + nimpp - 1 
    435                ijk_max(2) = ijk_max(2) + njmpp - 1 
    436                ijk_min = MINLOC( ze3t(:,:,:) ) 
    437                ijk_min(1) = ijk_min(1) + nimpp - 1 
    438                ijk_min(2) = ijk_min(2) + njmpp - 1 
    439             ENDIF 
     447            CALL mpp_maxloc( 'domvvl', ze3t, llmsk, z_tmax, ijk_max ) 
     448            CALL mpp_minloc( 'domvvl', ze3t, llmsk, z_tmin, ijk_min ) 
    440449            IF (lwp) THEN 
    441450               WRITE(numout, *) 'MAX( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmax 
     
    446455            ENDIF 
    447456         ENDIF 
     457         DEALLOCATE( ze3t, llmsk ) 
    448458         ! - ML - end test 
    449459         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below 
     
    629639      gdepw(:,:,1,Kmm) = 0.0_wp 
    630640      gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm) 
    631       DO_3D_11_11( 2, jpk ) 
     641      DO_3D( 1, 1, 1, 1, 2, jpk ) 
    632642        !    zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))   ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
    633643                                                           ! 1 for jk = mikt 
     
    684694         ! 
    685695      CASE( 'U' )                   !* from T- to U-point : hor. surface weighted mean 
    686          DO_3D_10_10( 1, jpk ) 
     696         DO_3D( 1, 0, 1, 0, 1, jpk ) 
    687697            pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2u(ji,jj)   & 
    688698               &                       * (   e1e2t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) )     & 
     
    693703         ! 
    694704      CASE( 'V' )                   !* from T- to V-point : hor. surface weighted mean 
    695          DO_3D_10_10( 1, jpk ) 
     705         DO_3D( 1, 0, 1, 0, 1, jpk ) 
    696706            pe3_out(ji,jj,jk) = 0.5_wp * ( vmask(ji,jj,jk)  * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2v(ji,jj)   & 
    697707               &                       * (   e1e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) )     & 
     
    702712         ! 
    703713      CASE( 'F' )                   !* from U-point to F-point : hor. surface weighted mean 
    704          DO_3D_10_10( 1, jpk ) 
     714         DO_3D( 1, 0, 1, 0, 1, jpk ) 
    705715            pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * umask(ji,jj+1,jk) * (1.0_wp - zlnwd) + zlnwd ) & 
    706716               &                       *    r1_e1e2f(ji,jj)                                                  & 
     
    775785         IF( ln_rstart ) THEN                   !* Read the restart file 
    776786            CALL rst_read_open                  !  open the restart file if necessary 
    777             IF( lrxios ) CALL iom_swap( TRIM(crxios_context) ) 
    778             CALL iom_get( numror, jpdom_autoglo, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
     787            IF( lroxios ) CALL iom_swap( TRIM(crxios_context) ) 
     788            CALL iom_get( numror, jpdom_autoglo, 'sshn'   , ssh(:,:,Kmm), ldxios = lroxios    ) 
    779789            ! 
    780790            id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. ) 
     
    789799            ! 
    790800            IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
    791                CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    792                CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     801               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lroxios ) 
     802               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lroxios ) 
    793803               ! needed to restart if land processor not computed  
    794804               IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files' 
     
    804814               IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 
    805815               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    806                CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
     816               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lroxios ) 
    807817               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    808818               l_1st_euler = .true. 
     
    811821               IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 
    812822               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    813                CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     823               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lroxios ) 
    814824               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    815825               l_1st_euler = .true. 
     
    836846               !                          ! ----------------------- ! 
    837847               IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist 
    838                   CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
    839                   CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios ) 
     848                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lroxios ) 
     849                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lroxios ) 
    840850               ELSE                            ! one at least array is missing 
    841851                  tilde_e3t_b(:,:,:) = 0.0_wp 
     
    846856                  !                       ! ------------ ! 
    847857                  IF( id5 > 0 ) THEN  ! required array exists 
    848                      CALL iom_get( numror, jpdom_autoglo, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios ) 
     858                     CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lroxios ) 
    849859                  ELSE                ! array is missing 
    850860                     hdiv_lf(:,:,:) = 0.0_wp 
     
    852862               ENDIF 
    853863            ENDIF 
    854             IF( lrxios ) CALL iom_swap( TRIM(cxios_context) ) 
     864            IF( lroxios ) CALL iom_swap( TRIM(cxios_context) ) 
    855865            ! 
    856866         ELSE                                   !* Initialize at "rest" 
     
    871881                  ssh(:,:,Kbb) = -ssh_ref 
    872882 
    873                   DO_2D_11_11 
     883                  DO_2D( 1, 1, 1, 1 ) 
    874884                     IF( ht_0(ji,jj)-ssh_ref <  rn_wdmin1 ) THEN ! if total depth is less than min depth 
    875885                        ssh(ji,jj,Kbb) = rn_wdmin1 - (ht_0(ji,jj) ) 
     
    887897               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    888898 
    889                DO_2D_11_11 
     899               DO_2D( 1, 1, 1, 1 ) 
    890900                  IF ( ht_0(ji,jj) .LE. 0.0 .AND. NINT( ssmask(ji,jj) ) .EQ. 1) THEN 
    891901                     CALL ctl_stop( 'dom_vvl_rst: ht_0 must be positive at potentially wet points' ) 
     
    10141024   END SUBROUTINE dom_vvl_ctl 
    10151025 
     1026#endif 
     1027 
    10161028   !!====================================================================== 
    10171029END MODULE domvvl 
Note: See TracChangeset for help on using the changeset viewer.