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.
ticket/1620_MERCATOR_SOLVER_SIMPLIFICATION – NEMO
wiki:ticket/1620_MERCATOR_SOLVER_SIMPLIFICATION

Author: Jérôme Chanut, Mercator Océan

Page related to ticket: #1620 and associated to the following development branch: [​https://forge.ipsl.jussieu.fr/nemo/browser/branches/2015/dev_r5847_MERCATOR9_solveur_simplification]

This development is part of the shared simplication process, task: SIMPLIF-2: Removal of filtered free surface. Split explicit and explicit free surface only.

Step 1: Remove filtered free surface option and associated key_dynspg_flt key

1) Remove parts of the code specific to "key_dynspg_flt" or lk_dynspg_flt=T and the need for solver modules in the code.
2) Suppress SOL directory and dynspg_flt module

3) Clean momentum trend routines related to filtered free surface (trddyn, trdken, trd_oce).
4) Update reference configurations:

  • Replace key_dynspg_flt by key_dynspg_ts if needed in CONFIG/* directories.
  • Remove namsol block in namelist_* and references to flt variables (trends) in field_def.xml
  • SETTE: update sette.sh, to remove modifications of namelist variables related to solver.

NB: one should change "solver.stat" file and numsol names in stp_ctl and in_out_manager... keep it as is for the time being

==> Commit changes to revision 5868 https://forge.ipsl.jussieu.fr/nemo/changeset?old_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&old=5867&new_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&new=5868

Step 2: Suppress implicit pressure gradient option, ln_hpg_imp=T

Since this option is not supported with the now default split explicit free surface: remove it ( => simpler step routine). ln_hpg_imp namelist variable suppressed in reference namelist.

==> Commit changes to revision 5869[ https://forge.ipsl.jussieu.fr/nemo/changeset?old_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&old=5868&new_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&new=5869]

Step 3: Time Stepping readibility / cleaning

1) dynzdf
Make time stepping identical in explicit or split-explicit cases => assume that "after" velocities not tendencies are available after vertical diffusion of momentum (as for tracers) => modify dynzdf/dynnxt routines

2) step

  • Group all dynamical trends at the same place (at the beginning of the time stepping). Still keep dynnxt after tracer time stepping at the end.
  • Assuming ua/va are not used anymore during tracer computation as working arrays, remove temporary 3d arrays ua_sv, va_sv

3) Suppress obsolete dynspg_oce module, remove key_dynspg_ts / key_dynspg_exp (add namelist variables instead)

!-----------------------------------------------------------------------
&namdyn_spg    !   surface pressure gradient
!-----------------------------------------------------------------------
   ln_dynspg_exp  = .false.   !  explicit free surface
   ln_dynspg_ts   = .true.    !  split-explicit free surface
/

4) Reviewed AGRIF code in the case of explicit free surface: slight changes in agrif_opa_interp module, but otherwise ok (quickly tested in ORCA2 Agulhas configuration)

==> Commit changes to revision: 5902 https://forge.ipsl.jussieu.fr/nemo/changeset?old_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&old=5869&new_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&new=5902

Step 4: Gurvan's Review:

GM: change in namelist : regroup namdyn_spg and namsplit namelists + change in some names (ln_bt_nn_auto becomes ln_bt_auto) :

!-----------------------------------------------------------------------
&namdyn_spg      !  surface pressure gradient computation
!-----------------------------------------------------------------------
   ln_dynspg_exp = .FALSE.   !  explicit free surface
   ln_dynspg_ts  = .FALSE.   !  split-explicit free surface
      ln_bt_fw   = .TRUE.    !  Forward integration of barotropic Eqs.
      ln_bt_av   = .TRUE.    !  Time filtering of barotropic variables
         nn_bt_flt =    1       !  Time filter choice  = 0 None
         !                      !                      = 1 Boxcar over   nn_baro sub-steps
         !                      !                      = 2 Boxcar over 2*nn_baro  "    "
      ln_bt_auto  = .TRUE.   !  number of sub-step defined from:
         rn_bt_cmax =  0.8      ! =T : the Maximum Courant Number allowed
         nn_baro    = 30        ! =F : the number of sub-step in rn_rdt seconds
/

Note that ln_dynspg_exp = ln_dynspg_ts = .FALSE. in the ref namelist so that this namelist should be systematical fill up in cfg namelist.

JC => DONE

GM: I don't understand the difference between nn_bt_flt=0 and ln_bt_av=F ....???

JC => Small difference: with nn_bt_flt=0 there is still a specific startup of the barotropic loop, previous bt arrays being not saved.

GM: Note that array of time-splitting part should only be allocated if ln_dynspg_ts=TRUE

JC => DONE.

GM: dynspg_exp should be modified so that it return the after velocity as dynspg_ts ===>>> simplify dynnxt.F90

JC => No. dynzdf returns velocities and dynspg_ts still returns tendencies: compliant with tracers, and dynzdf must be called at the end (all tendencies must be known because of possible implicit bottom friction)

GM:dynspg_oce should be suppressed : all variables should be declared either in dynspg.F90 (ln_dynspg_exp and ln_dynspg_ts) or in dynspg_ts for the others

JC => DONE. But time splitting arrays are defined in oce.F90 to avoid cyclic dependencies (this is linked to agrif bcs).

GM: Step.F90 further simplification are needed here :

with removal of solver the DYNAMICS should always be called first ! even in case of explicit free surface !!!!!

JC => DONE

GM: The only 2 differences is that in explicit free surface un,vn are not updated after the dynamics, and domvvl is called before the dynamics instead of after the dynamics (or in-between if you don’t follow the remark just below)

JC => ??

GM: why splitting the Dynamics in two parts? make the approximation dz(Ua) computed with e3uw_n ? to be tested …

JC => dynamics is not splitted anymore. Yes, one could use "now" vertical scale factors. This approximation has to be tested.

Furthermore, you can notice that ua,va are no more used as workspace in the tracers, ua_sv and va_sn are no more needed , no?

JC => ua_sv, va_sv have been suppressed

==> Commit changes to revision: 5917
==> Passes Sette: Yes

GYRE restartability passed
ORCA2LIMPIS restartability passed
ORCA2OFFPIS restartability passed
AMM12 restartability passed
ORCA2LIM3 restartability passed
SAS restartability inconclusive ( solver.stat not found )
GYRE reproducibility passed
ORCA2LIMPIS reproducibility passed
ORCA2OFFPIS reproducibility passed
AMM12 reproducibility passed
ORCA2LIM3 reproducibility passed
ORCA2_LIM_OBS reproducibility passed
SAS reproducibility inconclusive ( solver.stat not found )
ORCA2_LIM_AGRIF runability passed
ORCA2_LIM_AGRIF code corruption test passed

Overall changes here:

https://forge.ipsl.jussieu.fr/nemo/changeset?old_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&old=5867&new_path=%2Fbranches%2F2015%2Fdev_r5847_MERCATOR9_solveur_simplification&new=5917#file74


Step 5: Remaining things to do:

  • Correct momentum trend computation with time splitting (Gurvan 2016 dvpt)
  • Remove filtered free surface from documentation
Last modified 8 years ago Last modified on 2015-11-25T11:13:39+01:00