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 5777 for branches/2015/dev_r5721_CNRS9_NOC3_LDF/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90 – NEMO

Ignore:
Timestamp:
2015-10-06T13:40:42+02:00 (9 years ago)
Author:
gm
Message:

#1593: LDF-ADV, III. Phasing of the improvements/simplifications of ADV & LDF momentum trends (see wiki page)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5721_CNRS9_NOC3_LDF/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r5758 r5777  
    22   !!====================================================================== 
    33   !!                     ***  MODULE  dynldf_iso  *** 
    4    !! Ocean dynamics:  lateral viscosity trend 
     4   !! Ocean dynamics:   lateral viscosity trend (rotated laplacian operator) 
    55   !!====================================================================== 
    66   !! History :  OPA  !  97-07  (G. Madec)  Original code 
     
    88   !!             -   !  2004-08  (C. Talandier) New trends organization 
    99   !!            2.0  !  2005-11  (G. Madec)  s-coordinate: horizontal diffusion 
     10   !!            3.7  !  2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification, 
     11   !!                 !                                   add velocity dependent coefficient and optional read in file 
    1012   !!---------------------------------------------------------------------- 
    1113 
     
    1719   USE oce             ! ocean dynamics and tracers 
    1820   USE dom_oce         ! ocean space and time domain 
    19    USE ldfdyn_oce      ! ocean dynamics lateral physics 
    20    USE ldftra          ! lateral physics: eddy diffusivity & EIV coefficients 
     21   USE ldfdyn          ! lateral diffusion: eddy viscosity coef. 
     22   USE ldftra          ! lateral physics: eddy diffusivity 
    2123   USE zdf_oce         ! ocean vertical physics 
    2224   USE ldfslp          ! iso-neutral slopes  
    2325   ! 
    24    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2526   USE in_out_manager  ! I/O manager 
    2627   USE lib_mpp         ! MPP library 
     28   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2729   USE prtctl          ! Print control 
    2830   USE wrk_nemo        ! Memory Allocation 
     
    4042   !! * Substitutions 
    4143#  include "domzgr_substitute.h90" 
    42 #  include "ldfdyn_substitute.h90" 
    4344#  include "vectopt_loop_substitute.h90" 
    4445   !!---------------------------------------------------------------------- 
     
    8182      !!      horizontal fluxes associated with the rotated lateral mixing: 
    8283      !!      u-component: 
    83       !!         ziut = ( ahmt + ahmb0 ) e2t * e3t / e1t  di[ ub ] 
    84       !!               -      ahmt       e2t * mi-1(uslp) dk[ mi(mk(ub)) ] 
    85       !!         zjuf = ( ahmf + ahmb0 ) e1f * e3f / e2f  dj[ ub ] 
    86       !!               -      ahmf       e1f * mi(vslp)   dk[ mj(mk(ub)) ] 
     84      !!         ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t  di[ ub ] 
     85      !!               -  ahmt              e2t * mi-1(uslp) dk[ mi(mk(ub)) ] 
     86      !!         zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
     87      !!               -  ahmf              e1f * mi(vslp)   dk[ mj(mk(ub)) ] 
    8788      !!      v-component: 
    88       !!         zivf = ( ahmf + ahmb0 ) e2t * e3t / e1t  di[ vb ] 
    89       !!               -      ahmf       e2t * mj(uslp)   dk[ mi(mk(vb)) ] 
    90       !!         zjvt = ( ahmt + ahmb0 ) e1f * e3f / e2f  dj[ ub ] 
    91       !!               -      ahmt       e1f * mj-1(vslp) dk[ mj(mk(vb)) ] 
     89      !!         zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t  di[ vb ] 
     90      !!               -  ahmf              e2t * mj(uslp)   dk[ mi(mk(vb)) ] 
     91      !!         zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
     92      !!               -  ahmt              e1f * mj-1(vslp) dk[ mj(mk(vb)) ] 
    9293      !!      take the horizontal divergence of the fluxes: 
    9394      !!         diffu = 1/(e1u*e2u*e3u) {  di  [ ziut ] + dj-1[ zjuf ]  } 
     
    108109      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    109110      REAL(wp) ::   zabe1, zabe2, zcof1, zcof2                       ! local scalars 
    110       REAL(wp) ::   zmskt, zmskf, zbu, zbv, zuah, zvah               !   -      - 
     111      REAL(wp) ::   zmskt, zmskf                                     !   -      - 
    111112      REAL(wp) ::   zcoef0, zcoef3, zcoef4, zmkt, zmkf               !   -      - 
    112113      REAL(wp) ::   zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
     
    127128      ENDIF 
    128129 
    129       ! s-coordinate: Iso-level diffusion on tracer, but geopotential level diffusion on momentum 
     130!!gm bug is dyn_ldf_iso called before tra_ldf_iso ....   <<<<<===== TO BE CHECKED 
     131      ! s-coordinate: Iso-level diffusion on momentum but not on tracer 
    130132      IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 
    131133         ! 
     
    133135            DO jj = 2, jpjm1 
    134136               DO ji = 2, jpim1 
    135                   uslp (ji,jj,jk) = -1./e1u(ji,jj) * ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * umask(ji,jj,jk) 
    136                   vslp (ji,jj,jk) = -1./e2v(ji,jj) * ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * vmask(ji,jj,jk) 
    137                   wslpi(ji,jj,jk) = -1./e1t(ji,jj) * ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) * tmask(ji,jj,jk) * 0.5 
    138                   wslpj(ji,jj,jk) = -1./e2t(ji,jj) * ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) * tmask(ji,jj,jk) * 0.5 
     137                  uslp (ji,jj,jk) = - ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
     138                  vslp (ji,jj,jk) = - ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
     139                  wslpi(ji,jj,jk) = - ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 
     140                  wslpj(ji,jj,jk) = - ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 
    139141               END DO 
    140142            END DO 
     
    181183            DO jj = 2, jpjm1 
    182184               DO ji = fs_2, jpi   ! vector opt. 
    183                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) / e1t(ji,jj) 
    184  
    185                   zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    186                      &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
     185                  zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) * r1_e1t(ji,jj) 
     186 
     187                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     & 
     188                     &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    187189 
    188190                  zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    189191    
     192                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )    & 
     193                     &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      & 
     194                     &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
     195               END DO 
     196            END DO 
     197         ELSE                   ! other coordinate system (zco or sco) : e3t 
     198            DO jj = 2, jpjm1 
     199               DO ji = fs_2, jpi   ! vector opt. 
     200                  zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * fse3t(ji,jj,jk) * r1_e1t(ji,jj) 
     201 
     202                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     & 
     203                     &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp ) 
     204 
     205                  zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     206 
    190207                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
    191208                     &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
     
    193210               END DO 
    194211            END DO 
    195          ELSE                   ! other coordinate system (zco or sco) : e3t 
    196             DO jj = 2, jpjm1 
    197                DO ji = fs_2, jpi   ! vector opt. 
    198                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * fse3t(ji,jj,jk) / e1t(ji,jj) 
    199  
    200                   zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    201                      &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
    202  
    203                   zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    204  
    205                   ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
    206                      &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
    207                      &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
    208                END DO 
    209             END DO 
    210212         ENDIF 
    211213 
     
    213215         DO jj = 1, jpjm1 
    214216            DO ji = 1, fs_jpim1   ! vector opt. 
    215                zabe2 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e1f(ji,jj) * fse3f(ji,jj,jk) / e2f(ji,jj) 
    216  
    217                zmskf = 1./MAX(  umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)   & 
    218                   &           + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ), 1. ) 
     217               zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * fse3f(ji,jj,jk) * r1_e2f(ji,jj) 
     218 
     219               zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     & 
     220                  &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    219221 
    220222               zcof2 = - rn_aht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
     
    234236         DO jj = 2, jpjm1 
    235237            DO ji = 1, fs_jpim1   ! vector opt. 
    236                zabe1 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e2f(ji,jj) * fse3f(ji,jj,jk) / e1f(ji,jj) 
    237  
    238                zmskf = 1./MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)   & 
    239                   &           + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ), 1. ) 
     238               zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * fse3f(ji,jj,jk) * r1_e1f(ji,jj) 
     239 
     240               zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     & 
     241                  &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
    240242 
    241243               zcof1 = - rn_aht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
    242244 
    243                zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )   & 
    244                   &           + zcof1 * ( zdkv (ji,jj) + zdk1v(ji+1,jj)     & 
    245                   &                      +zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
     245               zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )    & 
     246                  &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      & 
     247                  &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
    246248            END DO 
    247249         END DO 
     
    251253            DO jj = 2, jpj 
    252254               DO ji = 1, fs_jpim1   ! vector opt. 
    253                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) / e2t(ji,jj) 
     255                  zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) * r1_e2t(ji,jj) 
     256 
     257                  zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     & 
     258                     &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
     259 
     260                  zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     261 
     262                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )    & 
     263                     &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      & 
     264                     &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
     265               END DO 
     266            END DO 
     267         ELSE                   ! other coordinate system (zco or sco) : e3t 
     268            DO jj = 2, jpj 
     269               DO ji = 1, fs_jpim1   ! vector opt. 
     270                  zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * fse3t(ji,jj,jk) * r1_e2t(ji,jj) 
    254271 
    255272                  zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
     
    263280               END DO 
    264281            END DO 
    265          ELSE                   ! other coordinate system (zco or sco) : e3t 
    266             DO jj = 2, jpj 
    267                DO ji = 1, fs_jpim1   ! vector opt. 
    268                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * fse3t(ji,jj,jk) / e2t(ji,jj) 
    269  
    270                   zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    271                      &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    272  
    273                   zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    274  
    275                   zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
    276                      &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     & 
    277                      &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
    278                END DO 
    279             END DO 
    280282         ENDIF 
    281283 
     
    283285         ! Second derivative (divergence) and add to the general trend 
    284286         ! ----------------------------------------------------------- 
    285  
    286287         DO jj = 2, jpjm1 
    287             DO ji = 2, jpim1          !! Question vectop possible??? !!bug 
    288                ! volume elements 
    289                zbu = e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    290                zbv = e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) 
    291                ! horizontal component of isopycnal momentum diffusive trends 
    292                zuah =( ziut (ji+1,jj) - ziut (ji,jj  ) +   & 
    293                   &    zjuf (ji  ,jj) - zjuf (ji,jj-1)  ) / zbu 
    294                zvah =( zivf (ji,jj  ) - zivf (ji-1,jj) +   & 
    295                   &    zjvt (ji,jj+1) - zjvt (ji,jj  )  ) / zbv 
    296                ! add the trends to the general trends 
    297                ua (ji,jj,jk) = ua (ji,jj,jk) + zuah 
    298                va (ji,jj,jk) = va (ji,jj,jk) + zvah 
     288            DO ji = 2, jpim1          !!gm Question vectop possible??? !!bug 
     289               ua(ji,jj,jk) = ua(ji,jj,jk) + ( ziut(ji+1,jj) - ziut(ji,jj  )    & 
     290                  &                          + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     291               va(ji,jj,jk) = va(ji,jj,jk) + ( zivf(ji,jj  ) - zivf(ji-1,jj)    & 
     292                  &                          + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    299293            END DO 
    300294         END DO 
     
    362356               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1)   & 
    363357                             + tmask(ji,jj,jk  )+tmask(ji+1,jj,jk  ), 1. ) 
    364                zmkf = 1./MAX(  fmask(ji,jj-1,jk-1)+fmask(ji,jj,jk-1)   & 
    365                              + fmask(ji,jj-1,jk  )+fmask(ji,jj,jk  ), 1. ) 
     358               zmkf = 1./MAX(  fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1)   & 
     359                             + fmask(ji,jj-1,jk  ) + fmask(ji,jj,jk  ), 1. ) 
    366360 
    367361               zcoef3 = - e2u(ji,jj) * zmkt * zuwslpi 
     
    409403         DO jk = 1, jpkm1 
    410404            DO ji = 2, jpim1 
    411                ! volume elements 
    412                zbu = e1e2u(ji,jj) * fse3u(ji,jj,jk) 
    413                zbv = e1e2v(ji,jj) * fse3v(ji,jj,jk) 
    414                ! part of the k-component of isopycnal momentum diffusive trends 
    415                zuav = ( zfuw(ji,jk) - zfuw(ji,jk+1) ) / zbu 
    416                zvav = ( zfvw(ji,jk) - zfvw(ji,jk+1) ) / zbv 
    417                ! add the trends to the general trends 
    418                ua(ji,jj,jk) = ua(ji,jj,jk) + zuav 
    419                va(ji,jj,jk) = va(ji,jj,jk) + zvav 
     405               ua(ji,jj,jk) = ua(ji,jj,jk) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     406               va(ji,jj,jk) = va(ji,jj,jk) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    420407            END DO 
    421408         END DO 
Note: See TracChangeset for help on using the changeset viewer.