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 7990 for branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2017-04-29T17:24:54+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09): OPA remove avmu, avmv from zdf modules + move CALL tke(gls)_rst & gls_rst in zdftke(gls) + rename zdftmx and zdfqiao

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r7953 r7990  
    2727   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    2828   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    29    !!            4.0  !  2017-04  (G. Madec)  Remove CPP keys 
     29   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
    3030   !!---------------------------------------------------------------------- 
    3131 
     
    159159      !! 
    160160      !! ** Action  :   compute en (now turbulent kinetic energy) 
    161       !!                update avt, avmu, avmv (before vertical eddy coef.) 
     161      !!                update avt, avm (before vertical eddy coef.) 
    162162      !! 
    163163      !! References : Gaspar et al., JGR, 1990, 
     
    175175#endif 
    176176      ! 
    177       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    178          avt (:,:,:) = avt_k (:,:,:)  
    179          avm (:,:,:) = avm_k (:,:,:)  
    180          avmu(:,:,:) = avmu_k(:,:,:)  
    181          avmv(:,:,:) = avmv_k(:,:,:)  
    182       ENDIF  
    183       ! 
    184       CALL tke_tke      ! now tke (en) 
    185       ! 
    186       CALL tke_avn      ! now avt, avm, avmu, avmv 
    187       ! 
    188       avt_k (:,:,:) = avt (:,:,:)  
    189       avm_k (:,:,:) = avm (:,:,:)  
    190       avmu_k(:,:,:) = avmu(:,:,:)  
    191       avmv_k(:,:,:) = avmv(:,:,:)  
     177      avt(:,:,:) = avt_k(:,:,:)     ! restore before Kz computed with TKE alone 
     178      avm(:,:,:) = avm_k(:,:,:)  
     179      ! 
     180      CALL tke_tke                  ! now tke (en) 
     181      ! 
     182      CALL tke_avn                  ! now avt, avm, dissl 
     183      ! 
     184      avt_k(:,:,:) = avt(:,:,:)     ! store Kz computed with TKE alone 
     185      avm_k(:,:,:) = avm(:,:,:)  
    192186      ! 
    193187#if defined key_agrif 
     
    195189      IF( .NOT.Agrif_Root() )   CALL Agrif_Update_Tke( kt )      ! children only 
    196190#endif       
    197      !  
     191      !  
     192      IF( lrst_oce )   CALL tke_rst( kt, 'WRITE' ) 
     193      ! 
    198194  END SUBROUTINE zdf_tke 
    199195 
     
    207203      !! ** Method  : - TKE surface boundary condition 
    208204      !!              - source term due to Langmuir cells (Axell JGR 2002) (ln_lc=T) 
    209       !!              - source term due to shear (saved in avmu, avmv arrays) 
     205      !!              - source term due to shear (= Kz dz[Ub] * dz[Un] ) 
    210206      !!              - Now TKE : resolution of the TKE equation by inverting 
    211207      !!                a tridiagonal linear system by a "methode de chasse" 
     
    213209      !! 
    214210      !! ** Action  : - en : now turbulent kinetic energy) 
    215       !!              - avmu, avmv : production of TKE by shear at u and v-points 
    216       !!                (= Kz dz[Ub] * dz[Un] ) 
    217211      !! --------------------------------------------------------------------- 
    218212      INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
     
    228222      REAL(wp) ::   zzd_up, zzd_lw                  !    -         - 
    229223!!bfr      REAL(wp) ::   zebot                           !    -         - 
    230       INTEGER , POINTER, DIMENSION(:,:  ) ::   imlc 
     224      INTEGER , DIMENSION(jpi,jpj) ::   imlc 
    231225      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
    232226      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv 
     
    236230      IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
    237231      ! 
    238       CALL wrk_alloc( jpi,jpj,       imlc )    ! integer 
    239232      CALL wrk_alloc( jpi,jpj,       zhlc )  
    240233      CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
     
    473466         END DO 
    474467      ENDIF 
     468!!gm not sure we need this lbc .... 
    475469      CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    476470      ! 
    477       CALL wrk_dealloc( jpi,jpj,       imlc )    ! integer 
    478471      CALL wrk_dealloc( jpi,jpj,       zhlc )  
    479472      CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
     
    516509      !!      with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise. 
    517510      !! 
    518       !! ** Action  : - avt : now vertical eddy diffusivity (w-point) 
    519       !!              - avmu, avmv : now vertical eddy viscosity at uw- and vw-points 
     511      !! ** Action  : - avt, avm : now vertical eddy diffusivity and viscosity (w-point) 
    520512      !!---------------------------------------------------------------------- 
    521513      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    522       REAL(wp) ::   zrn2, zraug, zcoef, zav     ! local scalars 
    523       REAL(wp) ::   zdku, zri, zsqen            !   -      - 
    524       REAL(wp) ::   zdkv, zemxl, zemlm, zemlp   !   -      - 
     514      REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars 
     515      REAL(wp) ::   zdku,   zdkv, zsqen       !   -      - 
     516      REAL(wp) ::   zemxl, zemlm, zemlp       !   -      - 
    525517      REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl, zmxlm, zmxld 
    526518      !!-------------------------------------------------------------------- 
     
    645637 
    646638      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    647       !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt) 
     639      !                     !  Vertical eddy viscosity and diffusivity  (avm and avt) 
    648640      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    649641      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
     
    658650         END DO 
    659651      END DO 
    660       CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    661       ! 
    662       DO jk = 2, jpkm1            !* vertical eddy viscosity at wu- and wv-points 
    663          DO jj = 2, jpjm1 
    664             DO ji = fs_2, fs_jpim1   ! vector opt. 
    665                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * wumask(ji,jj,jk) 
    666                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk) 
    667             END DO 
    668          END DO 
    669       END DO 
    670       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! Lateral boundary conditions 
     652      ! 
    671653      ! 
    672654      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
     
    677659# if defined key_c1d 
    678660                  e_pdl(ji,jj,jk) = apdlr(ji,jj,jk) * wmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
    679 !!gm bug NO zri here.... 
    680 !!gm remove the specific diag for c1d ! 
    681                   e_ric(ji,jj,jk) = zri * wmask(ji,jj,jk)                            ! c1d config. : save Ri 
    682661# endif 
    683662              END DO 
     
    685664         END DO 
    686665      ENDIF 
    687       CALL lbc_lnk( avt, 'W', 1. )                      ! Lateral boundary conditions on avt  (sign unchanged) 
     666!!gm I'm sure this is needed to compute the shear term at next time-step 
     667      CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
     668      CALL lbc_lnk( avt, 'W', 1. )      ! Lateral boundary conditions on avt  (sign unchanged) 
    688669 
    689670      IF(ln_ctl) THEN 
    690          CALL prt_ctl( tab3d_1=en  , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    691          CALL prt_ctl( tab3d_1=avmu, clinfo1=' tke  - u: ', mask1=umask,                   & 
    692             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
     671         CALL prt_ctl( tab3d_1=en , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     672         CALL prt_ctl( tab3d_1=avm, clinfo1=' tke  - m: ', ovlap=1, kdim=jpk ) 
    693673      ENDIF 
    694674      ! 
     
    759739      ENDIF 
    760740      ! 
    761       IF( ln_zdftmx ) THEN          ! Internal wave driven mixing 
    762          !                          ! specific values of rn_emin & rmxl_min are used 
    763          rn_emin  = 1.e-10_wp 
    764          rmxl_min = 1.e-03_wp 
     741      IF( ln_zdfiwm ) THEN          ! Internal wave-driven mixing 
     742         rn_emin  = 1.e-10_wp             ! specific values of rn_emin & rmxl_min are used 
     743         rmxl_min = 1.e-03_wp             ! associated avt minimum = molecular salt diffusivity (10^-9 m2/s) 
    765744         IF(lwp) WRITE(numout,*) '      Internal wave-driven mixing case:   force   rn_emin = 1.e-10 and rmxl_min = 1.e-3 ' 
    766       ELSE 
     745      ELSE                          ! standard case : associated avt minimum = molecular viscosity (10^-6 m2/s) 
    767746         rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) )    ! resulting minimum length to recover molecular viscosity 
    768747         IF(lwp) WRITE(numout,*) '      minimum mixing length with your parameters rmxl_min = ', rmxl_min 
     
    798777         avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    799778         avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    800          avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    801          avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    802779      END DO 
    803780      dissl(:,:,:) = 1.e-12_wp 
     
    821798     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    822799     ! 
    823      INTEGER ::   jit, jk   ! dummy loop indices 
    824      INTEGER ::   id1, id2, id3, id4, id5, id6   ! local integers 
     800     INTEGER ::   jit, jk              ! dummy loop indices 
     801     INTEGER ::   id1, id2, id3, id4   ! local integers 
    825802     !!---------------------------------------------------------------------- 
    826803     ! 
     
    829806        IF( ln_rstart ) THEN                   !* Read the restart file 
    830807           id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    831            id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    832            id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    833            id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    834            id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    835            id6 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
     808           id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     809           id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     810           id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
    836811           ! 
    837812           IF( id1 > 0 ) THEN                       ! 'en' exists 
    838813              CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
    839               IF( MIN( id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
    840                  CALL iom_get( numror, jpdom_autoglo, 'avt'  , avt   ) 
    841                  CALL iom_get( numror, jpdom_autoglo, 'avm'  , avm   ) 
    842                  CALL iom_get( numror, jpdom_autoglo, 'avmu' , avmu  ) 
    843                  CALL iom_get( numror, jpdom_autoglo, 'avmv' , avmv  ) 
     814              IF( MIN( id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
     815                 CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     816                 CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
    844817                 CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
    845818              ELSE                                                 ! one at least array is missing 
    846                  CALL tke_avn                                          ! compute avt, avm, avmu, avmv and dissl (approximation) 
     819                 CALL tke_avn                                          ! compute avt, avm, and dissl (approximation) 
    847820              ENDIF 
    848821           ELSE                                     ! No TKE array found: initialisation 
    849822              IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 
    850               en (:,:,:) = rn_emin * tmask(:,:,:) 
    851               CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation) 
    852               ! 
    853               avt_k (:,:,:) = avt (:,:,:) 
    854               avm_k (:,:,:) = avm (:,:,:) 
    855               avmu_k(:,:,:) = avmu(:,:,:) 
    856               avmv_k(:,:,:) = avmv(:,:,:) 
     823              en (:,:,:) = rn_emin * wmask(:,:,:) 
     824              CALL tke_avn                               ! recompute avt, avm, and dissl (approximation) 
     825              avt_k(:,:,:) = avt(:,:,:) 
     826              avm_k(:,:,:) = avm(:,:,:) 
    857827              ! 
    858828              DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
     829              avt_k(:,:,:) = avt(:,:,:) 
     830              avm_k(:,:,:) = avm(:,:,:) 
    859831           ENDIF 
    860832        ELSE                                   !* Start from rest 
    861833           en(:,:,:) = rn_emin * tmask(:,:,:) 
    862834           DO jk = 1, jpk                           ! set the Kz to the background value 
    863               avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    864               avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    865               avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    866               avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
     835              avt_k(:,:,jk) = avtb(jk) * wmask (:,:,jk) 
     836              avm_k(:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    867837           END DO 
    868838        ENDIF 
     
    871841        !                                   ! ------------------- 
    872842        IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
    873         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
    874         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    875         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    876         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    877         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    878         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl  ) 
     843        CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
     844        CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     845        CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     846        CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 
    879847        ! 
    880848     ENDIF 
Note: See TracChangeset for help on using the changeset viewer.