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 5902 for branches/2015/dev_r5847_MERCATOR9_solveur_simplification/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2015-11-20T10:58:48+01:00 (8 years ago)
Author:
jchanut
Message:

Free surface simplification #1620. Step 3: Step readibility, suppress cpp key_dynspg_xxx

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5847_MERCATOR9_solveur_simplification/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90

    r5868 r5902  
    1919   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes 
    2020   !!            3.7  !  2014-04  (G. Madec) add the diagnostic of the time filter trends 
     21   !!            3.7  !  2015-11  (J. Chanut) Free surface simplification 
    2122   !!------------------------------------------------------------------------- 
    2223   
     
    2829   USE sbc_oce         ! Surface boundary condition: ocean fields 
    2930   USE phycst          ! physical constants 
    30    USE dynspg_oce      ! type of surface pressure gradient 
    3131   USE dynadv          ! dynamics: vector invariant versus flux form 
    3232   USE domvvl          ! variable volume 
     
    6868      !!                  ***  ROUTINE dyn_nxt  *** 
    6969      !!                    
    70       !! ** Purpose :   Compute the after horizontal velocity. Apply the boundary  
    71       !!             condition on the after velocity, achieved the time stepping  
     70      !! ** Purpose :   Finalize after horizontal velocity. Apply the boundary  
     71      !!             condition on the after velocity, achieve the time stepping  
    7272      !!             by applying the Asselin filter on now fields and swapping  
    7373      !!             the fields. 
    7474      !! 
    75       !! ** Method  : * After velocity is compute using a leap-frog scheme: 
    76       !!                       (ua,va) = (ub,vb) + 2 rdt (ua,va) 
    77       !!             Note that with flux form advection and variable volume layer 
    78       !!             (lk_vvl=T), the leap-frog is applied on thickness weighted 
    79       !!             velocity. 
     75      !! ** Method  : * Ensure after velocities transport matches time splitting 
     76      !!             estimate (ln_dynspg_ts=T) 
    8077      !! 
    8178      !!              * Apply lateral boundary conditions on after velocity  
     
    9996      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    10097      INTEGER  ::   iku, ikv     ! local integers 
    101       REAL(wp) ::   z2dt         ! temporary scalar 
    102       REAL(wp) ::   zue3a, zue3n, zue3b, zuf, zec      ! local scalars 
     98      REAL(wp) ::   zue3a, zue3n, zue3b, zuf           ! local scalars 
    10399      REAL(wp) ::   zve3a, zve3n, zve3b, zvf, z1_2dt   !   -      - 
    104100      REAL(wp), POINTER, DIMENSION(:,:)   ::  zue, zve 
     
    108104      IF( nn_timing == 1 )   CALL timing_start('dyn_nxt') 
    109105      ! 
    110       CALL wrk_alloc( jpi,jpj,jpk,  ze3u_f, ze3v_f, zua, zva ) 
    111       IF( lk_dynspg_ts )   CALL wrk_alloc( jpi,jpj, zue, zve ) 
     106      IF( ln_dynspg_ts )   CALL wrk_alloc( jpi,jpj, zue, zve ) 
     107      IF( lk_vvl.AND.(.NOT.ln_dynadv_vec ) ) CALL wrk_alloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 
     108      IF( l_trddyn     )   CALL wrk_alloc( jpi,jpj,jpk, zua, zva ) 
    112109      ! 
    113110      IF( kt == nit000 ) THEN 
     
    117114      ENDIF 
    118115 
    119 # if defined key_dynspg_exp 
    120       ! Next velocity :   Leap-frog time stepping 
    121       ! ------------- 
    122       z2dt = 2. * rdt                                 ! Euler or leap-frog time step  
    123       IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt 
    124       ! 
    125       IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     116      IF ( ln_dynspg_ts ) THEN 
     117         ! Ensure below that barotropic velocities match time splitting estimate 
     118         ! Compute actual transport and replace it with ts estimate at "after" time step 
     119         zue(:,:) = fse3u_a(:,:,1) * ua(:,:,1) * umask(:,:,1) 
     120         zve(:,:) = fse3v_a(:,:,1) * va(:,:,1) * vmask(:,:,1) 
     121         DO jk = 2, jpkm1 
     122            zue(:,:) = zue(:,:) + fse3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
     123            zve(:,:) = zve(:,:) + fse3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 
     124         END DO 
    126125         DO jk = 1, jpkm1 
    127             ua(:,:,jk) = ( ub(:,:,jk) + z2dt * ua(:,:,jk) ) * umask(:,:,jk) 
    128             va(:,:,jk) = ( vb(:,:,jk) + z2dt * va(:,:,jk) ) * vmask(:,:,jk) 
    129          END DO 
    130       ELSE                                            ! applied on thickness weighted velocity 
    131          DO jk = 1, jpkm1 
    132             ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
    133                &           + z2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
    134                &         / fse3u_a(:,:,jk) * umask(:,:,jk) 
    135             va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
    136                &           + z2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
    137                &         / fse3v_a(:,:,jk) * vmask(:,:,jk) 
    138          END DO 
    139       ENDIF 
    140 # endif 
    141  
    142 # if defined key_dynspg_ts 
    143 !!gm IF ( lk_dynspg_ts ) THEN .... 
    144       ! Ensure below that barotropic velocities match time splitting estimate 
    145       ! Compute actual transport and replace it with ts estimate at "after" time step 
    146       zue(:,:) = fse3u_a(:,:,1) * ua(:,:,1) * umask(:,:,1) 
    147       zve(:,:) = fse3v_a(:,:,1) * va(:,:,1) * vmask(:,:,1) 
    148       DO jk = 2, jpkm1 
    149          zue(:,:) = zue(:,:) + fse3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
    150          zve(:,:) = zve(:,:) + fse3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 
    151       END DO 
    152       DO jk = 1, jpkm1 
    153          ua(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * hur_a(:,:) + ua_b(:,:) ) * umask(:,:,jk) 
    154          va(:,:,jk) = ( va(:,:,jk) - zve(:,:) * hvr_a(:,:) + va_b(:,:) ) * vmask(:,:,jk) 
    155       END DO 
    156  
    157       IF (lk_dynspg_ts.AND.(.NOT.ln_bt_fw)) THEN 
    158          ! Remove advective velocity from "now velocities"  
    159          ! prior to asselin filtering      
    160          ! In the forward case, this is done below after asselin filtering    
    161          ! so that asselin contribution is removed at the same time  
    162          DO jk = 1, jpkm1 
    163             un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:) + un_b(:,:) )*umask(:,:,jk) 
    164             vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:) + vn_b(:,:) )*vmask(:,:,jk) 
    165          END DO   
    166       ENDIF 
    167 !!gm ENDIF 
    168 # endif 
     126            ua(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * hur_a(:,:) + ua_b(:,:) ) * umask(:,:,jk) 
     127            va(:,:,jk) = ( va(:,:,jk) - zve(:,:) * hvr_a(:,:) + va_b(:,:) ) * vmask(:,:,jk) 
     128         END DO 
     129 
     130         IF ( .NOT.ln_bt_fw ) THEN 
     131            ! Remove advective velocity from "now velocities"  
     132            ! prior to asselin filtering      
     133            ! In the forward case, this is done below after asselin filtering    
     134            ! so that asselin contribution is removed at the same time  
     135            DO jk = 1, jpkm1 
     136               un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:) + un_b(:,:) )*umask(:,:,jk) 
     137               vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:) + vn_b(:,:) )*vmask(:,:,jk) 
     138            END DO   
     139         ENDIF 
     140      ENDIF 
    169141 
    170142      ! Update after velocity on domain lateral boundaries 
    171143      ! --------------------------------------------------       
    172       CALL lbc_lnk( ua, 'U', -1. )     !* local domain boundaries 
    173       CALL lbc_lnk( va, 'V', -1. )  
    174       ! 
    175 # if defined key_bdy 
    176       !                                !* BDY open boundaries 
    177       IF( lk_bdy .AND. lk_dynspg_exp ) CALL bdy_dyn( kt ) 
    178       IF( lk_bdy .AND. lk_dynspg_ts  ) CALL bdy_dyn( kt, dyn3d_only=.true. ) 
    179  
    180 !!$   Do we need a call to bdy_vol here?? 
    181       ! 
    182 # endif 
    183       ! 
    184144# if defined key_agrif 
    185145      CALL Agrif_dyn( kt )             !* AGRIF zoom boundaries 
    186146# endif 
    187  
     147      ! 
     148      CALL lbc_lnk( ua, 'U', -1. )     !* local domain boundaries 
     149      CALL lbc_lnk( va, 'V', -1. )  
     150      ! 
     151# if defined key_bdy 
     152      !                                !* BDY open boundaries 
     153      IF( lk_bdy .AND. ln_dynspg_exp ) CALL bdy_dyn( kt ) 
     154      IF( lk_bdy .AND. ln_dynspg_ts  ) CALL bdy_dyn( kt, dyn3d_only=.true. ) 
     155 
     156!!$   Do we need a call to bdy_vol here?? 
     157      ! 
     158# endif 
     159      ! 
    188160      IF( l_trddyn ) THEN             ! prepare the atf trend computation + some diagnostics 
    189161         z1_2dt = 1._wp / (2. * rdt)        ! Euler or leap-frog time step  
     
    242214            ! (used as a now filtered scale factor until the swap) 
    243215            ! ---------------------------------------------------- 
    244             IF (lk_dynspg_ts.AND.ln_bt_fw) THEN 
     216            IF (ln_dynspg_ts.AND.ln_bt_fw) THEN 
    245217               ! No asselin filtering on thicknesses if forward time splitting 
    246                   fse3t_b(:,:,:) = fse3t_n(:,:,:) 
     218               fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    247219            ELSE 
    248220               fse3t_b(:,:,:) = fse3t_n(:,:,:) + atfp * ( fse3t_b(:,:,:) - 2._wp * fse3t_n(:,:,:) + fse3t_a(:,:,:) ) 
     
    319291         ENDIF 
    320292         ! 
    321          IF (lk_dynspg_ts.AND.ln_bt_fw) THEN 
     293         IF (ln_dynspg_ts.AND.ln_bt_fw) THEN 
    322294            ! Revert "before" velocities to time split estimate 
    323295            ! Doing it here also means that asselin filter contribution is removed   
     
    383355      IF(ln_ctl)   CALL prt_ctl( tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask,   & 
    384356         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
    385       !  
    386       CALL wrk_dealloc( jpi,jpj,jpk,  ze3u_f, ze3v_f, zua, zva ) 
    387       IF( lk_dynspg_ts )   CALL wrk_dealloc( jpi,jpj, zue, zve ) 
     357      ! 
     358      IF( ln_dynspg_ts )   CALL wrk_dealloc( jpi,jpj, zue, zve ) 
     359      IF( lk_vvl.AND.(.NOT.ln_dynadv_vec ) ) CALL wrk_dealloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 
     360      IF( l_trddyn     )   CALL wrk_dealloc( jpi,jpj,jpk, zua, zva ) 
    388361      ! 
    389362      IF( nn_timing == 1 )  CALL timing_stop('dyn_nxt') 
Note: See TracChangeset for help on using the changeset viewer.