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 11949 for NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN/sshwzv.F90 – NEMO

Ignore:
Timestamp:
2019-11-22T15:29:17+01:00 (4 years ago)
Author:
acc
Message:

Merge in changes from 2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps. This just creates a fresh copy of this branch to use as the merge base. See ticket #2341

Location:
NEMO/branches/2019/dev_r11943_MERGE_2019/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src

    • Property svn:mergeinfo deleted
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN/sshwzv.F90

    r11414 r11949  
    1010   !!            3.3  !  2011-10  (M. Leclair) split former ssh_wzv routine and remove all vvl related work 
    1111   !!            4.0  !  2018-12  (A. Coward) add mixed implicit/explicit advection 
     12   !!            4.1  !  2019-08  (A. Coward, D. Storkey) Rename ssh_nxt -> ssh_atf. Now only does time filtering. 
    1213   !!---------------------------------------------------------------------- 
    1314 
    1415   !!---------------------------------------------------------------------- 
    1516   !!   ssh_nxt       : after ssh 
    16    !!   ssh_swp       : filter ans swap the ssh arrays 
     17   !!   ssh_atf       : time filter the ssh arrays 
    1718   !!   wzv           : compute now vertical velocity 
    1819   !!---------------------------------------------------------------------- 
     
    4445   PUBLIC   wzv        ! called by step.F90 
    4546   PUBLIC   wAimp      ! called by step.F90 
    46    PUBLIC   ssh_swp    ! called by step.F90 
     47   PUBLIC   ssh_atf    ! called by step.F90 
    4748 
    4849   !! * Substitutions 
     
    5556CONTAINS 
    5657 
    57    SUBROUTINE ssh_nxt( kt ) 
     58   SUBROUTINE ssh_nxt( kt, Kbb, Kmm, pssh, Kaa ) 
    5859      !!---------------------------------------------------------------------- 
    5960      !!                ***  ROUTINE ssh_nxt  *** 
    6061      !!                    
    61       !! ** Purpose :   compute the after ssh (ssha) 
     62      !! ** Purpose :   compute the after ssh (ssh(Kaa)) 
    6263      !! 
    6364      !! ** Method  : - Using the incompressibility hypothesis, the ssh increment 
     
    6566      !!      by the time step. 
    6667      !! 
    67       !! ** action  :   ssha, after sea surface height 
     68      !! ** action  :   ssh(:,:,Kaa), after sea surface height 
    6869      !! 
    6970      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    7071      !!---------------------------------------------------------------------- 
    71       INTEGER, INTENT(in) ::   kt   ! time step 
     72      INTEGER                         , INTENT(in   ) ::   kt             ! time step 
     73      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! time level index 
     74      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height 
    7275      !  
    7376      INTEGER  ::   jk            ! dummy loop indice 
     
    9295      !                                           !------------------------------! 
    9396      IF(ln_wd_il) THEN 
    94          CALL wad_lmt(sshb, zcoef * (emp_b(:,:) + emp(:,:)), z2dt) 
    95       ENDIF 
    96  
    97       CALL div_hor( kt )                               ! Horizontal divergence 
     97         CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), z2dt, Kmm, uu, vv ) 
     98      ENDIF 
     99 
     100      CALL div_hor( kt, Kbb, Kmm )                     ! Horizontal divergence 
    98101      ! 
    99102      zhdiv(:,:) = 0._wp 
    100103      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports 
    101         zhdiv(:,:) = zhdiv(:,:) + e3t_n(:,:,jk) * hdivn(:,:,jk) 
     104        zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk) 
    102105      END DO 
    103106      !                                                ! Sea surface elevation time stepping 
     
    105108      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    106109      !  
    107       ssha(:,:) = (  sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     110      pssh(:,:,Kaa) = (  pssh(:,:,Kbb) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
    108111      ! 
    109112#if defined key_agrif 
    110       CALL agrif_ssh( kt ) 
     113      Kbb_a = Kbb; Kmm_a = Kmm; Krhs_a = Kaa; CALL agrif_ssh( kt ) 
    111114#endif 
    112115      ! 
    113116      IF ( .NOT.ln_dynspg_ts ) THEN 
    114117         IF( ln_bdy ) THEN 
    115             CALL lbc_lnk( 'sshwzv', ssha, 'T', 1. )    ! Not sure that's necessary 
    116             CALL bdy_ssh( ssha )             ! Duplicate sea level across open boundaries 
     118            CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1. )    ! Not sure that's necessary 
     119            CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries 
    117120         ENDIF 
    118121      ENDIF 
     
    121124      !                                           !------------------------------! 
    122125      ! 
    123       IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha  - : ', mask1=tmask ) 
     126      IF(ln_ctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kaa), clinfo1=' pssh(:,:,Kaa)  - : ', mask1=tmask ) 
    124127      ! 
    125128      IF( ln_timing )   CALL timing_stop('ssh_nxt') 
     
    128131 
    129132    
    130    SUBROUTINE wzv( kt ) 
     133   SUBROUTINE wzv( kt, Kbb, Kmm, pww, Kaa ) 
    131134      !!---------------------------------------------------------------------- 
    132135      !!                ***  ROUTINE wzv  *** 
     
    139142      !!        The boundary conditions are w=0 at the bottom (no flux) and. 
    140143      !! 
    141       !! ** action  :   wn      : now vertical velocity 
     144      !! ** action  :   pww      : now vertical velocity 
    142145      !! 
    143146      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    144147      !!---------------------------------------------------------------------- 
    145       INTEGER, INTENT(in) ::   kt   ! time step 
     148      INTEGER                         , INTENT(in)    ::   kt             ! time step 
     149      INTEGER                         , INTENT(in)    ::   Kbb, Kmm, Kaa  ! time level indices 
     150      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pww            ! now vertical velocity 
    146151      ! 
    147152      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    157162         IF(lwp) WRITE(numout,*) '~~~~~ ' 
    158163         ! 
    159          wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
     164         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
    160165      ENDIF 
    161166      !                                           !------------------------------! 
     
    179184         CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
    180185         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells? 
    181          !                             ! Same question holds for hdivn. Perhaps just for security 
     186         !                             ! Same question holds for hdiv. Perhaps just for security 
    182187         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    183188            ! computation of w 
    184             wn(:,:,jk) = wn(:,:,jk+1) - (  e3t_n(:,:,jk) * hdivn(:,:,jk) + zhdiv(:,:,jk)    & 
    185                &                         + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) )     ) * tmask(:,:,jk) 
    186          END DO 
    187          !          IF( ln_vvl_layer ) wn(:,:,:) = 0.e0 
     189            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk) + zhdiv(:,:,jk)    & 
     190               &                         + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) )     ) * tmask(:,:,jk) 
     191         END DO 
     192         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 
    188193         DEALLOCATE( zhdiv )  
    189194      ELSE   ! z_star and linear free surface cases 
    190195         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    191196            ! computation of w 
    192             wn(:,:,jk) = wn(:,:,jk+1) - (  e3t_n(:,:,jk) * hdivn(:,:,jk)                 & 
    193                &                         + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) )  ) * tmask(:,:,jk) 
     197            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)                 & 
     198               &                         + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) )  ) * tmask(:,:,jk) 
    194199         END DO 
    195200      ENDIF 
     
    197202      IF( ln_bdy ) THEN 
    198203         DO jk = 1, jpkm1 
    199             wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 
     204            pww(:,:,jk) = pww(:,:,jk) * bdytmask(:,:) 
    200205         END DO 
    201206      ENDIF 
     
    203208#if defined key_agrif  
    204209      IF( .NOT. AGRIF_Root() ) THEN  
    205          IF ((nbondi ==  1).OR.(nbondi == 2)) wn(nlci-1 , :     ,:) = 0.e0      ! east  
    206          IF ((nbondi == -1).OR.(nbondi == 2)) wn(2      , :     ,:) = 0.e0      ! west  
    207          IF ((nbondj ==  1).OR.(nbondj == 2)) wn(:      ,nlcj-1 ,:) = 0.e0      ! north  
    208          IF ((nbondj == -1).OR.(nbondj == 2)) wn(:      ,2      ,:) = 0.e0      ! south  
     210         IF ((nbondi ==  1).OR.(nbondi == 2)) pww(nlci-1 , :     ,:) = 0.e0      ! east  
     211         IF ((nbondi == -1).OR.(nbondi == 2)) pww(2      , :     ,:) = 0.e0      ! west  
     212         IF ((nbondj ==  1).OR.(nbondj == 2)) pww(:      ,nlcj-1 ,:) = 0.e0      ! north  
     213         IF ((nbondj == -1).OR.(nbondj == 2)) pww(:      ,2      ,:) = 0.e0      ! south  
    209214      ENDIF  
    210215#endif  
     
    215220 
    216221 
    217    SUBROUTINE ssh_swp( kt ) 
    218       !!---------------------------------------------------------------------- 
    219       !!                    ***  ROUTINE ssh_nxt  *** 
    220       !! 
    221       !! ** Purpose :   achieve the sea surface  height time stepping by  
    222       !!              applying Asselin time filter and swapping the arrays 
    223       !!              ssha  already computed in ssh_nxt   
     222   SUBROUTINE ssh_atf( kt, Kbb, Kmm, Kaa, pssh ) 
     223      !!---------------------------------------------------------------------- 
     224      !!                    ***  ROUTINE ssh_atf  *** 
     225      !! 
     226      !! ** Purpose :   Apply Asselin time filter to now SSH. 
    224227      !! 
    225228      !! ** Method  : - apply Asselin time fiter to now ssh (excluding the forcing 
    226229      !!              from the filter, see Leclair and Madec 2010) and swap : 
    227       !!                sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 
     230      !!                pssh(:,:,Kmm) = pssh(:,:,Kaa) + atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 
    228231      !!                            - atfp * rdt * ( emp_b - emp ) / rau0 
    229       !!                sshn = ssha 
    230       !! 
    231       !! ** action  : - sshb, sshn   : before & now sea surface height 
    232       !!                               ready for the next time step 
     232      !! 
     233      !! ** action  : - pssh(:,:,Kmm) time filtered 
    233234      !! 
    234235      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    235236      !!---------------------------------------------------------------------- 
    236       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     237      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step index 
     238      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! ocean time level indices 
     239      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! SSH field 
    237240      ! 
    238241      REAL(wp) ::   zcoef   ! local scalar 
    239242      !!---------------------------------------------------------------------- 
    240243      ! 
    241       IF( ln_timing )   CALL timing_start('ssh_swp') 
     244      IF( ln_timing )   CALL timing_start('ssh_atf') 
    242245      ! 
    243246      IF( kt == nit000 ) THEN 
    244247         IF(lwp) WRITE(numout,*) 
    245          IF(lwp) WRITE(numout,*) 'ssh_swp : Asselin time filter and swap of sea surface height' 
     248         IF(lwp) WRITE(numout,*) 'ssh_atf : Asselin time filter of sea surface height' 
    246249         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    247250      ENDIF 
    248251      !              !==  Euler time-stepping: no filter, just swap  ==! 
    249       IF ( neuler == 0 .AND. kt == nit000 ) THEN 
    250          sshn(:,:) = ssha(:,:)                              ! now    <-- after  (before already = now) 
    251          ! 
    252       ELSE           !==  Leap-Frog time-stepping: Asselin filter + swap  ==! 
    253          !                                                  ! before <-- now filtered 
    254          sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) ) 
    255          IF( .NOT.ln_linssh ) THEN                          ! before <-- with forcing removed 
     252      IF ( .NOT.( neuler == 0 .AND. kt == nit000 ) ) THEN   ! Only do time filtering for leapfrog timesteps 
     253         !                                                  ! filtered "now" field 
     254         pssh(:,:,Kmm) = pssh(:,:,Kmm) + atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 
     255         IF( .NOT.ln_linssh ) THEN                          ! "now" <-- with forcing removed 
    256256            zcoef = atfp * rdt * r1_rau0 
    257             sshb(:,:) = sshb(:,:) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
     257            pssh(:,:,Kmm) = pssh(:,:,Kmm) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
    258258               &                             -    rnf_b(:,:) + rnf   (:,:)   & 
    259259               &                             + fwfisf_b(:,:) - fwfisf(:,:)   ) * ssmask(:,:) 
    260260         ENDIF 
    261          sshn(:,:) = ssha(:,:)                              ! now <-- after 
    262       ENDIF 
    263       ! 
    264       IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask ) 
    265       ! 
    266       IF( ln_timing )   CALL timing_stop('ssh_swp') 
    267       ! 
    268    END SUBROUTINE ssh_swp 
    269  
    270    SUBROUTINE wAimp( kt ) 
     261      ENDIF 
     262      ! 
     263      IF(ln_ctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kmm), clinfo1=' pssh(:,:,Kmm)  - : ', mask1=tmask ) 
     264      ! 
     265      IF( ln_timing )   CALL timing_stop('ssh_atf') 
     266      ! 
     267   END SUBROUTINE ssh_atf 
     268 
     269   SUBROUTINE wAimp( kt, Kmm ) 
    271270      !!---------------------------------------------------------------------- 
    272271      !!                ***  ROUTINE wAimp  *** 
     
    277276      !! ** Method  : -  
    278277      !! 
    279       !! ** action  :   wn      : now vertical velocity (to be handled explicitly) 
     278      !! ** action  :   ww      : now vertical velocity (to be handled explicitly) 
    280279      !!            :   wi      : now vertical velocity (for implicit treatment) 
    281280      !! 
     
    285284      !!---------------------------------------------------------------------- 
    286285      INTEGER, INTENT(in) ::   kt   ! time step 
     286      INTEGER, INTENT(in) ::   Kmm  ! time level index 
    287287      ! 
    288288      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    308308            DO jj = 2, jpjm1 
    309309               DO ji = 2, fs_jpim1   ! vector opt. 
    310                   z1_e3t = 1._wp / e3t_n(ji,jj,jk) 
     310                  z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    311311                  ! 2*rdt and not r2dt (for restartability) 
    312                   Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( wn(ji,jj,jk) , 0._wp ) - MIN( wn(ji,jj,jk+1) , 0._wp ) )                       &   
    313                      &                             + ( MAX( e2u(ji  ,jj)*e3u_n(ji  ,jj,jk)*un(ji  ,jj,jk) + un_td(ji  ,jj,jk), 0._wp ) -   & 
    314                      &                                 MIN( e2u(ji-1,jj)*e3u_n(ji-1,jj,jk)*un(ji-1,jj,jk) + un_td(ji-1,jj,jk), 0._wp ) )   & 
     312                  Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )                       &   
     313                     &                             + ( MAX( e2u(ji  ,jj)*e3u(ji  ,jj,jk,Kmm)*uu(ji  ,jj,jk,Kmm) + un_td(ji  ,jj,jk), 0._wp ) -   & 
     314                     &                                 MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) )   & 
    315315                     &                               * r1_e1e2t(ji,jj)                                                                     & 
    316                      &                             + ( MAX( e1v(ji,jj  )*e3v_n(ji,jj  ,jk)*vn(ji,jj  ,jk) + vn_td(ji,jj  ,jk), 0._wp ) -   & 
    317                      &                                 MIN( e1v(ji,jj-1)*e3v_n(ji,jj-1,jk)*vn(ji,jj-1,jk) + vn_td(ji,jj-1,jk), 0._wp ) )   & 
     316                     &                             + ( MAX( e1v(ji,jj  )*e3v(ji,jj  ,jk,Kmm)*vv(ji,jj  ,jk,Kmm) + vn_td(ji,jj  ,jk), 0._wp ) -   & 
     317                     &                                 MIN( e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm) + vn_td(ji,jj-1,jk), 0._wp ) )   & 
    318318                     &                               * r1_e1e2t(ji,jj)                                                                     & 
    319319                     &                             ) * z1_e3t 
     
    325325            DO jj = 2, jpjm1 
    326326               DO ji = 2, fs_jpim1   ! vector opt. 
    327                   z1_e3t = 1._wp / e3t_n(ji,jj,jk) 
     327                  z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    328328                  ! 2*rdt and not r2dt (for restartability) 
    329                   Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( wn(ji,jj,jk) , 0._wp ) - MIN( wn(ji,jj,jk+1) , 0._wp ) )   &  
    330                      &                             + ( MAX( e2u(ji  ,jj)*e3u_n(ji  ,jj,jk)*un(ji  ,jj,jk), 0._wp ) -   & 
    331                      &                                 MIN( e2u(ji-1,jj)*e3u_n(ji-1,jj,jk)*un(ji-1,jj,jk), 0._wp ) )   & 
     329                  Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )   &  
     330                     &                             + ( MAX( e2u(ji  ,jj)*e3u(ji  ,jj,jk,Kmm)*uu(ji  ,jj,jk,Kmm), 0._wp ) -   & 
     331                     &                                 MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) )   & 
    332332                     &                               * r1_e1e2t(ji,jj)                                                 & 
    333                      &                             + ( MAX( e1v(ji,jj  )*e3v_n(ji,jj  ,jk)*vn(ji,jj  ,jk), 0._wp ) -   & 
    334                      &                                 MIN( e1v(ji,jj-1)*e3v_n(ji,jj-1,jk)*vn(ji,jj-1,jk), 0._wp ) )   & 
     333                     &                             + ( MAX( e1v(ji,jj  )*e3v(ji,jj  ,jk,Kmm)*vv(ji,jj  ,jk,Kmm), 0._wp ) -   & 
     334                     &                                 MIN( e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm), 0._wp ) )   & 
    335335                     &                               * r1_e1e2t(ji,jj)                                                 & 
    336336                     &                             ) * z1_e3t 
     
    366366                  zcff = MIN(1._wp, zcff) 
    367367                  ! 
    368                   wi(ji,jj,jk) =           zcff   * wn(ji,jj,jk) 
    369                   wn(ji,jj,jk) = ( 1._wp - zcff ) * wn(ji,jj,jk) 
     368                  wi(ji,jj,jk) =           zcff   * ww(ji,jj,jk) 
     369                  ww(ji,jj,jk) = ( 1._wp - zcff ) * ww(ji,jj,jk) 
    370370                  ! 
    371371                  Cu_adv(ji,jj,jk) = zcff               ! Reuse array to output coefficient below and in stp_ctl 
     
    381381      CALL iom_put("wimp",wi)  
    382382      CALL iom_put("wi_cff",Cu_adv) 
    383       CALL iom_put("wexp",wn) 
     383      CALL iom_put("wexp",ww) 
    384384      ! 
    385385      IF( ln_timing )   CALL timing_stop('wAimp') 
Note: See TracChangeset for help on using the changeset viewer.