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 592 for trunk/NEMO/OPA_SRC/DYN – NEMO

Changeset 592 for trunk/NEMO/OPA_SRC/DYN


Ignore:
Timestamp:
2007-02-09T10:15:25+01:00 (17 years ago)
Author:
opalod
Message:

nemo_v2_update_001 : CT : - add non linear free surface (variable volume) with new cpp key key_vvl

Location:
trunk/NEMO/OPA_SRC/DYN
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DYN/dynhpg.F90

    r541 r592  
    160160         WRITE(numout,*) '          s-coord. (ROTated axes scheme)                 ln_hpg_rot = ', ln_hpg_rot 
    161161         WRITE(numout,*) '          weighting coeff. (wdj scheme)                     gamm       = ', gamm 
     162      ENDIF 
     163 
     164      IF( lk_vvl .AND. .NOT. ln_hpg_sco )   THEN 
     165         CALL ctl_stop( 'hpg_ctl : variable volume key_vvl compatible only with the standard jacobian formulation hpg_sco') 
    162166      ENDIF 
    163167 
     
    384388      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    385389      !! 
    386       INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    387       REAL(wp) ::   zcoef0, zuap, zvap   ! temporary scalars 
     390      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
     391      REAL(wp) ::   zcoef0, zuap, zvap, znad   ! temporary scalars 
    388392      !!---------------------------------------------------------------------- 
    389393 
     
    396400      ! Local constant initialization 
    397401      zcoef0 = - grav * 0.5 
     402      ! To use density and not density anomaly 
     403      IF ( lk_vvl ) THEN   ;     znad = 1.            ! Variable volume 
     404      ELSE                 ;     znad = 0.e0          ! Fixed volume 
     405      ENDIF 
    398406 
    399407      ! Surface value 
     
    401409         DO ji = fs_2, fs_jpim1   ! vector opt.    
    402410            ! hydrostatic pressure gradient along s-surfaces 
    403             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3w(ji+1,jj  ,1) * rhd(ji+1,jj  ,1)   & 
    404                &                                  - fse3w(ji  ,jj  ,1) * rhd(ji  ,jj  ,1) ) 
    405             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3w(ji  ,jj+1,1) * rhd(ji  ,jj+1,1)   & 
    406                &                                  - fse3w(ji  ,jj  ,1) * rhd(ji  ,jj  ,1) ) 
     411            zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3w(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )   & 
     412               &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
     413            zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3w(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )   & 
     414               &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
    407415            ! s-coordinate pressure gradient correction 
    408             zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) )   & 
     416            zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) + 2*znad )   & 
    409417               &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) 
    410             zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) )   & 
     418            zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) + 2*znad )   & 
    411419               &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
    412420            ! add to the general momentum trend 
     
    422430               ! hydrostatic pressure gradient along s-surfaces 
    423431               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   &  
    424                   &           * (  fse3w(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   &  
    425                   &              - fse3w(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) 
     432                  &           * (  fse3w(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   &  
     433                  &              - fse3w(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    426434               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    427                   &           * (  fse3w(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    428                   &              - fse3w(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) 
     435                  &           * (  fse3w(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
     436                  &              - fse3w(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    429437               ! s-coordinate pressure gradient correction 
    430                zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) )   & 
     438               zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2*znad )   & 
    431439                  &           * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) / e1u(ji,jj) 
    432                zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) )   & 
     440               zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2*znad )   & 
    433441                  &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) 
    434442               ! add to the general momentum trend 
  • trunk/NEMO/OPA_SRC/DYN/dynnxt.F90

    r392 r592  
    2121   USE agrif_opa_update 
    2222   USE agrif_opa_interp 
     23   USE domvvl          ! variable volume 
    2324 
    2425   IMPLICIT NONE 
     
    2728   !! * Accessibility 
    2829   PUBLIC dyn_nxt                ! routine called by step.F90 
     30   !! * Substitutions 
     31#  include "domzgr_substitute.h90" 
    2932   !!---------------------------------------------------------------------- 
    3033 
     
    7073      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    7174      REAL(wp) ::   z2dt         ! temporary scalar 
     75      !! Variable volume 
     76      REAL(wp) ::   zsshun, zsshvn           ! temporary scalars 
     77      REAL(wp), DIMENSION(jpi,jpj)     ::  & 
     78         zsshub, zsshua, zsshvb, zsshva      ! 2D workspace 
     79      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  & 
     80         zfse3ub, zfse3un, zfse3ua, &        ! 3D workspace 
     81         zfse3vb, zfse3vn, zfse3va 
    7282      !!---------------------------------------------------------------------- 
    7383      !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     
    8595      z2dt = 2. * rdt 
    8696      IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt 
     97 
     98      !! Explicit physics with thickness weighted updates 
     99      IF( lk_vvl .AND. .NOT. lk_dynspg_flt ) THEN 
     100 
     101         ! Sea surface elevation time stepping 
     102         ! ----------------------------------- 
     103         ! 
     104         DO jj = 1, jpjm1 
     105            DO ji = 1,jpim1 
     106 
     107               ! Sea Surface Height at u-point before 
     108               zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )     & 
     109                  &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * sshbb(ji  ,jj  )   & 
     110                  &            + e1t(ji+1,jj  ) * e2t(ji+1,jj  ) * sshbb(ji+1,jj  ) ) 
     111 
     112               ! Sea Surface Height at v-point before 
     113               zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )     & 
     114                  &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * sshbb(ji  ,jj  )   & 
     115                  &            + e1t(ji  ,jj+1) * e2t(ji  ,jj+1) * sshbb(ji  ,jj+1) ) 
     116 
     117               ! Sea Surface Height at u-point after 
     118               zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )     & 
     119                  &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * ssha(ji  ,jj  )    & 
     120                  &            + e1t(ji+1,jj  ) * e2t(ji+1,jj  ) * ssha(ji+1,jj  ) ) 
     121 
     122               ! Sea Surface Height at v-point after 
     123               zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )     & 
     124                  &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * ssha(ji  ,jj  )    & 
     125                  &            + e1t(ji  ,jj+1) * e2t(ji  ,jj+1) * ssha(ji  ,jj+1) ) 
     126 
     127            END DO 
     128         END DO 
     129 
     130         ! Boundaries conditions 
     131         CALL lbc_lnk( zsshua, 'U', 1. )   ;    CALL lbc_lnk( zsshva, 'V', 1. ) 
     132         CALL lbc_lnk( zsshub, 'U', 1. )   ;    CALL lbc_lnk( zsshvb, 'V', 1. ) 
     133 
     134         ! Scale factors at before and after time step 
     135         ! ------------------------------------------- 
     136         DO jk = 1, jpkm1 
     137            zfse3ub(:,:,jk)  = fsve3u(:,:,jk) * ( 1 + zsshub(:,:) * muu(:,:,jk) ) 
     138            zfse3ua(:,:,jk)  = fsve3u(:,:,jk) * ( 1 + zsshua(:,:) * muu(:,:,jk) ) 
     139            zfse3vb(:,:,jk)  = fsve3v(:,:,jk) * ( 1 + zsshvb(:,:) * muv(:,:,jk) ) 
     140            zfse3va(:,:,jk)  = fsve3v(:,:,jk) * ( 1 + zsshva(:,:) * muv(:,:,jk) ) 
     141         END DO 
     142 
     143         ! Asselin filtered scale factor at now time step 
     144         ! ---------------------------------------------- 
     145         IF( (neuler == 0 .AND. kt == nit000) .OR. lk_dynspg_ts ) THEN 
     146            zfse3un(:,:,:) = fse3u(:,:,:) 
     147            zfse3vn(:,:,:) = fse3v(:,:,:) 
     148         ELSE 
     149            DO jk = 1, jpkm1 
     150               DO jj = 1, jpj 
     151                  DO ji = 1, jpi 
     152                     zsshun = atfp * ( zsshub(ji,jj) + zsshua(ji,jj) ) + atfp1 * sshu(ji,jj) 
     153                     zsshvn = atfp * ( zsshvb(ji,jj) + zsshva(ji,jj) ) + atfp1 * sshv(ji,jj) 
     154                     zfse3un(ji,jj,jk) = fsve3u(ji,jj,jk) * ( 1 + zsshun * muu(ji,jj,jk) ) 
     155                     zfse3vn(ji,jj,jk) = fsve3v(ji,jj,jk) * ( 1 + zsshvn * muv(ji,jj,jk) ) 
     156                  END DO 
     157               END DO 
     158            END DO 
     159         ENDIF 
     160 
     161         ! Thickness weighting 
     162         ! ------------------- 
     163         ua(:,:,1:jpkm1) = ua(:,:,1:jpkm1) * fse3u (:,:,1:jpkm1) 
     164         va(:,:,1:jpkm1) = va(:,:,1:jpkm1) * fse3v (:,:,1:jpkm1) 
     165 
     166         un(:,:,1:jpkm1) = un(:,:,1:jpkm1) * fse3u (:,:,1:jpkm1) 
     167         vn(:,:,1:jpkm1) = vn(:,:,1:jpkm1) * fse3v (:,:,1:jpkm1) 
     168 
     169         ub(:,:,1:jpkm1) = ub(:,:,1:jpkm1) * zfse3ub(:,:,1:jpkm1) 
     170         vb(:,:,1:jpkm1) = vb(:,:,1:jpkm1) * zfse3vb(:,:,1:jpkm1) 
     171 
     172      ENDIF 
    87173 
    88174      ! Lateral boundary conditions on ( ua, va ) 
     
    146232# endif 
    147233#endif 
     234 
    148235         ! Time filter and swap of dynamics arrays 
    149236         ! ------------------------------------------ 
    150237         IF( neuler == 0 .AND. kt == nit000 ) THEN 
    151             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop 
    152                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    153                   ! Euler (forward) time stepping 
    154                   ub(ji,jj,jk) = un(ji,jj,jk) 
    155                   vb(ji,jj,jk) = vn(ji,jj,jk) 
    156                   un(ji,jj,jk) = ua(ji,jj,jk) 
    157                   vn(ji,jj,jk) = va(ji,jj,jk) 
    158                END DO 
    159             END DO 
     238            IF( (lk_vvl .AND. .NOT. lk_dynspg_flt) ) THEN      ! Varying levels 
     239               ! caution: don't use (:,:) for this loop 
     240               ! it causes optimization problems on NEC in auto-tasking 
     241               DO jj = 1, jpj 
     242                  DO ji = 1, jpi 
     243                     zsshun = umask(ji,jj,jk) / fse3u(ji,jj,jk) 
     244                     zsshvn = vmask(ji,jj,jk) / fse3v(ji,jj,jk) 
     245                     ub(ji,jj,jk) = un(ji,jj,jk) * zsshun * umask(ji,jj,jk) 
     246                     vb(ji,jj,jk) = vn(ji,jj,jk) * zsshvn * vmask(ji,jj,jk) 
     247                     zsshun = umask(ji,jj,jk) / zfse3ua(ji,jj,jk) 
     248                     zsshvn = vmask(ji,jj,jk) / zfse3va(ji,jj,jk) 
     249                     un(ji,jj,jk) = ua(ji,jj,jk) * zsshun * umask(ji,jj,jk) 
     250                     vn(ji,jj,jk) = va(ji,jj,jk) * zsshvn * vmask(ji,jj,jk) 
     251                  END DO 
     252               END DO 
     253            ELSE                                               ! Fixed levels 
     254               DO jj = 1, jpj 
     255                  DO ji = 1, jpi 
     256                     ! Euler (forward) time stepping 
     257                     ub(ji,jj,jk) = un(ji,jj,jk) 
     258                     vb(ji,jj,jk) = vn(ji,jj,jk) 
     259                     un(ji,jj,jk) = ua(ji,jj,jk) 
     260                     vn(ji,jj,jk) = va(ji,jj,jk) 
     261                  END DO 
     262               END DO 
     263            ENDIF 
    160264         ELSE 
    161             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop 
    162                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    163                   ! Leap-frog time stepping 
    164                   ub(ji,jj,jk) = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
    165                   vb(ji,jj,jk) = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
    166                   un(ji,jj,jk) = ua(ji,jj,jk) 
    167                   vn(ji,jj,jk) = va(ji,jj,jk) 
    168                END DO 
    169             END DO 
     265            IF( (lk_vvl .AND. .NOT. lk_dynspg_flt) ) THEN      ! Varying levels 
     266               ! caution: don't use (:,:) for this loop 
     267               ! it causes optimization problems on NEC in auto-tasking 
     268               DO jj = 1, jpj 
     269                  DO ji = 1, jpi 
     270                     zsshun = umask(ji,jj,jk) / zfse3un(ji,jj,jk) 
     271                     zsshvn = vmask(ji,jj,jk) / zfse3vn(ji,jj,jk) 
     272                     ub(ji,jj,jk) = ( atfp  * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) & 
     273                       &            + atfp1 * un(ji,jj,jk) ) * zsshun 
     274                     vb(ji,jj,jk) = ( atfp  * ( vb(ji,jj,jk) + va(ji,jj,jk) ) & 
     275                       &            + atfp1 * vn(ji,jj,jk) ) * zsshvn 
     276                     zsshun = umask(ji,jj,jk) / zfse3ua(ji,jj,jk) 
     277                     zsshvn = vmask(ji,jj,jk) / zfse3va(ji,jj,jk) 
     278                     un(ji,jj,jk) = ua(ji,jj,jk) * zsshun 
     279                     vn(ji,jj,jk) = va(ji,jj,jk) * zsshvn 
     280                  END DO 
     281               END DO 
     282            ELSE                                               ! Fixed levels 
     283               DO jj = 1, jpj 
     284                  DO ji = 1, jpi 
     285                     ! Leap-frog time stepping 
     286                     ub(ji,jj,jk) = atfp  * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
     287                     vb(ji,jj,jk) = atfp  * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
     288                     un(ji,jj,jk) = ua(ji,jj,jk) 
     289                     vn(ji,jj,jk) = va(ji,jj,jk) 
     290                  END DO 
     291               END DO 
     292            ENDIF 
    170293         ENDIF 
    171294         !                                             ! =============== 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_exp.F90

    r575 r592  
    110110      ENDIF 
    111111 
    112       ! 0. Initialization 
    113       ! ----------------- 
    114       ! read or estimate sea surface height and vertically integrated velocities 
    115       IF( lk_obc )   CALL obc_dta_bt( kt, 0 ) 
    116       z2dt = 2. * rdt                                       ! time step: leap-frog 
    117       IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest 
    118       zraur = 1.e0 / rauw 
    119  
    120  
    121       ! 1. Surface pressure gradient (now) 
    122       ! ---------------------------- 
    123       DO jj = 2, jpjm1 
    124          DO ji = fs_2, fs_jpim1   ! vector opt. 
    125             spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj) 
    126             spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 
    127          END DO 
    128       END DO 
    129  
    130       ! 2. Add the surface pressure trend to the general trend 
    131       ! ------------------------------------------------------ 
    132       DO jk = 1, jpkm1 
     112      IF( .NOT. lk_vvl ) THEN 
     113 
     114         ! 0. Initialization 
     115         ! ----------------- 
     116         ! read or estimate sea surface height and vertically integrated velocities 
     117         IF( lk_obc )   CALL obc_dta_bt( kt, 0 ) 
     118         z2dt = 2. * rdt                                       ! time step: leap-frog 
     119         IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest 
     120         zraur = 1.e0 / rauw 
     121 
     122         ! 1. Surface pressure gradient (now) 
     123         ! ---------------------------- 
    133124         DO jj = 2, jpjm1 
    134125            DO ji = fs_2, fs_jpim1   ! vector opt. 
    135                ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    136                va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
     126               spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj) 
     127               spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 
    137128            END DO 
    138129         END DO 
    139       END DO 
     130 
     131         ! 2. Add the surface pressure trend to the general trend 
     132         ! ------------------------------------------------------ 
     133         DO jk = 1, jpkm1 
     134            DO jj = 2, jpjm1 
     135               DO ji = fs_2, fs_jpim1   ! vector opt. 
     136                  ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
     137                  va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
     138               END DO 
     139            END DO 
     140         END DO 
    140141      
    141       ! 3. Vertical integration of horizontal divergence of velocities 
    142       ! -------------------------------- 
    143       zhdiv(:,:) = 0.e0 
    144       DO jk = jpkm1, 1, -1 
    145          DO jj = 2, jpjm1 
    146             DO ji = fs_2, fs_jpim1   ! vector opt. 
    147                zhdiv(ji,jj) = zhdiv(ji,jj) + (  e2u(ji  ,jj  ) * fse3u(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)      & 
    148                   &                           - e2u(ji-1,jj  ) * fse3u(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)      & 
    149                   &                           + e1v(ji  ,jj  ) * fse3v(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)      & 
    150                   &                           - e1v(ji  ,jj-1) * fse3v(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)  )   & 
    151                   &                        / ( e1t(ji,jj) * e2t(ji,jj) ) 
     142         ! 3. Vertical integration of horizontal divergence of velocities 
     143         ! -------------------------------- 
     144         zhdiv(:,:) = 0.e0 
     145         DO jk = jpkm1, 1, -1 
     146            DO jj = 2, jpjm1 
     147               DO ji = fs_2, fs_jpim1   ! vector opt. 
     148                  zhdiv(ji,jj) = zhdiv(ji,jj) + (  e2u(ji  ,jj  ) * fse3u(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)      & 
     149                     &                           - e2u(ji-1,jj  ) * fse3u(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)      & 
     150                     &                           + e1v(ji  ,jj  ) * fse3v(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)      & 
     151                     &                           - e1v(ji  ,jj-1) * fse3v(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)  )   & 
     152                     &                        / ( e1t(ji,jj) * e2t(ji,jj) ) 
     153               END DO 
    152154            END DO 
    153155         END DO 
    154       END DO 
    155156 
    156157#if defined key_obc 
    157       ! open boundaries (div must be zero behind the open boundary) 
    158       !  mpp remark: The zeroing of zhdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    159       IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east 
    160       IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west 
    161       IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north 
    162       IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south 
     158         ! open boundaries (div must be zero behind the open boundary) 
     159         !  mpp remark: The zeroing of zhdiv can probably be extended to 1->jpi/jpj for the correct row/column 
     160         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east 
     161         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west 
     162         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north 
     163         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south 
    163164#endif 
    164165 
    165  
    166       ! 4. Sea surface elevation time stepping 
    167       ! -------------------------------------- 
    168       ! Euler (forward) time stepping, no time filter 
    169       IF( neuler == 0 .AND. kt == nit000 ) THEN 
    170          DO jj = 1, jpj 
    171             DO ji = 1, jpi 
    172                ! after free surface elevation 
    173                zssha = sshb(ji,jj) - rdt * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) * tmask(ji,jj,1) 
    174                ! swap of arrays 
    175                sshb(ji,jj) = sshn(ji,jj) 
    176                sshn(ji,jj) = zssha 
    177             END DO 
    178          END DO 
    179       ELSE 
    180          ! Leap-frog time stepping and time filter 
    181          DO jj = 1, jpj 
    182             DO ji = 1, jpi 
    183                ! after free surface elevation 
    184                zssha = sshb(ji,jj) - z2dt * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) * tmask(ji,jj,1) 
    185                ! time filter and array swap 
    186                sshb(ji,jj) = atfp * ( sshb(ji,jj) + zssha ) + atfp1 * sshn(ji,jj) 
    187                sshn(ji,jj) = zssha 
    188             END DO 
    189          END DO 
     166         ! 4. Sea surface elevation time stepping 
     167         ! -------------------------------------- 
     168         ! Euler (forward) time stepping, no time filter 
     169         IF( neuler == 0 .AND. kt == nit000 ) THEN 
     170            DO jj = 1, jpj 
     171               DO ji = 1, jpi 
     172                  ! after free surface elevation 
     173                  zssha = sshb(ji,jj) - rdt * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) * tmask(ji,jj,1) 
     174                  ! swap of arrays 
     175                  sshb(ji,jj) = sshn(ji,jj) 
     176                  sshn(ji,jj) = zssha 
     177               END DO 
     178            END DO 
     179         ELSE 
     180            ! Leap-frog time stepping and time filter 
     181            DO jj = 1, jpj 
     182               DO ji = 1, jpi 
     183                  ! after free surface elevation 
     184                  zssha = sshb(ji,jj) - z2dt * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) * tmask(ji,jj,1) 
     185                  ! time filter and array swap 
     186                  sshb(ji,jj) = atfp * ( sshb(ji,jj) + zssha ) + atfp1 * sshn(ji,jj) 
     187                  sshn(ji,jj) = zssha 
     188               END DO 
     189            END DO 
     190         ENDIF 
     191 
     192      ELSE !! Variable volume, ssh time-stepping already done 
     193 
     194         ! read or estimate sea surface height and vertically integrated velocities 
     195         IF( lk_obc )   CALL obc_dta_bt( kt, 0 ) 
     196 
     197         ! Sea surface elevation swap 
     198         ! ----------------------------- 
     199         ! 
     200         sshbb(:,:) = sshb(:,:) ! Needed for the dynamics time-stepping 
     201         ! 
     202         IF( neuler == 0 .AND. kt == nit000 ) THEN 
     203            ! No time filter 
     204            sshb(:,:) = sshn(:,:) 
     205            sshn(:,:) = ssha(:,:) 
     206         ELSE 
     207            ! Time filter 
     208            sshb(:,:) = atfp * ( sshb(:,:) + ssha(:,:) ) + atfp1 * sshn(:,:) 
     209            sshn(:,:) = ssha(:,:) 
     210         ENDIF 
     211 
    190212      ENDIF 
    191213 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_flt.F90

    r575 r592  
    4646   USE iom 
    4747   USE restart         ! only for lrst_oce 
     48   USE domvvl          ! variable volume 
    4849 
    4950   IMPLICIT NONE 
     
    109110      !! References : Roullet and Madec 1999, JGR. 
    110111      !!--------------------------------------------------------------------- 
     112      !! * Modules used 
     113      USE oce    , ONLY :   zub   => ta,             &  ! ta used as workspace 
     114                            zvb   => sa                 ! sa   "          " 
     115 
    111116      INTEGER, INTENT( in )  ::   kt         ! ocean time-step index 
    112117      INTEGER, INTENT( out ) ::   kindic     ! solver convergence flag (<0 if not converge) 
     
    114119      INTEGER  ::   ji, jj, jk                          ! dummy loop indices 
    115120      REAL(wp) ::   z2dt, z2dtg, zraur, znugdt,      &  ! temporary scalars 
    116          &          znurau, zssha, zgcb, zbtd,       &  !   "          " 
     121         &          znurau, zgcb, zbtd,              &  !   "          " 
    117122         &          ztdgu, ztdgv                        !   "          " 
     123      !! Variable volume 
     124      REAL(wp), DIMENSION(jpi,jpj)     ::  & 
     125         zsshub, zsshua, zsshvb, zsshva, zssha          ! 2D workspace 
     126      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  &            ! 3D workspace 
     127         zfse3ub, zfse3ua, zfse3vb, zfse3va             ! 3D workspace 
    118128      !!---------------------------------------------------------------------- 
    119129      ! 
     
    142152      znurau =  znugdt * zraur 
    143153 
    144       ! Surface pressure gradient (now) 
    145       DO jj = 2, jpjm1 
    146          DO ji = fs_2, fs_jpim1   ! vector opt. 
    147             spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj) 
    148             spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 
    149          END DO  
    150       END DO  
    151  
    152       ! Add the surface pressure trend to the general trend 
    153       DO jk = 1, jpkm1 
     154      !! Explicit physics with thickness weighted updates 
     155      IF( lk_vvl ) THEN          ! variable volume  
     156 
     157         DO jj = 1, jpjm1 
     158            DO ji = 1,jpim1 
     159 
     160               ! Sea Surface Height at u-point before 
     161               zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  &  
     162                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)       & 
     163                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) ) 
     164 
     165               ! Sea Surface Height at v-point before 
     166               zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  & 
     167                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )       & 
     168                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
     169 
     170               ! Sea Surface Height at u-point after 
     171               zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  & 
     172                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)       & 
     173                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) ) 
     174 
     175               ! Sea Surface Height at v-point after 
     176               zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  & 
     177                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )       & 
     178                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     179 
     180            END DO 
     181         END DO 
     182 
     183         ! Boundaries conditions 
     184         CALL lbc_lnk( zsshub, 'U', 1. )    ;    CALL lbc_lnk( zsshvb, 'V', 1. ) 
     185         CALL lbc_lnk( zsshua, 'U', 1. )    ;    CALL lbc_lnk( zsshva, 'V', 1. ) 
     186 
     187         ! Scale factors at before and after time step 
     188         ! ------------------------------------------- 
     189         DO jk = 1, jpkm1 
     190            zfse3ua(:,:,jk)  = fsve3u(:,:,jk) * ( 1 + zsshua(:,:) * muu(:,:,jk) ) 
     191            zfse3va(:,:,jk)  = fsve3v(:,:,jk) * ( 1 + zsshva(:,:) * muv(:,:,jk) ) 
     192            zfse3ub(:,:,jk)  = fsve3u(:,:,jk) * ( 1 + zsshub(:,:) * muu(:,:,jk) ) 
     193            zfse3vb(:,:,jk)  = fsve3v(:,:,jk) * ( 1 + zsshvb(:,:) * muv(:,:,jk) ) 
     194         END DO 
     195 
     196         ! Thickness weighting 
     197         ! ------------------- 
     198         ua(:,:,1:jpkm1) = ua(:,:,1:jpkm1) * fse3u(:,:,1:jpkm1) 
     199         va(:,:,1:jpkm1) = va(:,:,1:jpkm1) * fse3v(:,:,1:jpkm1) 
     200 
     201         zub(:,:,1:jpkm1) = ub(:,:,1:jpkm1) * zfse3ub(:,:,1:jpkm1) 
     202         zvb(:,:,1:jpkm1) = vb(:,:,1:jpkm1) * zfse3vb(:,:,1:jpkm1) 
     203 
     204         ! Evaluate the masked next velocity (effect of the additional force not included) 
     205         DO jk = 1, jpkm1 
     206            DO jj = 2, jpjm1 
     207               DO ji = fs_2, fs_jpim1   ! vector opt. 
     208                  ua(ji,jj,jk) = ( zub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) /zfse3ua(ji,jj,jk) * umask(ji,jj,jk) 
     209                  va(ji,jj,jk) = ( zvb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) /zfse3va(ji,jj,jk) * vmask(ji,jj,jk) 
     210               END DO 
     211            END DO 
     212         END DO 
     213 
     214      ELSE                       ! fixed volume  
     215 
     216         ! Surface pressure gradient (now) 
    154217         DO jj = 2, jpjm1 
    155218            DO ji = fs_2, fs_jpim1   ! vector opt. 
    156                ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    157                va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
    158             END DO 
    159          END DO 
    160       END DO 
    161  
    162       ! Evaluate the masked next velocity (effect of the additional force not included) 
    163       DO jk = 1, jpkm1 
    164          DO jj = 2, jpjm1 
    165             DO ji = fs_2, fs_jpim1   ! vector opt. 
    166                ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk) 
    167                va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk) 
    168             END DO 
    169          END DO 
    170       END DO 
     219               spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj) 
     220               spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 
     221            END DO  
     222         END DO  
     223 
     224         ! Add the surface pressure trend to the general trend 
     225         DO jk = 1, jpkm1 
     226            DO jj = 2, jpjm1 
     227               DO ji = fs_2, fs_jpim1   ! vector opt. 
     228                  ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
     229                  va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
     230               END DO 
     231            END DO 
     232         END DO 
     233 
     234         ! Evaluate the masked next velocity (effect of the additional force not included) 
     235         DO jk = 1, jpkm1 
     236            DO jj = 2, jpjm1 
     237               DO ji = fs_2, fs_jpim1   ! vector opt. 
     238                  ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk) 
     239                  va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk) 
     240               END DO 
     241            END DO 
     242         END DO 
     243 
     244      ENDIF 
    171245 
    172246#if defined key_obc 
     
    221295      CALL lbc_lnk( spgu, 'U', -1. ) 
    222296      CALL lbc_lnk( spgv, 'V', -1. ) 
     297 
     298      IF( lk_vvl ) CALL sol_mat( kt ) 
    223299 
    224300      ! Right hand side of the elliptic equation and first guess 
     
    334410      ! Sea surface elevation time stepping 
    335411      ! ----------------------------------- 
     412      IF( lk_vvl ) THEN   ! after free surface elevation 
     413         zssha(:,:) = ssha(:,:) 
     414      ELSE 
     415         zssha(:,:) = sshb(:,:) + z2dt * ( wn(:,:,1) - emp(:,:) * zraur ) * tmask(:,:,1) 
     416      ENDIF 
     417 
    336418      IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler (forward) time stepping, no time filter 
    337          DO jj = 1, jpj 
    338             DO ji = 1, jpi 
    339                ! after free surface elevation 
    340                zssha = sshb(ji,jj) + rdt * ( wn(ji,jj,1) - emp(ji,jj) * zraur ) * tmask(ji,jj,1) 
    341                ! swap of arrays 
    342                sshb(ji,jj) = sshn(ji,jj) 
    343                sshn(ji,jj) = zssha 
    344             END DO 
    345          END DO 
     419         ! swap of arrays 
     420         sshb(:,:) = sshn (:,:) 
     421         sshn(:,:) = zssha(:,:) 
    346422      ELSE                                           ! Leap-frog time stepping and time filter 
    347          DO jj = 1, jpj 
    348             DO ji = 1, jpi 
    349                ! after free surface elevation 
    350                zssha = sshb(ji,jj) + z2dt * ( wn(ji,jj,1) - emp(ji,jj) * zraur ) * tmask(ji,jj,1) 
    351                ! time filter and array swap 
    352                sshb(ji,jj) = atfp * ( sshb(ji,jj) + zssha ) + atfp1 * sshn(ji,jj) 
    353                sshn(ji,jj) = zssha 
    354             END DO 
    355          END DO 
     423         ! time filter and array swap 
     424         sshb(:,:) = atfp * ( sshb(:,:) + zssha(:,:) ) + atfp1 * sshn(:,:) 
     425         sshn(:,:) = zssha(:,:) 
    356426      ENDIF 
    357427 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_oce.F90

    r367 r592  
    3939#endif 
    4040 
    41 #if   defined key_dynspg_ts   ||  defined key_esopa 
     41#if   defined key_dynspg_ts   ||  defined key_vvl   ||  defined key_esopa 
    4242   !! Time splitting variables 
    4343   !! ------------------------ 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r575 r592  
    3434   USE iom 
    3535   USE restart         ! only for lrst_oce 
     36   USE domvvl          ! variable volume 
    3637 
    3738   IMPLICIT NONE 
     
    102103         zsshb_e, zub_e, zvb_e,             &  !     "        " 
    103104         zun_e, zvn_e                          !     "        " 
     105      !! Variable volume 
     106      REAL(wp), DIMENSION(jpi,jpj)     ::   & 
     107         zspgu_1, zspgv_1, zsshun_e, zsshvn_e, hu_e, hv_e         ! 2D workspace 
     108      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zfse3un_e, zfse3vn_e  ! 3D workspace 
    104109      !!---------------------------------------------------------------------- 
    105110 
     
    137142         ENDIF 
    138143         ! 
     144      ENDIF 
     145 
     146      ! Substract the surface pressure gradient from the momentum 
     147      ! --------------------------------------------------------- 
     148      IF( lk_vvl ) THEN    ! Variable volume 
     149 
     150         ! 0. Local initialization 
     151         ! ----------------------- 
     152         zspgu_1(:,:) = 0.e0 
     153         zspgv_1(:,:) = 0.e0 
     154 
     155         ! 1. Surface pressure gradient (now) 
     156         ! ---------------------------- 
     157         DO jj = 2, jpjm1 
     158            DO ji = fs_2, fs_jpim1   ! vector opt. 
     159               zspgu_1(ji,jj) = -grav * ( ( rhd(ji+1,jj  ,1) + 1 ) * sshn(ji+1,jj  ) & 
     160                  &                     - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  ) ) / e1u(ji,jj) 
     161               zspgv_1(ji,jj) = -grav * ( ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1) & 
     162                  &                     - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  ) ) / e2v(ji,jj) 
     163            END DO  
     164         END DO 
     165 
     166         ! 2. Substract the surface pressure trend from the general trend 
     167         ! ------------------------------------------------------ 
     168         DO jk = 1, jpkm1 
     169            DO jj = 2, jpjm1 
     170               DO ji = fs_2, fs_jpim1   ! vector opt. 
     171                  ua(ji,jj,jk) = ua(ji,jj,jk) - zspgu_1(ji,jj) 
     172                  va(ji,jj,jk) = va(ji,jj,jk) - zspgv_1(ji,jj) 
     173               END DO 
     174            END DO 
     175         END DO 
     176 
    139177      ENDIF 
    140178 
     
    269307      zua_b  (:,:) = un_b  (:,:)    
    270308      zva_b  (:,:) = vn_b  (:,:) 
     309      IF( lk_vvl ) THEN 
     310         zsshun_e(:,:)    = sshu (:,:)     ! (barotropic) sea surface height (now) at u-point 
     311         zsshvn_e(:,:)    = sshv (:,:)     ! (barotropic) sea surface height (now) at v-point 
     312         hu_e(:,:)        = hu   (:,:)     ! (barotropic) ocean depth at u-point 
     313         hv_e(:,:)        = hv   (:,:)     ! (barotropic) ocean depth at v-point 
     314         zfse3un_e(:,:,:) = fse3u(:,:,:)   ! (barotropic) scale factors  at u-point 
     315         zfse3un_e(:,:,:) = fse3v(:,:,:)   ! (barotropic) scale factors  at v-point 
     316      ENDIF 
    271317 
    272318      ! set ssh corrections to 0 
     
    330376               DO ji = fs_2, fs_jpim1   ! vector opt. 
    331377                  ! surface pressure gradient 
    332                   zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    333                   zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     378                  IF( lk_vvl) THEN 
     379                     zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
     380                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
     381                     zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
     382                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     383                  ELSE 
     384                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     385                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     386                  ENDIF 
    334387                  ! energy conserving formulation for planetary vorticity term 
    335388                  zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
     
    349402               DO ji = fs_2, fs_jpim1   ! vector opt. 
    350403                  ! surface pressure gradient 
    351                   zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    352                   zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     404                  IF( lk_vvl) THEN 
     405                     zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
     406                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
     407                     zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
     408                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     409                  ELSE 
     410                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     411                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     412                  ENDIF 
    353413                  ! enstrophy conserving formulation for planetary vorticity term 
    354414                  zy1 = zfact1 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
     
    369429               DO ji = fs_2, fs_jpim1   ! vector opt. 
    370430                  ! surface pressure gradient 
    371                   zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    372                   zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     431                  IF( lk_vvl) THEN 
     432                     zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
     433                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
     434                     zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
     435                        &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     436                  ELSE 
     437                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     438                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     439                  ENDIF 
    373440                  ! energy/enstrophy conserving formulation for planetary vorticity term 
    374441                  zcubt = + zfac25 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     
    403470         ! Time filter and swap of dynamics arrays 
    404471         ! --------------------------------------- 
    405          IF( neuler == 0 .AND. kt == nit000 ) THEN   ! Euler (forward) time stepping 
     472         IF( neuler == 0 .AND. jit == 1 ) THEN   ! Euler (forward) time stepping 
    406473            zsshb_e(:,:) = sshn_e(:,:) 
    407474            zub_e  (:,:) = zun_e (:,:) 
     
    419486         ENDIF 
    420487 
     488         IF( lk_vvl ) THEN ! Variable volume 
     489 
     490            ! Sea surface elevation 
     491            ! --------------------- 
     492            DO jj = 1, jpjm1 
     493               DO ji = 1,jpim1 
     494 
     495                  ! Sea Surface Height at u-point before 
     496                  zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )   & 
     497                     &              * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    & 
     498                     &                + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 
     499 
     500                  ! Sea Surface Height at v-point before 
     501                  zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )   & 
     502                     &              * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    & 
     503                     &                + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 
     504 
     505               END DO 
     506            END DO 
     507 
     508            ! Boundaries conditions 
     509            CALL lbc_lnk( zsshun_e, 'U', 1. )    ;    CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
     510 
     511            ! Scale factors at before and after time step 
     512            ! ------------------------------------------- 
     513            DO jk = 1, jpkm1 
     514               zfse3un_e(:,:,jk)  = fsve3u(:,:,jk) * ( 1 + zsshun_e(:,:) * muu(:,:,jk) ) 
     515               zfse3vn_e(:,:,jk)  = fsve3v(:,:,jk) * ( 1 + zsshvn_e(:,:) * muv(:,:,jk) ) 
     516            END DO 
     517 
     518            ! Ocean depth at U- and V-points 
     519            hu_e(:,:) = 0.e0 
     520            hv_e(:,:) = 0.e0 
     521 
     522            DO jk = 1, jpk 
     523               hu_e(:,:) = hu_e(:,:) + zfse3un_e(:,:,jk) * umask(:,:,jk) 
     524               hv_e(:,:) = hv_e(:,:) + zfse3vn_e(:,:,jk) * vmask(:,:,jk) 
     525            END DO 
     526 
     527         ENDIF ! End variable volume case 
     528 
    421529         !                                                 ! ==================== ! 
    422530      END DO                                               !        end loop      ! 
     
    444552      ! Horizontal divergence of time averaged barotropic transports 
    445553      !------------------------------------------------------------- 
    446       DO jj = 2, jpjm1 
    447          DO ji = fs_2, fs_jpim1   ! vector opt. 
    448             zhdiv(ji,jj) = ( e2u(ji,jj) * un_b(ji,jj) - e2u(ji-1,jj  ) * un_b(ji-1,jj  )     & 
    449            &                +e1v(ji,jj) * vn_b(ji,jj) - e1v(ji  ,jj-1) * vn_b(ji  ,jj-1) )   & 
    450            &             / ( e1t(ji,jj) * e2t(ji,jj) ) 
    451          END DO 
    452       END DO 
    453  
    454 #if defined key_obc 
     554      IF( .NOT. lk_vvl ) THEN 
     555         DO jj = 2, jpjm1 
     556            DO ji = fs_2, fs_jpim1   ! vector opt. 
     557               zhdiv(ji,jj) = ( e2u(ji,jj) * un_b(ji,jj) - e2u(ji-1,jj  ) * un_b(ji-1,jj  )     & 
     558                  &            +e1v(ji,jj) * vn_b(ji,jj) - e1v(ji  ,jj-1) * vn_b(ji  ,jj-1) )   & 
     559                  &           / ( e1t(ji,jj) * e2t(ji,jj) ) 
     560            END DO 
     561         END DO 
     562      ENDIF 
     563 
     564#if defined key_obc && ! defined key_vvl 
    455565      ! open boundaries (div must be zero behind the open boundary) 
    456566      !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
     
    463573      ! sea surface height 
    464574      !------------------- 
    465       sshb(:,:) = sshn(:,:) 
    466       sshn(:,:) = (  sshb_b(:,:) - z2dt_b * ( zraur * emp(:,:) + zhdiv(:,:) )  ) * tmask(:,:,1) 
     575      IF( lk_vvl ) THEN 
     576         sshbb(:,:) = sshb(:,:) 
     577         sshb (:,:) = sshn(:,:) 
     578         sshn (:,:) = ssha(:,:) 
     579      ELSE 
     580         sshb (:,:) = sshn(:,:) 
     581         sshn(:,:) = (  sshb_b(:,:) - z2dt_b * ( zraur * emp(:,:) + zhdiv(:,:) )  ) * tmask(:,:,1) 
     582      ENDIF 
    467583 
    468584      ! ... Boundary conditions on sshn 
     
    477593      ! ------------------------------------------ 
    478594      sshb_b(:,:) = sshn_b (:,:) 
     595      IF ( kt == nit000 ) zssha_b(:,:) = sshn(:,:) 
    479596      sshn_b(:,:) = zssha_b(:,:) 
    480597      un_b  (:,:) = zua_b  (:,:)  
  • trunk/NEMO/OPA_SRC/DYN/wzvmod.F90

    r455 r592  
    44   !! Ocean diagnostic variable : vertical velocity 
    55   !!============================================================================== 
    6  
     6   !! History :   5.0  !  90-10  (C. Levy, G. Madec)  Original code 
     7   !!             7.0  !  96-01  (G. Madec)  Statement function for e3 
     8   !!             8.5  !  02-07  (G. Madec)  Free form, F90 
    79   !!---------------------------------------------------------------------- 
    810   !!   wzv        : Compute the vertical velocity 
     
    1416   USE prtctl          ! Print control 
    1517 
     18   USE domvvl          ! Variable volume 
     19   USE phycst 
     20   USE ocesbc          ! ocean surface boundary condition 
     21   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
     22 
    1623   IMPLICIT NONE 
    1724   PRIVATE 
    1825 
    1926   !! * Routine accessibility 
    20    PUBLIC wzv       ! routine called by step.F90 and inidtr.F90 
     27   PUBLIC wzv          ! routine called by step.F90 and inidtr.F90 
    2128 
    2229   !! * Substitutions 
    2330#  include "domzgr_substitute.h90" 
     31   !!---------------------------------------------------------------------- 
     32   !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     33   !! $Header$  
     34   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    2435   !!---------------------------------------------------------------------- 
    2536 
     
    4051      !!     velocity is computed by integrating the horizontal divergence  
    4152      !!     from the bottom to the surface. 
    42       !!       The boundary conditions are w=0 at the bottom (no flux) and, 
    43       !!     in regid-lid case, w=0 at the sea surface. 
     53      !!     The boundary conditions are w=0 at the bottom (no flux) and, 
     54      !!     in rigid-lid case, w=0 at the sea surface. 
    4455      !! 
    4556      !! ** action  :    wn array : the now vertical velocity 
    46       !! 
    47       !! History : 
    48       !!   5.0  !  90-10  (C. Levy, G. Madec)  Original code 
    49       !!   7.0  !  96-01  (G. Madec)  Statement function for e3 
    50       !!   8.5  !  02-07  (G. Madec)  Free form, F90 
    5157      !!---------------------------------------------------------------------- 
    5258      !! * Arguments 
     
    5561      !! * Local declarations 
    5662      INTEGER ::   jj, jk      ! dummy loop indices 
    57       !!---------------------------------------------------------------------- 
    58       !!  OPA 9.0 , LOCEAN-IPSL (2005)  
    59       !! $Header$  
    60       !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 
    6163      !!---------------------------------------------------------------------- 
    6264 
     
    103105      !! 
    104106      !! ** action  :   wn array : the now vertical velocity 
    105       !! 
    106       !! History : 
    107       !!   9.0  !  02-07  (G. Madec)  Vector optimization 
    108107      !!---------------------------------------------------------------------- 
    109108      !! * Arguments 
     
    111110 
    112111      !! * Local declarations 
    113       INTEGER ::   jk          ! dummy loop indices 
    114       !!---------------------------------------------------------------------- 
    115       !!  OPA 8.5, LODYC-IPSL (2002) 
     112      INTEGER  ::           jk           ! dummy loop indices 
     113      !! Variable volume 
     114      INTEGER  ::   ji, jj               ! dummy loop indices 
     115      REAL(wp) ::   z2dt, zraur          ! temporary scalar 
     116      REAL(wp), DIMENSION (jpi,jpj) ::   zssha, zun, zvn, zhdiv 
    116117      !!---------------------------------------------------------------------- 
    117118 
     
    125126      ENDIF 
    126127 
    127       ! Computation from the bottom 
    128       DO jk = jpkm1, 1, -1 
    129          wn(:,:,jk) = wn(:,:,jk+1) - fse3t(:,:,jk) * hdivn(:,:,jk) 
    130       END DO 
     128      IF( lk_vvl ) THEN                ! Variable volume 
     129         ! 
     130         z2dt = 2. * rdt                                       ! time step: leap-frog 
     131         IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest 
     132         zraur  = 1. / rauw 
     133 
     134         ! Vertically integrated quantities 
     135         ! -------------------------------- 
     136         zun(:,:) = 0.e0 
     137         zvn(:,:) = 0.e0 
     138         ! 
     139         DO jk = 1, jpkm1             ! Vertically integrated transports (now) 
     140            zun(:,:) = zun(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
     141            zvn(:,:) = zvn(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
     142         END DO 
     143 
     144         ! Horizontal divergence of barotropic transports 
     145         !-------------------------------------------------- 
     146         DO jj = 2, jpjm1 
     147            DO ji = 2, jpim1   ! vector opt. 
     148               zhdiv(ji,jj) = (  e2u(ji  ,jj  ) * zun(ji  ,jj  )     & 
     149                  &            - e2u(ji-1,jj  ) * zun(ji-1,jj  )     & 
     150                  &            + e1v(ji  ,jj  ) * zvn(ji  ,jj  )     & 
     151                  &            - e1v(ji  ,jj-1) * zvn(ji  ,jj-1) )   & 
     152                  &           / ( e1t(ji,jj) * e2t(ji,jj) ) 
     153            END DO 
     154         END DO 
     155 
     156#if defined key_obc && ( key_dynspg_exp || key_dynspg_ts ) 
     157         ! open boundaries (div must be zero behind the open boundary) 
     158         !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
     159         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1)   = 0.e0    ! east 
     160         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1)   = 0.e0    ! west 
     161         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0    ! north 
     162         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1)   = 0.e0    ! south 
     163#endif 
     164 
     165         CALL lbc_lnk( zhdiv, 'T', 1. ) 
     166 
     167         ! Sea surface elevation time stepping 
     168         ! ----------------------------------- 
     169         zssha(:,:) = sshb(:,:) - z2dt * ( zraur * emp(:,:) + zhdiv(:,:) ) * tmask(:,:,1) 
     170 
     171         ! Vertical velocity computed from bottom 
     172         ! -------------------------------------- 
     173         DO jk = jpkm1, 1, -1 
     174            wn(:,:,jk) = wn(:,:,jk+1) - fse3t(:,:,jk) * hdivn(:,:,jk) & 
     175              &        - ( zssha(:,:) - sshb(:,:) ) * fsve3t(:,:,jk) * mut(:,:,jk) / z2dt 
     176         END DO 
     177 
     178      ELSE                             ! Fixed volume  
     179 
     180         ! Vertical velocity computed from bottom 
     181         ! -------------------------------------- 
     182         DO jk = jpkm1, 1, -1 
     183            wn(:,:,jk) = wn(:,:,jk+1) - fse3t(:,:,jk) * hdivn(:,:,jk) 
     184         END DO 
     185       
     186      ENDIF  
    131187 
    132188      IF(ln_ctl)   CALL prt_ctl(tab3d_1=wn, clinfo1=' w**2 -   : ', mask1=wn) 
Note: See TracChangeset for help on using the changeset viewer.