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

Ignore:
Timestamp:
2009-05-11T16:34:47+02:00 (15 years ago)
Author:
rblod
Message:

Merge VVL branch with the trunk (act II), see ticket #429

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

Legend:

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

    r1152 r1438  
    44   !! Ocean dynamics: time stepping 
    55   !!====================================================================== 
    6     
     6   !!====================================================================== 
     7   !! History :  OPA  !  1987-02  (P. Andrich, D. L Hostis)  Original code 
     8   !!                 !  1990-10  (C. Levy, G. Madec) 
     9   !!            7.0  !  1993-03  (M. Guyon)  symetrical conditions 
     10   !!            8.0  !  1997-02  (G. Madec & M. Imbard)  opa, release 8.0 
     11   !!            8.2  !  1997-04  (A. Weaver)  Euler forward step 
     12   !!             -   !  1997-06  (G. Madec)  lateral boudary cond., lbc routine 
     13   !!    NEMO    1.0  !  2002-08  (G. Madec)  F90: Free form and module 
     14   !!             -   !  2002-10  (C. Talandier, A-M. Treguier) Open boundary cond. 
     15   !!            2.0  !  2005-11  (V. Garnier) Surface pressure gradient organization 
     16   !!            2.3  !  2007-07  (D. Storkey) Calls to BDY routines.  
     17   !!            3.2  !  2009-04  (G. Madec, R.Benshila))  re-introduce the vvl option 
     18   !!---------------------------------------------------------------------- 
     19   
    720   !!---------------------------------------------------------------------- 
    821   !!   dyn_nxt      : update the horizontal velocity from the momentum trend 
    922   !!---------------------------------------------------------------------- 
    10    !! * Modules used 
    1123   USE oce             ! ocean dynamics and tracers 
    1224   USE dom_oce         ! ocean space and time domain 
     
    2941   PRIVATE 
    3042 
    31    !! * Accessibility 
    32    PUBLIC dyn_nxt                ! routine called by step.F90 
     43   PUBLIC    dyn_nxt   ! routine called by step.F90 
     44 
    3345   !! * Substitutions 
    3446#  include "domzgr_substitute.h90" 
    35    !!---------------------------------------------------------------------- 
     47   !!------------------------------------------------------------------------- 
     48   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
     49   !! $Id$  
     50   !! Software is governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)  
     51   !!------------------------------------------------------------------------- 
    3652 
    3753CONTAINS 
     
    5975      !!             - Update un,vn arrays, the now horizontal velocity 
    6076      !! 
    61       !! History : 
    62       !!        !  87-02  (P. Andrich, D. L Hostis)  Original code 
    63       !!        !  90-10  (C. Levy, G. Madec) 
    64       !!        !  93-03  (M. Guyon)  symetrical conditions 
    65       !!        !  97-02  (G. Madec & M. Imbard)  opa, release 8.0 
    66       !!        !  97-04  (A. Weaver)  Euler forward step 
    67       !!        !  97-06  (G. Madec)  lateral boudary cond., lbc routine 
    68       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    69       !!        !  02-10  (C. Talandier, A-M. Treguier) Open boundary cond. 
    70       !!   9.0  !  05-11  (V. Garnier) Surface pressure gradient organization 
    71       !!    "   !  07-07  (D. Storkey) Calls to BDY routines.  
    7277      !!---------------------------------------------------------------------- 
    73       !! * Arguments 
    7478      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    75  
    76       !! * Local declarations 
     79      !! 
    7780      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    7881      REAL(wp) ::   z2dt         ! temporary scalar 
    79       REAL(wp) ::   zsshun1, zsshvn1         ! temporary scalar 
    80       !! Variable volume 
    81       REAL(wp), DIMENSION(jpi,jpj)     ::  & ! 2D workspace 
    82          zsshub, zsshun, zsshua,           & 
    83          zsshvb, zsshvn, zsshva 
    84       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  & 
    85          zfse3ub, zfse3un, zfse3ua, &        ! 3D workspace 
    86          zfse3vb, zfse3vn, zfse3va 
    87       !!---------------------------------------------------------------------- 
    88       !!  OPA 9.0 , LOCEAN-IPSL (2005)  
    89       !! $Id$  
    90       !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    91       !!---------------------------------------------------------------------- 
     82      REAL(wp) ::   zue3a , zue3n , zue3b    ! temporary scalar 
     83      REAL(wp) ::   zve3a , zve3n , zve3b    !    -         - 
     84      REAL(wp) ::   ze3u_b, ze3u_n, ze3u_a   !    -         - 
     85      REAL(wp) ::   ze3v_b, ze3v_n, ze3v_a   !    -         -  
     86      REAL(wp) ::   zuf   , zvf              !    -         -  
     87     !!---------------------------------------------------------------------- 
    9288 
    9389      IF( kt == nit000 ) THEN 
     
    10298 
    10399      !! Explicit physics with thickness weighted updates 
    104       IF( lk_vvl .AND. .NOT. lk_dynspg_flt ) THEN 
    105  
    106          ! Sea surface elevation time stepping 
    107          ! ----------------------------------- 
    108          ! 
    109          DO jj = 1, jpjm1 
    110             DO ji = 1,jpim1 
    111  
    112                ! Sea Surface Height at u-point before 
    113                zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )     & 
    114                   &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * sshbb(ji  ,jj  )   & 
    115                   &            + e1t(ji+1,jj  ) * e2t(ji+1,jj  ) * sshbb(ji+1,jj  ) ) 
    116  
    117                ! Sea Surface Height at v-point before 
    118                zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )     & 
    119                   &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * sshbb(ji  ,jj  )   & 
    120                   &            + e1t(ji  ,jj+1) * e2t(ji  ,jj+1) * sshbb(ji  ,jj+1) ) 
    121  
    122                ! Sea Surface Height at u-point after 
    123                zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )     & 
    124                   &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * ssha(ji  ,jj  )    & 
    125                   &            + e1t(ji+1,jj  ) * e2t(ji+1,jj  ) * ssha(ji+1,jj  ) ) 
    126  
    127                ! Sea Surface Height at v-point after 
    128                zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )     & 
    129                   &          * ( e1t(ji  ,jj  ) * e2t(ji  ,jj  ) * ssha(ji  ,jj  )    & 
    130                   &            + e1t(ji  ,jj+1) * e2t(ji  ,jj+1) * ssha(ji  ,jj+1) ) 
    131  
    132             END DO 
    133          END DO 
    134  
    135          ! Boundaries conditions 
    136          CALL lbc_lnk( zsshua, 'U', 1. )   ;    CALL lbc_lnk( zsshva, 'V', 1. ) 
    137          CALL lbc_lnk( zsshub, 'U', 1. )   ;    CALL lbc_lnk( zsshvb, 'V', 1. ) 
    138  
    139          ! Scale factors at before and after time step 
    140          ! ------------------------------------------- 
    141          CALL dom_vvl_sf( zsshub, 'U', zfse3ub ) ;    CALL dom_vvl_sf( zsshua, 'U', zfse3ua )  
    142          CALL dom_vvl_sf( zsshvb, 'V', zfse3vb ) ;    CALL dom_vvl_sf( zsshva, 'V', zfse3va )  
    143  
    144          ! Asselin filtered scale factor at now time step 
    145          ! ---------------------------------------------- 
    146          IF( (neuler == 0 .AND. kt == nit000) .OR. lk_dynspg_ts ) THEN 
    147             CALL dom_vvl_sf_ini( 'U', zfse3un ) ;   CALL dom_vvl_sf_ini( 'V', zfse3vn )  
    148          ELSE 
    149             zsshun(:,:) = atfp * ( zsshub(:,:) + zsshua(:,:) ) + atfp1 * sshu(:,:) 
    150             zsshvn(:,:) = atfp * ( zsshvb(:,:) + zsshva(:,:) ) + atfp1 * sshv(:,:) 
    151             CALL dom_vvl_sf( zsshun, 'U', zfse3un ) ;   CALL dom_vvl_sf( zsshvn, 'V', zfse3vn )  
    152          ENDIF 
    153  
    154          ! Thickness weighting 
    155          ! ------------------- 
     100 
     101      ! Lateral boundary conditions on ( ua, va ) 
     102      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )  
     103 
     104      ! Next velocity 
     105      ! ------------- 
     106#if defined key_dynspg_flt 
     107      ! Leap-frog time stepping already done in dynspg_flt.F routine 
     108#else 
     109      IF( lk_vvl ) THEN                                  ! Varying levels 
    156110         DO jk = 1, jpkm1 
    157             DO jj = 1, jpj 
    158                DO ji = 1, jpi 
    159                   ua(ji,jj,jk) = ua(ji,jj,jk) * fse3u(ji,jj,jk) 
    160                   va(ji,jj,jk) = va(ji,jj,jk) * fse3v(ji,jj,jk) 
    161  
    162                   un(ji,jj,jk) = un(ji,jj,jk) * fse3u(ji,jj,jk) 
    163                   vn(ji,jj,jk) = vn(ji,jj,jk) * fse3v(ji,jj,jk) 
    164  
    165                   ub(ji,jj,jk) = ub(ji,jj,jk) * zfse3ub(ji,jj,jk) 
    166                   vb(ji,jj,jk) = vb(ji,jj,jk) * zfse3vb(ji,jj,jk) 
    167                END DO 
    168             END DO 
    169          END DO 
    170  
    171       ENDIF 
    172  
    173       ! Lateral boundary conditions on ( ua, va ) 
    174       CALL lbc_lnk( ua, 'U', -1. ) 
    175       CALL lbc_lnk( va, 'V', -1. ) 
    176  
    177       !                                                ! =============== 
    178       DO jk = 1, jpkm1                                 ! Horizontal slab 
    179          !                                             ! =============== 
    180          ! Next velocity 
    181          ! ------------- 
    182 #if defined key_dynspg_flt 
    183          ! Leap-frog time stepping already done in dynspg.F routine 
    184 #else 
    185          DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop 
    186             DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    187                ! Leap-frog time stepping 
    188                ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk) 
    189                va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk) 
    190             END DO 
    191          END DO 
    192  
    193          IF( lk_vvl ) THEN 
    194             ! Unweight velocities prior to updating open boundaries. 
    195  
    196             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop 
    197                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    198                   ua(ji,jj,jk) = ua(ji,jj,jk) / fse3u(ji,jj,jk) 
    199                   va(ji,jj,jk) = va(ji,jj,jk) / fse3v(ji,jj,jk) 
    200  
    201                   un(ji,jj,jk) = un(ji,jj,jk) / fse3u(ji,jj,jk) 
    202                   vn(ji,jj,jk) = vn(ji,jj,jk) / fse3v(ji,jj,jk) 
    203  
    204                   ub(ji,jj,jk) = ub(ji,jj,jk) / zfse3ub(ji,jj,jk) 
    205                   vb(ji,jj,jk) = vb(ji,jj,jk) / zfse3vb(ji,jj,jk) 
    206                END DO 
    207             END DO 
    208  
    209          ENDIF 
     111            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)     & 
     112               &           + z2dt * ua(:,:,jk) * fse3u_n(:,:,jk) )   & 
     113               &         / fse3u_a(:,:,jk) * umask(:,:,jk) 
     114            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)     & 
     115               &           + z2dt * va(:,:,jk) * fse3v_n(:,:,jk) )   & 
     116               &         / fse3v_a(:,:,jk) * vmask(:,:,jk) 
     117         END DO 
     118      ELSE 
     119         DO jk = 1, jpkm1 
     120                  ! Leap-frog time stepping 
     121            ua(:,:,jk) = ( ub(:,:,jk) + z2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     122            va(:,:,jk) = ( vb(:,:,jk) + z2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     123         END DO 
     124      ENDIF 
    210125 
    211126# if defined key_obc 
    212          !                                             ! =============== 
    213       END DO                                           !   End of slab 
    214       !                                                ! =============== 
    215127      ! Update (ua,va) along open boundaries (only in the rigid-lid case) 
    216128      CALL obc_dyn( kt ) 
    217129 
    218130      IF ( lk_dynspg_exp .OR. lk_dynspg_ts ) THEN 
    219          !Flather boundary condition : 
     131         ! Flather boundary condition : 
    220132         !        - Update sea surface height on each open boundary 
    221133         !                 sshn (= after ssh) for explicit case 
     
    223135         !        - Correct the barotropic velocities 
    224136         CALL obc_dyn_bt( kt ) 
    225  
    226          !Boundary conditions on sshn ( after ssh) 
     137         ! 
     138         ! Boundary conditions on sshn ( after ssh) 
    227139         CALL lbc_lnk( sshn, 'T', 1. ) 
    228  
    229          IF(ln_ctl) THEN         ! print sum trends (used for debugging) 
    230             CALL prt_ctl(tab2d_1=sshn, clinfo1=' ssh      : ', mask1=tmask) 
    231          ENDIF 
    232  
    233          IF ( ln_vol_cst ) CALL obc_vol( kt ) 
    234  
    235       ENDIF 
    236  
    237       !                                                ! =============== 
    238       DO jk = 1, jpkm1                                 ! Horizontal slab 
    239          !                                             ! =============== 
     140         ! 
     141         IF( ln_vol_cst )   CALL obc_vol( kt ) 
     142         ! 
     143         IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshn, clinfo1=' ssh      : ', mask1=tmask ) 
     144      ENDIF 
     145 
    240146# elif defined key_bdy  
    241          !                                             ! =============== 
    242       END DO                                           !   End of slab 
    243       !                                                ! =============== 
    244147      ! Update (ua,va) along open boundaries (for exp or ts options). 
    245       IF ( lk_dynspg_exp .or. lk_dynspg_ts ) THEN 
    246    
     148      IF( lk_dynspg_exp .OR. lk_dynspg_ts ) THEN 
     149         ! 
    247150         CALL bdy_dyn_frs( kt ) 
    248  
    249          IF ( ln_bdy_fla ) THEN 
    250  
    251             ua_e(:,:)=0.0 
    252             va_e(:,:)=0.0 
    253  
     151         ! 
     152         IF( ln_bdy_fla ) THEN 
     153            ua_e(:,:) = 0.e0 
     154            va_e(:,:) = 0.e0 
    254155            ! Set these variables for use in bdy_dyn_fla 
    255156            hu_e(:,:) = hu(:,:) 
    256157            hv_e(:,:) = hv(:,:) 
    257  
    258             DO jk = 1, jpkm1 
    259                !! Vertically integrated momentum trends 
     158            DO jk = 1, jpkm1   !! Vertically integrated momentum trends 
    260159               ua_e(:,:) = ua_e(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 
    261160               va_e(:,:) = va_e(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
    262161            END DO 
    263  
    264162            DO jk = 1 , jpkm1 
    265163               ua(:,:,jk) = ua(:,:,jk) - ua_e(:,:) * hur(:,:) 
    266164               va(:,:,jk) = va(:,:,jk) - va_e(:,:) * hvr(:,:) 
    267165            END DO 
    268  
    269166            CALL bdy_dta_bt( kt+1, 0) 
    270167            CALL bdy_dyn_fla 
    271  
    272168         ENDIF 
    273  
     169         ! 
    274170         DO jk = 1 , jpkm1 
    275171            ua(:,:,jk) = ua(:,:,jk) + ua_e(:,:) * hur(:,:) 
    276172            va(:,:,jk) = va(:,:,jk) + va_e(:,:) * hvr(:,:) 
    277173         END DO 
    278  
    279       ENDIF 
    280  
    281       !                                                ! =============== 
    282       DO jk = 1, jpkm1                                 ! Horizontal slab 
    283          !                                             ! =============== 
     174      ENDIF 
    284175# endif 
     176 
    285177# if defined key_agrif 
    286          !                                             ! =============== 
    287       END DO                                           !   End of slab 
    288       !                                                ! =============== 
    289       ! Update (ua,va) along open boundaries (only in the rigid-lid case) 
    290178      CALL Agrif_dyn( kt ) 
    291       !                                                ! =============== 
    292       DO jk = 1, jpkm1                                 ! Horizontal slab 
    293          !                                             ! =============== 
    294179# endif 
    295180#endif 
    296181 
    297          ! Time filter and swap of dynamics arrays 
    298          ! ------------------------------------------ 
    299          IF( neuler == 0 .AND. kt == nit000 ) THEN 
    300             IF( (lk_vvl .AND. .NOT. lk_dynspg_flt) ) THEN      ! Varying levels 
    301                ! caution: don't use (:,:) for this loop 
    302                ! it causes optimization problems on NEC in auto-tasking 
     182      ! Time filter and swap of dynamics arrays 
     183      ! ------------------------------------------ 
     184      IF( neuler == 0 .AND. kt == nit000 ) THEN 
     185         DO jk = 1, jpkm1                                  
     186            un(:,:,jk) = ua(:,:,jk) 
     187            vn(:,:,jk) = va(:,:,jk) 
     188         END DO 
     189      ELSE 
     190         IF( lk_vvl ) THEN                                ! Varying levels 
     191            DO jk = 1, jpkm1                              ! filter applied on thickness weighted velocities 
    303192               DO jj = 1, jpj 
    304193                  DO ji = 1, jpi 
    305                      zsshun1 = umask(ji,jj,jk) / fse3u(ji,jj,jk) 
    306                      zsshvn1 = vmask(ji,jj,jk) / fse3v(ji,jj,jk) 
    307                      ub(ji,jj,jk) = un(ji,jj,jk) * zsshun1 * umask(ji,jj,jk) 
    308                      vb(ji,jj,jk) = vn(ji,jj,jk) * zsshvn1 * vmask(ji,jj,jk) 
    309                      zsshun1 = umask(ji,jj,jk) / zfse3ua(ji,jj,jk) 
    310                      zsshvn1 = vmask(ji,jj,jk) / zfse3va(ji,jj,jk) 
    311                      un(ji,jj,jk) = ua(ji,jj,jk) * zsshun1 * umask(ji,jj,jk) 
    312                      vn(ji,jj,jk) = va(ji,jj,jk) * zsshvn1 * vmask(ji,jj,jk) 
     194                     ze3u_a = fse3u_a(ji,jj,jk) 
     195                     ze3v_a = fse3v_a(ji,jj,jk) 
     196                     ze3u_n = fse3u_n(ji,jj,jk) 
     197                     ze3v_n = fse3v_n(ji,jj,jk) 
     198                     ze3u_b = fse3u_b(ji,jj,jk) 
     199                     ze3v_b = fse3v_b(ji,jj,jk) 
     200                     ! 
     201                     zue3a = ua(ji,jj,jk) * ze3u_a 
     202                     zve3a = va(ji,jj,jk) * ze3v_a 
     203                     zue3n = un(ji,jj,jk) * ze3u_n 
     204                     zve3n = vn(ji,jj,jk) * ze3v_n 
     205                     zue3b = ub(ji,jj,jk) * ze3u_b 
     206                     zve3b = vb(ji,jj,jk) * ze3v_b 
     207                     ! 
     208                     ub(ji,jj,jk) = ( atfp  * ( zue3b  + zue3a  ) + atfp1 * zue3n  )   & 
     209                        &         / ( atfp  * ( ze3u_b + ze3u_a ) + atfp1 * ze3u_n ) * umask(ji,jj,jk) 
     210                     vb(ji,jj,jk) = ( atfp  * ( zve3b  + zve3a  ) + atfp1 * zve3n  )   & 
     211                        &         / ( atfp  * ( ze3v_b + ze3v_a ) + atfp1 * ze3v_n ) * vmask(ji,jj,jk) 
     212                     un(ji,jj,jk) = ua(ji,jj,jk) * umask(ji,jj,jk) 
     213                     vn(ji,jj,jk) = va(ji,jj,jk) * vmask(ji,jj,jk) 
    313214                  END DO 
    314215               END DO 
    315             ELSE                                               ! Fixed levels 
     216            END DO 
     217         ELSE                                             ! Fixed levels 
     218            DO jk = 1, jpkm1                              ! filter applied on velocities 
    316219               DO jj = 1, jpj 
    317220                  DO ji = 1, jpi 
    318                      ! Euler (forward) time stepping 
    319                      ub(ji,jj,jk) = un(ji,jj,jk) 
    320                      vb(ji,jj,jk) = vn(ji,jj,jk) 
     221                     zuf = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
     222                     zvf = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
     223                     ub(ji,jj,jk) = zuf 
     224                     vb(ji,jj,jk) = zvf 
    321225                     un(ji,jj,jk) = ua(ji,jj,jk) 
    322226                     vn(ji,jj,jk) = va(ji,jj,jk) 
    323227                  END DO 
    324228               END DO 
    325             ENDIF 
    326          ELSE 
    327             IF( (lk_vvl .AND. .NOT. lk_dynspg_flt) ) THEN      ! Varying levels 
    328                ! caution: don't use (:,:) for this loop 
    329                ! it causes optimization problems on NEC in auto-tasking 
    330                DO jj = 1, jpj 
    331                   DO ji = 1, jpi 
    332                      zsshun1 = umask(ji,jj,jk) / zfse3un(ji,jj,jk) 
    333                      zsshvn1 = vmask(ji,jj,jk) / zfse3vn(ji,jj,jk) 
    334                      ub(ji,jj,jk) = ( atfp  * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) & 
    335                        &            + atfp1 * un(ji,jj,jk) ) * zsshun1 
    336                      vb(ji,jj,jk) = ( atfp  * ( vb(ji,jj,jk) + va(ji,jj,jk) ) & 
    337                        &            + atfp1 * vn(ji,jj,jk) ) * zsshvn1 
    338                      zsshun1 = umask(ji,jj,jk) / zfse3ua(ji,jj,jk) 
    339                      zsshvn1 = vmask(ji,jj,jk) / zfse3va(ji,jj,jk) 
    340                      un(ji,jj,jk) = ua(ji,jj,jk) * zsshun1 
    341                      vn(ji,jj,jk) = va(ji,jj,jk) * zsshvn1 
    342                   END DO 
    343                END DO 
    344             ELSE                                               ! Fixed levels 
    345                DO jj = 1, jpj 
    346                   DO ji = 1, jpi 
    347                      ! Leap-frog time stepping 
    348                      ub(ji,jj,jk) = atfp  * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
    349                      vb(ji,jj,jk) = atfp  * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
    350                      un(ji,jj,jk) = ua(ji,jj,jk) 
    351                      vn(ji,jj,jk) = va(ji,jj,jk) 
    352                   END DO 
    353                END DO 
    354             ENDIF 
     229            END DO 
    355230         ENDIF 
    356          !                                             ! =============== 
    357       END DO                                           !   End of slab 
    358       !                                                ! =============== 
    359  
    360       IF(ln_ctl)   THEN 
    361          CALL prt_ctl(tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask, & 
    362             &         tab3d_2=vn, clinfo2=' Vn: ', mask2=vmask) 
    363231      ENDIF 
    364232 
     
    367235#endif       
    368236 
     237      IF(ln_ctl)   CALL prt_ctl( tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask,   & 
     238         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
     239      !  
    369240   END SUBROUTINE dyn_nxt 
    370241 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_exp.F90

    r1146 r1438  
    44   !! Ocean dynamics:  surface pressure gradient trend 
    55   !!====================================================================== 
     6   !! History :  9.0  !  2005-11  (V. Garnier, G. Madec, L. Bessieres) Original code 
     7   !!---------------------------------------------------------------------- 
    68#if defined key_dynspg_exp   ||   defined key_esopa 
    79   !!---------------------------------------------------------------------- 
     
    1113   !!                      pressure gradient in the free surface constant   
    1214   !!                      volume case with vector optimization 
    13    !!   exp_rst      : read/write the explicit restart fields in the ocean restart file 
    1415   !!---------------------------------------------------------------------- 
    15    !! * Modules used 
    1616   USE oce             ! ocean dynamics and tracers  
    1717   USE dom_oce         ! ocean space and time domain  
     
    3131   PRIVATE 
    3232 
    33    !! * Accessibility 
    34    PUBLIC dyn_spg_exp  ! routine called by step.F90 
    35    PUBLIC exp_rst      ! routine called by istate.F90 
     33   PUBLIC   dyn_spg_exp   ! routine called by step.F90 
    3634 
    3735   !! * Substitutions 
     
    3937#  include "vectopt_loop_substitute.h90" 
    4038   !!---------------------------------------------------------------------- 
    41    !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     39   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    4240   !! $Id$ 
    43    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     41   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)  
    4442   !!---------------------------------------------------------------------- 
    45  
    4643 
    4744CONTAINS 
     
    6259      !!      -1- Compute the now surface pressure gradient 
    6360      !!      -2- Add it to the general trend 
    64       !!      -3- Compute the horizontal divergence of velocities 
    65       !!      - the now divergence is given by : 
    66       !!         zhdivn = 1/(e1t*e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] ) 
    67       !!      - integrate the horizontal divergence from the bottom  
    68       !!         to the surface 
    69       !!      - apply lateral boundary conditions on zhdivn 
    70       !!      -4- Estimate the after sea surface elevation from the kinematic 
    71       !!         surface boundary condition: 
    72       !!         zssha = sshb - 2 rdt ( zhdiv + emp ) 
    73       !!      - Time filter applied on now sea surface elevation to avoid 
    74       !!         the divergence of two consecutive time-steps and swap of free 
    75       !!         surface arrays to start the next time step: 
    76       !!         sshb = sshn + atfp * [ sshb + zssha - 2 sshn ] 
    77       !!         sshn = zssha 
    78       !!      - apply lateral boundary conditions on sshn 
    7961      !! 
    8062      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend 
     63      !!--------------------------------------------------------------------- 
     64      INTEGER, INTENT( in )  ::   kt         ! ocean time-step index 
    8165      !! 
    82       !! References : 
    83       !! 
    84       !! History : 
    85       !!   9.0  !  05-11  (V. Garnier, G. Madec, L. Bessieres) Original code 
    86       !! 
    87       !!--------------------------------------------------------------------- 
    88       !! * Arguments 
    89       INTEGER, INTENT( in )  ::   kt         ! ocean time-step index 
    90  
    91       !! * Local declarations 
    9266      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
    93       REAL(wp) ::   z2dt, zraur, zssha       ! temporary scalars  
    94       REAL(wp), DIMENSION(jpi,jpj)    ::  &  ! temporary arrays 
    95          &         zhdiv 
    9667      !!---------------------------------------------------------------------- 
    9768 
     
    10475         spgu(:,:) = 0.e0                     ! surface pressure gradient (i-direction) 
    10576         spgv(:,:) = 0.e0                     ! surface pressure gradient (j-direction) 
    106  
    107          CALL exp_rst( nit000, 'READ' )       ! read or initialize the following fields: 
    108          !                                    ! sshb, sshn 
    109  
    11077      ENDIF 
    11178 
    112       IF( .NOT. lk_vvl ) THEN 
     79      ! read or estimate sea surface height and vertically integrated velocities 
     80      IF( lk_obc )   CALL obc_dta_bt( kt, 0 ) 
    11381 
    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 
     82      ! Surface pressure gradient (now) 
     83      DO jj = 2, jpjm1 
     84         DO ji = fs_2, fs_jpim1   ! vector opt. 
     85            spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj) 
     86            spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 
     87         END DO 
     88      END DO 
    12189 
    122          ! 1. Surface pressure gradient (now) 
    123          ! ---------------------------- 
     90      ! Add the surface pressure trend to the general trend 
     91      DO jk = 1, jpkm1 
    12492         DO jj = 2, jpjm1 
    12593            DO ji = fs_2, fs_jpim1   ! vector opt. 
    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) 
     94               ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
     95               va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
    12896            END DO 
    12997         END DO 
     98      END DO 
    13099 
    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 
    141       
    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 
    154             END DO 
    155          END DO 
    156  
    157 #if defined key_obc 
    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 
    164 #endif 
    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 
    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  
    212       ENDIF 
    213  
    214       ! Boundary conditions on sshn 
    215       IF( .NOT. lk_obc ) CALL lbc_lnk( sshn, 'T', 1. ) 
    216  
    217       ! write filtered free surface arrays in restart file 
    218       ! -------------------------------------------------- 
    219       IF( lrst_oce )   CALL exp_rst( kt, 'WRITE' ) 
    220   
    221       IF(ln_ctl) THEN         ! print sum trends (used for debugging) 
    222          CALL prt_ctl(tab2d_1=sshn, clinfo1=' ssh      : ', mask1=tmask) 
    223       ENDIF 
    224        
    225100   END SUBROUTINE dyn_spg_exp 
    226101 
    227    SUBROUTINE exp_rst( kt, cdrw ) 
    228       !!--------------------------------------------------------------------- 
    229       !!                   ***  ROUTINE exp_rst  *** 
    230       !! 
    231       !! ** Purpose : Read or write explicit arrays in restart file 
    232       !!---------------------------------------------------------------------- 
    233       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    234       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    235       ! 
    236       !!---------------------------------------------------------------------- 
    237       ! 
    238       IF( TRIM(cdrw) == 'READ' ) THEN 
    239          IF( iom_varid( numror, 'sshn', ldstop = .FALSE. ) > 0 ) THEN 
    240             CALL iom_get( numror, jpdom_autoglo, 'sshb'  , sshb(:,:)   ) 
    241             CALL iom_get( numror, jpdom_autoglo, 'sshn'  , sshn(:,:)   ) 
    242             IF( neuler == 0 ) sshb(:,:) = sshn(:,:) 
    243          ELSE 
    244             IF( nn_rstssh == 1 ) THEN   
    245                sshb(:,:) = 0.e0 
    246                sshn(:,:) = 0.e0 
    247             ENDIF 
    248          ENDIF 
    249       ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
    250          CALL iom_rstput( kt, nitrst, numrow, 'sshb'  , sshb  (:,:) ) 
    251          CALL iom_rstput( kt, nitrst, numrow, 'sshn'  , sshn  (:,:) ) 
    252       ENDIF 
    253       ! 
    254    END SUBROUTINE exp_rst 
    255102#else 
    256103   !!---------------------------------------------------------------------- 
     
    261108      WRITE(*,*) 'dyn_spg_exp: You should not have seen this print! error?', kt 
    262109   END SUBROUTINE dyn_spg_exp 
    263    SUBROUTINE exp_rst( kt, cdrw )     ! Empty routine 
    264       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    265       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    266       WRITE(*,*) 'exp_rst: You should not have seen this print! error?', kt, cdrw 
    267    END SUBROUTINE exp_rst 
    268110#endif 
    269     
     111 
    270112   !!====================================================================== 
    271113END MODULE dynspg_exp 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_flt.F90

    r1200 r1438  
    44   !! Ocean dynamics:  surface pressure gradient trend 
    55   !!====================================================================== 
    6    !! History    8.0  !  98-05  (G. Roullet)  free surface 
    7    !!                 !  98-10  (G. Madec, M. Imbard)  release 8.2 
    8    !!            8.5  !  02-08  (G. Madec)  F90: Free form and module 
    9    !!            " "  !  02-11  (C. Talandier, A-M Treguier) Open boundaries 
    10    !!            9.0  !  04-08  (C. Talandier) New trends organization 
    11    !!            " "  !  05-11  (V. Garnier) Surface pressure gradient organization 
    12    !!            " "  !  06-07  (S. Masson)  distributed restart using iom 
    13    !!            " "  !  05-01  (J.Chanut, A.Sellar) Calls to BDY routines.  
     6   !! History    OPA  !  1998-05  (G. Roullet)  free surface 
     7   !!                 !  1998-10  (G. Madec, M. Imbard)  release 8.2 
     8   !!   NEMO     O.1  !  2002-08  (G. Madec)  F90: Free form and module 
     9   !!             -   !  2002-11  (C. Talandier, A-M Treguier) Open boundaries 
     10   !!            1.0  !  2004-08  (C. Talandier) New trends organization 
     11   !!             -   !  2005-11  (V. Garnier) Surface pressure gradient organization 
     12   !!            2.0  !  2006-07  (S. Masson)  distributed restart using iom 
     13   !!             -   !  2006-08  (J.Chanut, A.Sellar) Calls to BDY routines.  
     14   !!            3.2  !  2009-03  (G. Madec, M. Leclair, R. Benshila) introduce sshwzv module 
    1415   !!---------------------------------------------------------------------- 
    1516#if defined key_dynspg_flt   ||   defined key_esopa   
    1617   !!---------------------------------------------------------------------- 
    1718   !!   'key_dynspg_flt'                              filtered free surface 
    18    !!---------------------------------------------------------------------- 
    1919   !!---------------------------------------------------------------------- 
    2020   !!   dyn_spg_flt  : update the momentum trend with the surface pressure 
     
    5353   PRIVATE 
    5454 
    55    PUBLIC dyn_spg_flt  ! routine called by step.F90 
    56    PUBLIC flt_rst      ! routine called by istate.F90 
     55   PUBLIC   dyn_spg_flt  ! routine called by step.F90 
     56   PUBLIC   flt_rst      ! routine called by istate.F90 
    5757 
    5858   !! * Substitutions 
     
    6060#  include "vectopt_loop_substitute.h90" 
    6161   !!---------------------------------------------------------------------- 
    62    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
     62   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    6363   !! $Id$ 
    6464   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)  
     
    8080      !!         spgv = 1/rau0 d/dy(ps) =  1/e2v dj( sshn + rnu btda ) 
    8181      !!      where sshn is the free surface elevation and btda is the after 
    82       !!      of the free surface elevation 
    83       !!       -1- compute the after sea surface elevation from the kinematic 
    84       !!      surface boundary condition: 
    85       !!              zssha = sshb + 2 rdt ( wn - emp ) 
    86       !!           Time filter applied on now sea surface elevation to avoid  
    87       !!      the divergence of two consecutive time-steps and swap of free 
    88       !!      surface arrays to start the next time step: 
    89       !!              sshb = sshn + atfp * [ sshb + zssha - 2 sshn ] 
    90       !!              sshn = zssha 
    91       !!       -2- evaluate the surface presure trend (including the addi- 
     82      !!      time derivative of the free surface elevation 
     83      !!       -1- evaluate the surface presure trend (including the addi- 
    9284      !!      tional force) in three steps: 
    9385      !!        a- compute the right hand side of the elliptic equation: 
     
    10597      !!         iterative solver 
    10698      !!        c- apply the solver by a call to sol... routine 
    107       !!       -3- compute and add the free surface pressure gradient inclu- 
     99      !!       -2- compute and add the free surface pressure gradient inclu- 
    108100      !!      ding the additional force used to stabilize the equation. 
    109101      !! 
     
    112104      !! References : Roullet and Madec 1999, JGR. 
    113105      !!--------------------------------------------------------------------- 
    114       !! * Modules used 
    115       USE oce    , ONLY :   zub   => ta,             &  ! ta used as workspace 
    116                             zvb   => sa                 ! sa   "          " 
    117  
    118       INTEGER, INTENT( in )  ::   kt         ! ocean time-step index 
    119       INTEGER, INTENT( out ) ::   kindic     ! solver convergence flag (<0 if not converge) 
     106      USE oce, ONLY :   zub   => ta   ! ta used as workspace 
     107      USE oce, ONLY :   zvb   => sa   ! ta used as workspace 
     108      !! 
     109      INTEGER, INTENT( in )  ::   kt       ! ocean time-step index 
     110      INTEGER, INTENT( out ) ::   kindic   ! solver convergence flag (<0 if not converge) 
    120111      !!                                    
    121112      INTEGER  ::   ji, jj, jk                          ! dummy loop indices 
    122       REAL(wp) ::   z2dt, z2dtg, zraur, znugdt,      &  ! temporary scalars 
    123          &          znurau, zgcb, zbtd,              &  !   "          " 
    124          &          ztdgu, ztdgv                        !   "          " 
    125       !! Variable volume 
    126       REAL(wp), DIMENSION(jpi,jpj)     ::  & 
    127          zsshub, zsshua, zsshvb, zsshva, zssha          ! 2D workspace 
    128       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  &            ! 3D workspace 
    129          zfse3ub, zfse3ua, zfse3vb, zfse3va             ! 3D workspace 
     113      REAL(wp) ::   z2dt, z2dtg, zraur, znugdt          ! temporary scalars 
     114      REAL(wp) ::   znurau, zgcb, zbtd                  !   "          " 
     115      REAL(wp) ::   ztdgu, ztdgv                        !   "          " 
    130116      !!---------------------------------------------------------------------- 
    131117      ! 
     
    143129         ! when using agrif, sshn, gcx have to be read in istate 
    144130         IF (.NOT. lk_agrif) CALL flt_rst( nit000, 'READ' )       ! read or initialize the following fields: 
    145          !                                                        ! gcx, gcxb, sshb, sshn 
     131         !                                                        ! gcx, gcxb 
    146132      ENDIF 
    147133 
     
    158144      IF( lk_vvl ) THEN          ! variable volume  
    159145 
    160          DO jj = 1, jpjm1 
    161             DO ji = 1,jpim1 
    162  
    163                ! Sea Surface Height at u-point before 
    164                zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  &  
    165                   &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)       & 
    166                   &            + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) ) 
    167  
    168                ! Sea Surface Height at v-point before 
    169                zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  & 
    170                   &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )       & 
    171                   &            + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
    172  
    173                ! Sea Surface Height at u-point after 
    174                zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  & 
    175                   &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)       & 
    176                   &            + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) ) 
    177  
    178                ! Sea Surface Height at v-point after 
    179                zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  & 
    180                   &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )       & 
    181                   &            + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) ) 
    182  
    183             END DO 
    184          END DO 
    185  
    186          ! Boundaries conditions 
    187          CALL lbc_lnk( zsshub, 'U', 1. )    ;    CALL lbc_lnk( zsshvb, 'V', 1. ) 
    188          CALL lbc_lnk( zsshua, 'U', 1. )    ;    CALL lbc_lnk( zsshva, 'V', 1. ) 
    189  
    190          ! Scale factors at before and after time step 
    191          ! ------------------------------------------- 
    192          CALL dom_vvl_sf( zsshub, 'U', zfse3ub ) ;    CALL dom_vvl_sf( zsshua, 'U', zfse3ua ) 
    193          CALL dom_vvl_sf( zsshvb, 'V', zfse3vb ) ;    CALL dom_vvl_sf( zsshva, 'V', zfse3va ) 
    194  
    195  
    196          ! Thickness weighting 
    197          ! ------------------- 
    198          DO jk = 1, jpkm1 
    199             DO jj = 1, jpj 
    200                DO ji = 1, jpi 
    201                   ua(ji,jj,jk) = ua(ji,jj,jk) * fse3u(ji,jj,jk) 
    202                   va(ji,jj,jk) = va(ji,jj,jk) * fse3v(ji,jj,jk) 
    203  
    204                   zub(ji,jj,jk) = ub(ji,jj,jk) * zfse3ub(ji,jj,jk) 
    205                   zvb(ji,jj,jk) = vb(ji,jj,jk) * zfse3vb(ji,jj,jk) 
    206                END DO 
    207             END DO 
    208          END DO 
    209  
    210146         ! Evaluate the masked next velocity (effect of the additional force not included) 
     147         ! -------------------   (thickness weighted velocity, surface pressure gradient already included in dyn_hpg) 
    211148         DO jk = 1, jpkm1 
    212149            DO jj = 2, jpjm1 
    213150               DO ji = fs_2, fs_jpim1   ! vector opt. 
    214                   ua(ji,jj,jk) = ( zub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) /zfse3ua(ji,jj,jk) * umask(ji,jj,jk) 
    215                   va(ji,jj,jk) = ( zvb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) /zfse3va(ji,jj,jk) * vmask(ji,jj,jk) 
     151                  ua(ji,jj,jk) = (        ub(ji,jj,jk) * fse3u_b(ji,jj,jk)      & 
     152                     &           + z2dt * ua(ji,jj,jk) * fse3u_n(ji,jj,jk)  )   & 
     153                     &         / fse3u_a(ji,jj,jk) * umask(ji,jj,jk) 
     154                  va(ji,jj,jk) = (        vb(ji,jj,jk) * fse3v_b(ji,jj,jk)      & 
     155                     &           + z2dt * va(ji,jj,jk) * fse3v_n(ji,jj,jk)  )   & 
     156                     &         / fse3v_a(ji,jj,jk) * vmask(ji,jj,jk) 
    216157               END DO 
    217158            END DO 
     
    227168            END DO  
    228169         END DO  
    229  
    230          ! Add the surface pressure trend to the general trend 
     170         ! 
     171         ! add the surface pressure trend to the general trend and 
     172         ! evaluate the masked next velocity (effect of the additional force not included) 
    231173         DO jk = 1, jpkm1 
    232174            DO jj = 2, jpjm1 
    233175               DO ji = fs_2, fs_jpim1   ! vector opt. 
    234                   ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    235                   va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
     176                  ua(ji,jj,jk) = (  ub(ji,jj,jk) + z2dt * ( ua(ji,jj,jk) + spgu(ji,jj) )  ) * umask(ji,jj,jk) 
     177                  va(ji,jj,jk) = (  vb(ji,jj,jk) + z2dt * ( va(ji,jj,jk) + spgv(ji,jj) )  ) * vmask(ji,jj,jk) 
    236178               END DO 
    237179            END DO 
    238180         END DO 
    239  
    240          ! Evaluate the masked next velocity (effect of the additional force not included) 
    241          DO jk = 1, jpkm1 
    242             DO jj = 2, jpjm1 
    243                DO ji = fs_2, fs_jpim1   ! vector opt. 
    244                   ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk) 
    245                   va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk) 
    246                END DO 
    247             END DO 
    248          END DO 
    249  
     181         ! 
    250182      ENDIF 
    251183 
     
    311243      CALL lbc_lnk( spgv, 'V', -1. ) 
    312244 
    313       IF( lk_vvl ) CALL sol_mat( kt ) 
     245      IF( lk_vvl ) CALL sol_mat( kt )      ! build the matrix at kt (vvl case only) 
    314246 
    315247      ! Right hand side of the elliptic equation and first guess 
     
    347279      ! Relative precision (computation on one processor) 
    348280      ! ------------------ 
    349       rnorme =0. 
     281      rnorme =0.e0 
    350282      rnorme = SUM( gcb(1:jpi,1:jpj) * gcdmat(1:jpi,1:jpj) * gcb(1:jpi,1:jpj) * bmask(:,:) ) 
    351283      IF( lk_mpp )   CALL mpp_sum( rnorme )   ! sum over the global domain 
     
    413345      ENDIF 
    414346#endif       
    415       ! 7.  Add the trends multiplied by z2dt to the after velocity 
    416       ! ----------------------------------------------------------- 
     347      ! Add the trends multiplied by z2dt to the after velocity 
     348      ! ------------------------------------------------------- 
    417349      !     ( c a u t i o n : (ua,va) here are the after velocity not the 
    418350      !                       trend, the leap-frog time stepping will not 
     
    421353         DO jj = 2, jpjm1 
    422354            DO ji = fs_2, fs_jpim1   ! vector opt. 
    423                ua(ji,jj,jk) = (ua(ji,jj,jk) + spgu(ji,jj)) * umask(ji,jj,jk) 
    424                va(ji,jj,jk) = (va(ji,jj,jk) + spgv(ji,jj)) * vmask(ji,jj,jk) 
     355               ua(ji,jj,jk) = ( ua(ji,jj,jk) + spgu(ji,jj) ) * umask(ji,jj,jk) 
     356               va(ji,jj,jk) = ( va(ji,jj,jk) + spgv(ji,jj) ) * vmask(ji,jj,jk) 
    425357            END DO 
    426358         END DO 
    427359      END DO 
    428  
    429       ! Sea surface elevation time stepping 
    430       ! ----------------------------------- 
    431       IF( lk_vvl ) THEN   ! after free surface elevation 
    432          zssha(:,:) = ssha(:,:) 
    433       ELSE 
    434          zssha(:,:) = sshb(:,:) + z2dt * ( wn(:,:,1) - emp(:,:) * zraur ) * tmask(:,:,1) 
    435       ENDIF 
    436 #if defined key_obc 
    437 # if defined key_agrif 
    438       IF ( Agrif_Root() ) THEN 
    439 # endif 
    440          zssha(:,:)=zssha(:,:)*obctmsk(:,:) 
    441          CALL lbc_lnk(zssha,'T',1.)  ! absolutly compulsory !! (jmm) 
    442 # if defined key_agrif 
    443       ENDIF 
    444 # endif 
    445 #endif 
    446  
    447       IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler (forward) time stepping, no time filter 
    448          ! swap of arrays 
    449          sshb(:,:) = sshn (:,:) 
    450          sshn(:,:) = zssha(:,:) 
    451       ELSE                                           ! Leap-frog time stepping and time filter 
    452          ! time filter and array swap 
    453          sshb(:,:) = atfp * ( sshb(:,:) + zssha(:,:) ) + atfp1 * sshn(:,:) 
    454          sshn(:,:) = zssha(:,:) 
    455       ENDIF 
    456360 
    457361      ! write filtered free surface arrays in restart file 
    458362      ! -------------------------------------------------- 
    459363      IF( lrst_oce ) CALL flt_rst( kt, 'WRITE' ) 
    460  
    461       ! print sum trends (used for debugging) 
    462       IF(ln_ctl)     CALL prt_ctl( tab2d_1=sshn, clinfo1=' spg  - ssh: ', mask1=tmask ) 
    463364      ! 
    464365   END SUBROUTINE dyn_spg_flt 
     
    481382           CALL iom_get( numror, jpdom_autoglo, 'gcx' , gcx (1:jpi,1:jpj) ) 
    482383           CALL iom_get( numror, jpdom_autoglo, 'gcxb', gcxb(1:jpi,1:jpj) ) 
    483            CALL iom_get( numror, jpdom_autoglo, 'sshb', sshb(:,:)         ) 
    484            CALL iom_get( numror, jpdom_autoglo, 'sshn', sshn(:,:)         ) 
    485            IF( neuler == 0 ) THEN 
    486               sshb(:,:) = sshn(:,:) 
    487               gcxb(:,:) = gcx (:,:) 
    488            ENDIF 
     384           IF( neuler == 0 )   gcxb(:,:) = gcx (:,:) 
    489385        ELSE 
    490386           gcx (:,:) = 0.e0 
    491387           gcxb(:,:) = 0.e0 
    492            IF( nn_rstssh == 1 ) THEN   
    493               sshb(:,:) = 0.e0 
    494               sshn(:,:) = 0.e0 
    495            ENDIF 
    496388        ENDIF 
    497389     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
    498390! Caution : extra-hallow 
    499391! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj) 
    500         CALL iom_rstput( kt, nitrst, numrow, 'gcx' , gcx( 1:jpi,1:jpj) ) 
     392        CALL iom_rstput( kt, nitrst, numrow, 'gcx' , gcx (1:jpi,1:jpj) ) 
    501393        CALL iom_rstput( kt, nitrst, numrow, 'gcxb', gcxb(1:jpi,1:jpj) ) 
    502         CALL iom_rstput( kt, nitrst, numrow, 'sshb', sshb(:,:)         ) 
    503         CALL iom_rstput( kt, nitrst, numrow, 'sshn', sshn(:,:)         ) 
    504394     ENDIF 
    505395     ! 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_oce.F90

    r1152 r1438  
    4343   !! ------------------------ 
    4444      REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & ! variables averaged over the barotropic loop 
    45          sshn_b, sshb_b,               &  ! sea surface heigth (now, before) 
    46          un_b  , vn_b                     ! vertically integrated horizontal velocities (now) 
     45         un_e  , vn_e,                        & ! vertically integrated horizontal velocities (now) 
     46         ua_e  , va_e                           ! vertically integrated horizontal velocities (after) 
    4747      REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & ! variables of the explicit barotropic loop 
    48          sshb_e, sshn_e, ssha_e,       &  ! sea surface heigth (before,now,after) 
    49          ua_e  , va_e,                 &  ! vertically integrated horizontal velocities (after) 
    50          hu_e  , hv_e                     ! depth arrays for the barotropic solution 
     48         sshn_e, ssha_e,                      & ! sea surface heigth (now, after) 
     49         hu_e  , hv_e                           ! depth arrays for the barotropic solution 
    5150#endif 
    5251 
  • trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r1241 r1438  
    11MODULE dynspg_ts 
    22   !!====================================================================== 
    3    !!                   ***  MODULE  dynspg_ts  *** 
    4    !! Ocean dynamics:  surface pressure gradient trend 
    5    !!====================================================================== 
    6    !! History :   9.0  !  04-12  (L. Bessieres, G. Madec)  Original code 
    7    !!             " "  !  05-11  (V. Garnier, G. Madec)  optimization 
    8    !!             9.0  !  06-08  (S. Masson)  distributed restart using iom 
    9    !!              "   !  08-01  (R. Benshila)  change averaging method 
    10    !!              "   !  07-07  (D. Storkey) calls to BDY routines 
    11    !!--------------------------------------------------------------------- 
     3   !! History :   1.0  !  04-12  (L. Bessieres, G. Madec)  Original code 
     4   !!              -   !  05-11  (V. Garnier, G. Madec)  optimization 
     5   !!              -   !  06-08  (S. Masson)  distributed restart using iom 
     6   !!             2.0  !  07-07  (D. Storkey) calls to BDY routines 
     7   !!              -   !  08-01  (R. Benshila)  change averaging method 
     8  !!--------------------------------------------------------------------- 
    129#if defined key_dynspg_ts   ||   defined key_esopa 
    1310   !!---------------------------------------------------------------------- 
     
    1916   !!   ts_rst      : read/write the time-splitting restart fields in the ocean restart file 
    2017   !!---------------------------------------------------------------------- 
    21    !! * Modules used 
    2218   USE oce             ! ocean dynamics and tracers 
    2319   USE dom_oce         ! ocean space and time domain 
     
    4945   PUBLIC ts_rst      ! routine called by istate.F90 
    5046 
    51    REAL(wp), DIMENSION(jpi,jpj) ::  ftnw, ftne,   &  ! triad of coriolis parameter 
    52       &                             ftsw, ftse       ! (only used with een vorticity scheme) 
    53  
     47   REAL(wp), DIMENSION(jpi,jpj) ::  ftnw, ftne   ! triad of coriolis parameter 
     48   REAL(wp), DIMENSION(jpi,jpj) ::  ftsw, ftse   ! (only used with een vorticity scheme) 
    5449 
    5550   !! * Substitutions 
    5651#  include "domzgr_substitute.h90" 
    5752#  include "vectopt_loop_substitute.h90" 
    58    !!---------------------------------------------------------------------- 
    59    !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     53   !!------------------------------------------------------------------------- 
     54   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    6055   !! $Id$ 
    61    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    62    !!---------------------------------------------------------------------- 
     56   !! Software is governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)  
     57   !!------------------------------------------------------------------------- 
    6358 
    6459CONTAINS 
     
    8580      !!          (= 2 * baroclinic time step) and saved in zsshX_b, zuX_b  
    8681      !!          and zvX_b (X specifying after, now or before). 
    87       !!      -3- Update of sea surface height from time averaged barotropic  
    88       !!          variables. 
    89       !!        - apply lateral boundary conditions on sshn. 
    90       !!      -4- The new general trend becomes : 
    91       !!          ua = ua - sum_k(ua)/H + ( zua_b - sum_k(ub) )/H 
     82      !!      -3- The new general trend becomes : 
     83      !!          ua = ua - sum_k(ua)/H + ( zua_e - sum_k(ub) )/H 
    9284      !! 
    9385      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend 
     
    9688      !!--------------------------------------------------------------------- 
    9789      INTEGER, INTENT( in )  ::   kt           ! ocean time-step index 
    98  
    99       !! * Local declarations 
     90      !! 
    10091      INTEGER  ::  ji, jj, jk, jit             ! dummy loop indices 
    10192      INTEGER  ::  icycle                      ! temporary scalar 
     
    10798         zcu, zcv, zwx, zwy, zhdiv,         &  ! temporary arrays 
    10899         zua, zva, zub, zvb,                &  !     "        " 
    109          zssha_b, zua_b, zva_b,             &  !     "        " 
    110          zub_e, zvb_e,                      &  !     "        " 
    111          zun_e, zvn_e                          !     "        " 
     100         zua_e, zva_e, zssha_e,             &  !     "        " 
     101         zub_e, zvb_e, zsshb_e,             &  !     "        " 
     102         zu_sum, zv_sum, zssh_sum 
    112103      !! Variable volume 
    113104      REAL(wp), DIMENSION(jpi,jpj)     ::   & 
    114105         zspgu_1, zspgv_1, zsshun_e, zsshvn_e                     ! 2D workspace 
    115       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zfse3un_e, zfse3vn_e  ! 3D workspace 
    116106      !!---------------------------------------------------------------------- 
    117107 
    118108      ! Arrays initialization 
    119109      ! --------------------- 
    120       zua_b(:,:) = 0.e0   ;   zub_e(:,:) = 0.e0   ;   zun_e(:,:) = 0.e0 
    121       zva_b(:,:) = 0.e0   ;   zvb_e(:,:) = 0.e0   ;   zvn_e(:,:) = 0.e0 
    122110      zhdiv(:,:) = 0.e0 
    123111 
     
    133121         !                               ! sshb, sshn, sshb_b, sshn_b, un_b, vn_b 
    134122 
    135          ssha_e(:,:) = sshn(:,:) 
    136          ua_e(:,:)   = un_b(:,:) 
    137          va_e(:,:)   = vn_b(:,:) 
    138          hu_e(:,:)   = hu(:,:) 
    139          hv_e(:,:)   = hv(:,:) 
    140  
     123         zssha_e(:,:) = sshn(:,:) 
     124         zua_e  (:,:) = un_e(:,:) 
     125         zva_e  (:,:) = vn_e(:,:) 
     126         hu_e   (:,:) = hu  (:,:) 
     127         hv_e   (:,:) = hv  (:,:) 
    141128         IF( ln_dynvor_een ) THEN 
    142129            ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0 
     
    170157               zspgv_1(ji,jj) = -grav * ( ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1) & 
    171158                  &                     - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  ) ) / e2v(ji,jj) 
    172             END DO  
     159            END DO 
    173160         END DO 
    174161 
     
    193180      zfact2 = 0.5 * 0.5 
    194181      zraur  = 1. / rauw                                    ! 1 / volumic mass of pure water 
    195        
     182 
    196183      ! ----------------------------------------------------------------------------- 
    197184      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step) 
     
    215202               zva(ji,1) = zva(ji,1) + fse3v(ji,1,jk) * vmask(ji,1,jk) * va(ji,1,jk) 
    216203               !                                                           ! Vertically integrated transports (before) 
    217                zub(ji,1) = zub(ji,1) + fse3u(ji,1,jk) * ub(ji,1,jk) 
    218                zvb(ji,1) = zvb(ji,1) + fse3v(ji,1,jk) * vb(ji,1,jk) 
     204               zub(ji,1) = zub(ji,1) + fse3u_b(ji,1,jk) * ub(ji,1,jk) 
     205               zvb(ji,1) = zvb(ji,1) + fse3v_b(ji,1,jk) * vb(ji,1,jk) 
    219206               !                                                           ! Planetary vorticity transport fluxes (now) 
    220207               zwx(ji,1) = zwx(ji,1) + e2u(ji,1) * fse3u(ji,1,jk) * un(ji,1,jk) 
     
    228215            zva(:,:) = zva(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
    229216            !                                                           ! Vertically integrated transports (before) 
    230             zub(:,:) = zub(:,:) + fse3u(:,:,jk) * ub(:,:,jk) 
    231             zvb(:,:) = zvb(:,:) + fse3v(:,:,jk) * vb(:,:,jk) 
     217            zub(:,:) = zub(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk) 
     218            zvb(:,:) = zvb(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk) 
    232219            !                                                           ! Planetary vorticity (now) 
    233220            zwx(:,:) = zwx(:,:) + e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
     
    304291      !---------------- 
    305292      ! Number of iteration of the barotropic loop 
    306       icycle = 3  * nn_baro / 2 
     293      icycle = 2  * nn_baro + 1 
    307294 
    308295      ! variables for the barotropic equations 
    309       sshb_e (:,:) = sshn_b(:,:)       ! (barotropic) sea surface height (before and now) 
    310       sshn_e (:,:) = sshn_b(:,:) 
    311       zub_e  (:,:) = un_b  (:,:)       ! barotropic transports issued from the barotropic equations (before and now) 
    312       zvb_e  (:,:) = vn_b  (:,:) 
    313       zun_e  (:,:) = un_b  (:,:) 
    314       zvn_e  (:,:) = vn_b  (:,:) 
    315       zssha_b(:,:) = 0.e0 
    316       zua_b  (:,:) = 0.e0 
    317       zva_b  (:,:) = 0.e0 
    318       hu_e   (:,:) = hu   (:,:)     ! (barotropic) ocean depth at u-point 
    319       hv_e   (:,:) = hv   (:,:)     ! (barotropic) ocean depth at v-point 
    320       IF( lk_vvl ) THEN 
    321          zsshun_e(:,:)    = sshu (:,:)     ! (barotropic) sea surface height (now) at u-point 
    322          zsshvn_e(:,:)    = sshv (:,:)     ! (barotropic) sea surface height (now) at v-point 
    323          zfse3un_e(:,:,:) = fse3u(:,:,:)   ! (barotropic) scale factors  at u-point 
    324          zfse3un_e(:,:,:) = fse3v(:,:,:)   ! (barotropic) scale factors  at v-point 
     296      zu_sum  (:,:) = 0.e0 
     297      zv_sum  (:,:) = 0.e0 
     298      zssh_sum(:,:) = 0.e0 
     299      hu_e    (:,:) = hu    (:,:)      ! (barotropic) ocean depth at u-point 
     300      hv_e    (:,:) = hv    (:,:)      ! (barotropic) ocean depth at v-point 
     301      zsshb_e (:,:) = sshn_e(:,:)      ! (barotropic) sea surface height (before and now) 
     302      ! vertical sum 
     303      un_e  (:,:) = 0.e0 
     304      vn_e  (:,:) = 0.e0 
     305      IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
     306         DO jk = 1, jpkm1 
     307            DO ji = 1, jpij 
     308               un_e(ji,1) = un_e(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
     309               vn_e(ji,1) = vn_e(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
     310            END DO 
     311         END DO 
     312      ELSE                             ! No  vector opt. 
     313         DO jk = 1, jpkm1 
     314            un_e(:,:) = un_e(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
     315            vn_e(:,:) = vn_e(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
     316         END DO 
    325317      ENDIF 
     318      zub_e (:,:) = un_e(:,:) 
     319      zvb_e (:,:) = vn_e(:,:) 
     320 
    326321 
    327322      ! set ssh corrections to 0 
     
    352347         DO jj = 2, jpjm1 
    353348            DO ji = fs_2, fs_jpim1   ! vector opt. 
    354                zhdiv(ji,jj) = ( e2u(ji  ,jj  ) * zun_e(ji  ,jj)              & 
    355                   &            -e2u(ji-1,jj  ) * zun_e(ji-1,jj)              & 
    356                   &            +e1v(ji  ,jj  ) * zvn_e(ji  ,jj)              & 
    357                   &            -e1v(ji  ,jj-1) * zvn_e(ji  ,jj-1) )          & 
     349               zhdiv(ji,jj) = ( e2u(ji  ,jj  ) * un_e(ji  ,jj)              & 
     350                  &            -e2u(ji-1,jj  ) * un_e(ji-1,jj)              & 
     351                  &            +e1v(ji  ,jj  ) * vn_e(ji  ,jj)              & 
     352                  &            -e1v(ji  ,jj-1) * vn_e(ji  ,jj-1) )          & 
    358353                  &           / (e1t(ji,jj)*e2t(ji,jj)) 
    359354            END DO 
     
    370365 
    371366#if defined key_bdy 
    372             DO jj = 1, jpj 
    373                DO ji = 1, jpi 
    374                   zhdiv(ji,jj) = zhdiv(ji,jj)*bdytmask(ji,jj) 
    375                END DO 
    376             END DO 
     367         DO jj = 1, jpj 
     368            DO ji = 1, jpi 
     369               zhdiv(ji,jj) = zhdiv(ji,jj)*bdytmask(ji,jj) 
     370            END DO 
     371         END DO 
    377372#endif 
    378373 
     
    381376         DO jj = 2, jpjm1 
    382377            DO ji = fs_2, fs_jpim1   ! vector opt. 
    383                ssha_e(ji,jj) = ( sshb_e(ji,jj) - z2dt_e *  ( zraur * emp(ji,jj)  & 
    384             &            +  zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
     378               zssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e *  ( zraur * emp(ji,jj)  & 
     379                  &            +  zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
    385380            END DO 
    386381         END DO 
     
    388383         ! evolution of the barotropic transport ( following the vorticity scheme used) 
    389384         ! ---------------------------------------------------------------------------- 
    390          zwx(:,:) = e2u(:,:) * zun_e(:,:) 
    391          zwy(:,:) = e1v(:,:) * zvn_e(:,:) 
     385         zwx(:,:) = e2u(:,:) * un_e(:,:) 
     386         zwy(:,:) = e1v(:,:) * vn_e(:,:) 
    392387 
    393388         IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      ! energy conserving or mixed scheme 
     
    396391                  ! surface pressure gradient 
    397392                  IF( lk_vvl) THEN 
    398                      zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
    399                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
    400                      zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
    401                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     393                     zspgu = -grav * ( ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
     394                        &            - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
     395                     zspgv = -grav * ( ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
     396                        &            - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
    402397                  ELSE 
    403398                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     
    412407                  zcvbt =-zfact2 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) 
    413408                  ! after transports 
    414                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    415                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     409                  zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     410                  zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    416411               END DO 
    417412            END DO 
     
    422417                  ! surface pressure gradient 
    423418                  IF( lk_vvl) THEN 
    424                      zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
    425                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
    426                      zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
    427                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     419                     zspgu = -grav * ( ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
     420                        &            - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
     421                     zspgv = -grav * ( ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
     422                        &            - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
    428423                  ELSE 
    429424                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     
    432427                  ! enstrophy conserving formulation for planetary vorticity term 
    433428                  zy1 = zfact1 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
    434                                  + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
     429                     + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    435430                  zx1 =-zfact1 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
    436                                  + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     431                     + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    437432                  zcubt  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) 
    438433                  zcvbt  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) 
    439434                  ! after transports 
    440                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    441                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     435                  zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     436                  zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    442437               END DO 
    443438            END DO 
     
    449444                  ! surface pressure gradient 
    450445                  IF( lk_vvl) THEN 
    451                      zspgu = -grav * ( ( rhd(ji+1,jj,1) + 1 ) * sshn_e(ji+1,jj) & 
    452                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hu_e(ji,jj) / e1u(ji,jj) 
    453                      zspgv = -grav * ( ( rhd(ji,jj+1,1) + 1 ) * sshn_e(ji,jj+1) & 
    454                         &  - ( rhd(ji,jj,1) + 1 ) * sshn_e(ji,jj) ) * hv_e(ji,jj) / e2v(ji,jj) 
     446                     zspgu = -grav * ( ( rhd(ji+1,jj  ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
     447                        &            - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
     448                     zspgv = -grav * ( ( rhd(ji  ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
     449                        &            - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
    455450                  ELSE 
    456451                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     
    463458                     &                             + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    464459                  ! after transports 
    465                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    466                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     460                  zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     461                  zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    467462               END DO 
    468463            END DO 
     
    477472 
    478473         ! ... Boundary conditions on ua_e, va_e, ssha_e 
    479          CALL lbc_lnk( ua_e  , 'U', -1. ) 
    480          CALL lbc_lnk( va_e  , 'V', -1. ) 
    481          CALL lbc_lnk( ssha_e, 'T',  1. ) 
     474         CALL lbc_lnk( zua_e  , 'U', -1. ) 
     475         CALL lbc_lnk( zva_e  , 'V', -1. ) 
     476         CALL lbc_lnk( zssha_e, 'T',  1. ) 
    482477 
    483478         ! temporal sum 
    484479         !------------- 
    485          IF( jit >= nn_baro / 2 ) THEN 
    486             zssha_b(:,:) = zssha_b(:,:) + ssha_e(:,:) 
    487             zua_b  (:,:) = zua_b  (:,:) + ua_e  (:,:) 
    488             zva_b  (:,:) = zva_b  (:,:) + va_e  (:,:)  
    489          ENDIF 
     480         zu_sum  (:,:) = zu_sum  (:,:) + zua_e  (:,:) 
     481         zv_sum  (:,:) = zv_sum  (:,:) + zva_e  (:,:)  
     482         zssh_sum(:,:) = zssh_sum(:,:) + zssha_e(:,:)  
    490483 
    491484         ! Time filter and swap of dynamics arrays 
    492485         ! --------------------------------------- 
    493486         IF( jit == 1 ) THEN   ! Euler (forward) time stepping 
    494             sshb_e (:,:) = sshn_e(:,:) 
    495             zub_e  (:,:) = zun_e (:,:) 
    496             zvb_e  (:,:) = zvn_e (:,:) 
    497             sshn_e (:,:) = ssha_e(:,:) 
    498             zun_e  (:,:) = ua_e  (:,:) 
    499             zvn_e  (:,:) = va_e  (:,:) 
     487            zsshb_e(:,:) = sshn_e (:,:) 
     488            zub_e  (:,:) = un_e  (:,:) 
     489            zvb_e  (:,:) = vn_e  (:,:) 
     490            sshn_e (:,:) = zssha_e(:,:) 
     491            un_e   (:,:) = zua_e  (:,:) 
     492            vn_e   (:,:) = zva_e  (:,:) 
    500493         ELSE                                        ! Asselin filtering 
    501             sshb_e (:,:) = atfp * ( sshb_e(:,:) + ssha_e(:,:) ) + atfp1 * sshn_e(:,:) 
    502             zub_e  (:,:) = atfp * ( zub_e  (:,:) + ua_e  (:,:) ) + atfp1 * zun_e  (:,:) 
    503             zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + va_e  (:,:) ) + atfp1 * zvn_e  (:,:) 
    504             sshn_e (:,:) = ssha_e(:,:) 
    505             zun_e  (:,:) = ua_e  (:,:) 
    506             zvn_e  (:,:) = va_e  (:,:) 
     494            zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + zssha_e(:,:) ) + atfp1 * sshn_e(:,:) 
     495            zub_e  (:,:) = atfp * ( zub_e  (:,:) + zua_e  (:,:) ) + atfp1 * un_e  (:,:) 
     496            zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + zva_e  (:,:) ) + atfp1 * vn_e  (:,:) 
     497            sshn_e (:,:) = zssha_e(:,:) 
     498            un_e   (:,:) = zua_e  (:,:) 
     499            vn_e   (:,:) = zva_e  (:,:) 
    507500         ENDIF 
    508501 
    509          IF( lk_vvl ) THEN ! Variable volume 
     502         IF( lk_vvl ) THEN ! Variable volume   ! needed for BDY ??? 
    510503 
    511504            ! Sea surface elevation 
     
    528521 
    529522            ! Boundaries conditions 
    530             CALL lbc_lnk( zsshun_e, 'U', 1. )    ;    CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
    531  
    532             ! Scale factors at before and after time step 
     523            CALL lbc_lnk( zsshun_e, 'U', 1. )    ;  CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
     524 
     525            ! Ocean depth at U- and V-points 
    533526            ! ------------------------------------------- 
    534             CALL dom_vvl_sf( zsshun_e, 'U', zfse3un_e ) ;   CALL dom_vvl_sf( zsshvn_e, 'V', zfse3vn_e ) 
    535  
    536             ! Ocean depth at U- and V-points 
    537             hu_e(:,:) = 0.e0 
    538             hv_e(:,:) = 0.e0 
    539  
    540             DO jk = 1, jpk 
    541                hu_e(:,:) = hu_e(:,:) + zfse3un_e(:,:,jk) * umask(:,:,jk) 
    542                hv_e(:,:) = hv_e(:,:) + zfse3vn_e(:,:,jk) * vmask(:,:,jk) 
    543             END DO 
    544  
    545          ENDIF ! End variable volume case 
    546  
     527            hu_e(:,:) = hu_0(:,:) + zsshun_e(:,:) 
     528            hv_e(:,:) = hv_0(:,:) + zsshvn_e(:,:) 
     529 
     530            ! 
     531         ENDIF 
    547532         !                                                 ! ==================== ! 
    548533      END DO                                               !        end loop      ! 
    549534      !                                                    ! ==================== ! 
    550535 
    551  
    552536      ! Time average of after barotropic variables 
    553       zcoef =  1.e0 / ( nn_baro + 1 )  
    554       zssha_b(:,:) = zcoef * zssha_b(:,:)  
    555       zua_b  (:,:) = zcoef *  zua_b (:,:)  
    556       zva_b  (:,:) = zcoef *  zva_b (:,:)  
     537      zcoef =  1.e0 / ( 2 * nn_baro  + 1 )  
     538      un_e  (:,:) = zcoef *  zu_sum  (:,:)  
     539      vn_e  (:,:) = zcoef *  zv_sum  (:,:)  
     540      sshn_e(:,:) = zcoef *  zssh_sum(:,:)  
     541 
    557542#if defined key_obc 
    558543      IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:) 
     
    561546      IF( lp_obc_south )   sshfos_b(:,:) = zcoef * sshfos_b(:,:) 
    562547#endif 
    563       
    564  
    565       ! --------------------------------------------------------------------------- 
    566       ! Phase 3 : Update sea surface height from time averaged barotropic variables 
    567       ! --------------------------------------------------------------------------- 
    568  
    569   
    570       ! Horizontal divergence of time averaged barotropic transports 
    571       !------------------------------------------------------------- 
    572       IF( .NOT. lk_vvl ) THEN 
    573          DO jj = 2, jpjm1 
    574             DO ji = fs_2, fs_jpim1   ! vector opt. 
    575                zhdiv(ji,jj) = ( e2u(ji,jj) * un_b(ji,jj) - e2u(ji-1,jj  ) * un_b(ji-1,jj  )     & 
    576                   &            +e1v(ji,jj) * vn_b(ji,jj) - e1v(ji  ,jj-1) * vn_b(ji  ,jj-1) )   & 
    577                   &           / ( e1t(ji,jj) * e2t(ji,jj) ) 
    578             END DO 
    579          END DO 
    580       ENDIF 
    581  
    582 #if defined key_obc && ! defined key_vvl 
    583       ! open boundaries (div must be zero behind the open boundary) 
    584       !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    585       IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1)   = 0.e0    ! east 
    586       IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1)   = 0.e0    ! west 
    587       IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0    ! north 
    588       IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1)   = 0.e0    ! south 
    589 #endif 
    590  
    591 #if defined key_bdy 
    592          DO jj = 1, jpj 
    593            DO ji = 1, jpi 
    594              zhdiv(ji,jj) = zhdiv(ji,jj)*bdytmask(ji,jj) 
    595            END DO 
    596          END DO 
    597 #endif 
    598  
    599       ! sea surface height 
    600       !------------------- 
    601       IF( lk_vvl ) THEN 
    602          sshbb(:,:) = sshb(:,:) 
    603          sshb (:,:) = sshn(:,:) 
    604          sshn (:,:) = ssha(:,:) 
    605       ELSE 
    606          sshb (:,:) = sshn(:,:) 
    607          sshn(:,:) = (  sshb_b(:,:) - z2dt_b * ( zraur * emp(:,:) + zhdiv(:,:) )  ) * tmask(:,:,1) 
    608       ENDIF 
    609  
    610       ! ... Boundary conditions on sshn 
    611       IF( .NOT. lk_obc ) CALL lbc_lnk( sshn, 'T', 1. ) 
    612  
    613548 
    614549      ! ----------------------------------------------------------------------------- 
    615       ! Phase 4. Coupling between general trend and barotropic estimates - (2nd step) 
     550      ! Phase 3. Coupling between general trend and barotropic estimates - (2nd step) 
    616551      ! ----------------------------------------------------------------------------- 
    617552 
    618       ! Swap on time averaged barotropic variables 
    619       ! ------------------------------------------ 
    620       sshb_b(:,:) = sshn_b (:,:) 
    621       IF ( neuler == 0 .AND. kt == nit000 ) zssha_b(:,:) = sshn(:,:) 
    622       sshn_b(:,:) = zssha_b(:,:) 
    623       un_b  (:,:) = zua_b  (:,:)  
    624       vn_b  (:,:) = zva_b  (:,:)  
    625     
     553 
     554 
    626555      ! add time averaged barotropic coriolis and surface pressure gradient 
    627556      ! terms to the general momentum trend 
    628557      ! -------------------------------------------------------------------- 
    629558      DO jk=1,jpkm1 
    630          ua(:,:,jk) = ua(:,:,jk) + hur(:,:) * ( zua_b(:,:) - zub(:,:) ) / z2dt_b 
    631          va(:,:,jk) = va(:,:,jk) + hvr(:,:) * ( zva_b(:,:) - zvb(:,:) ) / z2dt_b 
     559         ua(:,:,jk) = ua(:,:,jk) + hur(:,:) * ( un_e(:,:) - zub(:,:) ) / z2dt_b 
     560         va(:,:,jk) = va(:,:,jk) + hvr(:,:) * ( vn_e(:,:) - zvb(:,:) ) / z2dt_b 
    632561      END DO 
    633562 
     
    636565      IF( lrst_oce )   CALL ts_rst( kt, 'WRITE' ) 
    637566 
    638       ! print sum trends (used for debugging) 
    639       IF( ln_ctl )     CALL prt_ctl( tab2d_1=sshn, clinfo1=' ssh      : ', mask1=tmask ) 
    640567      ! 
    641568   END SUBROUTINE dyn_spg_ts 
     
    655582      ! 
    656583      IF( TRIM(cdrw) == 'READ' ) THEN 
    657          IF( iom_varid( numror, 'sshn', ldstop = .FALSE. ) > 0 ) THEN 
    658             CALL iom_get( numror, jpdom_autoglo, 'sshb'  , sshb(:,:)   ) 
    659             CALL iom_get( numror, jpdom_autoglo, 'sshn'  , sshn(:,:)   ) 
    660             IF( neuler == 0 ) sshb(:,:) = sshn(:,:) 
     584         IF( iom_varid( numror, 'sshn_e', ldstop = .FALSE. ) > 0 ) THEN 
     585            CALL iom_get( numror, jpdom_autoglo, 'sshn_e', sshn_e(:,:) )   ! free surface and 
     586            CALL iom_get( numror, jpdom_autoglo, 'un_e'  , un_e  (:,:) )   ! horizontal transports issued 
     587            CALL iom_get( numror, jpdom_autoglo, 'vn_e'  , vn_e  (:,:) )   ! from barotropic loop 
    661588         ELSE 
    662             IF( nn_rstssh == 1 ) THEN   
    663                sshb(:,:) = 0.e0 
    664                sshn(:,:) = 0.e0 
    665             ENDIF 
    666          ENDIF 
    667          IF( iom_varid( numror, 'sshn_b', ldstop = .FALSE. ) > 0 ) THEN 
    668             CALL iom_get( numror, jpdom_autoglo, 'sshb_b', sshb_b(:,:) )   ! free surface issued 
    669             CALL iom_get( numror, jpdom_autoglo, 'sshn_b', sshn_b(:,:) )   ! from time-splitting loop 
    670             CALL iom_get( numror, jpdom_autoglo, 'un_b'  , un_b  (:,:) )   ! horizontal transports issued 
    671             CALL iom_get( numror, jpdom_autoglo, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop 
    672             IF( neuler == 0 ) sshb_b(:,:) = sshn_b(:,:) 
    673          ELSE 
    674             sshb_b(:,:) = sshb(:,:) 
    675             sshn_b(:,:) = sshn(:,:) 
    676             un_b  (:,:) = 0.e0 
    677             vn_b  (:,:) = 0.e0 
     589            sshn_e(:,:) = sshn(:,:) 
     590            un_e  (:,:) = 0.e0 
     591            vn_e  (:,:) = 0.e0 
    678592            ! vertical sum 
    679593            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
    680594               DO jk = 1, jpkm1 
    681595                  DO ji = 1, jpij 
    682                      un_b(ji,1) = un_b(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
    683                      vn_b(ji,1) = vn_b(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
     596                     un_e(ji,1) = un_e(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
     597                     vn_e(ji,1) = vn_e(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
    684598                  END DO 
    685599               END DO 
    686600            ELSE                             ! No  vector opt. 
    687601               DO jk = 1, jpkm1 
    688                   un_b(:,:) = un_b(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
    689                   vn_b(:,:) = vn_b(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
     602                  un_e(:,:) = un_e(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
     603                  vn_e(:,:) = vn_e(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
    690604               END DO 
    691605            ENDIF 
    692606         ENDIF 
    693607      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
    694          CALL iom_rstput( kt, nitrst, numrow, 'sshb'  , sshb  (:,:) ) 
    695          CALL iom_rstput( kt, nitrst, numrow, 'sshn'  , sshn  (:,:) ) 
    696          CALL iom_rstput( kt, nitrst, numrow, 'sshb_b', sshb_b(:,:) )   ! free surface issued 
    697          CALL iom_rstput( kt, nitrst, numrow, 'sshn_b', sshn_b(:,:) )   ! from barotropic loop 
    698          CALL iom_rstput( kt, nitrst, numrow, 'un_b'  , un_b  (:,:) )   ! horizontal transports issued 
    699          CALL iom_rstput( kt, nitrst, numrow, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop 
     608         CALL iom_rstput( kt, nitrst, numrow, 'sshn_e', sshn_e(:,:) )   ! free surface and 
     609         CALL iom_rstput( kt, nitrst, numrow, 'un_e'  , un_e  (:,:) )   ! horizontal transports issued 
     610         CALL iom_rstput( kt, nitrst, numrow, 'vn_e'  , vn_e  (:,:) )   ! from barotropic loop 
    700611      ENDIF 
    701612      ! 
  • trunk/NEMO/OPA_SRC/DYN/dynvor.F90

    r1152 r1438  
    55   !!                 planetary vorticity trends 
    66   !!====================================================================== 
    7    !! History :  1.0  !  89-12  (P. Andrich)  vor_ens: Original code 
    8    !!            5.0  !  91-11  (G. Madec) vor_ene, vor_mix: Original code 
    9    !!            6.0  !  96-01  (G. Madec)  s-coord, suppress work arrays 
    10    !!            8.5  !  02-08  (G. Madec)  F90: Free form and module 
    11    !!            8.5  !  04-02  (G. Madec)  vor_een: Original code 
    12    !!            9.0  !  03-08  (G. Madec)  vor_ctl: Original code 
    13    !!            9.0  !  05-11  (G. Madec)  dyn_vor: Original code (new step architecture) 
    14    !!            9.0  !  06-11  (G. Madec)  flux form advection: add metric term 
     7   !! History :  OPA  !  1989-12  (P. Andrich)  vor_ens: Original code 
     8   !!            5.0  !  1991-11  (G. Madec) vor_ene, vor_mix: Original code 
     9   !!            6.0  !  1996-01  (G. Madec)  s-coord, suppress work arrays 
     10   !!            8.5  !  2002-08  (G. Madec)  F90: Free form and module 
     11   !!   NEMO     1.0  !  2004-02  (G. Madec)  vor_een: Original code 
     12   !!             -   !  2003-08  (G. Madec)  add vor_ctl 
     13   !!             -   !  2005-11  (G. Madec)  add dyn_vor (new step architecture) 
     14   !!            2.0  !  2006-11  (G. Madec)  flux form advection: add metric term 
     15   !!            3.2  !  2009-04  (R. Benshila)  vvl: correction of een scheme 
    1516   !!---------------------------------------------------------------------- 
    1617 
     
    3738   PUBLIC   dyn_vor   ! routine called by step.F90 
    3839 
    39    !!* Namelist nam_dynvor: vorticity term 
     40   !                                             !!* Namelist nam_dynvor: vorticity term 
    4041   LOGICAL, PUBLIC ::   ln_dynvor_ene = .FALSE.   !: energy conserving scheme 
    4142   LOGICAL, PUBLIC ::   ln_dynvor_ens = .TRUE.    !: enstrophy conserving scheme 
     
    5253#  include "vectopt_loop_substitute.h90" 
    5354   !!---------------------------------------------------------------------- 
    54    !!   OPA 9.0 , LOCEAN-IPSL (2006)  
     55   !! NEMO/OPA 3,2 , LOCEAN-IPSL (2009)  
    5556   !! $Id$ 
    5657   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    174175      IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' vor  - Ua: ', mask1=umask, & 
    175176         &                     tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    176  
     177      ! 
    177178   END SUBROUTINE dyn_vor 
    178179 
     
    206207      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    207208      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
    208          !                                                        ! =nrvm (relative vorticity or metric) 
     209      !                                                           ! =nrvm (relative vorticity or metric) 
    209210      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend 
    210211      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
     
    222223      ENDIF 
    223224 
    224       ! Local constant initialization 
    225       zfact2 = 0.5 * 0.5 
     225      zfact2 = 0.5 * 0.5      ! Local constant initialization 
    226226 
    227227!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
     
    229229      DO jk = 1, jpkm1                                 ! Horizontal slab 
    230230         !                                             ! =============== 
     231         ! 
    231232         ! Potential vorticity and horizontal fluxes 
    232233         ! ----------------------------------------- 
     
    315316      INTEGER, INTENT(in) ::   kt   ! ocean timestep index 
    316317      !! 
    317       INTEGER ::   ji, jj, jk   ! dummy loop indices 
     318      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    318319      REAL(wp) ::   zfact1, zua, zcua, zx1, zy1   ! temporary scalars 
    319320      REAL(wp) ::   zfact2, zva, zcva, zx2, zy2   !    "         " 
     
    327328      ENDIF 
    328329 
    329       ! Local constant initialization 
    330       zfact1 = 0.5 * 0.25 
     330      zfact1 = 0.5 * 0.25      ! Local constant initialization 
    331331      zfact2 = 0.5 * 0.5 
    332332 
     
    335335      DO jk = 1, jpkm1                                 ! Horizontal slab 
    336336         !                                             ! =============== 
    337  
     337         ! 
    338338         ! Relative and planetary potential vorticity and horizontal fluxes 
    339339         ! ---------------------------------------------------------------- 
     
    438438      ENDIF 
    439439 
    440       ! Local constant initialization 
    441       zfact1 = 0.5 * 0.25 
     440      zfact1 = 0.5 * 0.25      ! Local constant initialization 
    442441 
    443442!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
     
    445444      DO jk = 1, jpkm1                                 ! Horizontal slab 
    446445         !                                             ! =============== 
     446         ! 
    447447         ! Potential vorticity and horizontal fluxes 
    448448         ! ----------------------------------------- 
     
    465465                       &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    466466                       &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    467                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                               & 
     467                       &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    468468                       &       ) 
    469469               END DO 
    470470            END DO 
    471471         END SELECT 
    472  
     472         ! 
    473473         IF( ln_sco ) THEN 
    474474            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop  
     
    487487            END DO 
    488488         ENDIF 
    489  
     489         ! 
    490490         ! Compute and add the vorticity term trend 
    491491         ! ---------------------------------------- 
     
    514514      !! 
    515515      !! ** Method  :   Trend evaluated using now fields (centered in time)  
    516       !!      and the Arakawa and Lamb (19XX) flux form formulation : conserves  
     516      !!      and the Arakawa and Lamb (1980) flux form formulation : conserves  
    517517      !!      both the horizontal kinetic energy and the potential enstrophy 
    518       !!      when horizontal divergence is zero. 
    519       !!      The trend of the vorticity term is given by: 
    520       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 
    521       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    522       !!      Add this trend to the general momentum trend (ua,va): 
    523       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
     518      !!      when horizontal divergence is zero (see the NEMO documentation) 
     519      !!      Add this trend to the general momentum trend (ua,va). 
    524520      !! 
    525521      !! ** Action : - Update (ua,va) with the now vorticity term trend 
     
    531527      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    532528      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
    533          !                                                        ! =nrvm (relative vorticity or metric) 
     529      !                                                           ! =nrvm (relative vorticity or metric) 
    534530      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend 
    535531      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    536532      !! 
    537       INTEGER ::   ji, jj, jk          ! dummy loop indices 
     533      INTEGER  ::   ji, jj, jk         ! dummy loop indices 
    538534      REAL(wp) ::   zfac12, zua, zva   ! temporary scalars 
    539535      REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz            ! temporary 2D workspace 
    540536      REAL(wp), DIMENSION(jpi,jpj) ::   ztnw, ztne, ztsw, ztse   ! temporary 3D workspace 
     537#if defined key_vvl 
     538      REAL(wp), DIMENSION(jpi,jpj,jpk)       ::   ze3f 
     539#else 
    541540      REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE ::   ze3f 
     541#endif 
    542542      !!---------------------------------------------------------------------- 
    543543 
     
    546546         IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
    547547         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    548  
     548      ENDIF 
     549 
     550      IF( kt == nit000 .OR. lk_vvl ) THEN      ! reciprocal of e3 at F-point (masked averaging of e3t) 
    549551         DO jk = 1, jpk 
    550552            DO jj = 1, jpjm1 
     
    559561      ENDIF 
    560562 
    561       ! Local constant initialization 
    562       zfac12 = 1.e0 / 12.e0 
     563      zfac12 = 1.e0 / 12.e0      ! Local constant initialization 
    563564 
    564565       
     
    571572         ! ----------------------------------------- 
    572573         SELECT CASE( kvor )      ! vorticity considered 
    573          CASE ( 1 )   ;   zwz(:,:) = ff(:,:)      * ze3f(:,:,jk)   ! planetary vorticity (Coriolis) 
    574          CASE ( 2 )   ;   zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk)   ! relative  vorticity 
     574         CASE ( 1 )                                                ! planetary vorticity (Coriolis) 
     575            zwz(:,:) = ff(:,:)      * ze3f(:,:,jk) 
     576         CASE ( 2 )                                                ! relative  vorticity 
     577            zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) 
    575578         CASE ( 3 )                                                ! metric term 
    576579            DO jj = 1, jpjm1 
     
    581584               END DO 
    582585            END DO 
    583          CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) ! total (relative + planetary vorticity) 
     586         CASE ( 4 )                                                ! total (relative + planetary vorticity) 
     587            zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) 
    584588         CASE ( 5 )                                                ! total (coriolis + metric) 
    585589            DO jj = 1, jpjm1 
     
    588592                       &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    589593                       &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    590                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                               & 
     594                       &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    591595                       &       ) * ze3f(ji,jj,jk) 
    592596               END DO 
     
    599603         ! Compute and add the vorticity term trend 
    600604         ! ---------------------------------------- 
    601          jj=2 
    602          ztne(1,:) = 0 ; ztnw(1,:) = 0 ; ztse(1,:) = 0 ; ztsw(1,:) = 0 
     605         jj = 2 
     606         ztne(1,:) = 0   ;   ztnw(1,:) = 0   ;   ztse(1,:) = 0   ;  ztsw(1,:) = 0 
    603607         DO ji = 2, jpi    
    604608               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
     
    636640      !! 
    637641      !! ** Purpose :   Control the consistency between cpp options for 
    638       !!      tracer advection schemes 
     642      !!              tracer advection schemes 
    639643      !!---------------------------------------------------------------------- 
    640644      INTEGER ::   ioptio          ! temporary integer 
  • trunk/NEMO/OPA_SRC/DYN/wzvmod.F90

    r1241 r1438  
    11MODULE wzvmod 
     2!! MODULE sshwzv    
    23   !!============================================================================== 
    3    !!                       ***  MODULE  wzvmod  *** 
    4    !! Ocean diagnostic variable : vertical velocity 
     4   !!                       ***  MODULE  sshwzv  *** 
     5   !! Ocean dynamics : sea surface height and vertical velocity 
    56   !!============================================================================== 
    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 
    9    !!              "   !  07-07  (D. Storkey) Zero zhdiv at open boundary (BDY)  
    10    !!---------------------------------------------------------------------- 
    11    !!   wzv        : Compute the vertical velocity 
    12    !!---------------------------------------------------------------------- 
    13    !! * Modules used 
     7   !! History :  3.1  !  2009-02  (G. Madec, M. Leclair)  Original code 
     8   !!---------------------------------------------------------------------- 
     9 
     10   !!---------------------------------------------------------------------- 
     11   !!   ssh_wzv        : after ssh & now vertical velocity 
     12   !!   ssh_nxt        : filter ans swap the ssh arrays 
     13   !!   ssh_rst        : read/write ssh restart fields in the ocean restart file 
     14   !!---------------------------------------------------------------------- 
    1415   USE oce             ! ocean dynamics and tracers variables 
    1516   USE dom_oce         ! ocean space and time domain variables  
    1617   USE sbc_oce         ! surface boundary condition: ocean 
    1718   USE domvvl          ! Variable volume 
     19   USE iom             ! I/O library 
     20   USE restart         ! only for lrst_oce 
    1821   USE in_out_manager  ! I/O manager 
    1922   USE prtctl          ! Print control 
    2023   USE phycst 
    21    USE bdy_oce         ! unstructured open boundaries 
    2224   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    2325   USE obc_par         ! open boundary cond. parameter 
     
    2729   PRIVATE 
    2830 
    29    !! * Routine accessibility 
    30    PUBLIC wzv          ! routine called by step.F90 and inidtr.F90 
     31   PUBLIC   ssh_wzv    ! called by step.F90 
     32   PUBLIC   ssh_nxt    ! called by step.F90 
    3133 
    3234   !! * Substitutions 
    3335#  include "domzgr_substitute.h90" 
    34    !!---------------------------------------------------------------------- 
    35    !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     36#  include "vectopt_loop_substitute.h90" 
     37 
     38   !!---------------------------------------------------------------------- 
     39   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    3640   !! $Id$ 
    3741   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    4044CONTAINS 
    4145 
    42    SUBROUTINE wzv( kt ) 
    43       !!---------------------------------------------------------------------- 
    44       !!                    ***  ROUTINE wzv  *** 
    45       !! 
    46       !! ** Purpose :   Compute the now vertical velocity after the array swap 
    47       !! 
    48       !! ** Method  :   Using the incompressibility hypothesis, the vertical 
    49       !!      velocity is computed by integrating the horizontal divergence  
    50       !!      from the bottom to the surface. 
    51       !!        The boundary conditions are w=0 at the bottom (no flux) and, 
    52       !!      in regid-lid case, w=0 at the sea surface. 
    53       !! 
    54       !! ** action  :   wn array : the now vertical velocity 
    55       !!---------------------------------------------------------------------- 
    56       !! * Arguments 
    57       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    58  
    59       !! * Local declarations 
    60       INTEGER  ::           jk           ! dummy loop indices 
    61       !! Variable volume 
    62       INTEGER  ::   ji, jj               ! dummy loop indices 
    63       REAL(wp) ::   z2dt, zraur          ! temporary scalar 
    64       REAL(wp), DIMENSION (jpi,jpj) ::   zssha, zun, zvn, zhdiv 
    65 #if defined key_bdy 
    66       INTEGER  ::     jgrd, jb           ! temporary scalars 
    67 #endif 
     46   SUBROUTINE ssh_wzv( kt )  
     47      !!---------------------------------------------------------------------- 
     48      !!                ***  ROUTINE ssh_wzv  *** 
     49      !!                    
     50      !! ** Purpose :   compute the after ssh (ssha), the now vertical velocity 
     51      !!              and update the now vertical coordinate (lk_vvl=T). 
     52      !! 
     53      !! ** Method  : - 
     54      !! 
     55      !!              - Using the incompressibility hypothesis, the vertical  
     56      !!      velocity is computed by integrating the horizontal divergence   
     57      !!      from the bottom to the surface minus the scale factor evolution. 
     58      !!        The boundary conditions are w=0 at the bottom (no flux) and. 
     59      !! 
     60      !! ** action  :   ssha    : after sea surface height 
     61      !!                wn      : now vertical velocity 
     62      !! if lk_vvl=T:   sshu_a, sshv_a, sshf_a  : after sea surface height 
     63      !!                          at u-, v-, f-point s 
     64      !!                hu, hv, hur, hvr : ocean depth and its inverse at u-,v-points 
     65      !!---------------------------------------------------------------------- 
     66      INTEGER, INTENT(in) ::   kt   ! time step 
     67      !! 
     68      INTEGER  ::   ji, jj, jk      ! dummy loop indices 
     69      REAL(wp) ::   zcoefu, zcoefv, zcoeff      ! temporary scalars 
     70      REAL(wp) ::   z2dt, zraur     ! temporary scalars 
     71      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv       ! 2D workspace 
    6872      !!---------------------------------------------------------------------- 
    6973 
    7074      IF( kt == nit000 ) THEN 
    7175         IF(lwp) WRITE(numout,*) 
    72          IF(lwp) WRITE(numout,*) 'wzv     : vertical velocity from continuity eq.' 
    73          IF(lwp) WRITE(numout,*) '~~~~~~~ '  
    74  
    75          ! bottom boundary condition: w=0 (set once for all) 
    76          wn(:,:,jpk) = 0.e0 
    77       ENDIF 
    78  
    79       IF( lk_vvl ) THEN                ! Variable volume 
    80          ! 
    81          z2dt = 2. * rdt                                       ! time step: leap-frog 
    82          IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest 
    83          zraur  = 1. / rauw 
    84  
    85          ! Vertically integrated quantities 
    86          ! -------------------------------- 
    87          zun(:,:) = 0.e0 
    88          zvn(:,:) = 0.e0 
    89          ! 
    90          DO jk = 1, jpkm1             ! Vertically integrated transports (now) 
    91             zun(:,:) = zun(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
    92             zvn(:,:) = zvn(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
    93          END DO 
    94  
    95          ! Horizontal divergence of barotropic transports 
    96          !-------------------------------------------------- 
    97          zhdiv(:,:) = 0.e0 
    98          DO jj = 2, jpjm1 
    99             DO ji = 2, jpim1   ! vector opt. 
    100                zhdiv(ji,jj) = (  e2u(ji  ,jj  ) * zun(ji  ,jj  )     & 
    101                   &            - e2u(ji-1,jj  ) * zun(ji-1,jj  )     & 
    102                   &            + e1v(ji  ,jj  ) * zvn(ji  ,jj  )     & 
    103                   &            - e1v(ji  ,jj-1) * zvn(ji  ,jj-1) )   & 
    104                   &           / ( e1t(ji,jj) * e2t(ji,jj) ) 
     76         IF(lwp) WRITE(numout,*) 'ssh_wzv : after sea surface height and now vertical velocity ' 
     77         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     78         ! 
     79         CALL ssh_rst( nit000, 'READ' )       ! read or initialize sshb and sshn 
     80         ! 
     81         wn(:,:,jpk) = 0.e0                   ! bottom boundary condition: w=0 (set once for all) 
     82         ! 
     83         IF( lk_vvl ) THEN                    ! before and now Sea SSH at u-, v-, f-points (vvl case only) 
     84            DO jj = 1, jpjm1 
     85               DO ji = 1, jpim1                    ! caution: use of Vector Opt. not possible 
     86                  zcoefu = 0.5  * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) ) 
     87                  zcoefv = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) ) 
     88                  zcoeff = 0.25 * umask(ji,jj,1) * umask(ji,jj+1,1) 
     89                  sshu_b(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)     & 
     90                     &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) ) 
     91                  sshv_b(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )     & 
     92                     &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
     93                  sshf_b(ji,jj) = zcoeff * ( sshb(ji  ,jj) + sshb(ji  ,jj+1)                 & 
     94                     &                     + sshb(ji+1,jj) + sshb(ji+1,jj+1) ) 
     95                  sshu_n(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn(ji  ,jj)     & 
     96                     &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn(ji+1,jj) ) 
     97                  sshv_n(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn(ji,jj  )     & 
     98                     &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn(ji,jj+1) ) 
     99                  sshf_n(ji,jj) = zcoeff * ( sshn(ji  ,jj) + sshn(ji  ,jj+1)                 & 
     100                     &                     + sshn(ji+1,jj) + sshn(ji+1,jj+1) ) 
     101               END DO 
     102            END DO 
     103            CALL lbc_lnk( sshu_b, 'U', 1. )   ;   CALL lbc_lnk( sshu_n, 'U', 1. ) 
     104            CALL lbc_lnk( sshv_b, 'V', 1. )   ;   CALL lbc_lnk( sshv_n, 'V', 1. ) 
     105            CALL lbc_lnk( sshf_b, 'F', 1. )   ;   CALL lbc_lnk( sshf_n, 'F', 1. ) 
     106         ENDIF 
     107         ! 
     108      ENDIF 
     109 
     110      ! set time step size (Euler/Leapfrog) 
     111      z2dt = 2. * rdt  
     112      IF( neuler == 0 .AND. kt == nit000 ) z2dt =rdt 
     113 
     114      zraur = 1. / rauw 
     115 
     116      !                                           !------------------------------! 
     117      !                                           !   After Sea Surface Height   ! 
     118      !                                           !------------------------------! 
     119      zhdiv(:,:) = 0.e0 
     120      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports 
     121        zhdiv(:,:) = zhdiv(:,:) + fse3t(:,:,jk) * hdivn(:,:,jk) 
     122      END DO 
     123 
     124      !                                                ! Sea surface elevation time stepping 
     125      ssha(:,:) = (  sshb(:,:) - z2dt * ( zraur * emp(:,:) + zhdiv(:,:) )  ) * tmask(:,:,1) 
     126 
     127#if defined key_obc 
     128# if defined key_agrif 
     129      IF ( Agrif_Root() ) THEN  
     130# endif 
     131         ssha(:,:) = ssha(:,:) * obctmsk(:,:) 
     132         CALL lbc_lnk( ssha, 'T', 1. )  ! absolutly compulsory !! (jmm) 
     133# if defined key_agrif 
     134      ENDIF 
     135# endif 
     136#endif 
     137 
     138      !                                                ! Sea Surface Height at u-,v- and f-points (vvl case only) 
     139      IF( lk_vvl ) THEN                                ! (required only in key_vvl case) 
     140         DO jj = 1, jpjm1 
     141            DO ji = 1, fs_jpim1   ! Vector Opt. 
     142               sshu_a(ji,jj) = 0.5  * umask(ji,jj,1) / ( e1u(ji  ,jj) * e2u(ji  ,jj) )                   & 
     143                  &                                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)     & 
     144                  &                                    + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) ) 
     145               sshv_a(ji,jj) = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj  ) * e2v(ji,jj  ) )                   & 
     146                  &                                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )     & 
     147                  &                                    + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     148               sshf_a(ji,jj) = 0.25 * umask(ji,jj,1) * umask (ji,jj+1,1)   &   ! Caution : fmask not used 
     149                  &                                  * ( ssha(ji  ,jj) + ssha(ji  ,jj+1)                 & 
     150                  &                                    + ssha(ji+1,jj) + ssha(ji+1,jj+1) ) 
    105151            END DO 
    106152         END DO 
    107  
    108 #if defined key_obc && ( defined key_dynspg_exp || defined key_dynspg_ts ) 
    109          ! open boundaries (div must be zero behind the open boundary) 
    110          !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    111          IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1)   = 0.e0    ! east 
    112          IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1)   = 0.e0    ! west 
    113          IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0    ! north 
    114          IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1)   = 0.e0    ! south 
    115 #endif 
    116  
    117 #if defined key_bdy 
    118          jgrd=1 !: tracer grid. 
    119          DO jb = 1, nblenrim(jgrd) 
    120            ji = nbi(jb,jgrd) 
    121            jj = nbj(jb,jgrd) 
    122            zhdiv(ji,jj) = 0.e0 
     153         CALL lbc_lnk( sshu_a, 'U', 1. )               ! Boundaries conditions 
     154         CALL lbc_lnk( sshv_a, 'V', 1. ) 
     155         CALL lbc_lnk( sshf_a, 'F', 1. ) 
     156      ENDIF 
     157 
     158      !                                           !------------------------------! 
     159      !                                           !     Now Vertical Velocity    ! 
     160      !                                           !------------------------------! 
     161      !                                                ! integrate from the bottom the hor. divergence 
     162      DO jk = jpkm1, 1, -1 
     163         wn(:,:,jk) = wn(:,:,jk+1) -    fse3t_n(:,:,jk) * hdivn(:,:,jk)   & 
     164              &                    - (  fse3t_a(:,:,jk)                   & 
     165              &                       - fse3t_b(:,:,jk) ) * tmask(:,:,jk) / z2dt 
     166      END DO 
     167 
     168      !                                           !------------------------------! 
     169      !                                           !  Update Now Vertical coord.  ! 
     170      !                                           !------------------------------! 
     171      IF( lk_vvl ) THEN                           ! only in vvl case) 
     172         !                                             ! now local depth and scale factors (stored in fse3. arrays) 
     173         DO jk = 1, jpkm1 
     174            fsdept(:,:,jk) = fsdept_n(:,:,jk)               ! depths 
     175            fsdepw(:,:,jk) = fsdepw_n(:,:,jk) 
     176            fsde3w(:,:,jk) = fsde3w_n(:,:,jk) 
     177            ! 
     178            fse3t (:,:,jk) = fse3t_n (:,:,jk)               ! vertical scale factors 
     179            fse3u (:,:,jk) = fse3u_n (:,:,jk) 
     180            fse3v (:,:,jk) = fse3v_n (:,:,jk) 
     181            fse3f (:,:,jk) = fse3f_n (:,:,jk) 
     182            fse3w (:,:,jk) = fse3w_n (:,:,jk) 
     183            fse3uw(:,:,jk) = fse3uw_n(:,:,jk) 
     184            fse3vw(:,:,jk) = fse3vw_n(:,:,jk) 
    123185         END DO 
    124 #endif 
    125  
    126          CALL lbc_lnk( zhdiv, 'T', 1. ) 
    127  
    128          ! Sea surface elevation time stepping 
    129          ! ----------------------------------- 
    130          zssha(:,:) = sshb(:,:) - z2dt * ( zraur * emp(:,:) + zhdiv(:,:) ) * tmask(:,:,1) 
    131  
    132          ! Vertical velocity computed from bottom 
    133          ! -------------------------------------- 
    134          DO jk = jpkm1, 1, -1 
    135             wn(:,:,jk) = wn(:,:,jk+1) - fse3t(:,:,jk) * hdivn(:,:,jk) & 
    136               &        - ( zssha(:,:) - sshb(:,:) ) * fsve3t(:,:,jk) * mut(:,:,jk) / z2dt 
    137          END DO 
    138  
    139       ELSE                             ! Fixed volume  
    140  
    141          ! Vertical velocity computed from bottom 
    142          ! -------------------------------------- 
    143          DO jk = jpkm1, 1, -1 
    144             wn(:,:,jk) = wn(:,:,jk+1) - fse3t(:,:,jk) * hdivn(:,:,jk) 
    145          END DO 
    146        
    147       ENDIF  
    148  
    149       IF(ln_ctl)   CALL prt_ctl(tab3d_1=wn, clinfo1=' w**2 -   : ', mask1=wn) 
    150  
    151    END SUBROUTINE wzv 
     186         !                                             ! ocean depth (at u- and v-points) 
     187         hu(:,:) = hu_0(:,:) + sshu_n(:,:) 
     188         hv(:,:) = hv_0(:,:) + sshv_n(:,:) 
     189         !                                             ! masked inverse of the ocean depth (at u- and v-points) 
     190         hur(:,:) = umask(:,:,1) / ( hu(:,:) + 1.e0 - umask(:,:,1) ) 
     191         hvr(:,:) = vmask(:,:,1) / ( hv(:,:) + 1.e0 - vmask(:,:,1) ) 
     192 
     193      ENDIF 
     194      ! 
     195   END SUBROUTINE ssh_wzv 
     196 
     197 
     198   SUBROUTINE ssh_nxt( kt ) 
     199      !!---------------------------------------------------------------------- 
     200      !!                    ***  ROUTINE ssh_nxt  *** 
     201      !! 
     202      !! ** Purpose :   achieve the sea surface  height time stepping by  
     203      !!              applying Asselin time filter and swapping the arrays 
     204      !!              ssha  already computed in ssh_wzv   
     205      !! 
     206      !! ** Method  : - apply Asselin time fiter to now ssh and swap : 
     207      !!             sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 
     208      !!             sshn = ssha 
     209      !! 
     210      !! ** action  : - sshb, sshn   : before & now sea surface height 
     211      !!                               ready for the next time step 
     212      !!---------------------------------------------------------------------- 
     213      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     214      !! 
     215      INTEGER  ::   ji, jj               ! dummy loop indices 
     216      !!---------------------------------------------------------------------- 
     217 
     218      IF( kt == nit000 ) THEN 
     219         IF(lwp) WRITE(numout,*) 
     220         IF(lwp) WRITE(numout,*) 'ssh_nxt : next sea surface height (Asselin time filter + swap)' 
     221         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     222      ENDIF 
     223 
     224      ! Time filter and swap of the ssh 
     225      ! ------------------------------- 
     226 
     227      IF( lk_vvl ) THEN      ! Variable volume levels :   ssh at t-, u-, v, f-points 
     228         !                   ! ---------------------- ! 
     229         IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step : no filter 
     230            sshn  (:,:) = ssha  (:,:)                        ! now <-- after  (before already = now) 
     231            sshu_n(:,:) = sshu_a(:,:) 
     232            sshv_n(:,:) = sshv_a(:,:) 
     233            sshf_n(:,:) = sshf_a(:,:) 
     234         ELSE                                           ! Leap-Frog time-stepping: Asselin filter + swap 
     235            DO jj = 1, jpj 
     236               DO ji = 1, jpi                                ! before <-- now filtered 
     237                  sshb  (ji,jj) = sshn(ji,jj)   + atfp * ( sshb  (ji,jj) - 2 * sshn  (ji,jj) + ssha  (ji,jj) ) 
     238                  sshu_b(ji,jj) = sshu_n(ji,jj) + atfp * ( sshu_b(ji,jj) - 2 * sshu_n(ji,jj) + sshu_a(ji,jj) ) 
     239                  sshv_b(ji,jj) = sshv_n(ji,jj) + atfp * ( sshv_b(ji,jj) - 2 * sshv_n(ji,jj) + sshv_a(ji,jj) ) 
     240                  sshf_b(ji,jj) = sshf_n(ji,jj) + atfp * ( sshf_b(ji,jj) - 2 * sshf_n(ji,jj) + sshf_a(ji,jj) ) 
     241                  sshn  (ji,jj) = ssha  (ji,jj)              ! now <-- after 
     242                  sshu_n(ji,jj) = sshu_a(ji,jj) 
     243                  sshv_n(ji,jj) = sshv_a(ji,jj) 
     244                  sshf_n(ji,jj) = sshf_a(ji,jj) 
     245               END DO 
     246            END DO 
     247         ENDIF 
     248         ! 
     249      ELSE                   ! fixed levels :   ssh at t-point only 
     250         !                   ! ------------ ! 
     251         IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step : no filter 
     252            sshn(:,:) = ssha(:,:)                            ! now <-- after  (before already = now) 
     253            ! 
     254         ELSE                                           ! Leap-Frog time-stepping: Asselin filter + swap 
     255            DO jj = 1, jpj 
     256               DO ji = 1, jpi                                ! before <-- now filtered 
     257                  sshb(ji,jj) = sshn(ji,jj) + atfp * ( sshb(ji,jj) - 2 * sshn(ji,jj) + ssha(ji,jj) )     
     258                  sshn(ji,jj) = ssha(ji,jj)                  ! now <-- after 
     259               END DO 
     260            END DO 
     261         ENDIF 
     262         ! 
     263      ENDIF 
     264 
     265      !                      ! write filtered free surface arrays in restart file 
     266      IF( lrst_oce )   CALL ssh_rst( kt, 'WRITE' ) 
     267      ! 
     268      IF(ln_ctl)   CALL prt_ctl(tab2d_1=sshb    , clinfo1=' sshb  - : ', mask1=tmask, ovlap=1 ) 
     269      ! 
     270   END SUBROUTINE ssh_nxt 
     271 
     272 
     273   SUBROUTINE ssh_rst( kt, cdrw ) 
     274      !!--------------------------------------------------------------------- 
     275      !!                   ***  ROUTINE ssh_rst  *** 
     276      !! 
     277      !! ** Purpose :   Read or write Sea Surface Height arrays in restart file 
     278      !! 
     279      !! ** action  : - cdrw = READ  :  sshb, sshn  read    in ocean restart file 
     280      !!              - cdrw = WRITE :  sshb, sshn  written in ocean restart file 
     281      !!---------------------------------------------------------------------- 
     282      INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
     283      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     284      !!---------------------------------------------------------------------- 
     285      ! 
     286      IF( TRIM(cdrw) == 'READ' ) THEN 
     287         IF( iom_varid( numror, 'sshn', ldstop = .FALSE. ) > 0 ) THEN 
     288            CALL iom_get( numror, jpdom_autoglo, 'sshb'  , sshb(:,:)   ) 
     289            CALL iom_get( numror, jpdom_autoglo, 'sshn'  , sshn(:,:)   ) 
     290            IF( neuler == 0 )   sshb(:,:) = sshn(:,:) 
     291         ELSE 
     292            IF( nn_rstssh == 1 ) THEN 
     293               sshb(:,:) = 0.e0 
     294               sshn(:,:) = 0.e0 
     295            ENDIF 
     296         ENDIF 
     297      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
     298         CALL iom_rstput( kt, nitrst, numrow, 'sshb'  , sshb(:,:) ) 
     299         CALL iom_rstput( kt, nitrst, numrow, 'sshn'  , sshn(:,:) ) 
     300      ENDIF 
     301      ! 
     302   END SUBROUTINE ssh_rst 
    152303 
    153304   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.