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 – NEMO

Changeset 592


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
Files:
1 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DOM/dom_oce.F90

    r454 r592  
    113113      e3w   , e3uw          !:                                        W--UW  points (m) 
    114114#endif 
     115#if defined key_vvl 
     116   LOGICAL, PUBLIC, PARAMETER ::   lk_vvl = .TRUE.    !: variable grid flag 
     117 
     118   !! All coordinates 
     119   !! --------------- 
     120   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &  !: 
     121      gdep3w_1        ,  &  !: depth of T-points (sum of e3w) (m) 
     122      gdept_1, gdepw_1,  &  !: analytical depth at T-W  points (m) 
     123      e3v_1  , e3f_1  ,  &  !: analytical vertical scale factors at  V--F 
     124      e3t_1  , e3u_1  ,  &  !:                                       T--U  points (m) 
     125      e3vw_1          ,  &  !: analytical vertical scale factors at  VW-- 
     126      e3w_1  , e3uw_1       !:                                       W--UW  points (m) 
     127#else 
     128   LOGICAL, PUBLIC, PARAMETER ::   lk_vvl = .FALSE.   !: fixed grid flag 
     129#endif 
    115130   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   &   !: 
    116131      hur, hvr,          &  !: inverse of u and v-points ocean depth (1/m) 
  • trunk/NEMO/OPA_SRC/DOM/domain.F90

    r531 r592  
    2727   USE domwri          ! domain: write the meshmask file 
    2828   USE closea          ! closed sea or lake              (dom_clo routine) 
     29   USE domvvl          ! variable volume 
    2930 
    3031   IMPLICIT NONE 
     
    9192      CALL dom_msk                        ! Masks 
    9293 
     94      IF( lk_vvl )   CALL dom_vvl_ini     ! Vertical variable mesh 
    9395 
    9496      ! Local depth or Inverse of the local depth of the water column at u- and v-points 
  • trunk/NEMO/OPA_SRC/DOM/domstp.F90

    r474 r592  
    8888            IF(lwp) WRITE(numout,*)'               accelerating the convergence' 
    8989            IF(lwp) WRITE(numout,*)'               dynamics time step = ', rdt/3600., ' hours' 
    90             IF( ln_sco .AND. rdtmin /= rdtmax )   & 
    91                  & CALL ctl_stop ( ' depth dependent acceleration of convergence not implemented in s-coordinates' ) 
     90            IF( ln_sco .AND. rdtmin /= rdtmax .AND. lk_vvl )   & 
     91                 & CALL ctl_stop ( ' depth dependent acceleration of convergence not implemented in s-coordinates & 
     92                 &                   nor in variable volume' ) 
    9293            IF(lwp) WRITE(numout,*)'         tracers   time step :  dt (hours)  level' 
    9394 
  • trunk/NEMO/OPA_SRC/DOM/domzgr.F90

    r528 r592  
    337337            idta(:,:) = jpkm1                            ! flat basin  
    338338            zdta(:,:) = gdepw_0(jpk) 
     339            h_oce     = gdepw_0(jpk) 
    339340 
    340341         ELSE                                         ! bump 
     
    342343            IF(lwp) WRITE(numout,*) '         bathymetry field: flat basin with a bump' 
    343344 
    344             ii_bump = jpidta / 3 + 3       ! i-index of the bump center 
     345            ii_bump = jpidta / 2           ! i-index of the bump center 
    345346            ij_bump = jpjdta / 2           ! j-index of the bump center 
    346             r_bump  =    6                 ! bump radius (index)        
    347             h_bump  =  240.e0              ! bump height (meters) 
     347            r_bump  = 50000.e0             ! bump radius (meters)        
     348            h_bump  = 2700.e0              ! bump height (meters) 
    348349            h_oce   = gdepw_0(jpk)         ! background ocean depth (meters) 
    349350            IF(lwp) WRITE(numout,*) '            bump characteristics: ' 
     
    355356            DO jj = 1, jpjdta 
    356357               DO ji = 1, jpidta 
    357                   zi = FLOAT( ji - ii_bump ) / r_bump       
    358                   zj = FLOAT( jj - ij_bump ) / r_bump        
     358                  zi = FLOAT( ji - ii_bump ) * ppe1_m / r_bump 
     359                  zj = FLOAT( jj - ij_bump ) * ppe2_m / r_bump 
    359360                  zdta(ji,jj) = h_oce - h_bump * EXP( -( zi*zi + zj*zj ) ) 
    360361               END DO 
     
    392393            idta( 1    , :    ) = ih                ;      zdta( 1    , :    ) =  zh 
    393394            idta(jpidta, :    ) = ih                ;      zdta(jpidta, :    ) =  zh 
    394          ENDIF 
    395  
    396          !  EEL R5 configuration with east and west open boundaries. 
    397          !  Two rows of zeroes are needed at the south and north for OBCs 
    398            
    399          IF( cp_cfg == "eel" .AND. jp_cfg == 5 ) THEN 
    400             ih = 0                                  ;      zh = 0.e0 
    401             IF( ln_sco )   zh = jpkm1               ;      IF( ln_sco )   zh = h_oce 
    402             idta( : , 2      ) = jpkm1              ;      zdta( : , 2      ) =  h_oce 
    403             idta( : ,jpjdta-1) = jpkm1              ;      zdta( : ,jpjdta-1) =  h_oce 
    404395         ENDIF 
    405396 
  • trunk/NEMO/OPA_SRC/DOM/domzgr_substitute.h90

    r454 r592  
    4040#   define  fse3vw(i,j,k)  e3vw(i,j,k) 
    4141#endif 
     42 
     43#if defined key_vvl 
     44#   define  fsvdept(i,j,k)  gdept_1(i,j,k) 
     45 
     46#   define  fsvdepw(i,j,k)  gdepw_1(i,j,k) 
     47#   define  fsvde3w(i,j,k)  gdep3w_1(i,j,k) 
     48 
     49#   define  fsve3t(i,j,k)   e3t_1(i,j,k) 
     50#   define  fsve3u(i,j,k)   e3u_1(i,j,k) 
     51#   define  fsve3v(i,j,k)   e3v_1(i,j,k) 
     52#   define  fsve3f(i,j,k)   e3f_1(i,j,k) 
     53 
     54#   define  fsve3w(i,j,k)   e3w_1(i,j,k) 
     55#   define  fsve3uw(i,j,k)  e3uw_1(i,j,k) 
     56#   define  fsve3vw(i,j,k)  e3vw_1(i,j,k) 
     57#else 
     58#   define  fsvdept(i,j,k)  gdept(i,j,k) 
     59 
     60#   define  fsvdepw(i,j,k)  gdepw(i,j,k) 
     61#   define  fsvde3w(i,j,k)  gdep3w(i,j,k) 
     62 
     63#   define  fsve3t(i,j,k)   e3t(i,j,k) 
     64#   define  fsve3u(i,j,k)   e3u(i,j,k) 
     65#   define  fsve3v(i,j,k)   e3v(i,j,k) 
     66#   define  fsve3f(i,j,k)   e3f(i,j,k) 
     67 
     68#   define  fsve3w(i,j,k)   e3w(i,j,k) 
     69#   define  fsve3uw(i,j,k)  e3uw(i,j,k) 
     70#   define  fsve3vw(i,j,k)  e3vw(i,j,k) 
     71#endif 
     72 
  • 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) 
  • trunk/NEMO/OPA_SRC/LDF/ldfslp.F90

    r461 r592  
    723723      wslpjml(:,:) = 0.e0 
    724724 
    725       IF( ln_traldf_hor .OR. ln_dynldf_hor ) THEN 
     725      IF( (ln_traldf_hor .OR. ln_dynldf_hor) .AND. .NOT. (lk_vvl .AND. ln_rstart) ) THEN 
    726726         IF(lwp) THEN 
    727727            WRITE(numout,*) '          Horizontal mixing in s-coordinate: slope = slope of s-surfaces' 
  • trunk/NEMO/OPA_SRC/TRA/traadv_cen2.F90

    r503 r592  
    304304 
    305305      ! Surface value 
    306       IF( lk_dynspg_rl ) THEN 
    307          ! rigid lid : flux set to zero 
     306      IF( lk_dynspg_rl .OR. lk_vvl ) THEN 
     307         ! rigid lid or variable volume: flux set to zero 
    308308         zwx(:,:, 1 ) = 0.e0    ;    zwy(:,:, 1 ) = 0.e0 
    309309      ELSE 
  • trunk/NEMO/OPA_SRC/TRA/traadv_muscl.F90

    r503 r592  
    355355      END DO 
    356356      ! surface values 
    357       IF( lk_dynspg_rl ) THEN                           ! rigid lid : flux set to zero 
     357      IF( lk_dynspg_rl .OR. lk_vvl) THEN                ! rigid lid or variable volume: flux set to zero 
    358358         zt1(:,:, 1 ) = 0.e0 
    359359         zs1(:,:, 1 ) = 0.e0 
  • trunk/NEMO/OPA_SRC/TRA/traadv_muscl2.F90

    r503 r592  
    428428 
    429429      ! surface values 
    430       IF( lk_dynspg_rl ) THEN                           ! rigid lid : flux set to zero 
     430      IF( lk_dynspg_rl .OR. lk_vvl ) THEN               ! rigid lid or variable volume: flux set to zero 
    431431         zt1(:,:, 1 ) = 0.e0 
    432432         zs1(:,:, 1 ) = 0.e0 
  • trunk/NEMO/OPA_SRC/TRA/traadv_tvd.F90

    r503 r592  
    130130      ! upstream tracer flux in the k direction 
    131131      ! Surface value 
    132       IF( lk_dynspg_rl ) THEN                           ! rigid lid : flux set to zero 
     132      IF( lk_dynspg_rl .OR. lk_vvl ) THEN               ! rigid lid or variable volume: flux set to zero 
    133133         ztw(:,:,1) = 0.e0 
    134134         zsw(:,:,1) = 0.e0 
  • trunk/NEMO/OPA_SRC/TRA/traadv_ubs.F90

    r519 r592  
    373373      ! ------------------------------------------------------------------- 
    374374      ! Surface value 
    375       IF( lk_dynspg_rl ) THEN                           ! rigid lid : flux set to zero 
     375      IF( lk_dynspg_rl .OR. lk_vvl ) THEN                           ! rigid lid : flux set to zero 
    376376         ztw(:,:,1) = 0.e0 
    377377         zsw(:,:,1) = 0.e0 
  • trunk/NEMO/OPA_SRC/TRA/trabbc.F90

    r541 r592  
    3737 
    3838   INTEGER , DIMENSION(jpi,jpj) ::   nbotlevt   ! ocean bottom level index at T-pt 
    39    REAL(wp), DIMENSION(jpi,jpj) ::   qgh_trd    ! geothermal heating trend 
     39   REAL(wp), DIMENSION(jpi,jpj) ::   qgh_trd0   ! geothermal heating trend 
    4040  
    4141   !! * Substitutions 
     
    8080      INTEGER ::   ji, jj   ! dummy loop indices 
    8181#endif 
     82      REAL(wp) ::   zqgh_trd  ! geothermal heat flux trend 
    8283      !!---------------------------------------------------------------------- 
    8384 
     
    9697#if defined key_vectopt_loop   &&   ! defined key_mpp_omp 
    9798         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
    98             ta(ji,1,nbotlevt(ji,1)) = ta(ji,1,nbotlevt(ji,1)) + qgh_trd(ji,1) 
     99            zqgh_trd = ro0cpr * qgh_trd0(ji,1) / fse3t(ji,1,nbotlevt(ji,1) ) 
     100            ta(ji,1,nbotlevt(ji,1)) = ta(ji,1,nbotlevt(ji,1)) + zqgh_trd 
    99101         END DO 
    100102#else 
    101103         DO jj = 2, jpjm1 
    102104            DO ji = 2, jpim1 
    103                ta(ji,jj,nbotlevt(ji,jj)) = ta(ji,jj,nbotlevt(ji,jj)) + qgh_trd(ji,jj) 
     105               zqgh_trd = ro0cpr * qgh_trd0(ji,jj) / fse3t(ji,jj,nbotlevt(ji,jj)) 
     106               ta(ji,jj,nbotlevt(ji,jj)) = ta(ji,jj,nbotlevt(ji,jj)) + zqgh_trd 
    104107            END DO 
    105108         END DO 
     
    131134      !!              - NetCDF file  : geothermal_heating.nc ( if necessary ) 
    132135      !! 
    133       !! ** Action  : - compute the heat geothermal trend qgh_trd 
     136      !! ** Action  : - read/fix the geothermal heat qgh_trd0 
    134137      !!              - compute the bottom ocean level nbotlevt 
    135138      !!---------------------------------------------------------------------- 
     
    162165      END DO 
    163166 
    164  
    165167      SELECT CASE ( ngeo_flux )      ! initialization of geothermal heat flux 
    166168      ! 
     
    171173      CASE ( 1 )                ! constant flux 
    172174         IF(lwp) WRITE(numout,*) '             *** constant heat flux  =   ', ngeo_flux_const 
    173          qgh_trd(:,:) = ngeo_flux_const 
     175         qgh_trd0(:,:) = ngeo_flux_const 
    174176         ! 
    175177      CASE ( 2 )                ! variable geothermal heat flux 
     
    178180         IF(lwp) WRITE(numout,*) '             *** variable geothermal heat flux' 
    179181         CALL iom_open ( 'geothermal_heating.nc', inum ) 
    180          CALL iom_get ( inum, jpdom_data, 'heatflow', qgh_trd ) 
     182         CALL iom_get ( inum, jpdom_data, 'heatflow', qgh_trd0 ) 
    181183         CALL iom_close (inum) 
    182184         ! 
    183          qgh_trd(:,:) = qgh_trd(:,:) * 1.e-3 ! conversion in W/m2 
     185         qgh_trd0(:,:) = qgh_trd0(:,:) * 1.e-3 ! conversion in W/m2 
    184186         ! 
    185187      CASE DEFAULT 
     
    189191      END SELECT 
    190192 
    191       ! geothermal heat flux trend 
    192  
    193       SELECT CASE ( ngeo_flux ) 
    194       ! 
    195       CASE ( 1:2 )                !  geothermal heat flux 
    196 #if defined key_vectopt_loop   &&   ! defined key_mpp_omp 
    197          DO ji = 1, jpij   ! vector opt. (forced unrolling) 
    198             qgh_trd(ji,1) = ro0cpr * qgh_trd(ji,1) / fse3t(ji,1,nbotlevt(ji,1) ) 
    199          END DO 
    200 #else 
    201          DO jj = 1, jpj 
    202             DO ji = 1, jpi 
    203                qgh_trd(ji,jj) = ro0cpr * qgh_trd(ji,jj) / fse3t(ji,jj,nbotlevt(ji,jj)) 
    204             END DO 
    205          END DO 
    206 #endif 
    207       END SELECT 
    208       ! 
     193 
    209194   END SUBROUTINE tra_bbc_init 
    210195 
  • trunk/NEMO/OPA_SRC/TRA/tranxt.F90

    r503 r592  
    3030   USE agrif_opa_interp 
    3131 
     32   USE ocesbc          ! ocean surface boundary condition 
     33   USE domvvl          ! variable volume 
     34   USE dynspg_oce      ! surface pressure gradient variables 
     35   USE phycst 
     36 
    3237   IMPLICIT NONE 
    3338   PRIVATE 
     
    3540   !! * Routine accessibility 
    3641   PUBLIC   tra_nxt   ! routine called by step.F90 
     42 
     43   REAL(wp) ::   vemp ! total amount of volume added or removed by E-P forcing 
     44 
     45   !! * Substitutions 
     46#  include "domzgr_substitute.h90" 
    3747   !!---------------------------------------------------------------------- 
    3848   !!   OPA 9.0 , LOCEAN-IPSL (2006)  
     
    7989      REAL(wp) ::   zt, zs       ! temporary scalars 
    8090      REAL(wp) ::   zfact        ! temporary scalar 
     91      !! Variable volume 
     92      REAL(wp) ::   zssh                         ! temporary scalars 
     93      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfse3tb, zfse3tn, zfse3ta  ! 3D workspace 
     94 
    8195      !!---------------------------------------------------------------------- 
     96 
     97      !! Explicit physics with thickness weighted updates 
     98      IF( lk_vvl .AND. ln_zdfexp ) THEN 
     99 
     100         ! Scale factors at before and after time step 
     101         ! ------------------------------------------- 
     102         DO jk = 1, jpkm1 
     103            zfse3tb(:,:,jk)  = fsve3t(:,:,jk) * ( 1 + sshb(:,:) * mut(:,:,jk) ) 
     104            zfse3ta(:,:,jk)  = fsve3t(:,:,jk) * ( 1 + ssha(:,:) * mut(:,:,jk) ) 
     105         END DO 
     106 
     107         ! Asselin filtered scale factor at now time step 
     108         ! ---------------------------------------------- 
     109         IF( (neuler == 0 .AND. kt == nit000) .OR. lk_dynspg_ts ) THEN 
     110            zfse3tn(:,:,:) = fse3t(:,:,:) 
     111         ELSE 
     112            DO jk = 1, jpkm1 
     113               DO jj = 1, jpj 
     114                  DO ji = 1, jpi 
     115                     zssh = atfp * ( sshb(ji,jj) + ssha(ji,jj) ) + atfp1 * sshn(ji,jj) 
     116                     zfse3tn(ji,jj,jk) = fsve3t(ji,jj,jk) * ( 1 + zssh * mut(ji,jj,jk) ) 
     117                  END DO 
     118               END DO 
     119            END DO 
     120         ENDIF 
     121 
     122         ! Thickness weighting 
     123         ! ------------------- 
     124         ta(:,:,1:jpkm1) = ta(:,:,1:jpkm1) * fse3t (:,:,1:jpkm1) 
     125         sa(:,:,1:jpkm1) = sa(:,:,1:jpkm1) * fse3t (:,:,1:jpkm1) 
     126 
     127         tn(:,:,1:jpkm1) = tn(:,:,1:jpkm1) * fse3t (:,:,1:jpkm1) 
     128         sn(:,:,1:jpkm1) = sn(:,:,1:jpkm1) * fse3t (:,:,1:jpkm1) 
     129 
     130         tb(:,:,1:jpkm1) = tb(:,:,1:jpkm1) * zfse3tb(:,:,1:jpkm1) 
     131         sb(:,:,1:jpkm1) = sb(:,:,1:jpkm1) * zfse3tb(:,:,1:jpkm1) 
     132 
     133      ENDIF 
    82134 
    83135      IF( l_trdtra ) THEN 
     
    85137         ztrds(:,:,jpk) = 0.e0 
    86138      ENDIF 
     139 
    87140      ! 0. Lateral boundary conditions on ( ta, sa )   (T-point, unchanged sign) 
    88141      ! ---------------------------------============ 
     
    165218         ELSE                                          ! Default case 
    166219            IF( neuler == 0 .AND. kt == nit000 ) THEN 
    167                DO jj = 1, jpj 
    168                   DO ji = 1, jpi 
    169                      tb(ji,jj,jk) = tn(ji,jj,jk) 
    170                      sb(ji,jj,jk) = sn(ji,jj,jk) 
    171                      tn(ji,jj,jk) = ta(ji,jj,jk) 
    172                      sn(ji,jj,jk) = sa(ji,jj,jk) 
    173                   END DO 
    174                END DO 
     220               IF( (lk_vvl .AND. ln_zdfexp) ) THEN                      ! Varying levels 
     221                  DO jj = 1, jpj 
     222                     DO ji = 1, jpi 
     223                        zssh = tmask(ji,jj,jk) / fse3t(ji,jj,jk) 
     224                        tb(ji,jj,jk) = tn(ji,jj,jk) * zssh * tmask(ji,jj,jk) 
     225                        sb(ji,jj,jk) = sn(ji,jj,jk) * zssh * tmask(ji,jj,jk) 
     226                        zssh = tmask(ji,jj,jk) / zfse3ta(ji,jj,jk) 
     227                        tn(ji,jj,jk) = ta(ji,jj,jk) * zssh * tmask(ji,jj,jk) 
     228                        sn(ji,jj,jk) = sa(ji,jj,jk) * zssh * tmask(ji,jj,jk) 
     229                     END DO 
     230                  END DO 
     231               ELSE                                                     ! Fixed levels 
     232                 DO jj = 1, jpj 
     233                     DO ji = 1, jpi 
     234                        tb(ji,jj,jk) = tn(ji,jj,jk) 
     235                        sb(ji,jj,jk) = sn(ji,jj,jk) 
     236                        tn(ji,jj,jk) = ta(ji,jj,jk) 
     237                        sn(ji,jj,jk) = sa(ji,jj,jk) 
     238                     END DO 
     239                  END DO 
     240               ENDIF 
    175241               IF( l_trdtra ) THEN 
    176242                  ztrdt(:,:,jk) = 0.e0 
     
    186252                  END DO 
    187253               END IF 
    188                DO jj = 1, jpj 
    189                   DO ji = 1, jpi 
    190                      tb(ji,jj,jk) = atfp  * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) + atfp1 * tn(ji,jj,jk) 
    191                      sb(ji,jj,jk) = atfp  * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) + atfp1 * sn(ji,jj,jk) 
    192                      tn(ji,jj,jk) = ta(ji,jj,jk) 
    193                      sn(ji,jj,jk) = sa(ji,jj,jk) 
    194                   END DO 
    195                END DO 
     254               IF( (lk_vvl .AND. ln_zdfexp) ) THEN                      ! Varying levels 
     255                  DO jj = 1, jpj 
     256                     DO ji = 1, jpi 
     257                        zssh = tmask(ji,jj,jk) / zfse3tn(ji,jj,jk) 
     258                        tb(ji,jj,jk) = ( atfp  * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) & 
     259                          &            + atfp1 * tn(ji,jj,jk) ) * zssh 
     260                        sb(ji,jj,jk) = ( atfp  * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) & 
     261                          &            + atfp1 * sn(ji,jj,jk) ) * zssh 
     262                        zssh = tmask(ji,jj,1) / zfse3ta(ji,jj,jk) 
     263                        tn(ji,jj,jk) = ta(ji,jj,jk) * zssh 
     264                        sn(ji,jj,jk) = sa(ji,jj,jk) * zssh 
     265                     END DO 
     266                  END DO 
     267               ELSE                                                     ! Fixed levels or first varying level 
     268                  DO jj = 1, jpj 
     269                     DO ji = 1, jpi 
     270                        tb(ji,jj,jk) = atfp  * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) + atfp1 * tn(ji,jj,jk) 
     271                        sb(ji,jj,jk) = atfp  * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) + atfp1 * sn(ji,jj,jk) 
     272                        tn(ji,jj,jk) = ta(ji,jj,jk) 
     273                        sn(ji,jj,jk) = sa(ji,jj,jk) 
     274                     END DO 
     275                  END DO 
     276               ENDIF 
    196277            ENDIF 
    197278         ENDIF 
  • trunk/NEMO/OPA_SRC/TRA/trasbc.F90

    r503 r592  
    110110            zse3t = 1. / fse3t(ji,jj,1) 
    111111#endif 
    112             zta = ro0cpr * ( qt(ji,jj) - qsr(ji,jj) ) * zse3t      ! temperature : heat flux 
    113             zsa = emps(ji,jj) * zsrau * sn(ji,jj,1)   * zse3t      ! salinity :  concent./dilut. effect 
    114             ta(ji,jj,1) = ta(ji,jj,1) + zta                        ! add the trend to the general tracer trend 
     112            IF( lk_vvl) THEN 
     113               zta = ro0cpr * ( qt(ji,jj) - qsr(ji,jj) ) * zse3t &   ! temperature : heat flux 
     114                &    - emp(ji,jj) * zsrau * tn(ji,jj,1)  * zse3t     ! & cooling/heating effet of EMP flux 
     115               zsa = 0.e0                                            ! No salinity concent./dilut. effect 
     116            ELSE 
     117               zta = ro0cpr * ( qt(ji,jj) - qsr(ji,jj) ) * zse3t     ! temperature : heat flux 
     118               zsa = emps(ji,jj) * zsrau * sn(ji,jj,1)   * zse3t     ! salinity :  concent./dilut. effect 
     119            ENDIF 
     120            ta(ji,jj,1) = ta(ji,jj,1) + zta                          ! add the trend to the general tracer trend 
    115121            sa(ji,jj,1) = sa(ji,jj,1) + zsa 
    116122         END DO 
  • trunk/NEMO/OPA_SRC/TRA/trazdf.F90

    r583 r592  
    2424   USE in_out_manager  ! I/O manager 
    2525   USE prtctl          ! Print control 
     26 
     27   USE phycst 
     28   USE dynspg_oce 
     29   USE ocesbc          ! ocean surface boundary condition 
     30   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     31   USE domvvl          ! variable volume 
    2632 
    2733   IMPLICIT NONE 
     
    7379         ztrds(:,:,:) = sa(:,:,:) 
    7480      ENDIF 
     81 
     82      IF( lk_vvl )   CALL dom_vvl_ssh( kt )      ! compute ssha field 
    7583 
    7684      SELECT CASE ( nzdf )                       ! compute lateral mixing trend and add it to the general trend 
  • trunk/NEMO/OPA_SRC/TRA/trazdf_imp.F90

    r503 r592  
    3131   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3232   USE prtctl          ! Print control 
     33   USE domvvl          ! variable volume 
    3334 
    3435   IMPLICIT NONE 
     
    9798      !! * Local declarations 
    9899      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
    99       REAL(wp) ::   zavi, zrhs               ! temporary scalars 
     100      REAL(wp) ::   zavi, zrhs, znvvl,     & ! temporary scalars 
     101         ze3tb, ze3tn, ze3ta, zvsfvvl        ! variable vertical scale factors 
    100102      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    101103         zwi, zwt, zavsi                     ! workspace arrays 
     
    119121      zavsi(:,:,jpk) = 0.e0     ;     zavsi( : ,:,1) = 0.e0 
    120122 
     123      ! I.1 Variable volume : to take into account vertical variable vertical scale factors 
     124      ! ------------------- 
     125      IF( lk_vvl ) THEN   ;    znvvl = 1. 
     126      ELSE                ;    znvvl = 0.e0 
     127      ENDIF 
     128 
    121129      ! II. Vertical trend associated with the vertical physics 
    122130      ! ======================================================= 
     
    145153      END DO 
    146154 
     155#else 
     156      ! No isopycnal diffusion 
     157      zwt(:,:,:) = avt(:,:,:) 
     158# if defined key_zdfddm 
     159      zavsi(:,:,:) = avs(:,:,:) 
     160# endif 
     161 
     162#endif 
     163 
    147164      ! Diagonal, inferior, superior  (including the bottom boundary condition via avt masked) 
    148165      DO jk = 1, jpkm1 
    149166         DO jj = 2, jpjm1 
    150167            DO ji = fs_2, fs_jpim1   ! vector opt. 
    151                zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    152                zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    153                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
    154             END DO 
    155          END DO 
    156       END DO 
    157 #else 
    158       ! Diagonal, inferior, superior  (including the bottom boundary condition via avt masked) 
    159       DO jk = 1, jpkm1 
    160          DO jj = 2, jpjm1 
    161             DO ji = fs_2, fs_jpim1   ! vector opt. 
    162                zwi(ji,jj,jk) = - p2dt(jk) * avt(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    163                zws(ji,jj,jk) = - p2dt(jk) * avt(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    164                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
    165             END DO 
    166          END DO 
    167       END DO 
    168 #endif 
     168               zvsfvvl = fsve3t(ji,jj,jk) * ( 1 + ssha(ji,jj) * mut(ji,jj,jk) ) 
     169               ze3ta = ( 1. - znvvl ) + znvvl*zvsfvvl                                ! after scale factor at T-point 
     170               ze3tn = ( 1. - znvvl )*fse3t(ji,jj,jk) + znvvl                        ! now   scale factor at T-point 
     171               zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk  ) / ( ze3tn * fse3w(ji,jj,jk  ) ) 
     172               zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * fse3w(ji,jj,jk+1) ) 
     173               zwd(ji,jj,jk) = ze3ta - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     174            END DO 
     175         END DO 
     176      END DO 
    169177 
    170178      ! Surface boudary conditions 
    171179      DO jj = 2, jpjm1 
    172180         DO ji = fs_2, fs_jpim1   ! vector opt. 
     181            zvsfvvl = fsve3t(ji,jj,1) * ( 1 + ssha(ji,jj) * mut(ji,jj,1) ) 
     182            ze3ta = ( 1. - znvvl ) + znvvl*zvsfvvl                                   ! after scale factor at T-point 
    173183            zwi(ji,jj,1) = 0.e0 
    174             zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     184            zwd(ji,jj,1) = ze3ta - zws(ji,jj,1) 
    175185         END DO 
    176186      END DO 
     
    214224      DO jj = 2, jpjm1 
    215225         DO ji = fs_2, fs_jpim1 
    216             ta(ji,jj,1) = tb(ji,jj,1) + p2dt(1) * ta(ji,jj,1) 
    217          END DO 
    218       END DO 
    219       DO jk = 2, jpkm1 
    220          DO jj = 2, jpjm1 
    221             DO ji = fs_2, fs_jpim1 
    222                zrhs = tb(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk)   ! zrhs=right hand side  
     226            zvsfvvl = fsve3t(ji,jj,1) * ( 1 + sshb(ji,jj) * mut(ji,jj,1) ) 
     227            ze3tb = ( 1. - znvvl ) + znvvl*zvsfvvl 
     228            ze3tn = ( 1. - znvvl ) + znvvl*fse3t (ji,jj,1) 
     229            ta(ji,jj,1) = ze3tb * tb(ji,jj,1) + p2dt(1) * ze3tn * ta(ji,jj,1) 
     230         END DO 
     231      END DO 
     232      DO jk = 2, jpkm1 
     233         DO jj = 2, jpjm1 
     234            DO ji = fs_2, fs_jpim1 
     235               zvsfvvl = fsve3t(ji,jj,jk) * ( 1 + sshb(ji,jj) * mut(ji,jj,jk) ) 
     236               ze3tb = ( 1. - znvvl ) + znvvl*zvsfvvl 
     237               ze3tn = ( 1. - znvvl ) + znvvl*fse3t (ji,jj,jk) 
     238               zrhs = ze3tb * tb(ji,jj,jk) + p2dt(jk) * ze3tn * ta(ji,jj,jk)   ! zrhs=right hand side  
    223239               ta(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *ta(ji,jj,jk-1) 
    224240            END DO 
     
    249265 
    250266      ! Diagonal, inferior, superior  (including the bottom boundary condition via avs masked) 
    251 # if defined key_ldfslp 
    252267      DO jk = 1, jpkm1 
    253268         DO jj = 2, jpjm1 
    254269            DO ji = fs_2, fs_jpim1   ! vector opt. 
    255                zwi(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    256                zws(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    257                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
    258             END DO 
    259          END DO 
    260       END DO 
    261 # else 
    262       DO jk = 1, jpkm1 
    263          DO jj = 2, jpjm1 
    264             DO ji = fs_2, fs_jpim1   ! vector opt. 
    265                zwi(ji,jj,jk) = - p2dt(jk) * avs(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    266                zws(ji,jj,jk) = - p2dt(jk) * avs(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    267                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
    268             END DO 
    269          END DO 
    270       END DO 
    271 # endif 
     270               zvsfvvl = fsve3t(ji,jj,jk) * ( 1 + ssha(ji,jj) * mut(ji,jj,jk) ) 
     271               ze3ta = ( 1. - znvvl ) + znvvl*zvsfvvl                                      ! after scale factor at T-point 
     272               ze3tn = ( 1. - znvvl )*fse3t(ji,jj,jk) + znvvl                              ! now   scale factor at T-point 
     273               zwi(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk  ) / ( ze3tn * fse3w(ji,jj,jk  ) ) 
     274               zws(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk+1) / ( ze3tn * fse3w(ji,jj,jk+1) ) 
     275               zwd(ji,jj,jk) = ze3ta - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     276            END DO 
     277         END DO 
     278      END DO 
    272279 
    273280      ! Surface boudary conditions 
    274281      DO jj = 2, jpjm1 
    275282         DO ji = fs_2, fs_jpim1   ! vector opt. 
     283            zvsfvvl = fsve3t(ji,jj,1) * ( 1 + ssha(ji,jj) * mut(ji,jj,1) ) 
     284            ze3ta = ( 1. - znvvl ) + znvvl*zvsfvvl                                          ! after scale factor at T-point 
    276285            zwi(ji,jj,1) = 0.e0 
    277             zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     286            zwd(ji,jj,1) = ze3ta - zws(ji,jj,1) 
    278287         END DO 
    279288      END DO 
     
    316325      DO jj = 2, jpjm1 
    317326         DO ji = fs_2, fs_jpim1 
    318             sa(ji,jj,1) = sb(ji,jj,1) + p2dt(1) * sa(ji,jj,1) 
    319          END DO 
    320       END DO 
    321       DO jk = 2, jpkm1 
    322          DO jj = 2, jpjm1 
    323             DO ji = fs_2, fs_jpim1 
    324                zrhs = sb(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk)   ! zrhs=right hand side 
     327            zvsfvvl = fsve3t(ji,jj,1) * ( 1 + sshb(ji,jj) * mut(ji,jj,1) ) 
     328            ze3tb = ( 1. - znvvl ) + znvvl*zvsfvvl                               ! before scale factor at T-point 
     329            ze3tn = ( 1. - znvvl ) + znvvl*fse3t(ji,jj,1)                        ! now    scale factor at T-point 
     330            sa(ji,jj,1) = ze3tb * sb(ji,jj,1) + p2dt(1) * ze3tn * sa(ji,jj,1) 
     331         END DO 
     332      END DO 
     333      DO jk = 2, jpkm1 
     334         DO jj = 2, jpjm1 
     335            DO ji = fs_2, fs_jpim1 
     336               zvsfvvl = fsve3t(ji,jj,jk) * ( 1 + sshb(ji,jj) * mut(ji,jj,jk) ) 
     337               ze3tb = ( 1. - znvvl ) + znvvl*zvsfvvl                            ! before scale factor at T-point 
     338               ze3tn = ( 1. - znvvl ) + znvvl*fse3t(ji,jj,jk)                    ! now    scale factor at T-point 
     339               zrhs = ze3tb * sb(ji,jj,jk) + p2dt(jk) * ze3tn * sa(ji,jj,jk)     ! zrhs=right hand side 
    325340               sa(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *sa(ji,jj,jk-1) 
    326341            END DO 
Note: See TracChangeset for help on using the changeset viewer.