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 6004 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2015-12-04T17:05:58+01:00 (8 years ago)
Author:
gm
Message:

#1613: vvl by default, step III: Merge with the trunk (free surface simplification) (see wiki)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r5904 r6004  
    11MODULE dynspg_ts 
     2   !!====================================================================== 
     3   !!                   ***  MODULE  dynspg_ts  *** 
     4   !! Ocean dynamics:  surface pressure gradient trend, split-explicit scheme 
    25   !!====================================================================== 
    36   !! History :   1.0  ! 2004-12  (L. Bessieres, G. Madec)  Original code 
     
    1114   !!             3.5  ! 2013-07  (J. Chanut) Switch to Forward-backward time stepping 
    1215   !!             3.6  ! 2013-11  (A. Coward) Update for z-tilde compatibility 
     16   !!             3.7  ! 2015-11  (J. Chanut) free surface simplification 
    1317   !!--------------------------------------------------------------------- 
    14 #if defined key_dynspg_ts 
     18 
    1519   !!---------------------------------------------------------------------- 
    16    !!   'key_dynspg_ts'         split explicit free surface 
    17    !!---------------------------------------------------------------------- 
    18    !!   dyn_spg_ts  : compute surface pressure gradient trend using a time- 
    19    !!                 splitting scheme and add to the general trend  
     20   !!   dyn_spg_ts     : compute surface pressure gradient trend using a time-splitting scheme  
     21   !!   dyn_spg_ts_init: initialisation of the time-splitting scheme 
     22   !!   ts_wgt         : set time-splitting weights for temporal averaging (or not) 
     23   !!   ts_rst         : read/write time-splitting fields in restart file 
    2024   !!---------------------------------------------------------------------- 
    2125   USE oce             ! ocean dynamics and tracers 
    2226   USE dom_oce         ! ocean space and time domain 
    2327   USE sbc_oce         ! surface boundary condition: ocean 
     28   USE zdf_oce         ! Bottom friction coefts 
    2429   USE sbcisf          ! ice shelf variable (fwfisf) 
    25    USE dynspg_oce      ! surface pressure gradient variables 
     30   USE sbcapr          ! surface boundary condition: atmospheric pressure 
     31   USE dynadv    , ONLY: ln_dynadv_vec 
    2632   USE phycst          ! physical constants 
    2733   USE dynvor          ! vorticity term 
    2834   USE bdy_par         ! for lk_bdy 
    29    USE bdytides        ! open boundary condition data      
     35   USE bdytides        ! open boundary condition data 
    3036   USE bdydyn2d        ! open boundary conditions on barotropic variables 
    3137   USE sbctide         ! tides 
    3238   USE updtide         ! tide potential 
     39   ! 
     40   USE in_out_manager  ! I/O manager 
    3341   USE lib_mpp         ! distributed memory computing library 
    3442   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3543   USE prtctl          ! Print control 
    36    USE in_out_manager  ! I/O manager 
    3744   USE iom             ! IOM library 
    3845   USE restart         ! only for lrst_oce 
    39    USE zdf_oce         ! Bottom friction coefts 
    4046   USE wrk_nemo        ! Memory Allocation 
    4147   USE timing          ! Timing     
    42    USE sbcapr          ! surface boundary condition: atmospheric pressure 
    43    USE dynadv, ONLY: ln_dynadv_vec 
    4448#if defined key_agrif 
    4549   USE agrif_opa_interp ! agrif 
     
    6064   REAL(wp),SAVE :: rdtbt   ! Barotropic time step 
    6165 
    62    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: & 
    63                     wgtbtp1, &              ! Primary weights used for time filtering of barotropic variables 
    64                     wgtbtp2                 ! Secondary weights used for time filtering of barotropic variables 
    65  
    66    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz          ! ff/h at F points 
    67    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne   ! triad of coriolis parameter 
    68    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   ! (only used with een vorticity scheme) 
    69  
    70    ! Arrays below are saved to allow testing of the "no time averaging" option 
    71    ! If this option is not retained, these could be replaced by temporary arrays 
    72    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sshbb_e, sshb_e, & ! Instantaneous barotropic arrays 
    73                                                    ubb_e, ub_e,     & 
    74                                                    vbb_e, vb_e 
     66   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::   wgtbtp1, wgtbtp2   !: 1st & 2nd weights used in time filtering of barotropic fields 
     67 
     68   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz          !: ff/h at F points 
     69   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne   !: triad of coriolis parameter 
     70   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   !: (only used with een vorticity scheme) 
     71 
     72   !! Time filtered arrays at baroclinic time step: 
     73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv     !: Advection vel. at "now" barocl. step 
     74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ub2_b  , vb2_b      !: Half step fluxes (ln_bt_fw=T) 
     75#if defined key_agrif 
     76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ub2_i_b,  vb2_i_b   !: Half step time integrated fluxes  
     77#endif 
     78 
     79   !! Arrays at barotropic time step:                   ! bef before !   before   !    now     !   after    ! 
     80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ubb_e    ,    ub_e    ,    un_e    ,    ua_e    !: u-external velocity 
     81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vbb_e    ,    vb_e    ,    vn_e    ,    va_e    !: v-external velocity 
     82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshbb_e  ,    sshb_e  ,    sshn_e  ,    ssha_e  !: external ssh 
     83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hu_e                 !: external u-depth 
     84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hv_e                 !: external v-depth 
     85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hur_e                !: inverse of u-depth 
     86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hvr_e                !: inverse of v-depth 
    7587 
    7688   !! * Substitutions 
     
    8799      !!                  ***  routine dyn_spg_ts_alloc  *** 
    88100      !!---------------------------------------------------------------------- 
    89       INTEGER :: ierr(3) 
     101      INTEGER :: ierr(5) 
    90102      !!---------------------------------------------------------------------- 
    91103      ierr(:) = 0 
    92104      ! 
    93       ALLOCATE( sshb_e(jpi,jpj), sshbb_e(jpi,jpj), & 
    94          &      ub_e(jpi,jpj)  , vb_e(jpi,jpj)   , & 
    95          &      ubb_e(jpi,jpj) , vbb_e(jpi,jpj)  , STAT= ierr(1) ) 
    96          ! 
    97       ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT= ierr(2) ) 
    98       ! 
    99       IF( ln_dynvor_een ) ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , &  
    100          &                          ftsw(jpi,jpj) , ftse(jpi,jpj) , STAT=ierr(3) ) 
     105      ALLOCATE( ssha_e(jpi,jpj),  sshn_e(jpi,jpj), sshb_e(jpi,jpj), sshbb_e(jpi,jpj), & 
     106         &        ua_e(jpi,jpj),    un_e(jpi,jpj),   ub_e(jpi,jpj),   ubb_e(jpi,jpj), & 
     107         &        va_e(jpi,jpj),    vn_e(jpi,jpj),   vb_e(jpi,jpj),   vbb_e(jpi,jpj), & 
     108         &        hu_e(jpi,jpj),   hur_e(jpi,jpj),   hv_e(jpi,jpj),   hvr_e(jpi,jpj), STAT=ierr(1) ) 
     109         ! 
     110      ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj)                , STAT=ierr(2) ) 
     111      ! 
     112      IF( ln_dynvor_een )   ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj)                 , &  
     113         &                            ftsw(jpi,jpj) , ftse(jpi,jpj)                 , STAT=ierr(3) ) 
     114         ! 
     115      ALLOCATE( ub2_b(jpi,jpj), vb2_b(jpi,jpj), un_adv(jpi,jpj), vn_adv(jpi,jpj)    , STAT=ierr(4) ) 
     116#if defined key_agrif 
     117      ALLOCATE( ub2_i_b(jpi,jpj), vb2_i_b(jpi,jpj)                                  , STAT= ierr(5)) 
     118#endif 
    101119      ! 
    102120      dyn_spg_ts_alloc = MAXVAL( ierr(:) ) 
     121      ! 
    103122      IF( lk_mpp                )   CALL mpp_sum( dyn_spg_ts_alloc ) 
    104       IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_warn('dynspg_oce_alloc: failed to allocate arrays') 
     123      IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_warn('dyn_spg_ts_alloc: failed to allocate arrays') 
    105124      ! 
    106125   END FUNCTION dyn_spg_ts_alloc 
     
    110129      !!---------------------------------------------------------------------- 
    111130      !! 
    112       !! ** Purpose :    
    113       !!      -Compute the now trend due to the explicit time stepping 
    114       !!      of the quasi-linear barotropic system.  
     131      !! ** Purpose : - Compute the now trend due to the explicit time stepping 
     132      !!              of the quasi-linear barotropic system, and add it to the 
     133      !!              general momentum trend.  
    115134      !! 
    116       !! ** Method  :   
     135      !! ** Method  : - split-explicit schem (time splitting) : 
    117136      !!      Barotropic variables are advanced from internal time steps 
    118137      !!      "n"   to "n+1" if ln_bt_fw=T 
     
    128147      !!      continuity equation taken at the baroclinic time steps. This  
    129148      !!      ensures tracers conservation. 
    130       !!      -Update 3d trend (ua, va) with barotropic component. 
     149      !!      - (ua, va) momentum trend updated with barotropic component. 
    131150      !! 
    132       !! References : Shchepetkin, A.F. and J.C. McWilliams, 2005:  
    133       !!              The regional oceanic modeling system (ROMS):  
    134       !!              a split-explicit, free-surface, 
    135       !!              topography-following-coordinate oceanic model.  
    136       !!              Ocean Modelling, 9, 347-404.  
     151      !! References : Shchepetkin and McWilliams, Ocean Modelling, 2005.  
    137152      !!--------------------------------------------------------------------- 
    138153      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
     
    149164      REAL(wp) ::   za0, za1, za2, za3         !   -      - 
    150165      ! 
    151       REAL(wp), POINTER, DIMENSION(:,:) ::   zun_e, zvn_e, zsshp2_e 
    152       REAL(wp), POINTER, DIMENSION(:,:) ::   zu_trd, zv_trd, zu_frc, zv_frc, zssh_frc 
    153       REAL(wp), POINTER, DIMENSION(:,:) ::   zu_sum, zv_sum, zwx, zwy, zhdiv 
    154       REAL(wp), POINTER, DIMENSION(:,:) ::   zhup2_e, zhvp2_e, zhust_e, zhvst_e 
    155       REAL(wp), POINTER, DIMENSION(:,:) ::   zsshu_a, zsshv_a 
    156       REAL(wp), POINTER, DIMENSION(:,:) ::   zhf 
     166      REAL(wp), POINTER, DIMENSION(:,:) :: zsshp2_e 
     167      REAL(wp), POINTER, DIMENSION(:,:) :: zu_trd, zv_trd, zu_frc, zv_frc, zssh_frc 
     168      REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zhdiv 
     169      REAL(wp), POINTER, DIMENSION(:,:) :: zhup2_e, zhvp2_e, zhust_e, zhvst_e 
     170      REAL(wp), POINTER, DIMENSION(:,:) :: zsshu_a, zsshv_a 
     171      REAL(wp), POINTER, DIMENSION(:,:) :: zhf 
    157172      !!---------------------------------------------------------------------- 
    158173      ! 
    159174      IF( nn_timing == 1 )  CALL timing_start('dyn_spg_ts') 
    160175      ! 
     176      !                                         !* Allocate temporary arrays 
    161177      CALL wrk_alloc( jpi,jpj,   zsshp2_e, zhdiv ) 
    162       CALL wrk_alloc( jpi,jpj,   zu_trd, zv_trd, zun_e, zvn_e  ) 
    163       CALL wrk_alloc( jpi,jpj,   zwx, zwy, zu_sum, zv_sum, zssh_frc, zu_frc, zv_frc) 
     178      CALL wrk_alloc( jpi,jpj,   zu_trd, zv_trd) 
     179      CALL wrk_alloc( jpi,jpj,   zwx, zwy, zssh_frc, zu_frc, zv_frc) 
    164180      CALL wrk_alloc( jpi,jpj,   zhup2_e, zhvp2_e, zhust_e, zhvst_e) 
    165       CALL wrk_alloc( jpi,jpj,   zsshu_a, zsshv_a ) 
     181      CALL wrk_alloc( jpi,jpj,   zsshu_a, zsshv_a                                   ) 
    166182      CALL wrk_alloc( jpi,jpj,   zhf ) 
    167183      ! 
     
    180196      ll_fw_start = .FALSE. 
    181197      !                                            ! time offset in steps for bdy data update 
    182       IF( .NOT.ln_bt_fw ) THEN   ;   noffset =-2*nn_baro 
    183       ELSE                       ;   noffset = 0  
     198      IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_baro 
     199      ELSE                       ;   noffset =   0  
    184200      ENDIF 
    185201      ! 
     
    194210         ! 
    195211         IF( ln_bt_fw .OR. neuler == 0 ) THEN 
    196             ll_fw_start=.TRUE. 
    197             noffset = 0 
     212            ll_fw_start =.TRUE. 
     213            noffset     = 0 
    198214         ELSE 
    199             ll_fw_start=.FALSE. 
     215            ll_fw_start =.FALSE. 
    200216         ENDIF 
    201217         ! 
     
    212228      ! and update depths at T-F points (ht and zhf resp.) at each barotropic time step 
    213229      ! 
    214       IF ( kt == nit000 .OR. .NOT.ln_linssh ) THEN 
    215          IF ( ln_dynvor_een ) THEN              !==  EEN scheme  ==! 
     230      IF( kt == nit000 .OR. .NOT.ln_linssh ) THEN 
     231         IF( ln_dynvor_een ) THEN               !==  EEN scheme  ==! 
    216232            SELECT CASE( nn_een_e3f )              !* ff/e3 at F-point 
    217233            CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     
    219235                  DO ji = 1, jpim1 
    220236                     zwz(ji,jj) =   ( ht_n(ji  ,jj+1) + ht_n(ji+1,jj+1) +                    & 
    221                         &             ht_n(ji  ,jj  ) + ht_n(ji+1,jj  )   ) / 4._wp   
     237                        &             ht_n(ji  ,jj  ) + ht_n(ji+1,jj  )   ) * 0.25_wp   
    222238                     IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff(ji,jj) / zwz(ji,jj) 
    223239                  END DO 
     
    407423      zv_frc(:,:) = zv_frc(:,:) + r1_hv_n(:,:) * bfrva(:,:) * zwy(:,:) 
    408424      !        
    409       IF (ln_bt_fw) THEN                        ! Add wind forcing 
     425      IF( ln_bt_fw ) THEN                        ! Add wind forcing 
    410426         zu_frc(:,:) =  zu_frc(:,:) + zraur * utau(:,:) * r1_hu_n(:,:) 
    411427         zv_frc(:,:) =  zv_frc(:,:) + zraur * vtau(:,:) * r1_hv_n(:,:) 
     
    477493      ! 
    478494      IF (ln_bt_fw) THEN                  ! FORWARD integration: start from NOW fields                     
    479          sshn_e(:,:) = sshn(:,:)             
    480          zun_e (:,:) = un_b(:,:)             
    481          zvn_e (:,:) = vn_b(:,:) 
     495         sshn_e(:,:) =    sshn(:,:)             
     496         un_e  (:,:) =    un_b(:,:)             
     497         vn_e  (:,:) =    vn_b(:,:) 
    482498         ! 
    483499         hu_e  (:,:) =    hu_n(:,:)        
     
    486502         hvr_e (:,:) = r1_hv_n(:,:) 
    487503      ELSE                                ! CENTRED integration: start from BEFORE fields 
    488          sshn_e(:,:) = sshb(:,:) 
    489          zun_e (:,:) = ub_b(:,:)          
    490          zvn_e (:,:) = vb_b(:,:) 
     504         sshn_e(:,:) =    sshb(:,:) 
     505         un_e  (:,:) =    ub_b(:,:)          
     506         vn_e  (:,:) =    vb_b(:,:) 
    491507         ! 
    492508         hu_e  (:,:) =    hu_b(:,:)        
     
    502518      va_b  (:,:) = 0._wp 
    503519      ssha  (:,:) = 0._wp       ! Sum for after averaged sea level 
    504       zu_sum(:,:) = 0._wp       ! Sum for now transport issued from ts loop 
    505       zv_sum(:,:) = 0._wp 
     520      un_adv(:,:) = 0._wp       ! Sum for now transport issued from ts loop 
     521      vn_adv(:,:) = 0._wp 
    506522      !                                             ! ==================== ! 
    507523      DO jn = 1, icycle                             !  sub-time-step loop  ! 
     
    511527         ! Update only tidal forcing at open boundaries 
    512528#if defined key_tide 
    513          IF ( lk_bdy .AND. lk_tide )      CALL bdy_dta_tides( kt, kit=jn, time_offset=(noffset+1) ) 
    514          IF ( ln_tide_pot .AND. lk_tide ) CALL upd_tide     ( kt, kit=jn, koffset=noffset ) 
     529         IF( lk_bdy      .AND. lk_tide )   CALL bdy_dta_tides( kt, kit=jn, time_offset= noffset+1 ) 
     530         IF( ln_tide_pot .AND. lk_tide )   CALL upd_tide     ( kt, kit=jn, time_offset= noffset  ) 
    515531#endif 
    516532         ! 
     
    527543 
    528544         ! Extrapolate barotropic velocities at step jit+0.5: 
    529          ua_e(:,:) = za1 * zun_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 
    530          va_e(:,:) = za1 * zvn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) 
     545         ua_e(:,:) = za1 * un_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 
     546         va_e(:,:) = za1 * vn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) 
    531547 
    532548         IF( .NOT.ln_linssh ) THEN                        !* Update ocean depth (variable volume case only) 
     
    589605         ! Sum over sub-time-steps to compute advective velocities 
    590606         za2 = wgtbtp2(jn) 
    591          zu_sum(:,:) = zu_sum(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 
    592          zv_sum(:,:) = zv_sum(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 
     607         un_adv(:,:) = un_adv(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 
     608         vn_adv(:,:) = vn_adv(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 
    593609         ! 
    594610         ! Set next sea level: 
     
    648664         ! 
    649665         ! Compute associated depths at U and V points: 
    650          IF( .NOT.( ln_dynadv_vec .OR. ln_linssh ) ) THEN   !* Vector form 
     666         IF( .NOT.ln_linssh  .AND. .NOT.ln_dynadv_vec ) THEN   !* Vector form 
    651667            !                                         
    652668            DO jj = 2, jpjm1                             
     
    671687         ! zwy(:,:) = e1v(:,:) * va_e(:,:) * zhvp2_e(:,:) 
    672688         ! 
    673          IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      !==  energy conserving or mixed scheme  ==! 
     689         IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN     !==  energy conserving or mixed scheme  ==! 
    674690            DO jj = 2, jpjm1 
    675691               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    683699            END DO 
    684700            ! 
    685          ELSEIF ( ln_dynvor_ens ) THEN                    !==  enstrophy conserving scheme  ==! 
     701         ELSEIF ( ln_dynvor_ens ) THEN                   !==  enstrophy conserving scheme  ==! 
    686702            DO jj = 2, jpjm1 
    687703               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    695711            END DO 
    696712            ! 
    697          ELSEIF ( ln_dynvor_een ) THEN !==  energy and enstrophy conserving scheme  ==! 
     713         ELSEIF ( ln_dynvor_een ) THEN                   !==  energy and enstrophy conserving scheme  ==! 
    698714            DO jj = 2, jpjm1 
    699715               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    724740         ! 
    725741         ! Add bottom stresses: 
    726          zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * zun_e(:,:) * hur_e(:,:) 
    727          zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * zvn_e(:,:) * hvr_e(:,:) 
     742         zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * un_e(:,:) * hur_e(:,:) 
     743         zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
    728744         ! 
    729745         ! Surface pressure trend: 
     
    742758            DO jj = 2, jpjm1 
    743759               DO ji = fs_2, fs_jpim1   ! vector opt. 
    744                   ua_e(ji,jj) = (                                zun_e(ji,jj)   &  
    745                             &     + rdtbt * (                      zwx(ji,jj)   & 
    746                             &                                 + zu_trd(ji,jj)   & 
    747                             &                                 + zu_frc(ji,jj) ) &  
    748                             &   ) * umask(ji,jj,1) 
    749  
    750                   va_e(ji,jj) = (                                zvn_e(ji,jj)   & 
    751                             &     + rdtbt * (                      zwy(ji,jj)   & 
    752                             &                                 + zv_trd(ji,jj)   & 
    753                             &                                 + zv_frc(ji,jj) ) & 
    754                             &   ) * vmask(ji,jj,1) 
    755                END DO 
    756             END DO 
    757  
     760                  ua_e(ji,jj) = (                                 un_e(ji,jj)    &  
     761                     &            + rdtbt * (                      zwx(ji,jj)    & 
     762                     &                                        + zu_trd(ji,jj)    & 
     763                     &                                        + zu_frc(ji,jj) )  ) * umask(ji,jj,1) 
     764                     ! 
     765                  va_e(ji,jj) = (                                 vn_e(ji,jj)    & 
     766                     &            + rdtbt * (                      zwy(ji,jj)    & 
     767                     &                                        + zv_trd(ji,jj)    & 
     768                     &                                        + zv_frc(ji,jj) )  ) * vmask(ji,jj,1) 
     769               END DO 
     770            END DO 
     771            ! 
    758772         ELSE                                      !* Flux form 
    759773            DO jj = 2, jpjm1 
    760774               DO ji = fs_2, fs_jpim1   ! vector opt. 
    761  
    762                   zhura = umask(ji,jj,1)/(hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - umask(ji,jj,1)) 
    763                   zhvra = vmask(ji,jj,1)/(hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - vmask(ji,jj,1)) 
    764  
    765                   ua_e(ji,jj) = (                hu_e(ji,jj)  *  zun_e(ji,jj)   &  
    766                             &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
    767                             &               + zhup2_e(ji,jj)  * zu_trd(ji,jj)   & 
    768                             &               +    hu_n(ji,jj)  * zu_frc(ji,jj) ) & 
    769                             &   ) * zhura 
    770  
    771                   va_e(ji,jj) = (                hv_e(ji,jj)  *  zvn_e(ji,jj)   & 
    772                             &     + rdtbt * ( zhvst_e(ji,jj)  *    zwy(ji,jj)   & 
    773                             &               + zhvp2_e(ji,jj)  * zv_trd(ji,jj)   & 
    774                             &               +    hv_n(ji,jj)  * zv_frc(ji,jj) ) & 
    775                             &   ) * zhvra 
     775                  zhura = umask(ji,jj,1) / ( hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - umask(ji,jj,1) ) 
     776                  zhvra = vmask(ji,jj,1) / ( hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - vmask(ji,jj,1) ) 
     777                  ! 
     778                  ua_e(ji,jj) = (                hu_e(ji,jj)  *   un_e(ji,jj)    &  
     779                     &            + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)    &  
     780                     &                      + zhup2_e(ji,jj)  * zu_trd(ji,jj)    & 
     781                     &                      +    hu_n(ji,jj)  * zu_frc(ji,jj) )  ) * zhura 
     782                     ! 
     783                  va_e(ji,jj) = (                hv_e(ji,jj)  *   vn_e(ji,jj)    & 
     784                     &            + rdtbt * ( zhvst_e(ji,jj)  *    zwy(ji,jj)    & 
     785                     &                      + zhvp2_e(ji,jj)  * zv_trd(ji,jj)    & 
     786                     &                      +    hv_n(ji,jj)  * zv_frc(ji,jj) )  ) * zhvra 
    776787               END DO 
    777788            END DO 
     
    779790         ! 
    780791         IF( .NOT.ln_linssh ) THEN                     !* Update ocean depth (variable volume case only) 
    781             !                                          !  ----------------------------------------------         
    782792            hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
    783793            hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
     
    787797         ENDIF 
    788798         !                                             !* domain lateral boundary 
    789          !                                             !  ----------------------- 
    790          ! 
    791799         CALL lbc_lnk_multi( ua_e, 'U', -1._wp, va_e , 'V', -1._wp ) 
    792800         ! 
    793801#if defined key_bdy   
    794802         !                                                 ! open boundaries 
    795          IF( lk_bdy ) CALL bdy_dyn2d( jn, ua_e, va_e, zun_e, zvn_e, hur_e, hvr_e, ssha_e ) 
     803         IF( lk_bdy )   CALL bdy_dyn2d( jn, ua_e, va_e, un_e, vn_e, hur_e, hvr_e, ssha_e ) 
    796804#endif 
    797805#if defined key_agrif                                                            
     
    801809         !                                             !  ---- 
    802810         ubb_e  (:,:) = ub_e  (:,:) 
    803          ub_e   (:,:) = zun_e (:,:) 
    804          zun_e  (:,:) = ua_e  (:,:) 
     811         ub_e   (:,:) = un_e (:,:) 
     812         un_e   (:,:) = ua_e  (:,:) 
    805813         ! 
    806814         vbb_e  (:,:) = vb_e  (:,:) 
    807          vb_e   (:,:) = zvn_e (:,:) 
    808          zvn_e  (:,:) = va_e  (:,:) 
     815         vb_e   (:,:) = vn_e (:,:) 
     816         vn_e   (:,:) = va_e  (:,:) 
    809817         ! 
    810818         sshbb_e(:,:) = sshb_e(:,:) 
     
    831839      ! ----------------------------------------------------------------------------- 
    832840      ! 
    833       ! At this stage ssha holds a time averaged value 
    834       !                                                ! Sea Surface Height at u-,v- and f-points 
    835       IF( .NOT.ln_linssh ) THEN                        ! (required only in non-linear free surface case) 
     841      ! Set advection velocity correction: 
     842      zwx(:,:) = un_adv(:,:) 
     843      zwy(:,:) = vn_adv(:,:) 
     844      IF( ( kt == nit000 .AND. neuler==0 ) .OR. .NOT.ln_bt_fw ) THEN      
     845         un_adv(:,:) = zwx(:,:) * r1_hu_n(:,:) 
     846         vn_adv(:,:) = zwy(:,:) * r1_hv_n(:,:) 
     847      ELSE 
     848         un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zwx(:,:) ) * r1_hu_n(:,:) 
     849         vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zwy(:,:) ) * r1_hv_n(:,:) 
     850      END IF 
     851 
     852      IF( ln_bt_fw ) THEN ! Save integrated transport for next computation 
     853         ub2_b(:,:) = zwx(:,:) 
     854         vb2_b(:,:) = zwy(:,:) 
     855      ENDIF 
     856      ! 
     857      ! Update barotropic trend: 
     858      IF( ln_dynadv_vec .OR. ln_linssh ) THEN 
     859         DO jk=1,jpkm1 
     860            ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * z1_2dt_b 
     861            va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * z1_2dt_b 
     862         END DO 
     863      ELSE 
     864         ! At this stage, ssha has been corrected: compute new depths at velocity points 
    836865         DO jj = 1, jpjm1 
    837866            DO ji = 1, jpim1      ! NO Vector Opt. 
     
    845874         END DO 
    846875         CALL lbc_lnk_multi( zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 
    847       ENDIF 
    848       ! 
    849       ! Set advection velocity correction: 
    850       IF( ( kt == nit000 .AND. neuler==0 ) .OR. .NOT.ln_bt_fw ) THEN      
    851          un_adv(:,:) = zu_sum(:,:) * r1_hu_n(:,:) 
    852          vn_adv(:,:) = zv_sum(:,:) * r1_hv_n(:,:) 
    853       ELSE 
    854          un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zu_sum(:,:) ) * r1_hu_n(:,:) 
    855          vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zv_sum(:,:) ) * r1_hv_n(:,:) 
    856       END IF 
    857  
    858       IF( ln_bt_fw ) THEN ! Save integrated transport for next computation 
    859          ub2_b(:,:) = zu_sum(:,:) 
    860          vb2_b(:,:) = zv_sum(:,:) 
    861       ENDIF 
    862       ! 
    863       ! Update barotropic trend: 
    864       IF( ln_dynadv_vec .OR. ln_linssh ) THEN 
    865          DO jk=1,jpkm1 
    866             ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * z1_2dt_b 
    867             va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * z1_2dt_b 
    868          END DO 
    869       ELSE 
     876         ! 
    870877         DO jk=1,jpkm1 
    871878            ua(:,:,jk) = ua(:,:,jk) + r1_hu_n(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * z1_2dt_b 
     
    883890         ! 
    884891      END DO 
     892      ! 
     893      CALL iom_put(  "ubar", un_adv(:,:)      )    ! barotropic i-current 
     894      CALL iom_put(  "vbar", vn_adv(:,:)      )    ! barotropic i-current 
    885895      ! 
    886896#if defined key_agrif 
     
    898908         vb2_i_b(:,:) = vb2_i_b(:,:) + za1 * vb2_b(:,:) 
    899909      ENDIF 
    900       ! 
    901       ! 
    902910#endif       
    903       ! 
    904911      !                                   !* write time-spliting arrays in the restart 
    905912      IF( lrst_oce .AND.ln_bt_fw )   CALL ts_rst( kt, 'WRITE' ) 
    906913      ! 
    907914      CALL wrk_dealloc( jpi,jpj,   zsshp2_e, zhdiv ) 
    908       CALL wrk_dealloc( jpi,jpj,   zu_trd, zv_trd, zun_e, zvn_e ) 
    909       CALL wrk_dealloc( jpi,jpj,   zwx, zwy, zu_sum, zv_sum, zssh_frc, zu_frc, zv_frc ) 
     915      CALL wrk_dealloc( jpi,jpj,   zu_trd, zv_trd ) 
     916      CALL wrk_dealloc( jpi,jpj,   zwx, zwy, zssh_frc, zu_frc, zv_frc ) 
    910917      CALL wrk_dealloc( jpi,jpj,   zhup2_e, zhvp2_e, zhust_e, zhvst_e ) 
    911       CALL wrk_dealloc( jpi,jpj,   zsshu_a, zsshv_a ) 
     918      CALL wrk_dealloc( jpi,jpj,   zsshu_a, zsshv_a                                   ) 
    912919      CALL wrk_dealloc( jpi,jpj,   zhf ) 
    913920      ! 
     
    9941001   END SUBROUTINE ts_wgt 
    9951002 
     1003 
    9961004   SUBROUTINE ts_rst( kt, cdrw ) 
    9971005      !!--------------------------------------------------------------------- 
     
    10471055   END SUBROUTINE ts_rst 
    10481056 
    1049    SUBROUTINE dyn_spg_ts_init( kt ) 
     1057 
     1058   SUBROUTINE dyn_spg_ts_init 
    10501059      !!--------------------------------------------------------------------- 
    10511060      !!                   ***  ROUTINE dyn_spg_ts_init  *** 
     
    10531062      !! ** Purpose : Set time splitting options 
    10541063      !!---------------------------------------------------------------------- 
    1055       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1056       ! 
    1057       INTEGER  :: ji ,jj 
    1058       INTEGER  ::   ios                 ! Local integer output status for namelist read 
    1059       REAL(wp) :: zxr2, zyr2, zcmax 
    1060       REAL(wp), POINTER, DIMENSION(:,:) :: zcu 
    1061       !! 
    1062       NAMELIST/namsplit/ ln_bt_fw, ln_bt_av, ln_bt_nn_auto, & 
    1063       &                  nn_baro, rn_bt_cmax, nn_bt_flt 
     1064      INTEGER  ::   ji ,jj              ! dummy loop indices 
     1065      REAL(wp) ::   zxr2, zyr2, zcmax   ! local scalar 
     1066      REAL(wp), POINTER, DIMENSION(:,:) ::   zcu 
    10641067      !!---------------------------------------------------------------------- 
    10651068      ! 
    1066       REWIND( numnam_ref )              ! Namelist namsplit in reference namelist : time splitting parameters 
    1067       READ  ( numnam_ref, namsplit, IOSTAT = ios, ERR = 901) 
    1068 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsplit in reference namelist', lwp ) 
    1069  
    1070       REWIND( numnam_cfg )              ! Namelist namsplit in configuration namelist : time splitting parameters 
    1071       READ  ( numnam_cfg, namsplit, IOSTAT = ios, ERR = 902 ) 
    1072 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsplit in configuration namelist', lwp ) 
    1073       IF(lwm) WRITE ( numond, namsplit ) 
    1074       ! 
    1075       !         ! Max courant number for ext. grav. waves 
    1076       ! 
    1077       CALL wrk_alloc( jpi, jpj, zcu ) 
    1078       ! 
    1079       IF( .NOT.ln_linssh ) THEN  
    1080          DO jj = 1, jpj 
    1081             DO ji =1, jpi 
    1082                zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
    1083                zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
    1084                zcu(ji,jj) = SQRT( grav * ht_0(ji,jj) * (zxr2 + zyr2) ) 
    1085             END DO 
    1086          END DO 
    1087       ELSE 
    1088 !!gm  BUG ??  restartability issue if ssh changes are large.... 
    1089 !!gm          We should just test this with ht_0 only, no? 
    1090          DO jj = 1, jpj 
    1091             DO ji =1, jpi 
    1092                zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
    1093                zyr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
    1094                zcu(ji,jj) = SQRT( grav * ht_n(ji,jj) * (zxr2 + zyr2) ) 
    1095             END DO 
    1096          END DO 
    1097       ENDIF 
    1098  
     1069      ! Max courant number for ext. grav. waves 
     1070      ! 
     1071      CALL wrk_alloc( jpi,jpj,   zcu ) 
     1072      ! 
     1073      DO jj = 1, jpj 
     1074         DO ji =1, jpi 
     1075            zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
     1076            zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
     1077            zcu(ji,jj) = SQRT( grav * ht_0(ji,jj) * (zxr2 + zyr2) ) 
     1078         END DO 
     1079      END DO 
     1080      ! 
    10991081      zcmax = MAXVAL( zcu(:,:) ) 
    11001082      IF( lk_mpp )   CALL mpp_max( zcmax ) 
    11011083 
    11021084      ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 
    1103       IF (ln_bt_nn_auto) nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
     1085      IF( ln_bt_auto )  nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
    11041086       
    11051087      rdtbt = rdt / REAL( nn_baro , wp ) 
     
    11091091      IF(lwp) WRITE(numout,*) 'dyn_spg_ts : split-explicit free surface' 
    11101092      IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    1111       IF( ln_bt_nn_auto ) THEN 
    1112          IF(lwp) WRITE(numout,*) '     ln_ts_nn_auto=.true. Automatically set nn_baro ' 
     1093      IF( ln_bt_auto ) THEN 
     1094         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.true. Automatically set nn_baro ' 
    11131095         IF(lwp) WRITE(numout,*) '     Max. courant number allowed: ', rn_bt_cmax 
    11141096      ELSE 
    1115          IF(lwp) WRITE(numout,*) '     ln_ts_nn_auto=.false.: Use nn_baro in namelist ' 
     1097         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_baro in namelist ' 
    11161098      ENDIF 
    11171099 
     
    11311113#if defined key_agrif 
    11321114      ! Restrict the use of Agrif to the forward case only 
    1133       IF ((.NOT.ln_bt_fw ).AND.(.NOT.Agrif_Root())) CALL ctl_stop( 'AGRIF not implemented if ln_bt_fw=.FALSE.' ) 
     1115      IF( .NOT.ln_bt_fw .AND. .NOT.Agrif_Root() )  CALL ctl_stop( 'AGRIF not implemented if ln_bt_fw=.FALSE.' ) 
    11341116#endif 
    11351117      ! 
    11361118      IF(lwp) WRITE(numout,*)    '     Time filter choice, nn_bt_flt: ', nn_bt_flt 
    11371119      SELECT CASE ( nn_bt_flt ) 
    1138            CASE( 0 )  ;   IF(lwp) WRITE(numout,*) '           Dirac' 
    1139            CASE( 1 )  ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_baro' 
    1140            CASE( 2 )  ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_baro'  
    1141            CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1,2' ) 
     1120         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '           Dirac' 
     1121         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_baro' 
     1122         CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_baro'  
     1123         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1,2' ) 
    11421124      END SELECT 
    11431125      ! 
     
    11471129      IF(lwp) WRITE(numout,*) '     Maximum Courant number is   :', zcmax 
    11481130      ! 
    1149       IF ((.NOT.ln_bt_av).AND.(.NOT.ln_bt_fw)) THEN 
     1131      IF( .NOT.ln_bt_av .AND. .NOT.ln_bt_fw ) THEN 
    11501132         CALL ctl_stop( 'dynspg_ts ERROR: No time averaging => only forward integration is possible' ) 
    11511133      ENDIF 
    1152       IF ( zcmax>0.9_wp ) THEN 
     1134      IF( zcmax>0.9_wp ) THEN 
    11531135         CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_baro !' )           
    11541136      ENDIF 
    11551137      ! 
    1156       CALL wrk_dealloc( jpi, jpj, zcu ) 
     1138      CALL wrk_dealloc( jpi,jpj,  zcu ) 
    11571139      ! 
    11581140   END SUBROUTINE dyn_spg_ts_init 
    11591141 
    1160 #else 
    1161    !!--------------------------------------------------------------------------- 
    1162    !!   Default case :   Empty module   No split explicit free surface 
    1163    !!--------------------------------------------------------------------------- 
    1164 CONTAINS 
    1165    INTEGER FUNCTION dyn_spg_ts_alloc()    ! Dummy function 
    1166       dyn_spg_ts_alloc = 0 
    1167    END FUNCTION dyn_spg_ts_alloc 
    1168    SUBROUTINE dyn_spg_ts( kt )            ! Empty routine 
    1169       INTEGER, INTENT(in) :: kt 
    1170       WRITE(*,*) 'dyn_spg_ts: You should not have seen this print! error?', kt 
    1171    END SUBROUTINE dyn_spg_ts 
    1172    SUBROUTINE ts_rst( kt, cdrw )          ! Empty routine 
    1173       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1174       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    1175       WRITE(*,*) 'ts_rst    : You should not have seen this print! error?', kt, cdrw 
    1176    END SUBROUTINE ts_rst   
    1177    SUBROUTINE dyn_spg_ts_init( kt )       ! Empty routine 
    1178       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1179       WRITE(*,*) 'dyn_spg_ts_init   : You should not have seen this print! error?', kt 
    1180    END SUBROUTINE dyn_spg_ts_init 
    1181 #endif 
    1182     
    11831142   !!====================================================================== 
    11841143END MODULE dynspg_ts 
Note: See TracChangeset for help on using the changeset viewer.