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 12822 for NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/SWE/dynldf_lap_blp.F90 – NEMO

Ignore:
Timestamp:
2020-04-28T11:10:38+02:00 (4 years ago)
Author:
gm
Message:

symmetric sterss tensor and half cell modifications (wet point only, ghost cells)

File:
1 copied

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/SWE/dynldf_lap_blp.F90

    r12529 r12822  
    55   !!====================================================================== 
    66   !! History : 3.7  ! 2014-01  (G. Madec, S. Masson)  Original code, re-entrant laplacian 
     7   !!           4.0  ! 2020-04  (A. Nasser, G. Madec)  Add symmetric mixing tensor  
    78   !!---------------------------------------------------------------------- 
    89 
     
    2526   PUBLIC dyn_ldf_lap  ! called by dynldf.F90 
    2627   PUBLIC dyn_ldf_blp  ! called by dynldf.F90 
    27  
     28!!anSYM   
     29   INTEGER, PUBLIC, PARAMETER ::   np_dynldf_lap_rot  = 1         ! div-rot   laplacian  
     30   INTEGER, PUBLIC, PARAMETER ::   np_dynldf_lap_sym  = 2         ! symmetric laplacian (Griffies&Hallberg 2000) 
     31   INTEGER, PUBLIC, PARAMETER ::   np_dynldf_lap_symN = 3         ! symmetric laplacian (cartesian) 
     32    
     33   INTEGER, PUBLIC, PARAMETER ::   ln_dynldf_lap_typ = 1         ! choose type of laplacian (ideally from namelist) 
     34!!anSYM 
    2835   !! * Substitutions 
    2936#  include "do_loop_substitute.h90" 
     
    4451      !! ** Method  :   The Laplacian operator apply on horizontal velocity is  
    4552      !!      writen as :   grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) )  
     53      !!      writen as :   grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) )  
    4654      !! 
    4755      !! ** Action : - pu_rhs, pv_rhs increased by the harmonic operator applied on pu, pv. 
     56      !! 
     57      !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/  
    4858      !!---------------------------------------------------------------------- 
    4959      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index 
     
    5767      REAL(wp) ::   zua, zva     ! local scalars 
    5868      REAL(wp), DIMENSION(jpi,jpj) ::   zcur, zdiv 
    59       !!---------------------------------------------------------------------- 
    60       ! 
     69      REAL(wp), DIMENSION(jpi,jpj) ::   zten, zshe   ! tension (diagonal) and shearing (anti-diagonal) terms 
     70      !!---------------------------------------------------------------------- 
     71      ! 
     72!!anSYM TO BE ADDED : reading of laplacian operator (ln_dynldf_lap_typ -> to be written nn_) shall be added in dyn_ldf_init  
     73!!                 as the writing    
     74!!                 and an integer as np_dynldf_lap for instance taken as argument by dyn_ldf_lap call in dyn_ldf 
    6175      IF( kt == nit000 .AND. lwp ) THEN 
    6276         WRITE(numout,*) 
    6377         WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 
    6478         WRITE(numout,*) '~~~~~~~ ' 
     79         WRITE(numout,*) '                  ln_dynldf_lap_typ = ', ln_dynldf_lap_typ 
     80         SELECT CASE( ln_dynldf_lap_typ )             ! print the choice of operator 
     81         CASE( np_dynldf_lap_rot )   ;   WRITE(numout,*) '   ==>>>   div-rot   laplacian' 
     82         CASE( np_dynldf_lap_sym )   ;   WRITE(numout,*) '   ==>>>   symmetric laplacian (covariant form)' 
     83         CASE( np_dynldf_lap_symN)   ;   WRITE(numout,*) '   ==>>>   symmetric laplacian (simple form)' 
     84         END SELECT 
    6585      ENDIF 
    6686      ! 
     
    6989      ENDIF 
    7090      ! 
    71       !                                                ! =============== 
    72       DO jk = 1, jpkm1                                 ! Horizontal slab 
    73          !                                             ! =============== 
    74          DO_2D_01_01 
    75             !                                      ! ahm * e3 * curl  (computed from 1 to jpim1/jpjm1) 
    76 !!gm open question here : e3f  at before or now ?    probably now... 
     91      SELECT CASE( ln_dynldf_lap_typ )   
     92         !               
     93         CASE ( np_dynldf_lap_rot )       !==  Vorticity-Divergence form  ==! 
     94            !    
     95            DO jk = 1, jpkm1                                 ! Horizontal slab 
     96               !                                              
     97               DO_2D_01_01 
     98               !                                      ! ahm * e3 * curl  (computed from 1 to jpim1/jpjm1) 
     99!!gm open question here : e3f  at before or now ?    probably now...  
    77100!!gm note that ahmf has already been multiplied by fmask 
    78             zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       & 
    79                &     * (  e2v(ji  ,jj-1) * pv(ji  ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk)  & 
    80                &        - e1u(ji-1,jj  ) * pu(ji-1,jj  ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk)  ) 
    81             !                                      ! ahm * div        (computed from 2 to jpi/jpj) 
     101                  zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       & 
     102                     &     * (  e2v(ji  ,jj-1) * pv(ji  ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk)  & 
     103                     &        - e1u(ji-1,jj  ) * pu(ji-1,jj  ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk)  ) 
     104                  !                                      ! ahm * div        (computed from 2 to jpi/jpj) 
    82105!!gm note that ahmt has already been multiplied by tmask 
    83             zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb)                                         & 
    84                &     * (  e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kbb) * pu(ji-1,jj,jk)  & 
    85                &        + e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kbb) * pv(ji,jj-1,jk)  ) 
    86          END_2D 
     106                  zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb)                                         & 
     107                     &     * (  e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kbb) * pu(ji-1,jj,jk)  & 
     108                     &        + e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kbb) * pv(ji,jj-1,jk)  ) 
     109               END_2D 
     110               ! 
     111               DO_2D_00_00 
     112                  pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * (                                             & 
     113                     &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
     114                     &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                       ) 
     115                     ! 
     116                  pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * (                                             & 
     117                     &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm)   & 
     118                     &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                       ) 
     119               END_2D 
     120               ! 
     121            END DO                                           !   End of slab 
     122            ! 
     123         CASE ( np_dynldf_lap_sym )       !==  Symmetric form  ==!   (Griffies&Hallberg 2000) 
     124            ! 
     125            DO jk = 1, jpkm1                                 ! Horizontal slab 
     126               ! 
     127               DO_2D_01_01 
     128                  !                                      ! shearing stress component (F-point)   NB : ahmf has already been multiplied by fmask 
     129                  zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk)                                                              & 
     130                     &     * (    e1f(ji-1,jj-1)    * r1_e2f(ji-1,jj-1)                                             & 
     131                     &         * ( pu(ji-1,jj  ,jk) * r1_e1u(ji-1,jj  )  - pu(ji-1,jj-1,jk) * r1_e1u(ji-1,jj-1) )   & 
     132                     &         +  e2f(ji-1,jj-1)    * r1_e1f(ji-1,jj-1)                                             & 
     133                     &         * ( pv(ji  ,jj-1,jk) * r1_e2v(ji  ,jj-1)  - pv(ji-1,jj-1,jk) * r1_e2v(ji-1,jj-1) )   )  
     134                  !                                      ! tension stress component (T-point)   NB : ahmt has already been multiplied by tmask 
     135                  zten(ji,jj)    = ahmt(ji,jj,jk)                                                       & 
     136                     &     * (    e2t(ji,jj)    * r1_e1t(ji,jj)                                         & 
     137                     &         * ( pu(ji,jj,jk) * r1_e2u(ji,jj)  - pu(ji-1,jj,jk) * r1_e2u(ji-1,jj) )   & 
     138                     &         -  e1t(ji,jj)    * r1_e2t(ji,jj)                                         & 
     139                     &         * ( pv(ji,jj,jk) * r1_e1v(ji,jj)  - pv(ji,jj-1,jk) * r1_e1v(ji,jj-1) )   )    
     140               END_2D 
     141               ! 
     142               DO_2D_00_00 
     143                  pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)                               & 
     144                     &    * (   (   zten(ji+1,jj  ) * e2t(ji+1,jj  )*e2t(ji+1,jj  ) * e3t(ji+1,jj  ,jk,Kmm)                       & 
     145                     &            - zten(ji  ,jj  ) * e2t(ji  ,jj  )*e2t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm) ) * r1_e2u(ji,jj)     &                                                     
     146                     &        + (   zshe(ji  ,jj  ) * e1f(ji  ,jj  )*e1f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                           & 
     147                     &            - zshe(ji  ,jj-1) * e1f(ji  ,jj-1)*e1f(ji  ,jj-1) * e3f(ji  ,jj-1,jk)     ) * r1_e1u(ji,jj) )    
     148                  ! 
     149                  pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)                               & 
     150                     &    * (   (   zshe(ji  ,jj  ) * e2f(ji  ,jj  )*e2f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                           & 
     151                     &            - zshe(ji-1,jj  ) * e2f(ji-1,jj  )*e2f(ji-1,jj  ) * e3f(ji-1,jj  ,jk)     ) * r1_e2v(ji,jj)     & 
     152                     &        - (   zten(ji  ,jj+1) * e1t(ji  ,jj+1)*e1t(ji  ,jj+1) * e3t(ji  ,jj+1,jk,Kmm)                       & 
     153                     &            - zten(ji  ,jj  ) * e1t(ji  ,jj  )*e1t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm) ) * r1_e1v(ji,jj) ) 
     154                   ! 
     155               END_2D 
     156               ! 
     157            END DO                                           !   End of slab 
     158            ! 
     159         CASE ( np_dynldf_lap_symN )       !==  Symmetric form  ==!   (naive way) 
     160            ! 
     161            DO jk = 1, jpkm1                                 ! Horizontal slab 
     162               ! 
     163               DO_2D_01_01 
     164                  !                                      ! shearing stress component (F-point)   NB : ahmf has already been multiplied by fmask 
     165                  zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk)                                           & 
     166                     &     * (   r1_e2f(ji-1,jj-1) * ( pu(ji-1,jj  ,jk) - pu(ji-1,jj-1,jk)  )   & 
     167                     &         + r1_e1f(ji-1,jj-1) * ( pv(ji  ,jj-1,jk) - pv(ji-1,jj-1,jk)  )   )  
     168                  !                                      ! tension stress component (T-point)   NB : ahmt has already been multiplied by tmask 
     169                  zten(ji,jj)    = ahmt(ji,jj,jk)                                       & 
     170                     &     * (   r1_e1t(ji,jj) * ( pu(ji,jj,jk) - pu(ji-1,jj  ,jk)  )   & 
     171                     &         - r1_e2t(ji,jj) * ( pv(ji,jj,jk) - pv(ji  ,jj-1,jk)  )   )    
     172               END_2D 
     173               ! 
     174               DO_2D_00_00 
     175                  pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
     176                     &    * (   zten(ji+1,jj  ) * e2t(ji+1,jj  ) * e3t(ji+1,jj  ,jk,Kmm)              & 
     177                     &        - zten(ji  ,jj  ) * e2t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm)              & 
     178                     &        + zshe(ji  ,jj  ) * e1f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                  & 
     179                     &        - zshe(ji  ,jj-1) * e1f(ji  ,jj-1) * e3f(ji  ,jj-1,jk)                  )     
     180                  ! 
     181                  pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)   & 
     182                     &    * (   zshe(ji  ,jj  ) * e2f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                  & 
     183                     &        - zshe(ji-1,jj  ) * e2f(ji-1,jj  ) * e3f(ji-1,jj  ,jk)                  & 
     184                     &        - zten(ji  ,jj+1) * e1t(ji  ,jj+1) * e3t(ji  ,jj+1,jk,Kmm)              & 
     185                     &        + zten(ji  ,jj  ) * e1t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm)              ) 
     186                   ! 
     187               END_2D 
     188               ! 
     189            END DO                                           !   End of slab 
     190            !   
     191         CASE DEFAULT                                     ! error 
     192            CALL ctl_stop('STOP','dyn_ldf_lap: wrong value for ln_dynldf_lap_typ'  ) 
     193         END SELECT 
    87194         ! 
    88          DO_2D_00_00 
    89             pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * (                                                 & 
    90                &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
    91                &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                     ) 
    92                ! 
    93             pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * (                                                 & 
    94                &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm)   & 
    95                &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                     ) 
    96          END_2D 
    97          !                                             ! =============== 
    98       END DO                                           !   End of slab 
    99       !                                                ! =============== 
    100195      ! 
    101196   END SUBROUTINE dyn_ldf_lap 
Note: See TracChangeset for help on using the changeset viewer.