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 10978 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/sshwzv.F90 – NEMO

Ignore:
Timestamp:
2019-05-15T09:41:30+02:00 (5 years ago)
Author:
davestorkey
Message:

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : DOM and sshwzv.F90. (sshwzv.F90 will be rewritten somewhat when we rewrite the time-level swapping but I've done it anyway). Passes all non-AGRIF SETTE tests.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/sshwzv.F90

    r10969 r10978  
    5454CONTAINS 
    5555 
    56    SUBROUTINE ssh_nxt( kt, Kbb, Kmm ) 
     56   SUBROUTINE ssh_nxt( kt, Kbb, Kmm, pssh, Kaa ) 
    5757      !!---------------------------------------------------------------------- 
    5858      !!                ***  ROUTINE ssh_nxt  *** 
    5959      !!                    
    60       !! ** Purpose :   compute the after ssh (ssha) 
     60      !! ** Purpose :   compute the after ssh (ssh(Kaa)) 
    6161      !! 
    6262      !! ** Method  : - Using the incompressibility hypothesis, the ssh increment 
     
    6464      !!      by the time step. 
    6565      !! 
    66       !! ** action  :   ssha, after sea surface height 
     66      !! ** action  :   ssh(:,:,Kaa), after sea surface height 
    6767      !! 
    6868      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    6969      !!---------------------------------------------------------------------- 
    70       INTEGER, INTENT(in) ::   kt        ! time step 
    71       INTEGER, INTENT(in) ::   Kbb, Kmm  ! time level index 
     70      INTEGER                         , INTENT(in   ) ::   kt             ! time step 
     71      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! time level index 
     72      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height 
    7273      !  
    7374      INTEGER  ::   jk            ! dummy loop indice 
     
    9293      !                                           !------------------------------! 
    9394      IF(ln_wd_il) THEN 
    94          CALL wad_lmt(sshb, zcoef * (emp_b(:,:) + emp(:,:)), z2dt) 
     95         CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), z2dt) 
    9596      ENDIF 
    9697 
     
    99100      zhdiv(:,:) = 0._wp 
    100101      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports 
    101         zhdiv(:,:) = zhdiv(:,:) + e3t_n(:,:,jk) * hdivn(:,:,jk) 
     102        zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk) 
    102103      END DO 
    103104      !                                                ! Sea surface elevation time stepping 
     
    105106      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    106107      !  
    107       ssha(:,:) = (  sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     108      pssh(:,:,Kaa) = (  pssh(:,:,Kbb) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
    108109      ! 
    109110#if defined key_agrif 
     
    113114      IF ( .NOT.ln_dynspg_ts ) THEN 
    114115         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 
     116            CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1. )    ! Not sure that's necessary 
     117            CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries 
    117118         ENDIF 
    118119      ENDIF 
     
    121122      !                                           !------------------------------! 
    122123      ! 
    123       IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha  - : ', mask1=tmask ) 
     124      IF(ln_ctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kaa), clinfo1=' pssh(:,:,Kaa)  - : ', mask1=tmask ) 
    124125      ! 
    125126      IF( ln_timing )   CALL timing_stop('ssh_nxt') 
     
    128129 
    129130    
    130    SUBROUTINE wzv( kt ) 
     131   SUBROUTINE wzv( kt, Kbb, Kmm, pww, Kaa ) 
    131132      !!---------------------------------------------------------------------- 
    132133      !!                ***  ROUTINE wzv  *** 
     
    139140      !!        The boundary conditions are w=0 at the bottom (no flux) and. 
    140141      !! 
    141       !! ** action  :   wn      : now vertical velocity 
     142      !! ** action  :   pww      : now vertical velocity 
    142143      !! 
    143144      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    144145      !!---------------------------------------------------------------------- 
    145       INTEGER, INTENT(in) ::   kt   ! time step 
     146      INTEGER                         , INTENT(in)    ::   kt             ! time step 
     147      INTEGER                         , INTENT(in)    ::   Kbb, Kmm, Kaa  ! time level indices 
     148      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pww            ! now vertical velocity 
    146149      ! 
    147150      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    157160         IF(lwp) WRITE(numout,*) '~~~~~ ' 
    158161         ! 
    159          wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
     162         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
    160163      ENDIF 
    161164      !                                           !------------------------------! 
     
    179182         CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
    180183         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells? 
    181          !                             ! Same question holds for hdivn. Perhaps just for security 
     184         !                             ! Same question holds for hdiv. Perhaps just for security 
    182185         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    183186            ! 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 
     187            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk) + zhdiv(:,:,jk)    & 
     188               &                         + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) )     ) * tmask(:,:,jk) 
     189         END DO 
     190         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 
    188191         DEALLOCATE( zhdiv )  
    189192      ELSE   ! z_star and linear free surface cases 
    190193         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    191194            ! 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) 
     195            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)                 & 
     196               &                         + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) )  ) * tmask(:,:,jk) 
    194197         END DO 
    195198      ENDIF 
     
    197200      IF( ln_bdy ) THEN 
    198201         DO jk = 1, jpkm1 
    199             wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 
     202            pww(:,:,jk) = pww(:,:,jk) * bdytmask(:,:) 
    200203         END DO 
    201204      ENDIF 
     
    203206#if defined key_agrif  
    204207      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  
     208         IF ((nbondi ==  1).OR.(nbondi == 2)) pww(nlci-1 , :     ,:) = 0.e0      ! east  
     209         IF ((nbondi == -1).OR.(nbondi == 2)) pww(2      , :     ,:) = 0.e0      ! west  
     210         IF ((nbondj ==  1).OR.(nbondj == 2)) pww(:      ,nlcj-1 ,:) = 0.e0      ! north  
     211         IF ((nbondj == -1).OR.(nbondj == 2)) pww(:      ,2      ,:) = 0.e0      ! south  
    209212      ENDIF  
    210213#endif  
     
    215218 
    216219 
    217    SUBROUTINE ssh_swp( kt ) 
     220   SUBROUTINE ssh_swp( kt, Kbb, Kmm, Kaa ) 
    218221      !!---------------------------------------------------------------------- 
    219222      !!                    ***  ROUTINE ssh_nxt  *** 
     
    221224      !! ** Purpose :   achieve the sea surface  height time stepping by  
    222225      !!              applying Asselin time filter and swapping the arrays 
    223       !!              ssha  already computed in ssh_nxt   
     226      !!              ssh(:,:,Kaa)  already computed in ssh_nxt   
    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      !!                ssh(:,:,Kmm) = ssh(:,:,Kaa) + atfp * ( ssh(:,:,Kbb) -2 ssh(:,:,Kmm) + ssh(:,:,Kaa) ) 
    228231      !!                            - atfp * rdt * ( emp_b - emp ) / rau0 
    229       !!                sshn = ssha 
    230       !! 
    231       !! ** action  : - sshb, sshn   : before & now sea surface height 
     232      !!                ssh(:,:,Kmm) = ssh(:,:,Kaa) 
     233      !! 
     234      !! ** action  : - ssh(:,:,Kbb), ssh(:,:,Kmm)   : before & now sea surface height 
    232235      !!                               ready for the next time step 
    233236      !! 
    234237      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    235238      !!---------------------------------------------------------------------- 
    236       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     239      INTEGER, INTENT(in) ::   kt              ! ocean time-step index 
     240      INTEGER, INTENT(in) ::   Kbb, Kmm, Kaa   ! ocean time-step index 
    237241      ! 
    238242      REAL(wp) ::   zcoef   ! local scalar 
     
    248252      !              !==  Euler time-stepping: no filter, just swap  ==! 
    249253      IF ( neuler == 0 .AND. kt == nit000 ) THEN 
    250          sshn(:,:) = ssha(:,:)                              ! now    <-- after  (before already = now) 
     254         ssh(:,:,Kmm) = ssh(:,:,Kaa)                              ! now    <-- after  (before already = now) 
    251255         ! 
    252256      ELSE           !==  Leap-Frog time-stepping: Asselin filter + swap  ==! 
    253257         !                                                  ! before <-- now filtered 
    254          sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) ) 
     258         ssh(:,:,Kbb) = ssh(:,:,Kmm) + atfp * ( ssh(:,:,Kbb) - 2 * ssh(:,:,Kmm) + ssh(:,:,Kaa) ) 
    255259         IF( .NOT.ln_linssh ) THEN                          ! before <-- with forcing removed 
    256260            zcoef = atfp * rdt * r1_rau0 
    257             sshb(:,:) = sshb(:,:) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
     261            ssh(:,:,Kbb) = ssh(:,:,Kbb) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
    258262               &                             -    rnf_b(:,:) + rnf   (:,:)   & 
    259263               &                             + fwfisf_b(:,:) - fwfisf(:,:)   ) * ssmask(:,:) 
    260264         ENDIF 
    261          sshn(:,:) = ssha(:,:)                              ! now <-- after 
    262       ENDIF 
    263       ! 
    264       IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask ) 
     265         ssh(:,:,Kmm) = ssh(:,:,Kaa)                              ! now <-- after 
     266      ENDIF 
     267      ! 
     268      IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssh(:,:,Kbb), clinfo1=' ssh(:,:,Kbb)  - : ', mask1=tmask ) 
    265269      ! 
    266270      IF( ln_timing )   CALL timing_stop('ssh_swp') 
     
    268272   END SUBROUTINE ssh_swp 
    269273 
    270    SUBROUTINE wAimp( kt ) 
     274   SUBROUTINE wAimp( kt, Kmm ) 
    271275      !!---------------------------------------------------------------------- 
    272276      !!                ***  ROUTINE wAimp  *** 
     
    277281      !! ** Method  : -  
    278282      !! 
    279       !! ** action  :   wn      : now vertical velocity (to be handled explicitly) 
     283      !! ** action  :   ww      : now vertical velocity (to be handled explicitly) 
    280284      !!            :   wi      : now vertical velocity (for implicit treatment) 
    281285      !! 
     
    283287      !!---------------------------------------------------------------------- 
    284288      INTEGER, INTENT(in) ::   kt   ! time step 
     289      INTEGER, INTENT(in) ::   Kmm  ! time level index 
    285290      ! 
    286291      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    305310         DO jj = 2, jpjm1 
    306311            DO ji = 2, fs_jpim1   ! vector opt. 
    307                z1_e3w = 1._wp / e3w_n(ji,jj,jk) 
    308                Cu_adv(ji,jj,jk) = r2dt * ( ( MAX( wn(ji,jj,jk) , 0._wp ) - MIN( wn(ji,jj,jk+1) , 0._wp ) )    & 
    309                   &                      + ( MAX( e2u(ji  ,jj)*e3uw_n(ji  ,jj,jk)*un(ji  ,jj,jk), 0._wp ) -   & 
    310                   &                          MIN( e2u(ji-1,jj)*e3uw_n(ji-1,jj,jk)*un(ji-1,jj,jk), 0._wp ) )   & 
     312               z1_e3w = 1._wp / e3w(ji,jj,jk,Kmm) 
     313               Cu_adv(ji,jj,jk) = r2dt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )    & 
     314                  &                      + ( MAX( e2u(ji  ,jj)*e3uw(ji  ,jj,jk,Kmm)*uu(ji  ,jj,jk,Kmm), 0._wp ) -   & 
     315                  &                          MIN( e2u(ji-1,jj)*e3uw(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) )   & 
    311316                  &                        * r1_e1e2t(ji,jj)                                                  & 
    312                   &                      + ( MAX( e1v(ji,jj  )*e3vw_n(ji,jj  ,jk)*vn(ji,jj  ,jk), 0._wp ) -   & 
    313                   &                          MIN( e1v(ji,jj-1)*e3vw_n(ji,jj-1,jk)*vn(ji,jj-1,jk), 0._wp ) )   & 
     317                  &                      + ( MAX( e1v(ji,jj  )*e3vw(ji,jj  ,jk,Kmm)*vv(ji,jj  ,jk,Kmm), 0._wp ) -   & 
     318                  &                          MIN( e1v(ji,jj-1)*e3vw(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm), 0._wp ) )   & 
    314319                  &                        * r1_e1e2t(ji,jj)                                                  & 
    315320                  &                      ) * z1_e3w 
     
    338343                  zcff = MIN(1._wp, zcff) 
    339344                  ! 
    340                   wi(ji,jj,jk) =           zcff   * wn(ji,jj,jk) 
    341                   wn(ji,jj,jk) = ( 1._wp - zcff ) * wn(ji,jj,jk) 
     345                  wi(ji,jj,jk) =           zcff   * ww(ji,jj,jk) 
     346                  ww(ji,jj,jk) = ( 1._wp - zcff ) * ww(ji,jj,jk) 
    342347                  ! 
    343348                  Cu_adv(ji,jj,jk) = zcff               ! Reuse array to output coefficient 
     
    351356      CALL iom_put("wimp",wi)  
    352357      CALL iom_put("wi_cff",Cu_adv) 
    353       CALL iom_put("wexp",wn) 
     358      CALL iom_put("wexp",ww) 
    354359      ! 
    355360      IF( ln_timing )   CALL timing_stop('wAimp') 
Note: See TracChangeset for help on using the changeset viewer.