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 5930 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90 – NEMO

Ignore:
Timestamp:
2015-11-26T17:07:10+01:00 (8 years ago)
Author:
jchanut
Message:

#1620 Merge free surface simplification into trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r5836 r5930  
    2525   USE wrk_nemo        ! Memory Allocation 
    2626   USE timing          ! Timing 
    27    USE dynadv          ! dynamics: vector invariant versus flux form 
    28    USE dynspg_oce, ONLY: lk_dynspg_ts 
     27   USE dynadv, ONLY: ln_dynadv_vec ! Momentum advection form 
    2928 
    3029   IMPLICIT NONE 
     
    8786      ENDIF 
    8887 
    89       ! 0. Local constant initialization 
    90       ! -------------------------------- 
    91       z1_p2dt = 1._wp / p2dt      ! inverse of the timestep 
    92  
    93       ! 1. Apply semi-implicit bottom friction 
     88      ! 1. Time step dynamics 
     89      ! --------------------- 
     90 
     91      IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     92         DO jk = 1, jpkm1 
     93            ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     94            va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     95         END DO 
     96      ELSE                                            ! applied on thickness weighted velocity 
     97         DO jk = 1, jpkm1 
     98            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
     99               &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
     100               &                               / fse3u_a(:,:,jk) * umask(:,:,jk) 
     101            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
     102               &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
     103               &                               / fse3v_a(:,:,jk) * vmask(:,:,jk) 
     104         END DO 
     105      ENDIF 
     106 
     107      ! 2. Apply semi-implicit bottom friction 
    94108      ! -------------------------------------- 
    95109      ! Only needed for semi-implicit bottom friction setup. The explicit 
     
    97111      ! column vector of the tri-diagonal matrix equation 
    98112      ! 
    99  
    100113      IF( ln_bfrimp ) THEN 
    101114         DO jj = 2, jpjm1 
     
    119132      ENDIF 
    120133 
    121 #if defined key_dynspg_ts 
    122       IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
    123          DO jk = 1, jpkm1 
    124             ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
    125             va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
    126          END DO 
    127       ELSE                                            ! applied on thickness weighted velocity 
    128          DO jk = 1, jpkm1 
    129             ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
    130                &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
    131                &                               / fse3u_a(:,:,jk) * umask(:,:,jk) 
    132             va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
    133                &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
    134                &                               / fse3v_a(:,:,jk) * vmask(:,:,jk) 
    135          END DO 
    136       ENDIF 
    137  
    138       IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN 
     134      ! With split-explicit free surface, barotropic stress is treated explicitly 
     135      ! Update velocities at the bottom. 
     136      ! J. Chanut: The bottom stress is computed considering after barotropic velocities, which does  
     137      !            not lead to the effective stress seen over the whole barotropic loop.  
     138      IF ( ln_bfrimp .AND.ln_dynspg_ts ) THEN 
    139139         ! remove barotropic velocities: 
    140140         DO jk = 1, jpkm1 
     
    166166         END IF 
    167167      ENDIF 
    168 #endif 
    169  
    170       ! 2. Vertical diffusion on u 
     168 
     169      ! 3. Vertical diffusion on u 
    171170      ! --------------------------- 
    172171      ! Matrix and second member construction 
     
    219218      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    220219         DO ji = fs_2, fs_jpim1   ! vector opt. 
    221 #if defined key_dynspg_ts 
    222220            ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl   * fse3u_a(ji,jj,1)  
    223221            ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    224222               &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1)  
    225 #else 
    226             ua(ji,jj,1) = ub(ji,jj,1) & 
    227                &                   + p2dt *(ua(ji,jj,1) +  0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    228                &                                      / ( fse3u(ji,jj,1) * rau0     ) * umask(ji,jj,1) )  
    229 #endif 
    230223         END DO 
    231224      END DO 
     
    233226         DO jj = 2, jpjm1 
    234227            DO ji = fs_2, fs_jpim1 
    235 #if defined key_dynspg_ts 
    236228               zrhs = ua(ji,jj,jk)   ! zrhs=right hand side 
    237 #else 
    238                zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 
    239 #endif 
    240229               ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
    241230            END DO 
     
    256245      END DO 
    257246 
    258 #if ! defined key_dynspg_ts 
    259       ! Normalization to obtain the general momentum trend ua 
    260       DO jk = 1, jpkm1 
    261          DO jj = 2, jpjm1    
    262             DO ji = fs_2, fs_jpim1   ! vector opt. 
    263                ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) * z1_p2dt 
    264             END DO 
    265          END DO 
    266       END DO 
    267 #endif 
    268  
    269       ! 3. Vertical diffusion on v 
     247      ! 4. Vertical diffusion on v 
    270248      ! --------------------------- 
    271249      ! Matrix and second member construction 
     
    317295      ! 
    318296      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    319          DO ji = fs_2, fs_jpim1   ! vector opt. 
    320 #if defined key_dynspg_ts             
     297         DO ji = fs_2, fs_jpim1   ! vector opt.           
    321298            ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl   * fse3v_a(ji,jj,1)  
    322299            va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    323300               &                                      / ( ze3va * rau0 )  
    324 #else 
    325             va(ji,jj,1) = vb(ji,jj,1) & 
    326                &                   + p2dt *(va(ji,jj,1) +  0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    327                &                                                       / ( fse3v(ji,jj,1) * rau0     )  ) 
    328 #endif 
    329301         END DO 
    330302      END DO 
     
    332304         DO jj = 2, jpjm1 
    333305            DO ji = fs_2, fs_jpim1   ! vector opt. 
    334 #if defined key_dynspg_ts 
    335306               zrhs = va(ji,jj,jk)   ! zrhs=right hand side 
    336 #else 
    337                zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 
    338 #endif 
    339307               va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
    340308            END DO 
     
    355323      END DO 
    356324 
    357       ! Normalization to obtain the general momentum trend va 
    358 #if ! defined key_dynspg_ts 
    359       DO jk = 1, jpkm1 
    360          DO jj = 2, jpjm1    
    361             DO ji = fs_2, fs_jpim1   ! vector opt. 
    362                va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) * z1_p2dt 
    363             END DO 
    364          END DO 
    365       END DO 
    366 #endif 
    367  
    368325      ! J. Chanut: Lines below are useless ? 
    369       !! restore bottom layer avmu(v)  
     326      !! restore avmu(v)=0. at bottom (and top if ln_isfcav=T interfaces) 
    370327      IF( ln_bfrimp ) THEN 
    371328        DO jj = 2, jpjm1 
Note: See TracChangeset for help on using the changeset viewer.