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 11480 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2019-08-29T11:23:25+02:00 (5 years ago)
Author:
davestorkey
Message:

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Merge in changes from branch of branch.
Main changes:

  1. "nxt" modules renamed as "atf" and now just do Asselin time filtering. The time level swapping is achieved by swapping indices.
  2. Some additional prognostic grid variables changed to use a time dimension.

Notes:

  1. This merged branch passes SETTE tests but does not identical results to the SETTE tests with the trunk@10721 unless minor bugs to do with Euler timestepping and the OFF timestepping are fixed in the trunk (NEMO tickets #2310 and #2311).
  2. The nn_dttrc > 1 option for TOP (TOP has a different timestep to OCE) doesn't work. But it doesn't work in the trunk or NEMO 4.0 release either.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DOM/domvvl.F90

    r10978 r11480  
    1313   !!   dom_vvl_init     : define initial vertical scale factors, depths and column thickness 
    1414   !!   dom_vvl_sf_nxt   : Compute next vertical scale factors 
    15    !!   dom_vvl_sf_swp   : Swap vertical scale factors and update the vertical grid 
     15   !!   dom_vvl_sf_update   : Swap vertical scale factors and update the vertical grid 
    1616   !!   dom_vvl_interpol : Interpolate vertical scale factors from one grid point to another 
    1717   !!   dom_vvl_rst      : read/write restart file 
     
    3737   PUBLIC  dom_vvl_init       ! called by domain.F90 
    3838   PUBLIC  dom_vvl_sf_nxt     ! called by step.F90 
    39    PUBLIC  dom_vvl_sf_swp     ! called by step.F90 
     39   PUBLIC  dom_vvl_sf_update  ! called by step.F90 
    4040   PUBLIC  dom_vvl_interpol   ! called by dynnxt.F90 
    4141 
     
    181181      ! 
    182182      !                    !==  thickness of the water column  !!   (ocean portion only) 
    183       ht_n(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1)   !!gm  BUG  :  this should be 1/2 * e3w(k=1) .... 
    184       hu_b(:,:) = e3u(:,:,1,Kbb) * umask(:,:,1) 
    185       hu_n(:,:) = e3u(:,:,1,Kmm) * umask(:,:,1) 
    186       hv_b(:,:) = e3v(:,:,1,Kbb) * vmask(:,:,1) 
    187       hv_n(:,:) = e3v(:,:,1,Kmm) * vmask(:,:,1) 
     183      ht(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1)   !!gm  BUG  :  this should be 1/2 * e3w(k=1) .... 
     184      hu(:,:,Kbb) = e3u(:,:,1,Kbb) * umask(:,:,1) 
     185      hu(:,:,Kmm) = e3u(:,:,1,Kmm) * umask(:,:,1) 
     186      hv(:,:,Kbb) = e3v(:,:,1,Kbb) * vmask(:,:,1) 
     187      hv(:,:,Kmm) = e3v(:,:,1,Kmm) * vmask(:,:,1) 
    188188      DO jk = 2, jpkm1 
    189          ht_n(:,:) = ht_n(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    190          hu_b(:,:) = hu_b(:,:) + e3u(:,:,jk,Kbb) * umask(:,:,jk) 
    191          hu_n(:,:) = hu_n(:,:) + e3u(:,:,jk,Kmm) * umask(:,:,jk) 
    192          hv_b(:,:) = hv_b(:,:) + e3v(:,:,jk,Kbb) * vmask(:,:,jk) 
    193          hv_n(:,:) = hv_n(:,:) + e3v(:,:,jk,Kmm) * vmask(:,:,jk) 
     189         ht(:,:) = ht(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
     190         hu(:,:,Kbb) = hu(:,:,Kbb) + e3u(:,:,jk,Kbb) * umask(:,:,jk) 
     191         hu(:,:,Kmm) = hu(:,:,Kmm) + e3u(:,:,jk,Kmm) * umask(:,:,jk) 
     192         hv(:,:,Kbb) = hv(:,:,Kbb) + e3v(:,:,jk,Kbb) * vmask(:,:,jk) 
     193         hv(:,:,Kmm) = hv(:,:,Kmm) + e3v(:,:,jk,Kmm) * vmask(:,:,jk) 
    194194      END DO 
    195195      ! 
    196196      !                    !==  inverse of water column thickness   ==!   (u- and v- points) 
    197       r1_hu_b(:,:) = ssumask(:,:) / ( hu_b(:,:) + 1._wp - ssumask(:,:) )    ! _i mask due to ISF 
    198       r1_hu_n(:,:) = ssumask(:,:) / ( hu_n(:,:) + 1._wp - ssumask(:,:) ) 
    199       r1_hv_b(:,:) = ssvmask(:,:) / ( hv_b(:,:) + 1._wp - ssvmask(:,:) ) 
    200       r1_hv_n(:,:) = ssvmask(:,:) / ( hv_n(:,:) + 1._wp - ssvmask(:,:) ) 
     197      r1_hu(:,:,Kbb) = ssumask(:,:) / ( hu(:,:,Kbb) + 1._wp - ssumask(:,:) )    ! _i mask due to ISF 
     198      r1_hu(:,:,Kmm) = ssumask(:,:) / ( hu(:,:,Kmm) + 1._wp - ssumask(:,:) ) 
     199      r1_hv(:,:,Kbb) = ssvmask(:,:) / ( hv(:,:,Kbb) + 1._wp - ssvmask(:,:) ) 
     200      r1_hv(:,:,Kmm) = ssvmask(:,:) / ( hv(:,:,Kmm) + 1._wp - ssvmask(:,:) ) 
    201201 
    202202      !                    !==   z_tilde coordinate case  ==!   (Restoring frequencies) 
     
    550550      ! *********************************** ! 
    551551 
    552       hu_a(:,:) = e3u(:,:,1,Kaa) * umask(:,:,1) 
    553       hv_a(:,:) = e3v(:,:,1,Kaa) * vmask(:,:,1) 
     552      hu(:,:,Kaa) = e3u(:,:,1,Kaa) * umask(:,:,1) 
     553      hv(:,:,Kaa) = e3v(:,:,1,Kaa) * vmask(:,:,1) 
    554554      DO jk = 2, jpkm1 
    555          hu_a(:,:) = hu_a(:,:) + e3u(:,:,jk,Kaa) * umask(:,:,jk) 
    556          hv_a(:,:) = hv_a(:,:) + e3v(:,:,jk,Kaa) * vmask(:,:,jk) 
     555         hu(:,:,Kaa) = hu(:,:,Kaa) + e3u(:,:,jk,Kaa) * umask(:,:,jk) 
     556         hv(:,:,Kaa) = hv(:,:,Kaa) + e3v(:,:,jk,Kaa) * vmask(:,:,jk) 
    557557      END DO 
    558558      !                                        ! Inverse of the local depth 
    559559!!gm BUG ?  don't understand the use of umask_i here ..... 
    560       r1_hu_a(:,:) = ssumask(:,:) / ( hu_a(:,:) + 1._wp - ssumask(:,:) ) 
    561       r1_hv_a(:,:) = ssvmask(:,:) / ( hv_a(:,:) + 1._wp - ssvmask(:,:) ) 
     560      r1_hu(:,:,Kaa) = ssumask(:,:) / ( hu(:,:,Kaa) + 1._wp - ssumask(:,:) ) 
     561      r1_hv(:,:,Kaa) = ssvmask(:,:) / ( hv(:,:,Kaa) + 1._wp - ssvmask(:,:) ) 
    562562      ! 
    563563      IF( ln_timing )   CALL timing_stop('dom_vvl_sf_nxt') 
     
    566566 
    567567 
    568    SUBROUTINE dom_vvl_sf_swp( kt, Kbb, Kmm, Kaa ) 
    569       !!---------------------------------------------------------------------- 
    570       !!                ***  ROUTINE dom_vvl_sf_swp  *** 
     568   SUBROUTINE dom_vvl_sf_update( kt, Kbb, Kmm, Kaa ) 
     569      !!---------------------------------------------------------------------- 
     570      !!                ***  ROUTINE dom_vvl_sf_update  *** 
    571571      !!                    
    572       !! ** Purpose :  compute time filter and swap of scale factors  
     572      !! ** Purpose :  for z tilde case: compute time filter and swap of scale factors  
    573573      !!               compute all depths and related variables for next time step 
    574574      !!               write outputs and restart file 
    575575      !! 
    576       !! ** Method  :  - swap of e3t with trick for volume/tracer conservation 
     576      !! ** Method  :  - swap of e3t with trick for volume/tracer conservation (ONLY FOR Z TILDE CASE) 
    577577      !!               - reconstruct scale factor at other grid points (interpolate) 
    578578      !!               - recompute depths and water height fields 
    579579      !! 
    580       !! ** Action  :  - e3t_(b/n), tilde_e3t_(b/n) and e3(u/v)_n ready for next time step 
     580      !! ** Action  :  - tilde_e3t_(b/n) ready for next time step 
    581581      !!               - Recompute: 
    582582      !!                    e3(u/v)_b        
     
    599599      IF( ln_linssh )   RETURN      ! No calculation in linear free surface 
    600600      ! 
    601       IF( ln_timing )   CALL timing_start('dom_vvl_sf_swp') 
     601      IF( ln_timing )   CALL timing_start('dom_vvl_sf_update') 
    602602      ! 
    603603      IF( kt == nit000 )   THEN 
    604604         IF(lwp) WRITE(numout,*) 
    605          IF(lwp) WRITE(numout,*) 'dom_vvl_sf_swp : - time filter and swap of scale factors' 
    606          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   - interpolate scale factors and compute depths for next time step' 
     605         IF(lwp) WRITE(numout,*) 'dom_vvl_sf_update : - interpolate scale factors and compute depths for next time step' 
     606         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~' 
    607607      ENDIF 
    608608      ! 
     
    619619         tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) 
    620620      ENDIF 
    621       gdept(:,:,:,Kbb) = gdept(:,:,:,Kmm) 
    622       gdepw(:,:,:,Kbb) = gdepw(:,:,:,Kmm) 
    623  
    624       e3t(:,:,:,Kmm) = e3t(:,:,:,Kaa) 
    625       e3u(:,:,:,Kmm) = e3u(:,:,:,Kaa) 
    626       e3v(:,:,:,Kmm) = e3v(:,:,:,Kaa) 
    627621 
    628622      ! Compute all missing vertical scale factor and depths 
     
    630624      ! Horizontal scale factor interpolations 
    631625      ! -------------------------------------- 
    632       ! - ML - e3u(:,:,:,Kbb) and e3v(:,:,:,Kbb) are allready computed in dynnxt 
    633       ! - JC - hu_b, hv_b, hur_b, hvr_b also 
     626      ! - ML - e3u(:,:,:,Kbb) and e3v(:,:,:,Kbb) are already computed in dynnxt 
     627      ! - JC - hu(:,:,:,Kbb), hv(:,:,:,:,Kbb), hur_b, hvr_b also 
    634628       
    635629      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F'  ) 
     
    663657      ! Local depth and Inverse of the local depth of the water 
    664658      ! ------------------------------------------------------- 
    665       hu_n(:,:) = hu_a(:,:)   ;   r1_hu_n(:,:) = r1_hu_a(:,:) 
    666       hv_n(:,:) = hv_a(:,:)   ;   r1_hv_n(:,:) = r1_hv_a(:,:) 
    667       ! 
    668       ht_n(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1) 
     659      ! 
     660      ht(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1) 
    669661      DO jk = 2, jpkm1 
    670          ht_n(:,:) = ht_n(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
     662         ht(:,:) = ht(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    671663      END DO 
    672664 
     
    675667      IF( lrst_oce  )   CALL dom_vvl_rst( kt, Kbb, Kmm, 'WRITE' ) 
    676668      ! 
    677       IF( ln_timing )   CALL timing_stop('dom_vvl_sf_swp') 
    678       ! 
    679    END SUBROUTINE dom_vvl_sf_swp 
     669      IF( ln_timing )   CALL timing_stop('dom_vvl_sf_update') 
     670      ! 
     671   END SUBROUTINE dom_vvl_sf_update 
    680672 
    681673 
Note: See TracChangeset for help on using the changeset viewer.