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 13899 for NEMO/branches/2020/tickets_icb_1900/src/SWE/domvvl.F90 – NEMO

Ignore:
Timestamp:
2020-11-27T17:26:33+01:00 (4 years ago)
Author:
mathiot
Message:

ticket #1900: update branch to trunk and add ICB test case

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

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/tickets_icb_1900

    • Property svn:externals
      •  

        old new  
        22^/utils/build/makenemo@HEAD   makenemo 
        33^/utils/build/mk@HEAD         mk 
        4 ^/utils/tools/@HEAD           tools 
         4^/utils/tools@HEAD            tools 
        55^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
         
        88 
        99# SETTE 
        10 ^/utils/CI/sette@12931        sette 
         10^/utils/CI/sette@13559        sette 
  • NEMO/branches/2020/tickets_icb_1900/src/SWE/domvvl.F90

    r12983 r13899  
    205205      gdept(:,:,1,Kbb) = 0.5_wp * e3w(:,:,1,Kbb) 
    206206      gdepw(:,:,1,Kbb) = 0.0_wp 
    207       DO_3D_11_11( 2, jpk ) 
     207      DO_3D( 1, 1, 1, 1, 2, jpk ) 
    208208         !    zcoef = tmask - wmask    ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
    209209         !                             ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf) 
     
    253253         ENDIF 
    254254         IF ( ln_vvl_zstar_at_eqtor ) THEN   ! use z-star in vicinity of the Equator 
    255             DO_2D_11_11 
     255            DO_2D( 1, 1, 1, 1 ) 
    256256!!gm  case |gphi| >= 6 degrees is useless   initialized just above by default 
    257257               IF( ABS(gphit(ji,jj)) >= 6.) THEN 
     
    276276            IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN 
    277277               IF( nn_cfg == 3 ) THEN   ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2 
    278                   ii0 = 103   ;   ii1 = 111        
    279                   ij0 = 128   ;   ij1 = 135   ;    
     278                  ii0 = 103 + nn_hls - 1   ;   ii1 = 111 + nn_hls - 1       
     279                  ij0 = 128 + nn_hls       ;   ij1 = 135 + nn_hls 
    280280                  frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp 
    281281                  frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rn_Dt 
     
    354354      e3v(:,:,:,Kaa) = e3v(:,:,:,Kmm) 
    355355      ! 
    356       DO_3D_11_11( 1, jpk ) 
     356      DO_3D( 1, 1, 1, 1, 1, jpk ) 
    357357         gdepw(ji,jj,jk,Kmm) =  gdepw_0(ji,jj,jk) * (1._wp + r3t(ji,jj,Kmm)) 
    358358         gdept(ji,jj,jk,Kmm) =  gdept_0(ji,jj,jk) * (1._wp + r3t(ji,jj,Kmm))  
     
    415415      LOGICAL                ::   ll_do_bclinic         ! local logical 
    416416      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv 
    417       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze3t 
     417      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3t 
     418      LOGICAL , DIMENSION(:,:,:), ALLOCATABLE ::   llmsk 
    418419      !!---------------------------------------------------------------------- 
    419420      ! 
     
    500501         zwu(:,:) = 0._wp 
    501502         zwv(:,:) = 0._wp 
    502          DO_3D_10_10( 1, jpkm1 ) 
     503         DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    503504            un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj)           & 
    504505               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) ) 
     
    508509            zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 
    509510         END_3D 
    510          DO_2D_11_11 
     511         DO_2D( 1, 1, 1, 1 ) 
    511512            un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj) 
    512513            vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj) 
    513514         END_2D 
    514          DO_3D_00_00( 1, jpkm1 ) 
     515         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    515516            tilde_e3t_a(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) + (   un_td(ji-1,jj  ,jk) - un_td(ji,jj,jk)    & 
    516517               &                                          +     vn_td(ji  ,jj-1,jk) - vn_td(ji,jj,jk)    & 
     
    528529         ! Maximum deformation control 
    529530         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     531         ALLOCATE( ze3t(jpi,jpj,jpk), llmsk(jpi,jpj,jpk) ) 
    530532         ze3t(:,:,jpk) = 0._wp 
    531533         DO jk = 1, jpkm1 
    532534            ze3t(:,:,jk) = tilde_e3t_a(:,:,jk) / e3t_0(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 
    533535         END DO 
    534          z_tmax = MAXVAL( ze3t(:,:,:) ) 
    535          CALL mpp_max( 'domvvl', z_tmax )                 ! max over the global domain 
    536          z_tmin = MINVAL( ze3t(:,:,:) ) 
    537          CALL mpp_min( 'domvvl', z_tmin )                 ! min over the global domain 
     536         ! 
     537         llmsk(   1:Nis1,:,:) = .FALSE.   ! exclude halos from the checked region 
     538         llmsk(Nie1: jpi,:,:) = .FALSE. 
     539         llmsk(:,   1:Njs1,:) = .FALSE. 
     540         llmsk(:,Nje1: jpj,:) = .FALSE. 
     541         ! 
     542         llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp                  ! define only the inner domain 
     543         z_tmax = MAXVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_max( 'domvvl', z_tmax )   ! max over the global domain 
     544         z_tmin = MINVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_min( 'domvvl', z_tmin )   ! min over the global domain 
    538545         ! - ML - test: for the moment, stop simulation for too large e3_t variations 
    539546         IF( ( z_tmax >  rn_zdef_max ) .OR. ( z_tmin < - rn_zdef_max ) ) THEN 
    540             IF( lk_mpp ) THEN 
    541                CALL mpp_maxloc( 'domvvl', ze3t, tmask, z_tmax, ijk_max ) 
    542                CALL mpp_minloc( 'domvvl', ze3t, tmask, z_tmin, ijk_min ) 
    543             ELSE 
    544                ijk_max = MAXLOC( ze3t(:,:,:) ) 
    545                ijk_max(1) = ijk_max(1) + nimpp - 1 
    546                ijk_max(2) = ijk_max(2) + njmpp - 1 
    547                ijk_min = MINLOC( ze3t(:,:,:) ) 
    548                ijk_min(1) = ijk_min(1) + nimpp - 1 
    549                ijk_min(2) = ijk_min(2) + njmpp - 1 
    550             ENDIF 
     547            CALL mpp_maxloc( 'domvvl', ze3t, llmsk, z_tmax, ijk_max ) 
     548            CALL mpp_minloc( 'domvvl', ze3t, llmsk, z_tmin, ijk_min ) 
    551549            IF (lwp) THEN 
    552550               WRITE(numout, *) 'MAX( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmax 
     
    557555            ENDIF 
    558556         ENDIF 
     557         DEALLOCATE( ze3t, llmsk ) 
    559558         ! - ML - end test 
    560559         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below 
     
    697696      LOGICAL                ::   ll_do_bclinic         ! local logical 
    698697      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv 
    699       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze3t 
    700698      !!---------------------------------------------------------------------- 
    701699      ! 
     
    831829      gdepw(:,:,1,Kmm) = 0.0_wp 
    832830      gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm) 
    833       DO_3D_11_11( 2, jpk ) 
     831      DO_3D( 1, 1, 1, 1, 2, jpk ) 
    834832        !    zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))   ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
    835833                                                           ! 1 for jk = mikt 
     
    918916 
    919917      ! t- and w- points depth (set the isf depth as it is in the initial step) 
    920       DO_3D_11_11( 1, jpk ) 
     918      DO_3D( 1, 1, 1, 1, 1, jpk ) 
    921919         gdepw(ji,jj,jk,Kmm) =  gdepw_0(ji,jj,jk) * (1._wp + r3t(ji,jj,Kmm)) 
    922920         gdept(ji,jj,jk,Kmm) =  gdept_0(ji,jj,jk) * (1._wp + r3t(ji,jj,Kmm))  
     
    10141012         ! 
    10151013      CASE( 'U' )                   !* from T- to U-point : hor. surface weighted mean 
    1016          DO_2D_00_00 
     1014         DO_2D( 0, 0, 0, 0 ) 
    10171015            zc3(ji,jj) = 0.5_wp * (  e1e2t(ji  ,jj) * pssh(ji  ,jj)  & 
    10181016               &                   + e1e2t(ji+1,jj) * pssh(ji+1,jj)  ) * r1_hu_0(ji,jj) * r1_e1e2u(ji,jj) 
     
    10251023         ! 
    10261024      CASE( 'V' )                   !* from T- to V-point : hor. surface weighted mean 
    1027          DO_2D_00_00 
     1025         DO_2D( 0, 0, 0, 0 ) 
    10281026            zc3(ji,jj) = 0.5_wp * (  e1e2t(ji,jj  ) * pssh(ji,jj  )  & 
    10291027               &                   + e1e2t(ji,jj+1) * pssh(ji,jj+1)  ) * r1_hv_0(ji,jj) * r1_e1e2v(ji,jj) 
     
    10361034         ! 
    10371035      CASE( 'F' )                   !* from U-point to F-point : hor. surface weighted mean 
    1038          DO_2D_10_10 
     1036         DO_2D( 1, 0, 1, 0 ) 
    10391037            zc3(ji,jj) = 0.25_wp * (  e1e2t(ji  ,jj  ) * pssh(ji  ,jj  )  & 
    10401038               &                    + e1e2t(ji+1,jj  ) * pssh(ji+1,jj  )  & 
     
    10571055      CASE( 'UW' )                  !* from U- to UW-point 
    10581056         ! 
    1059          DO_2D_00_00 
     1057         DO_2D( 0, 0, 0, 0 ) 
    10601058            zc3(ji,jj) = 0.5_wp * (  e1e2t(ji  ,jj) * pssh(ji  ,jj)  & 
    10611059               &                   + e1e2t(ji+1,jj) * pssh(ji+1,jj)  ) * r1_hu_0(ji,jj) * r1_e1e2u(ji,jj) 
     
    10681066      CASE( 'VW' )                  !* from U- to UW-point : vertical simple mean 
    10691067         ! 
    1070          DO_2D_00_00 
     1068         DO_2D( 0, 0, 0, 0 ) 
    10711069            zc3(ji,jj) = 0.5_wp * (  e1e2t(ji,jj  ) * pssh(ji,jj  )  & 
    10721070               &                   + e1e2t(ji,jj+1) * pssh(ji,jj+1)  ) * r1_hv_0(ji,jj) * r1_e1e2v(ji,jj) 
     
    11071105         IF( ln_rstart ) THEN                   !* Read the restart file 
    11081106            CALL rst_read_open                  !  open the restart file if necessary 
    1109             CALL iom_get( numror, jpdom_autoglo, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
     1107            CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
    11101108            ! 
    11111109            id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. ) 
     
    11201118            ! 
    11211119            IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
    1122                CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    1123                CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     1120               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
     1121               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    11241122               ! needed to restart if land processor not computed  
    11251123               IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files' 
     
    11351133               IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 
    11361134               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    1137                CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
     1135               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    11381136               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    11391137               l_1st_euler = .true. 
     
    11421140               IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 
    11431141               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    1144                CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     1142               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    11451143               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    11461144               l_1st_euler = .true. 
     
    11671165               !                          ! ----------------------- ! 
    11681166               IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist 
    1169                   CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
    1170                   CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios ) 
     1167                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
     1168                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios ) 
    11711169               ELSE                            ! one at least array is missing 
    11721170                  tilde_e3t_b(:,:,:) = 0.0_wp 
     
    11771175                  !                       ! ------------ ! 
    11781176                  IF( id5 > 0 ) THEN  ! required array exists 
    1179                      CALL iom_get( numror, jpdom_autoglo, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios ) 
     1177                     CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios ) 
    11801178                  ELSE                ! array is missing 
    11811179                     hdiv_lf(:,:,:) = 0.0_wp 
     
    12011199                  ssh(:,:,Kbb) = -ssh_ref 
    12021200 
    1203                   DO_2D_11_11 
     1201                  DO_2D( 1, 1, 1, 1 ) 
    12041202                     IF( ht_0(ji,jj)-ssh_ref <  rn_wdmin1 ) THEN ! if total depth is less than min depth 
    12051203                        ssh(ji,jj,Kbb) = rn_wdmin1 - (ht_0(ji,jj) ) 
Note: See TracChangeset for help on using the changeset viewer.