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 13151 for NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/OCE/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2020-06-24T14:38:26+02:00 (4 years ago)
Author:
gm
Message:

result from merge with qco r12983

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/OCE/DOM/domvvl.F90

    r12489 r13151  
    22   !!====================================================================== 
    33   !!                       ***  MODULE domvvl   *** 
    4    !! Ocean :  
     4   !! Ocean : 
    55   !!====================================================================== 
    66   !! History :  2.0  !  2006-06  (B. Levier, L. Marie)  original code 
     
    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 
     
    3528   IMPLICIT NONE 
    3629   PRIVATE 
    37  
    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  
     30    
    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" 
     
    98109      !!---------------------------------------------------------------------- 
    99110      !!                ***  ROUTINE dom_vvl_init  *** 
    100       !!                    
     111      !! 
    101112      !! ** Purpose :  Initialization of all scale factors, depths 
    102113      !!               and water column heights 
     
    107118      !! ** Action  : - e3t_(n/b) and tilde_e3t_(n/b) 
    108119      !!              - Regrid: e3[u/v](:,:,:,Kmm) 
    109       !!                        e3[u/v](:,:,:,Kmm)        
    110       !!                        e3w(:,:,:,Kmm)            
     120      !!                        e3[u/v](:,:,:,Kmm) 
     121      !!                        e3w(:,:,:,Kmm) 
    111122      !!                        e3[u/v]w_b 
    112       !!                        e3[u/v]w_n       
     123      !!                        e3[u/v]w_n 
    113124      !!                        gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm) and gde3w 
    114125      !!              - h(t/u/v)_0 
     
    135146      ! 
    136147   END SUBROUTINE dom_vvl_init 
    137    ! 
     148 
     149 
    138150   SUBROUTINE dom_vvl_zgr(Kbb, Kmm, Kaa) 
    139151      !!---------------------------------------------------------------------- 
    140152      !!                ***  ROUTINE dom_vvl_init  *** 
    141       !!                    
    142       !! ** Purpose :  Interpolation of all scale factors,  
     153      !! 
     154      !! ** Purpose :  Interpolation of all scale factors, 
    143155      !!               depths and water column heights 
    144156      !! 
     
    147159      !! ** Action  : - e3t_(n/b) and tilde_e3t_(n/b) 
    148160      !!              - Regrid: e3(u/v)_n 
    149       !!                        e3(u/v)_b        
    150       !!                        e3w_n            
    151       !!                        e3(u/v)w_b       
    152       !!                        e3(u/v)w_n       
     161      !!                        e3(u/v)_b 
     162      !!                        e3w_n 
     163      !!                        e3(u/v)w_b 
     164      !!                        e3(u/v)w_n 
    153165      !!                        gdept_n, gdepw_n and gde3w_n 
    154166      !!              - h(t/u/v)_0 
     
    168180      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3u(:,:,:,Kbb), 'U' )    ! from T to U 
    169181      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3u(:,:,:,Kmm), 'U' ) 
    170       CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3v(:,:,:,Kbb), 'V' )    ! from T to V  
     182      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3v(:,:,:,Kbb), 'V' )    ! from T to V 
    171183      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3v(:,:,:,Kmm), 'V' ) 
    172184      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F' )    ! from U to F 
    173       !                                ! Vertical interpolation of e3t,u,v  
     185      !                                ! Vertical interpolation of e3t,u,v 
    174186      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3w (:,:,:,Kmm), 'W'  )  ! from T to W 
    175187      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3w (:,:,:,Kbb), 'W'  ) 
     
    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) 
    195          !                             ! 0.5 where jk = mikt      
     207         !                             ! 0.5 where jk = mikt 
    196208!!gm ???????   BUG ?  gdept(:,:,:,Kmm) as well as gde3w  does not include the thickness of ISF ?? 
    197209         zcoef = ( tmask(ji,jj,jk) - wmask(ji,jj,jk) ) 
    198210         gdepw(ji,jj,jk,Kmm) = gdepw(ji,jj,jk-1,Kmm) + e3t(ji,jj,jk-1,Kmm) 
    199211         gdept(ji,jj,jk,Kmm) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm) + 0.5 * e3w(ji,jj,jk,Kmm))  & 
    200             &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm))  
     212            &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm)) 
    201213         gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm) - ssh(ji,jj,Kmm) 
    202214         gdepw(ji,jj,jk,Kbb) = gdepw(ji,jj,jk-1,Kbb) + e3t(ji,jj,jk-1,Kbb) 
    203215         gdept(ji,jj,jk,Kbb) =      zcoef  * ( gdepw(ji,jj,jk  ,Kbb) + 0.5 * e3w(ji,jj,jk,Kbb))  & 
    204             &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kbb) +       e3w(ji,jj,jk,Kbb))  
     216            &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kbb) +       e3w(ji,jj,jk,Kbb)) 
    205217      END_3D 
    206218      ! 
     
    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   ;   ii1 = 111 
     276                  ij0 = 128   ;   ij1 = 135   ; 
    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 
     
    280292            CALL iom_set_rstw_var_active('tilde_e3t_n') 
    281293         END IF 
    282          !                                           ! -------------!     
     294         !                                           ! -------------! 
    283295         IF( ln_vvl_ztilde ) THEN                    ! z_tilde case ! 
    284296            !                                        ! ------------ ! 
     
    291303 
    292304 
    293    SUBROUTINE dom_vvl_sf_nxt( kt, Kbb, Kmm, Kaa, kcall )  
     305   SUBROUTINE dom_vvl_sf_nxt( kt, Kbb, Kmm, Kaa, kcall ) 
    294306      !!---------------------------------------------------------------------- 
    295307      !!                ***  ROUTINE dom_vvl_sf_nxt  *** 
    296       !!                    
     308      !! 
    297309      !! ** Purpose :  - compute the after scale factors used in tra_zdf, dynnxt, 
    298310      !!                 tranxt and dynspg routines 
    299311      !! 
    300312      !! ** Method  :  - z_star case:  Repartition of ssh INCREMENT proportionnaly to the level thickness. 
    301       !!               - z_tilde_case: after scale factor increment =  
     313      !!               - z_tilde_case: after scale factor increment = 
    302314      !!                                    high frequency part of horizontal divergence 
    303315      !!                                  + retsoring towards the background grid 
     
    307319      !! 
    308320      !! ** Action  :  - hdiv_lf    : restoring towards full baroclinic divergence in z_tilde case 
    309       !!               - tilde_e3t_a: after increment of vertical scale factor  
     321      !!               - tilde_e3t_a: after increment of vertical scale factor 
    310322      !!                              in z_tilde case 
    311323      !!               - e3(t/u/v)_a 
     
    410422            un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj)           & 
    411423               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) ) 
    412             vn_td(ji,jj,jk) = rn_ahe3 * vmask(ji,jj,jk) * e1_e2v(ji,jj)           &  
     424            vn_td(ji,jj,jk) = rn_ahe3 * vmask(ji,jj,jk) * e1_e2v(ji,jj)           & 
    413425               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji  ,jj+1,jk) ) 
    414426            zwu(ji,jj) = zwu(ji,jj) + un_td(ji,jj,jk) 
     
    460472               WRITE(numout, *) 'at i, j, k=', ijk_max 
    461473               WRITE(numout, *) 'MIN( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmin 
    462                WRITE(numout, *) 'at i, j, k=', ijk_min             
     474               WRITE(numout, *) 'at i, j, k=', ijk_min 
    463475               CALL ctl_stop( 'STOP', 'MAX( ABS( tilde_e3t_a(:,:,: ) ) / e3t_0(:,:,:) ) too high') 
    464476            ENDIF 
     
    575587      !!---------------------------------------------------------------------- 
    576588      !!                ***  ROUTINE dom_vvl_sf_update  *** 
    577       !!                    
    578       !! ** Purpose :  for z tilde case: compute time filter and swap of scale factors  
     589      !! 
     590      !! ** Purpose :  for z tilde case: compute time filter and swap of scale factors 
    579591      !!               compute all depths and related variables for next time step 
    580592      !!               write outputs and restart file 
     
    586598      !! ** Action  :  - tilde_e3t_(b/n) ready for next time step 
    587599      !!               - Recompute: 
    588       !!                    e3(u/v)_b        
    589       !!                    e3w(:,:,:,Kmm)            
    590       !!                    e3(u/v)w_b       
    591       !!                    e3(u/v)w_n       
     600      !!                    e3(u/v)_b 
     601      !!                    e3w(:,:,:,Kmm) 
     602      !!                    e3(u/v)w_b 
     603      !!                    e3(u/v)w_n 
    592604      !!                    gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm)  and gde3w 
    593605      !!                    h(u/v) and h(u/v)r 
     
    620632            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 
    621633         ELSE 
    622             tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &  
     634            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) & 
    623635            &         + rn_atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 
    624636         ENDIF 
     
    632644      ! - ML - e3u(:,:,:,Kbb) and e3v(:,:,:,Kbb) are already computed in dynnxt 
    633645      ! - JC - hu(:,:,:,Kbb), hv(:,:,:,:,Kbb), hur_b, hvr_b also 
    634        
     646 
    635647      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F'  ) 
    636        
     648 
    637649      ! Vertical scale factor interpolations 
    638650      CALL dom_vvl_interpol( e3t(:,:,:,Kmm),  e3w(:,:,:,Kmm), 'W'  ) 
     
    653665         gdepw(ji,jj,jk,Kmm) = gdepw(ji,jj,jk-1,Kmm) + e3t(ji,jj,jk-1,Kmm) 
    654666         gdept(ji,jj,jk,Kmm) =    zcoef  * ( gdepw(ji,jj,jk  ,Kmm) + 0.5 * e3w(ji,jj,jk,Kmm) )  & 
    655              &             + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm) )  
     667             &             + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm) ) 
    656668         gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm) - ssh(ji,jj,Kmm) 
    657669      END_3D 
     
    772784      !!--------------------------------------------------------------------- 
    773785      !!                   ***  ROUTINE dom_vvl_rst  *** 
    774       !!                      
     786      !! 
    775787      !! ** Purpose :   Read or write VVL file in restart file 
    776788      !! 
     
    789801      !!---------------------------------------------------------------------- 
    790802      ! 
    791       IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     803      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise 
    792804         !                                   ! =============== 
    793805         IF( ln_rstart ) THEN                   !* Read the restart file 
     
    808820               CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    809821               CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    810                ! needed to restart if land processor not computed  
     822               ! needed to restart if land processor not computed 
    811823               IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files' 
    812                WHERE ( tmask(:,:,:) == 0.0_wp )  
     824               WHERE ( tmask(:,:,:) == 0.0_wp ) 
    813825                  e3t(:,:,:,Kmm) = e3t_0(:,:,:) 
    814826                  e3t(:,:,:,Kbb) = e3t_0(:,:,:) 
     
    873885            ! 
    874886 
    875             IF( ll_wd ) THEN   ! MJB ll_wd edits start here - these are essential  
     887            IF( ll_wd ) THEN   ! MJB ll_wd edits start here - these are essential 
    876888               ! 
    877889               IF( cn_cfg == 'wad' ) THEN 
     
    908920                       CALL ctl_stop( 'dom_vvl_rst: ht_0 must be positive at potentially wet points' ) 
    909921                     ENDIF 
    910                   END DO  
    911                END DO  
     922                  END DO 
     923               END DO 
    912924               ! 
    913925            ELSE 
     
    950962            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lwxios) 
    951963         END IF 
    952          !                                           ! -------------!     
     964         !                                           ! -------------! 
    953965         IF( ln_vvl_ztilde ) THEN                    ! z_tilde case ! 
    954966            !                                        ! ------------ ! 
     
    965977      !!--------------------------------------------------------------------- 
    966978      !!                  ***  ROUTINE dom_vvl_ctl  *** 
    967       !!                 
     979      !! 
    968980      !! ** Purpose :   Control the consistency between namelist options 
    969981      !!                for vertical coordinate 
     
    974986         &              ln_vvl_zstar_at_eqtor      , rn_ahe3     , rn_rst_e3t            , & 
    975987         &              rn_lf_cutoff               , rn_zdef_max , ln_vvl_dbg                ! not yet implemented: ln_vvl_kepe 
    976       !!----------------------------------------------------------------------  
     988      !!---------------------------------------------------------------------- 
    977989      ! 
    978990      READ  ( numnam_ref, nam_vvl, IOSTAT = ios, ERR = 901) 
     
    10311043   END SUBROUTINE dom_vvl_ctl 
    10321044 
     1045#endif 
     1046 
    10331047   !!====================================================================== 
    10341048END MODULE domvvl 
Note: See TracChangeset for help on using the changeset viewer.