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 14037 for NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/OCE/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2020-12-03T12:20:38+01:00 (3 years ago)
Author:
ayoung
Message:

Updated to trunk at 14020. Sette tests passed with change of results for configurations with non-linear ssh. Ticket #2506.

Location:
NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG

    • Property svn:externals
      •  

        old new  
        88 
        99# SETTE 
        10 ^/utils/CI/sette@13292        sette 
         10^/utils/CI/sette_wave@13990         sette 
  • NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/OCE/DOM/domvvl.F90

    r13295 r14037  
    202202      gdept(:,:,1,Kbb) = 0.5_wp * e3w(:,:,1,Kbb) 
    203203      gdepw(:,:,1,Kbb) = 0.0_wp 
    204       DO_3D( 1, 1, 1, 1, 2, jpk ) 
     204      DO_3D( 1, 1, 1, 1, 2, jpk )                     ! vertical sum 
    205205         !    zcoef = tmask - wmask    ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
    206206         !                             ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf) 
     
    282282      ENDIF 
    283283      ! 
    284       IF(lwxios) THEN 
    285 ! define variables in restart file when writing with XIOS 
    286          CALL iom_set_rstw_var_active('e3t_b') 
    287          CALL iom_set_rstw_var_active('e3t_n') 
    288          !                                           ! ----------------------- ! 
    289          IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN  ! z_tilde and layer cases ! 
    290             !                                        ! ----------------------- ! 
    291             CALL iom_set_rstw_var_active('tilde_e3t_b') 
    292             CALL iom_set_rstw_var_active('tilde_e3t_n') 
    293          END IF 
    294          !                                           ! -------------!     
    295          IF( ln_vvl_ztilde ) THEN                    ! z_tilde case ! 
    296             !                                        ! ------------ ! 
    297             CALL iom_set_rstw_var_active('hdiv_lf') 
    298          ENDIF 
    299          ! 
    300       ENDIF 
    301       ! 
    302284   END SUBROUTINE dom_vvl_zgr 
    303285 
     
    334316      LOGICAL                ::   ll_do_bclinic         ! local logical 
    335317      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv 
    336       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze3t 
     318      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3t 
     319      LOGICAL , DIMENSION(:,:,:), ALLOCATABLE ::   llmsk 
    337320      !!---------------------------------------------------------------------- 
    338321      ! 
     
    419402         zwu(:,:) = 0._wp 
    420403         zwv(:,:) = 0._wp 
    421          DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
     404         DO_3D( 1, 0, 1, 0, 1, jpkm1 )   ! a - first derivative: diffusive fluxes 
    422405            un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj)           & 
    423406               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) ) 
     
    427410            zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 
    428411         END_3D 
    429          DO_2D( 1, 1, 1, 1 ) 
     412         DO_2D( 1, 1, 1, 1 )             ! b - correction for last oceanic u-v points 
    430413            un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj) 
    431414            vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj) 
    432415         END_2D 
    433          DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     416         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! c - second derivative: divergence of diffusive fluxes 
    434417            tilde_e3t_a(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) + (   un_td(ji-1,jj  ,jk) - un_td(ji,jj,jk)    & 
    435418               &                                          +     vn_td(ji  ,jj-1,jk) - vn_td(ji,jj,jk)    & 
    436419               &                                            ) * r1_e1e2t(ji,jj) 
    437420         END_3D 
    438          !                       ! d - thickness diffusion transport: boundary conditions 
     421         !                               ! d - thickness diffusion transport: boundary conditions 
    439422         !                             (stored for tracer advction and continuity equation) 
    440423         CALL lbc_lnk_multi( 'domvvl', un_td , 'U' , -1._wp, vn_td , 'V' , -1._wp) 
    441  
    442424         ! 4 - Time stepping of baroclinic scale factors 
    443425         ! --------------------------------------------- 
     
    447429         ! Maximum deformation control 
    448430         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    449          ze3t(:,:,jpk) = 0._wp 
    450          DO jk = 1, jpkm1 
    451             ze3t(:,:,jk) = tilde_e3t_a(:,:,jk) / e3t_0(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 
    452          END DO 
    453          z_tmax = MAXVAL( ze3t(:,:,:) ) 
    454          CALL mpp_max( 'domvvl', z_tmax )                 ! max over the global domain 
    455          z_tmin = MINVAL( ze3t(:,:,:) ) 
    456          CALL mpp_min( 'domvvl', z_tmin )                 ! min over the global domain 
     431         ALLOCATE( ze3t(jpi,jpj,jpk), llmsk(jpi,jpj,jpk) ) 
     432         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     433            ze3t(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) / e3t_0(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 
     434         END_3D 
     435         ! 
     436         llmsk(   1:Nis1,:,:) = .FALSE.   ! exclude halos from the checked region 
     437         llmsk(Nie1: jpi,:,:) = .FALSE. 
     438         llmsk(:,   1:Njs1,:) = .FALSE. 
     439         llmsk(:,Nje1: jpj,:) = .FALSE. 
     440         ! 
     441         llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp                  ! define only the inner domain 
     442         z_tmax = MAXVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_max( 'domvvl', z_tmax )   ! max over the global domain 
     443         z_tmin = MINVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_min( 'domvvl', z_tmin )   ! min over the global domain 
    457444         ! - ML - test: for the moment, stop simulation for too large e3_t variations 
    458445         IF( ( z_tmax >  rn_zdef_max ) .OR. ( z_tmin < - rn_zdef_max ) ) THEN 
    459             IF( lk_mpp ) THEN 
    460                CALL mpp_maxloc( 'domvvl', ze3t, tmask, z_tmax, ijk_max ) 
    461                CALL mpp_minloc( 'domvvl', ze3t, tmask, z_tmin, ijk_min ) 
    462             ELSE 
    463                ijk_max = MAXLOC( ze3t(:,:,:) ) 
    464                ijk_max(1) = ijk_max(1) + nimpp - 1 
    465                ijk_max(2) = ijk_max(2) + njmpp - 1 
    466                ijk_min = MINLOC( ze3t(:,:,:) ) 
    467                ijk_min(1) = ijk_min(1) + nimpp - 1 
    468                ijk_min(2) = ijk_min(2) + njmpp - 1 
    469             ENDIF 
     446            CALL mpp_maxloc( 'domvvl', ze3t, llmsk, z_tmax, ijk_max ) 
     447            CALL mpp_minloc( 'domvvl', ze3t, llmsk, z_tmin, ijk_min ) 
    470448            IF (lwp) THEN 
    471449               WRITE(numout, *) 'MAX( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmax 
     
    476454            ENDIF 
    477455         ENDIF 
     456         DEALLOCATE( ze3t, llmsk ) 
    478457         ! - ML - end test 
    479458         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below 
     
    805784         IF( ln_rstart ) THEN                   !* Read the restart file 
    806785            CALL rst_read_open                  !  open the restart file if necessary 
    807             CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
     786            CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm)    ) 
    808787            ! 
    809788            id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. ) 
     
    818797            ! 
    819798            IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
    820                CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    821                CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     799               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb) ) 
     800               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm) ) 
    822801               ! needed to restart if land processor not computed  
    823802               IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files' 
     
    833812               IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 
    834813               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    835                CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
     814               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb) ) 
    836815               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    837816               l_1st_euler = .true. 
     
    840819               IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 
    841820               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    842                CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     821               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm) ) 
    843822               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    844823               l_1st_euler = .true. 
     
    865844               !                          ! ----------------------- ! 
    866845               IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist 
    867                   CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
    868                   CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios ) 
     846                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:) ) 
     847                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:) ) 
    869848               ELSE                            ! one at least array is missing 
    870849                  tilde_e3t_b(:,:,:) = 0.0_wp 
     
    875854                  !                       ! ------------ ! 
    876855                  IF( id5 > 0 ) THEN  ! required array exists 
    877                      CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios ) 
     856                     CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:) ) 
    878857                  ELSE                ! array is missing 
    879858                     hdiv_lf(:,:,:) = 0.0_wp 
     
    948927         !                                   ! =================== 
    949928         IF(lwp) WRITE(numout,*) '---- dom_vvl_rst ----' 
    950          IF( lwxios ) CALL iom_swap(      cwxios_context          ) 
    951929         !                                           ! --------- ! 
    952930         !                                           ! all cases ! 
    953931         !                                           ! --------- ! 
    954          CALL iom_rstput( kt, nitrst, numrow, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lwxios ) 
    955          CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lwxios ) 
     932         CALL iom_rstput( kt, nitrst, numrow, 'e3t_b', e3t(:,:,:,Kbb) ) 
     933         CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t(:,:,:,Kmm) ) 
    956934         !                                           ! ----------------------- ! 
    957935         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN  ! z_tilde and layer cases ! 
    958936            !                                        ! ----------------------- ! 
    959             CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lwxios) 
    960             CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lwxios) 
     937            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_b', tilde_e3t_b(:,:,:)) 
     938            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_n', tilde_e3t_n(:,:,:)) 
    961939         END IF 
    962940         !                                           ! -------------!     
    963941         IF( ln_vvl_ztilde ) THEN                    ! z_tilde case ! 
    964942            !                                        ! ------------ ! 
    965             CALL iom_rstput( kt, nitrst, numrow, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lwxios) 
     943            CALL iom_rstput( kt, nitrst, numrow, 'hdiv_lf', hdiv_lf(:,:,:)) 
    966944         ENDIF 
    967945         ! 
    968          IF( lwxios ) CALL iom_swap(      cxios_context          ) 
    969946      ENDIF 
    970947      ! 
Note: See TracChangeset for help on using the changeset viewer.