Last edited **LastModified()?**

Author : Gurvan Madec, Andrew Coward

ticket : #1613

Branch : **dev_r5836_NOC3_vvl_by_default**

WP2015 Action : NOC-3

# Description

Development branch related to NOC-3 system simplification actions of 2015 work plan : set the non-linear free surface (i.e. key_vvl) by default.

- suppression of domzgr_substitute.h90 : before, now and after e3 scale factors are systematically defined. All fse3… desappear from all NEMO modules.
- key_vvl is removed. A namelist logical (ln_linssh) is used.
- linear free surface (constant volume) case : e3 before, now and after are set equal one for all, and we use exactly the same calculation as in non-linear case (except that update of e3 at each time-step is by-passed)
- time stepping on tracers is performed systematically on thickness-weighted tracers (or possibly on volume-weighted tracers).

Starting from **trunk** (revision: 5836) after the merge with dev_r5721_CNRS9_NOC3_LDF

# Strategy

Three steps:

## I. Before/Now/After? vertical coordinate system by default

==⇒>> runs ORCA2_LIM3 trunk and this branch identical to the last digit ==⇒>>

OKsee revision 5845

==⇒>> small bug correction in in_out_manager.F90 ==⇒>>OKsee revision 5858

==⇒>> correction of trunk bugs 5860 and 5861 + bug correction in non-vvl case==⇒>>OKsee revision 5862

==⇒>> Not working in non vvl case (blow up in 10 time step !) error (tmask instead of umask in dlmvvl)

==⇒>> OK see revision 5863

==⇒>> re-introduce changes in dynhpg.F90 ==⇒>>OKsee revision 5864

- dom_oce.F90 :

(1) systematic declaration of before/now/after vertical coordinate

(2) uniformisation of the name: hur (hvr) becomes r1_hu_n (r1_hv_n) ; idem for before and after

(3) gdep3w becomes gde3w === - all NEMO code: replace fs… by the the associated variable. When time-step is not prescribed, use _n variable (as was done in domzgr_substitute.h90). Results are identical when, in dynhpg.F90, the substitution of 1/e1u, 1/e2v by by r1_e1u, r1_e2v is removed =⇒> last digit changes !)
- remove domzgr_substitute.h90 and its #include every where in the code. compilation OK (ORCA2_LIM3, ORCA2_LIM with/without AGRIF, ORCA2_LIM_PISCES,ORCA2_SAS_LIM, AMM12, C1D_PAPA, ORCA2_OFF_PISCES, GYRE_PISCES)
- domzgr.F90 : Add the initialization of "_b", "_n", "_a" vertical coordinate arrays to "_0" in cas of linear free surface (i.e. .not.lk_vvl)
- reintroduce in dynhpg.F90 the substitution of 1/e1u, 1/e2v by by r1_e1u, r1_e2v ==⇒>>
**OK**see revision 5864

## II. Non-linear free surface by default

==⇒>>

(1)+(2)runs ORCA2_LIM and ORCA2_LIM3 (ln_linssh=T & =F) identical to the last digit with results of part I (rev 5864) and compilation with ORCA2_LIM_PISCES fine ==⇒>>OKsee revision 5868

==⇒>>(3) TRAruns ORCA2_LIM and ORCA2_LIM3 (ln_linssh=T & =F) OK, but solver modified (roundoff changes) ==⇒>>OKsee revision 5883

Bug correction to pass SETTE ==⇒>>OKsee revision 5916

### (1) replace lk_vvl by .NOT.ln_linssh everywhere

### (2) remove key_vvl and introduce ln_linssh in nam_zgr namelist

domain.F90 , dom_init : impose _b, _n, _a depth and vertical scale factors to be equal to _0 ones if ln_linssh=T

domzgr.F90 : now only compute the _0 mesh (in particular remove the setting of _n fields in zgr_sco

### (3) remove optimization associated with linear free surface ; promote test on ln_linssh in favor of test on .NOT.ln_linssh

**TRA**(and TRC) :

**traadv_…** : surface flux set systematically to zero for all tracers. compute for each tracer in ln_linssh case **traqsr **: ln_linssh desappears: always computed with now scale factors. introduction of np_RGB, np_2BD, etc … Logical ln_traqsr moved from namtra_qsr to namsbc**trazdf_exp & trazdf_imp** : e3t & e3w _b, _n, _a are systematically taken into account. No differences between ln_linssh=T or F

**trasbc** : non-linear free surface calculation, and addition of concentration/dilution term only when ln_linssh=T**tranxt** : tra_nxt_fix cannot be removed as in tra_nxt_vvl the vertical scale factor used changes (asselin time filter on e3t….)

**DYN**:

Only dynzdf_… are modify since dynhpg, dynspg_… will be significantly modified by the suppression of SOLVER**dynzdf_imp** : e3u (e3v) & e3uw (e3vw) _b, _n, _a are systematically taken into account. No differences between ln_linssh=T or F case

## III. Merge with the trunk (suppression of solvers & filtered free surface)

**(1)** Merge with the trunk, revision 5930.

Minor correction:

- bmask is removed (not used anymore) (modules: dommsk.F90, bdyini.F90, dom_oce.F90)

- suppression of kt argument in subroutine tide_init (bdyini.F90 module)

merge with compilation OK, **no test run** ==⇒>> revision 6004.

Bug correction to pass SETTE test ==⇒>> revision 6030 & 6031.

**(2)** Improve the time stepping with respect to vertical mixing (dynzdf.F90, dynzdf_exp.F90, dynzdf_imp.F90, and dynnxt.F90)

- dynnxt.F90 : add a subroutine (dyn_nxt_LF) which performs the leap frog time stepping, and is called in dynzdf in both explicit and implicit cases.

- dynzdf_exp and _imp.F90 : remove the LF time stepping now done in dynzdf.F90

- dynzdf_imp.F90 : add in argument the time step of the e3u, e3v: either _n (linear free surf.) or _a (default)

e3uw, e3vw changed from now to after time step, and since there are only used in dyn_zdf_imp there are computed there and defined as local 3D arrays

- dynzdf_exp.F90 : e3uw, e3vw changed from now to before time step.

## IV. time stepping of tracers : performed systematically on thickness-weighted tracers (or possibly on volume-weighted tracers):

===⇒>>> This part is **postponed to WP 2016**

The idea here is to put in tsa the volume-weighted tracer trends (i.e. bt*dt(ts) with bt=e1e2t*e3t_n )

There is a double advantage : (1) same code for linear and non-linear free surface ; (2) reduce to tits minimum the number of division by the volume of the T-cells

Action : change all the TRA modules

## Misc. issues also solved

- dynldf_lap_blp.F90 & sbcwaves.F90: correct the 2 bugs found in trunk (see trunk revision 5860 and 5861):
**OK**see revision 5862 - dynldf_lap_blp.F90 : add the correction on zdiv in AGRIF case:
**OK**revision 5862 - domhpg.F90 : replace everywhere /e1u (/e2v) by *r1_e1u (*r1_e2v) =⇒> put in comment !!gm to get same results
**OK** - dynspg_flt.F90 : replace everywhere /e1u (/e2v) by *r1_e1u (*r1_e2v)
**OK** - use nn_print test to bypass some control print. (domcfg.F90 ; …)
**OK** - remove the use of prihre, prihin, prizre =⇒>> remove lib_print.f90
**OK** - sbcwave : move drag and stokes drift logical from namsbc to namsbc_wave.
**OK**see revision 5883 - merge traadv_lap.F90 & traadv_blp.F90 into traadv_lap_blp.F90 (as for the dynamics) + traldf.F90 & trcldf.F90 for USE traldf_lap_blp.
**OK**see revision 5883 - geo2ocean.F90 : simplification by removing the old and no more used repcmo & rep ere subroutines.
**OK**see revision 5883