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 1361 for branches/dev_004_VVL/NEMO/OPA_SRC/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2009-03-31T18:26:41+02:00 (15 years ago)
Author:
rblod
Message:

dev004_VVL: new organisation see ticket #389

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_004_VVL/NEMO/OPA_SRC/DYN/dynnxt.F90

    r1152 r1361  
    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.1  !  2009-02  (G. Madec)  re-introduce the vvl option 
     18   !!---------------------------------------------------------------------- 
     19   
    720   !!---------------------------------------------------------------------- 
    821   !!   dyn_nxt      : update the horizontal velocity from the momentum trend 
     
    3447#  include "domzgr_substitute.h90" 
    3548   !!---------------------------------------------------------------------- 
     49   !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     50   !! $Id$  
     51   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     52   !!---------------------------------------------------------------------- 
    3653 
    3754CONTAINS 
     
    5976      !!             - Update un,vn arrays, the now horizontal velocity 
    6077      !! 
    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.  
    7278      !!---------------------------------------------------------------------- 
    73       !! * Arguments 
    7479      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    75  
    76       !! * Local declarations 
    77       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     80      !! 
     81      INTEGER  ::   jk   ! dummy loop indices 
    7882      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  
    9183      !!---------------------------------------------------------------------- 
    9284 
     
    10294 
    10395      !! 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          ! ------------------- 
    156          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 
    17296 
    17397      ! Lateral boundary conditions on ( ua, va ) 
     
    17599      CALL lbc_lnk( va, 'V', -1. ) 
    176100 
    177       !                                                ! =============== 
    178       DO jk = 1, jpkm1                                 ! Horizontal slab 
    179          !                                             ! =============== 
    180          ! Next velocity 
    181          ! ------------- 
     101      ! Next velocity 
     102      ! ------------- 
    182103#if defined key_dynspg_flt 
    183          ! Leap-frog time stepping already done in dynspg.F routine 
     104      ! Leap-frog time stepping already done in dynspg_flt.F routine 
    184105#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 
     106      IF( lk_vvl ) THEN                                  ! Varying levels 
     107         !RB_vvl scale factors are wrong at this point 
     108         DO jk = 1, jpkm1 
     109            ua(ji,jj,jk) = (        ub(:,:,jk) * fse3u(:,:,jk)     & 
     110               &           + z2dt * ua(:,:,jk) * fse3u(:,:,jk) )   & 
     111               &         / fse3u(:,:,jk) * umask(:,:,jk) 
     112            va(ji,jj,jk) = (        vb(:,:,jk) * fse3v(:,:,jk)     & 
     113               &           + z2dt * va(:,:,jk) * fse3v(:,:,jk) )   & 
     114               &         / fse3v(:,:,jk) * vmask(:,:,jk) 
     115         END DO 
     116      ELSE 
     117         DO jk = 1, jpkm1 
     118                  ! Leap-frog time stepping 
     119            ua(:,:,jk) = ( ub(:,:,jk) + z2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     120            va(:,:,jk) = ( vb(:,:,jk) + z2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     121         END DO 
     122      ENDIF 
    210123 
    211124# if defined key_obc 
    212          !                                             ! =============== 
    213       END DO                                           !   End of slab 
    214       !                                                ! =============== 
    215125      ! Update (ua,va) along open boundaries (only in the rigid-lid case) 
    216126      CALL obc_dyn( kt ) 
     
    235145      ENDIF 
    236146 
    237       !                                                ! =============== 
    238       DO jk = 1, jpkm1                                 ! Horizontal slab 
    239          !                                             ! =============== 
    240147# elif defined key_bdy  
    241          !                                             ! =============== 
    242       END DO                                           !   End of slab 
    243       !                                                ! =============== 
    244148      ! Update (ua,va) along open boundaries (for exp or ts options). 
    245149      IF ( lk_dynspg_exp .or. lk_dynspg_ts ) THEN 
     
    279183      ENDIF 
    280184 
    281       !                                                ! =============== 
    282       DO jk = 1, jpkm1                                 ! Horizontal slab 
    283          !                                             ! =============== 
    284185# endif 
    285186# 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) 
    290187      CALL Agrif_dyn( kt ) 
    291       !                                                ! =============== 
    292       DO jk = 1, jpkm1                                 ! Horizontal slab 
    293          !                                             ! =============== 
    294188# endif 
    295189#endif 
    296190 
    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 
    303                DO jj = 1, jpj 
    304                   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) 
    313                   END DO 
    314                END DO 
    315             ELSE                                               ! Fixed levels 
    316                DO jj = 1, jpj 
    317                   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) 
    321                      un(ji,jj,jk) = ua(ji,jj,jk) 
    322                      vn(ji,jj,jk) = va(ji,jj,jk) 
    323                   END DO 
    324                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 
     191      ! Time filter and swap of dynamics arrays 
     192      ! ------------------------------------------ 
     193      IF( neuler == 0 .AND. kt == nit000 ) THEN 
     194         DO jk = 1, jpkm1                                  
     195            ub(:,:,jk) = un(:,:,jk)  
     196            vb(:,:,jk) = vn(:,:,jk) 
     197            un(:,:,jk) = ua(:,:,jk) 
     198            vn(:,:,jk) = va(:,:,jk) 
     199         END DO 
     200      ELSE 
     201         IF( lk_vvl ) THEN                                ! Varying levels 
     202            ! Not done 
     203         ELSE                                             ! Fixed levels 
     204!RB_vvl : should be done as in tranxt ? 
     205            DO jk = 1, jpkm1                              ! filter applied on velocities 
     206               ub(:,:,jk) = atfp * ( ub(:,:,jk) + ua(:,:,jk) ) + atfp1 * un(:,:,jk) 
     207               vb(:,:,jk) = atfp * ( vb(:,:,jk) + va(:,:,jk) ) + atfp1 * vn(:,:,jk) 
     208               un(:,:,jk) = ua(:,:,jk) 
     209               vn(:,:,jk) = va(:,:,jk) 
     210            END DO 
    355211         ENDIF 
    356          !                                             ! =============== 
    357       END DO                                           !   End of slab 
    358       !                                                ! =============== 
     212      ENDIF 
    359213 
    360214      IF(ln_ctl)   THEN 
Note: See TracChangeset for help on using the changeset viewer.