From 16443a0babdabbf3f0a1c283dc84f5ec43a0613c Mon Sep 17 00:00:00 2001
From: Sebastien Masson <sebastien.masson@locean.ipsl.fr>
Date: Mon, 19 Dec 2022 11:37:44 +0000
Subject: [PATCH] Resolve "Summer Body 2022"

---
 arch/CNRS/arch-X64_IRENE_GCC.fcm              |    6 +-
 arch/CNRS/arch-X64_JEANZAY_GCC.fcm            |   74 +
 arch/arch-osx_gfortran.fcm                    |    4 +-
 cfgs/AGRIF_DEMO/EXPREF/file_def_nemo-oce.xml  |    4 +-
 cfgs/AGRIF_DEMO/cpp_AGRIF_DEMO.fcm            |    2 +-
 cfgs/AMM12/EXPREF/file_def_nemo-oce.xml       |    4 +-
 cfgs/AMM12/cpp_AMM12.fcm                      |    2 +-
 cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml     |    4 +-
 cfgs/GYRE_PISCES/cpp_GYRE_PISCES.fcm          |    2 +-
 .../EXPREF/file_def_nemo-oce.xml              |    4 +-
 .../EXPREF/file_def_nemo-oce.xml              |    4 +-
 cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg     |   11 +
 .../ORCA2_ICE_PISCES/cpp_ORCA2_ICE_PISCES.fcm |    2 +-
 cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_cfg     |    2 +-
 .../ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm |    2 +-
 .../EXPREF/file_def_nemo-innerttrc.xml        |   15 +-
 cfgs/ORCA2_OFF_TRC/EXPREF/namelist_cfg        |    2 +-
 .../EXPREF/file_def_nemo-oce.xml              |    4 +-
 cfgs/ORCA2_SAS_ICE/cpp_ORCA2_SAS_ICE.fcm      |    2 +-
 cfgs/SHARED/field_def_nemo-ice.xml            |   20 +-
 cfgs/SHARED/field_def_nemo-innerttrc.xml      |    8 +-
 cfgs/SHARED/field_def_nemo-oce.xml            |  579 +++--
 cfgs/SHARED/field_def_nemo-pisces.xml         |  251 +-
 cfgs/SHARED/grid_def_nemo.xml                 |   55 +-
 cfgs/SHARED/namelist_ref                      |   50 +-
 cfgs/SPITZ12/EXPREF/file_def_nemo-oce.xml     |    4 +-
 cfgs/WED025/EXPREF/file_def_nemo-oce.xml      |    4 +-
 cfgs/WED025/cpp_WED025.fcm                    |    2 +-
 mk/Flist_cfgs.sh                              |    3 -
 sette/BATCH_TEMPLATE/batch-X64_AA_INTEL_OMPI  |    2 +-
 sette/BATCH_TEMPLATE/batch-X64_IRENE_GCC      |    6 +-
 sette/BATCH_TEMPLATE/batch-X64_JEANZAY        |    1 +
 sette/BATCH_TEMPLATE/batch-X64_JEANZAY_GCC    |   93 +
 sette/sette.sh                                |    5 +-
 sette/sette_reference-configurations.sh       |    4 +-
 src/ABL/abl.F90                               |   26 +-
 src/ABL/ablmod.F90                            |  575 +++--
 src/ABL/ablrst.F90                            |    6 +-
 src/ABL/sbcabl.F90                            |   22 +-
 src/ICE/ice.F90                               |  135 +-
 src/ICE/ice1d.F90                             |   96 +-
 src/ICE/icealb.F90                            |   28 +-
 src/ICE/icecor.F90                            |   18 +-
 src/ICE/icectl.F90                            |  224 +-
 src/ICE/icedia.F90                            |   51 +-
 src/ICE/icedyn.F90                            |   34 +-
 src/ICE/icedyn_adv.F90                        |   15 +-
 src/ICE/icedyn_adv_pra.F90                    | 1529 ++++++------
 src/ICE/icedyn_adv_umx.F90                    |  201 +-
 src/ICE/icedyn_rdgrft.F90                     |  402 ++--
 src/ICE/icedyn_rhg_eap.F90                    |  375 ++-
 src/ICE/icedyn_rhg_evp.F90                    |  418 ++--
 src/ICE/icedyn_rhg_vp.F90                     |  119 +-
 src/ICE/iceistate.F90                         |  239 +-
 src/ICE/iceitd.F90                            |  181 +-
 src/ICE/icerst.F90                            |    2 +-
 src/ICE/icesbc.F90                            |  158 +-
 src/ICE/icestp.F90                            |  175 +-
 src/ICE/icetab.F90                            |  135 +-
 src/ICE/icethd.F90                            |   39 +-
 src/ICE/icethd_dh.F90                         |  613 ++---
 src/ICE/icethd_do.F90                         |  410 ++--
 src/ICE/icethd_ent.F90                        |  144 --
 src/ICE/icethd_pnd.F90                        |   24 +-
 src/ICE/icethd_zdf_bl99.F90                   |  846 ++++---
 src/ICE/iceupdate.F90                         |  139 +-
 src/ICE/icevar.F90                            |  652 +++---
 src/ICE/icewri.F90                            |  229 +-
 src/NST/agrif_all_update.F90                  |   10 +-
 src/NST/agrif_ice_interp.F90                  |   12 +-
 src/NST/agrif_oce_interp.F90                  |  162 +-
 src/NST/agrif_oce_sponge.F90                  |   74 +-
 src/NST/agrif_oce_update.F90                  |  107 +-
 src/NST/agrif_top_interp.F90                  |    4 +-
 src/NST/agrif_top_sponge.F90                  |   10 +-
 src/NST/agrif_user.F90                        |   16 +-
 src/OCE/ASM/asminc.F90                        |   85 +-
 src/OCE/BDY/bdydyn.F90                        |    1 -
 src/OCE/BDY/bdyice.F90                        |   11 +-
 src/OCE/BDY/bdyini.F90                        |   34 +-
 src/OCE/BDY/bdyvol.F90                        |   20 +-
 src/OCE/C1D/dtauvd.F90                        |   13 +-
 src/OCE/C1D/dyndmp.F90                        |    2 +-
 src/OCE/CRS/crs.F90                           |    7 +-
 src/OCE/CRS/crsfld.F90                        |    4 +-
 src/OCE/CRS/crsini.F90                        |   10 +-
 src/OCE/DIA/dia25h.F90                        |   16 +-
 src/OCE/DIA/diaar5.F90                        |  204 +-
 src/OCE/DIA/diacfl.F90                        |   19 +-
 src/OCE/DIA/diadct.F90                        |    9 +-
 src/OCE/DIA/diadetide.F90                     |   21 +-
 src/OCE/DIA/diahsb.F90                        |  177 +-
 src/OCE/DIA/diahth.F90                        |   86 +-
 src/OCE/DIA/diamlr.F90                        |    9 +-
 src/OCE/DIA/diaptr.F90                        |  323 +--
 src/OCE/DIA/diawri.F90                        |  360 +--
 src/OCE/DIU/diu_bulk.F90                      |   68 +-
 src/OCE/DIU/diu_coolskin.F90                  |   26 +-
 src/OCE/DIU/step_diu.F90                      |    3 +-
 src/OCE/DOM/closea.F90                        |   16 +-
 src/OCE/DOM/dom_oce.F90                       |  302 ++-
 src/OCE/DOM/domain.F90                        |  118 +-
 src/OCE/DOM/dommsk.F90                        |    6 +-
 src/OCE/DOM/domqco.F90                        |   10 +-
 src/OCE/DOM/domutl.F90                        |  222 +-
 src/OCE/DOM/domvvl.F90                        | 1105 ---------
 src/OCE/DOM/domwri.F90                        |   39 +-
 src/OCE/DOM/domzgr.F90                        |  306 ++-
 src/OCE/DOM/domzgr_substitute.h90             |  784 ++++++-
 src/OCE/DOM/dtatsd.F90                        |   40 +-
 src/OCE/DOM/istate.F90                        |    1 -
 src/OCE/DYN/divhor.F90                        |   50 +-
 src/OCE/DYN/dynadv.F90                        |   17 +-
 src/OCE/DYN/dynadv_cen2.F90                   |  143 +-
 src/OCE/DYN/dynadv_ubs.F90                    |  277 +--
 src/OCE/DYN/dynatf.F90                        |  369 ---
 src/OCE/DYN/dynatf_qco.F90                    |   19 +-
 src/OCE/DYN/dynhpg.F90                        |  408 ++--
 src/OCE/DYN/dynkeg.F90                        |  123 +-
 src/OCE/DYN/dynldf.F90                        |    9 +-
 src/OCE/DYN/dynldf_iso.F90                    |   78 +-
 src/OCE/DYN/dynldf_iso_lf.F90                 |  401 ----
 src/OCE/DYN/dynldf_lap_blp.F90                |  230 --
 src/OCE/DYN/dynldf_lap_blp_lf.F90             |   18 +-
 src/OCE/DYN/dynldf_lev.F90                    |  222 ++
 src/OCE/DYN/dynldf_lev_rot_scheme.h90         |   53 +
 src/OCE/DYN/dynldf_lev_sym_scheme.h90         |   58 +
 src/OCE/DYN/dynspg.F90                        |    8 +-
 src/OCE/DYN/dynspg_exp.F90                    |    6 +-
 src/OCE/DYN/dynspg_ts.F90                     |   84 +-
 src/OCE/DYN/dynvor.F90                        |  397 ++--
 src/OCE/DYN/dynzad.F90                        |    6 +-
 src/OCE/DYN/dynzdf.F90                        |  609 ++---
 src/OCE/DYN/sshwzv.F90                        |  104 +-
 src/OCE/DYN/wet_dry.F90                       |   32 +-
 src/OCE/FLO/floblk.F90                        |    8 +-
 src/OCE/FLO/flodom.F90                        |    4 +-
 src/OCE/FLO/florst.F90                        |    8 +-
 src/OCE/FLO/flowri.F90                        |    4 +-
 src/OCE/ICB/icbclv.F90                        |    4 +-
 src/OCE/ICB/icbdyn.F90                        |    8 +-
 src/OCE/ICB/icbini.F90                        |   10 +-
 src/OCE/ICB/icblbc.F90                        |   34 +-
 src/OCE/ICB/icbrst.F90                        |   24 +-
 src/OCE/ICB/icbthm.F90                        |   14 +-
 src/OCE/ICB/icbutl.F90                        |   39 +-
 src/OCE/IOM/iom.F90                           |  239 +-
 src/OCE/IOM/iom_nf90.F90                      |   59 +-
 src/OCE/IOM/prtctl.F90                        |  139 +-
 src/OCE/ISF/isf_oce.F90                       |  171 +-
 src/OCE/ISF/isfcav.F90                        |  253 +-
 src/OCE/ISF/isfcavgam.F90                     |  259 +-
 src/OCE/ISF/isfcavmlt.F90                     |  294 +--
 src/OCE/ISF/isfcpl.F90                        |  422 ++--
 src/OCE/ISF/isfdiags.F90                      |   51 +-
 src/OCE/ISF/isfdynatf.F90                     |   75 +-
 src/OCE/ISF/isfhdiv.F90                       |   68 +-
 src/OCE/ISF/isfload.F90                       |   33 +-
 src/OCE/ISF/isfpar.F90                        |  148 +-
 src/OCE/ISF/isfparmlt.F90                     |  195 +-
 src/OCE/ISF/isfrst.F90                        |   27 +-
 src/OCE/ISF/isfstp.F90                        |  142 +-
 src/OCE/ISF/isftbl.F90                        |  237 +-
 src/OCE/ISF/isfutils.F90                      |   53 +-
 src/OCE/LBC/lbc_lnk_call_generic.h90          |   41 +-
 src/OCE/LBC/lbc_lnk_neicoll_generic.h90       |  447 ++--
 src/OCE/LBC/lbc_lnk_pt2pt_generic.h90         |  413 ++--
 src/OCE/LBC/lbc_nfd_generic.h90               |  380 ++-
 src/OCE/LBC/lbclnk.F90                        |   14 +-
 src/OCE/LBC/lbcnfd.F90                        |   17 +-
 src/OCE/LBC/lib_mpp.F90                       |   22 +-
 src/OCE/LBC/mpp_lbc_north_icb_generic.h90     |    2 +-
 src/OCE/LBC/mpp_lnk_icb_generic.h90           |    2 +-
 src/OCE/LBC/mpp_loc_generic.h90               |   24 +-
 src/OCE/LBC/mpp_nfd_generic.h90               |  502 ++--
 src/OCE/LBC/mppini.F90                        |  218 +-
 src/OCE/LDF/ldfc1d_c2d.F90                    |    5 +-
 src/OCE/LDF/ldfdyn.F90                        |   68 +-
 src/OCE/LDF/ldfslp.F90                        |  507 ++--
 src/OCE/LDF/ldftra.F90                        |  186 +-
 src/OCE/OBS/mpp_map.F90                       |    6 +-
 src/OCE/OBS/obs_grd_bruteforce.h90            |    6 +-
 src/OCE/OBS/obs_grid.F90                      |    6 +-
 src/OCE/OBS/obs_inter_sup.F90                 |    4 +-
 src/OCE/OBS/obs_write.F90                     |    8 +-
 src/OCE/SBC/cpl_oasis3.F90                    |   25 +-
 src/OCE/SBC/cyclone.F90                       |   12 +-
 src/OCE/SBC/fldread.F90                       |   61 +-
 src/OCE/SBC/geo2ocean.F90                     |  111 +-
 src/OCE/SBC/ocealb.F90                        |    8 +-
 src/OCE/SBC/sbc_ice.F90                       |   47 +-
 src/OCE/SBC/sbc_oce.F90                       |   98 +-
 src/OCE/SBC/sbc_phy.F90                       |  298 +--
 src/OCE/SBC/sbcblk.F90                        |  605 +++--
 src/OCE/SBC/sbcblk_algo_andreas.F90           |   62 +-
 src/OCE/SBC/sbcblk_algo_coare3p0.F90          |  100 +-
 src/OCE/SBC/sbcblk_algo_coare3p6.F90          |  106 +-
 src/OCE/SBC/sbcblk_algo_ecmwf.F90             |   94 +-
 src/OCE/SBC/sbcblk_algo_ice_an05.F90          |   78 +-
 src/OCE/SBC/sbcblk_algo_ice_cdn.F90           |   54 +-
 src/OCE/SBC/sbcblk_algo_ice_lg15.F90          |   52 +-
 src/OCE/SBC/sbcblk_algo_ice_lu12.F90          |   46 +-
 src/OCE/SBC/sbcblk_algo_ncar.F90              |   72 +-
 src/OCE/SBC/sbcblk_skin_coare.F90             |   24 +-
 src/OCE/SBC/sbcblk_skin_ecmwf.F90             |   22 +-
 src/OCE/SBC/sbcclo.F90                        |    8 +-
 src/OCE/SBC/sbccpl.F90                        |  737 +++---
 src/OCE/SBC/sbcdcy.F90                        |   28 +-
 src/OCE/SBC/sbcflx.F90                        |   72 +-
 src/OCE/SBC/sbcfwb.F90                        |  126 +-
 src/OCE/SBC/sbcice_cice.F90                   |   45 +-
 src/OCE/SBC/sbcice_if.F90                     |   18 +-
 src/OCE/SBC/sbcmod.F90                        |  231 +-
 src/OCE/SBC/sbcrnf.F90                        |  128 +-
 src/OCE/SBC/sbcssm.F90                        |   24 +-
 src/OCE/SBC/sbcssr.F90                        |   32 +-
 src/OCE/SBC/sbcwave.F90                       |  100 +-
 src/OCE/TRA/eosbn2.F90                        |  728 ++++--
 src/OCE/TRA/traadv.F90                        |   59 +-
 src/OCE/TRA/traadv_cen.F90                    |  182 +-
 src/OCE/TRA/traadv_cen_lf.F90                 |    5 +-
 src/OCE/TRA/traadv_fct.F90                    |  394 +---
 src/OCE/TRA/traadv_mus.F90                    |  244 +-
 src/OCE/TRA/traadv_qck.F90                    |   57 +-
 src/OCE/TRA/traadv_qck_lf.F90                 |   50 +-
 src/OCE/TRA/traadv_ubs.F90                    |   28 +-
 src/OCE/TRA/traadv_ubs_lf.F90                 |   11 +-
 src/OCE/TRA/traatf.F90                        |  389 ---
 src/OCE/TRA/traatf_qco.F90                    |   18 +-
 src/OCE/TRA/trabbl.F90                        |   16 +-
 src/OCE/TRA/tradmp.F90                        |    6 +-
 src/OCE/TRA/traisf.F90                        |   41 +-
 src/OCE/TRA/traldf.F90                        |   77 +-
 src/OCE/TRA/traldf_iso.F90                    |  615 ++---
 src/OCE/TRA/traldf_iso_scheme.h90             |  195 ++
 src/OCE/TRA/traldf_lap_blp.F90                |  260 ---
 src/OCE/TRA/traldf_lev.F90                    |  253 ++
 src/OCE/TRA/traldf_triad.F90                  |  193 +-
 src/OCE/TRA/tramle.F90                        |   35 +-
 src/OCE/TRA/tranpc.F90                        |   14 +-
 src/OCE/TRA/traqsr.F90                        |  149 +-
 src/OCE/TRA/trasbc.F90                        |   16 +-
 src/OCE/TRA/trazdf.F90                        |  265 ++-
 src/OCE/TRA/zpshde.F90                        |  487 ----
 src/OCE/TRD/trddyn.F90                        |   23 +-
 src/OCE/TRD/trdglo.F90                        |  119 +-
 src/OCE/TRD/trdken.F90                        |   97 +-
 src/OCE/TRD/trdmxl.F90                        |  115 +-
 src/OCE/TRD/trdmxl_oce.F90                    |   48 +-
 src/OCE/TRD/trdpen.F90                        |   36 +-
 src/OCE/TRD/trdtra.F90                        |  122 +-
 src/OCE/TRD/trdvor.F90                        |   45 +-
 src/OCE/USR/usrdef_fmask.F90                  |   28 +-
 src/OCE/USR/usrdef_hgr.F90                    |    4 +-
 src/OCE/USR/usrdef_sbc.F90                    |   16 +-
 src/OCE/USR/usrdef_zgr.F90                    |   27 +-
 src/OCE/ZDF/zdf_oce.F90                       |    8 +-
 src/OCE/ZDF/zdfddm.F90                        |   14 +-
 src/OCE/ZDF/zdfdrg.F90                        |    4 +-
 src/OCE/ZDF/zdfevd.F90                        |   40 +-
 src/OCE/ZDF/zdfgls.F90                        |  166 +-
 src/OCE/ZDF/zdfiwm.F90                        |  170 +-
 src/OCE/ZDF/zdfmfc.F90                        |   69 +-
 src/OCE/ZDF/zdfmxl.F90                        |   38 +-
 src/OCE/ZDF/zdfosm.F90                        |  606 ++---
 src/OCE/ZDF/zdfphy.F90                        |   99 +-
 src/OCE/ZDF/zdfric.F90                        |   17 +-
 src/OCE/ZDF/zdfsh2.F90                        |   16 +-
 src/OCE/ZDF/zdfswm.F90                        |   10 +-
 src/OCE/ZDF/zdftke.F90                        |  147 +-
 src/OCE/do_loop_substitute.h90                |   47 +-
 src/OCE/lib_fortran.F90                       |  336 +--
 src/OCE/lib_fortran_generic.h90               |  278 ++-
 src/OCE/module_example.F90                    |   12 +-
 src/OCE/nemogcm.F90                           |    9 +-
 src/OCE/oce.F90                               |   13 -
 src/OCE/par_oce.F90                           |    3 +-
 src/OCE/step.F90                              |  452 ----
 src/OCE/step_oce.F90                          |    8 +-
 src/OCE/stp2d.F90                             |   23 +-
 src/OCE/stpctl.F90                            |    2 +-
 src/OCE/stpmlf.F90                            |   29 +-
 src/OCE/stprk3.F90                            |   17 +-
 src/OCE/stprk3_stg.F90                        |   13 +-
 src/OCE/trc_oce.F90                           |   11 +-
 src/OFF/dtadyn.F90                            |  168 +-
 src/OFF/nemogcm.F90                           |    7 +-
 src/SAS/diawri.F90                            |   12 +-
 src/SAS/nemogcm.F90                           |    9 +-
 src/SAS/sbcssm.F90                            |    2 +-
 src/SAS/stpctl.F90                            |   27 +-
 src/SWE/domzgr_substitute.h90                 |   36 +-
 src/SWE/nemogcm.F90                           |    2 -
 src/SWE/stp_oce.F90                           |   11 +-
 src/SWE/stpctl.F90                            |    9 +-
 src/SWE/stpmlf.F90                            |    4 +-
 src/SWE/stprk3.F90                            |   12 +-
 src/TOP/AGE/trcsms_age.F90                    |    4 +-
 src/TOP/AGE/trcwri_age.F90                    |    1 -
 src/TOP/C14/sms_c14.F90                       |    8 +-
 src/TOP/C14/trcatm_c14.F90                    |   19 +-
 src/TOP/C14/trcsms_c14.F90                    |   12 +-
 src/TOP/C14/trcwri_c14.F90                    |   78 +-
 src/TOP/CFC/trcini_cfc.F90                    |    2 +-
 src/TOP/CFC/trcsms_cfc.F90                    |   10 +-
 src/TOP/PISCES/P2Z/p2zbio.F90                 |   30 +-
 src/TOP/PISCES/P2Z/p2zexp.F90                 |   31 +-
 src/TOP/PISCES/P2Z/p2zopt.F90                 |   22 +-
 src/TOP/PISCES/P2Z/p2zsed.F90                 |   27 +-
 src/TOP/PISCES/P4Z/p4zagg.F90                 |    4 +-
 src/TOP/PISCES/P4Z/p4zbc.F90                  |  109 +-
 src/TOP/PISCES/P4Z/p4zbio.F90                 |    2 +-
 src/TOP/PISCES/P4Z/p4zche.F90                 |   56 +-
 src/TOP/PISCES/P4Z/p4zfechem.F90              |  132 +-
 src/TOP/PISCES/P4Z/p4zflx.F90                 |  105 +-
 src/TOP/PISCES/P4Z/p4zint.F90                 |   18 +-
 src/TOP/PISCES/P4Z/p4zligand.F90              |  137 +-
 src/TOP/PISCES/P4Z/p4zlim.F90                 |   80 +-
 src/TOP/PISCES/P4Z/p4zlys.F90                 |   75 +-
 src/TOP/PISCES/P4Z/p4zmeso.F90                |   98 +-
 src/TOP/PISCES/P4Z/p4zmicro.F90               |   78 +-
 src/TOP/PISCES/P4Z/p4zmort.F90                |    4 +-
 src/TOP/PISCES/P4Z/p4zopt.F90                 |  190 +-
 src/TOP/PISCES/P4Z/p4zpoc.F90                 |  141 +-
 src/TOP/PISCES/P4Z/p4zprod.F90                |  282 ++-
 src/TOP/PISCES/P4Z/p4zrem.F90                 |  119 +-
 src/TOP/PISCES/P4Z/p4zsed.F90                 |  250 +-
 src/TOP/PISCES/P4Z/p4zsink.F90                |  165 +-
 src/TOP/PISCES/P4Z/p4zsms.F90                 |  133 +-
 src/TOP/PISCES/P4Z/p5zlim.F90                 |  133 +-
 src/TOP/PISCES/P4Z/p5zmeso.F90                |   99 +-
 src/TOP/PISCES/P4Z/p5zmicro.F90               |   75 +-
 src/TOP/PISCES/P4Z/p5zmort.F90                |    6 +-
 src/TOP/PISCES/P4Z/p5zprod.F90                |  542 +++--
 src/TOP/PISCES/SED/oce_sed.F90                |   13 +-
 src/TOP/PISCES/SED/sedchem.F90                |    2 +-
 src/TOP/PISCES/SED/sedini.F90                 |    1 +
 src/TOP/PISCES/SED/sedsfc.F90                 |    2 +-
 src/TOP/PISCES/SED/trcdmp_sed.F90             |    2 +-
 src/TOP/PISCES/sms_pisces.F90                 |   48 +-
 src/TOP/PISCES/trcice_pisces.F90              |   24 +-
 src/TOP/PISCES/trcini_pisces.F90              |    1 -
 src/TOP/PISCES/trcwri_pisces.F90              |   18 +-
 src/TOP/TRP/trcadv.F90                        |   30 +-
 src/TOP/TRP/trcatf.F90                        |    8 +-
 src/TOP/TRP/trcdmp.F90                        |   10 +-
 src/TOP/TRP/trcldf.F90                        |   33 +-
 src/TOP/TRP/trcsbc.F90                        |   50 +-
 src/TOP/TRP/trcsink.F90                       |   61 +-
 src/TOP/TRP/trctrp.F90                        |    8 -
 src/TOP/TRP/trczdf.F90                        |    2 +-
 src/TOP/TRP/trdmxl_trc.F90                    |   10 +-
 src/TOP/oce_trc.F90                           |    7 +-
 src/TOP/trc.F90                               |   26 +-
 src/TOP/trcais.F90                            |    8 +-
 src/TOP/trcbc.F90                             |    6 +-
 src/TOP/trcdta.F90                            |   19 +-
 src/TOP/trcini.F90                            |    5 +-
 src/TOP/trcnam.F90                            |    7 +-
 src/TOP/trcopt.F90                            |  125 +-
 src/TOP/trcstp.F90                            |   32 +-
 src/TOP/trcstp_rk3.F90                        |   43 +-
 src/TOP/trcwri.F90                            |   61 +-
 tests/ADIAB_WAVE/MY_SRC/sbcwave.F90           |   10 +-
 tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90        |    8 +-
 tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90        |    7 +-
 tests/BENCH/MY_SRC/usrdef_hgr.F90             |    6 +-
 tests/BENCH/MY_SRC/usrdef_istate.F90          |    4 +-
 tests/BENCH/MY_SRC/usrdef_sbc.F90             |   19 +-
 tests/BENCH/MY_SRC/usrdef_zgr.F90             |   45 +-
 tests/BENCH/cpp_BENCH.fcm                     |    2 +-
 tests/C1D_ASICS/MY_SRC/usrdef_nam.F90         |    1 -
 tests/CANAL/EXPREF/file_def_nemo-oce.xml      |    4 +-
 tests/CANAL/MY_SRC/usrdef_hgr.F90             |    4 +-
 tests/CANAL/MY_SRC/usrdef_zgr.F90             |   30 +-
 tests/CANAL/cpp_CANAL.fcm                     |    2 +-
 tests/DIA_GPU/EXPREF/file_def_nemo-oce.xml    |    4 +-
 tests/DIA_GPU/MY_SRC/stpctl.F90               |    2 +-
 tests/DOME/MY_SRC/usrdef_hgr.F90              |    4 +-
 tests/DOME/MY_SRC/usrdef_istate.F90           |    4 +-
 tests/DOME/MY_SRC/usrdef_zgr.F90              |    3 +-
 tests/DONUT/EXPREF/file_def_nemo-oce.xml      |    4 +-
 tests/DONUT/cpp_DONUT.fcm                     |    2 +-
 tests/ICB/MY_SRC/usrdef_nam.F90               |    1 -
 tests/ICE_ADV1D/EXPREF/file_def_nemo-ice.xml  |    2 -
 tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90         |    4 +-
 tests/ICE_ADV1D/MY_SRC/usrdef_sbc.F90         |   30 +-
 tests/ICE_ADV1D/MY_SRC/usrdef_zgr.F90         |    2 +-
 tests/ICE_ADV2D/EXPREF/file_def_nemo-ice.xml  |    2 -
 tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90         |   16 +-
 tests/ICE_ADV2D/MY_SRC/usrdef_sbc.F90         |   22 +-
 tests/ICE_ADV2D/MY_SRC/usrdef_zgr.F90         |    2 +-
 tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90         |   16 +-
 tests/ICE_AGRIF/MY_SRC/usrdef_sbc.F90         |   22 +-
 tests/ICE_AGRIF/MY_SRC/usrdef_zgr.F90         |   40 +-
 tests/ICE_AGRIF/cpp_ICE_AGRIF.fcm             |    2 +-
 tests/ICE_RHEO/EXPREF/file_def_nemo-oce.xml   |    7 +-
 tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90      |   10 +-
 tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90      |   10 +-
 tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90          |   12 +-
 tests/ICE_RHEO/MY_SRC/usrdef_nam.F90          |    1 -
 tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90          |   58 +-
 tests/ISOMIP+/EXPREF/namelist_cfg             |   13 +-
 tests/ISOMIP+/MY_SRC/dtatsd.F90               |   79 +-
 tests/ISOMIP+/MY_SRC/eosbn2.F90               | 2078 -----------------
 tests/ISOMIP+/MY_SRC/isf_oce.F90              |  159 +-
 tests/ISOMIP+/MY_SRC/isfcavgam.F90            |  253 --
 tests/ISOMIP+/MY_SRC/isfstp.F90               |  322 ---
 tests/ISOMIP+/MY_SRC/istate.F90               |   48 +-
 tests/ISOMIP+/MY_SRC/sbcfwb.F90               |  277 ---
 tests/ISOMIP+/MY_SRC/tradmp.F90               |  243 --
 tests/ISOMIP+/cpp_ISOMIP+.fcm                 |    2 +-
 tests/ISOMIP/EXPREF/ISOMIP_mlt.png            |  Bin 221790 -> 0 bytes
 tests/ISOMIP/EXPREF/ISOMIP_moc.png            |  Bin 507571 -> 0 bytes
 tests/ISOMIP/EXPREF/ISOMIP_psi.png            |  Bin 467568 -> 0 bytes
 tests/ISOMIP/EXPREF/README                    |   25 -
 tests/ISOMIP/EXPREF/axis_def_nemo.xml         |    1 -
 tests/ISOMIP/EXPREF/context_nemo.xml          |   37 -
 tests/ISOMIP/EXPREF/domain_def_nemo.xml       |    1 -
 tests/ISOMIP/EXPREF/field_def_nemo-oce.xml    |    1 -
 tests/ISOMIP/EXPREF/file_def_nemo-oce.xml     |   50 -
 tests/ISOMIP/EXPREF/grid_def_nemo.xml         |    1 -
 tests/ISOMIP/EXPREF/iodef.xml                 |   26 -
 tests/ISOMIP/EXPREF/namelist_cfg              |  510 ----
 tests/ISOMIP/EXPREF/namelist_ref              |    1 -
 tests/ISOMIP/EXPREF/plot_mlt.py               |   47 -
 tests/ISOMIP/EXPREF/plot_moc.py               |   60 -
 tests/ISOMIP/EXPREF/plot_psi.py               |   52 -
 tests/ISOMIP/MY_SRC/usrdef_hgr.F90            |  119 -
 tests/ISOMIP/MY_SRC/usrdef_istate.F90         |   87 -
 tests/ISOMIP/MY_SRC/usrdef_nam.F90            |  108 -
 tests/ISOMIP/MY_SRC/usrdef_sbc.F90            |   90 -
 tests/ISOMIP/MY_SRC/usrdef_zgr.F90            |  236 --
 tests/ISOMIP/cpp_ISOMIP.fcm                   |    1 -
 tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90     |    8 +-
 tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90     |   44 +-
 tests/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm     |    2 +-
 .../namelist_sco_FCT2_flux_cen-ahm1000_cfg    |    3 -
 .../EXPREF/namelist_sco_FCT2_flux_ubs_cfg     |    4 -
 .../namelist_sco_FCT4_flux_cen-ahm1000_cfg    |    4 -
 .../EXPREF/namelist_sco_FCT4_flux_ubs_cfg     |    4 -
 .../EXPREF/namelist_zps_FCT4_flux_ubs_cfg     |    3 -
 tests/OVERFLOW/MY_SRC/usrdef_hgr.F90          |    8 +-
 tests/OVERFLOW/MY_SRC/usrdef_nam.F90          |    7 +-
 tests/OVERFLOW/MY_SRC/usrdef_zgr.F90          |  202 +-
 tests/OVERFLOW/cpp_OVERFLOW.fcm               |    2 +-
 tests/STATION_ASF/MY_SRC/icesbc.F90           |   11 +-
 tests/STATION_ASF/MY_SRC/icestp.F90           |    8 +-
 tests/STATION_ASF/MY_SRC/stpctl.F90           |   26 +-
 tests/STATION_ASF/MY_SRC/usrdef_hgr.F90       |    1 -
 tests/STATION_ASF/MY_SRC/usrdef_nam.F90       |    1 -
 tests/SWG/EXPREF/file_def_nemo-oce.xml        |    4 +-
 tests/SWG/MY_SRC/usrdef_fmask.F90             |   28 +-
 tests/SWG/MY_SRC/usrdef_nam.F90               |    1 -
 tests/SWG/MY_SRC/usrdef_sbc.F90               |   15 +-
 tests/SWG/MY_SRC/usrdef_zgr.F90               |   18 +-
 tests/SWG/cpp_SWG.fcm                         |    2 +-
 tests/TSUNAMI/MY_SRC/usrdef_hgr.F90           |    4 +-
 tests/VORTEX/MY_SRC/usrdef_hgr.F90            |    4 +-
 tests/VORTEX/MY_SRC/usrdef_zgr.F90            |   30 +-
 tests/VORTEX/cpp_VORTEX.fcm                   |    2 +-
 tests/WAD/EXPREF/file_def_nemo-oce.xml        |    4 +-
 tests/WAD/MY_SRC/usrdef_hgr.F90               |    8 +-
 tests/WAD/MY_SRC/usrdef_istate.F90            |    9 +-
 tests/WAD/MY_SRC/usrdef_zgr.F90               |   64 +-
 tools/MISCELLANEOUS/chk_jijj_in_doloops.sh    |   55 +
 466 files changed, 20430 insertions(+), 25363 deletions(-)
 create mode 100644 arch/CNRS/arch-X64_JEANZAY_GCC.fcm
 create mode 100644 sette/BATCH_TEMPLATE/batch-X64_JEANZAY_GCC
 delete mode 100644 src/ICE/icethd_ent.F90
 delete mode 100644 src/OCE/DOM/domvvl.F90
 delete mode 100644 src/OCE/DYN/dynatf.F90
 delete mode 100644 src/OCE/DYN/dynldf_iso_lf.F90
 delete mode 100644 src/OCE/DYN/dynldf_lap_blp.F90
 create mode 100644 src/OCE/DYN/dynldf_lev.F90
 create mode 100644 src/OCE/DYN/dynldf_lev_rot_scheme.h90
 create mode 100644 src/OCE/DYN/dynldf_lev_sym_scheme.h90
 delete mode 100644 src/OCE/TRA/traatf.F90
 create mode 100644 src/OCE/TRA/traldf_iso_scheme.h90
 delete mode 100644 src/OCE/TRA/traldf_lap_blp.F90
 create mode 100644 src/OCE/TRA/traldf_lev.F90
 delete mode 100644 src/OCE/TRA/zpshde.F90
 delete mode 100644 src/OCE/step.F90
 delete mode 100644 tests/ISOMIP+/MY_SRC/eosbn2.F90
 delete mode 100644 tests/ISOMIP+/MY_SRC/isfcavgam.F90
 delete mode 100644 tests/ISOMIP+/MY_SRC/isfstp.F90
 delete mode 100644 tests/ISOMIP+/MY_SRC/sbcfwb.F90
 delete mode 100644 tests/ISOMIP+/MY_SRC/tradmp.F90
 delete mode 100644 tests/ISOMIP/EXPREF/ISOMIP_mlt.png
 delete mode 100644 tests/ISOMIP/EXPREF/ISOMIP_moc.png
 delete mode 100644 tests/ISOMIP/EXPREF/ISOMIP_psi.png
 delete mode 100644 tests/ISOMIP/EXPREF/README
 delete mode 120000 tests/ISOMIP/EXPREF/axis_def_nemo.xml
 delete mode 100644 tests/ISOMIP/EXPREF/context_nemo.xml
 delete mode 120000 tests/ISOMIP/EXPREF/domain_def_nemo.xml
 delete mode 120000 tests/ISOMIP/EXPREF/field_def_nemo-oce.xml
 delete mode 100644 tests/ISOMIP/EXPREF/file_def_nemo-oce.xml
 delete mode 120000 tests/ISOMIP/EXPREF/grid_def_nemo.xml
 delete mode 100644 tests/ISOMIP/EXPREF/iodef.xml
 delete mode 100644 tests/ISOMIP/EXPREF/namelist_cfg
 delete mode 120000 tests/ISOMIP/EXPREF/namelist_ref
 delete mode 100644 tests/ISOMIP/EXPREF/plot_mlt.py
 delete mode 100644 tests/ISOMIP/EXPREF/plot_moc.py
 delete mode 100644 tests/ISOMIP/EXPREF/plot_psi.py
 delete mode 100644 tests/ISOMIP/MY_SRC/usrdef_hgr.F90
 delete mode 100644 tests/ISOMIP/MY_SRC/usrdef_istate.F90
 delete mode 100644 tests/ISOMIP/MY_SRC/usrdef_nam.F90
 delete mode 100644 tests/ISOMIP/MY_SRC/usrdef_sbc.F90
 delete mode 100644 tests/ISOMIP/MY_SRC/usrdef_zgr.F90
 delete mode 100644 tests/ISOMIP/cpp_ISOMIP.fcm
 create mode 100755 tools/MISCELLANEOUS/chk_jijj_in_doloops.sh

diff --git a/arch/CNRS/arch-X64_IRENE_GCC.fcm b/arch/CNRS/arch-X64_IRENE_GCC.fcm
index 99dffdfb..f3c63fa3 100644
--- a/arch/CNRS/arch-X64_IRENE_GCC.fcm
+++ b/arch/CNRS/arch-X64_IRENE_GCC.fcm
@@ -5,9 +5,9 @@
 #   module purge
 #   module load gnu/8.3.0
 #   module load flavor/buildcompiler/gcc/8
-#   module load flavor/buildmpi/openmpi/2.0
+#   module load flavor/buildmpi/openmpi/4.0
 #   module load flavor/hdf5/parallel
-#   module load mpi/openmpi/2.0.4
+#   module load mpi/openmpi/4.0.5.3
 #   module load hdf5/1.8.20
 #   module load netcdf-c/4.6.0
 #   module load netcdf-fortran/4.4.4
@@ -30,7 +30,7 @@
 %CPP	             cpp -Dkey_nosignedzero 
 %FC                  mpif90
 %PROD_FCFLAGS        -fdefault-real-8 -O3 -funroll-all-loops -fcray-pointer -ffree-line-length-none -Wno-missing-include-dirs 
-%DEBUG_FCFLAGS       -fdefault-real-8 -O0 -g -fbacktrace -funroll-all-loops -fcray-pointer -ffree-line-length-none -fcheck=all -finit-real=nan
+%DEBUG_FCFLAGS       -fdefault-real-8 -O0 -g -fbacktrace -funroll-all-loops -fcray-pointer -ffree-line-length-none -Wno-missing-include-dirs -fcheck=all -finit-real=nan
 %FFLAGS              %FCFLAGS
 %LD                  mpif90
 %LDFLAGS             
diff --git a/arch/CNRS/arch-X64_JEANZAY_GCC.fcm b/arch/CNRS/arch-X64_JEANZAY_GCC.fcm
new file mode 100644
index 00000000..12051bec
--- /dev/null
+++ b/arch/CNRS/arch-X64_JEANZAY_GCC.fcm
@@ -0,0 +1,74 @@
+# Jean-Zay HPE at IDRIS, http://www.idris.fr/jean-zay
+#
+# XIOS_HOME   root directory containing lib for XIOS
+# OASIS_HOME  root directory containing lib for OASIS
+#
+# NCDF_INC    netcdf4 include file
+# NCDF_LIB    netcdf4 library
+# XIOS_INC    xios include file    (taken into accound only if key_xios is activated)
+# XIOS_LIB    xios library         (taken into accound only if key_xios is activated)
+# OASIS_INC   oasis include file   (taken into accound only if key_oasis3 is activated)
+# OASIS_LIB   oasis library        (taken into accound only if key_oasis3 is activated)
+#
+# FC          Fortran compiler command
+# FCFLAGS     Fortran compiler flags
+# FFLAGS      Fortran 77 compiler flags
+# LD          linker
+# LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries
+# FPPFLAGS    pre-processing flags
+# AR          assembler
+# ARFLAGS     assembler flags
+# MK          make
+# USER_INC    complete list of include files
+# USER_LIB    complete list of libraries to pass to the linker
+# CC          C compiler used to compile conv for AGRIF
+# CFLAGS      compiler flags used with CC
+#
+# Note that:
+#  - unix variables "$..." are accpeted and will be evaluated before calling fcm.
+#  - fcm variables are starting with a % (and not a $)
+#
+# Module we used:
+#    module purge
+#    module load gcc/8.3.1
+#    module load openmpi/4.1.1
+#    module load hdf5/1.12.0-mpi
+#    module load netcdf-c/4.7.4-mpi
+#    module load netcdf-fortran/4.5.3-mpi
+#
+#---------------------------------------------------------------------------------------------
+#---------------------------------------------------------------------------------------------
+# All NETCDF and HDF paths are empty as they are automatically defined through environment
+# variables by the load of modules
+#---------------------------------------------------------------------------------------------
+#---------------------------------------------------------------------------------------------
+#
+#
+%XIOS_HOME           $WORK/xios-trunk_gcc
+%OASIS_HOME          
+%NETCDF_C_HOME       $( echo $PATH | xargs -d ':' -n 1 | grep netcdf-c )/..
+%NETCDF_F_HOME       $( echo $PATH | xargs -d ':' -n 1 | grep netcdf-fortran )/..
+
+%NCDF_INC            -I%NETCDF_F_HOME/include -I%NETCDF_C_HOME/include
+%NCDF_LIB            -L%NETCDF_F_HOME/lib -lnetcdff -L%NETCDF_C_HOME/lib -lnetcdf
+%XIOS_INC            -I%XIOS_HOME/inc 
+%XIOS_LIB            -L%XIOS_HOME/lib -lxios -lstdc++
+%OASIS_INC           -I%OASIS_HOME/build/lib/mct -I%OASIS_HOME/build/lib/psmile.MPI1
+%OASIS_LIB           -L%OASIS_HOME/lib -lpsmile.MPI1 -lmct -lmpeu -lscrip
+
+%CPP	             cpp -Dkey_nosignedzero 
+%FC                  mpif90
+%PROD_FCFLAGS        -fdefault-real-8 -O3 -funroll-all-loops -fcray-pointer -ffree-line-length-none -Wno-missing-include-dirs 
+%DEBUG_FCFLAGS       -fdefault-real-8 -O0 -g -fbacktrace -funroll-all-loops -fcray-pointer -ffree-line-length-none  -Wno-missing-include-dirs -fcheck=all -finit-real=nan
+%FFLAGS              %FCFLAGS
+%LD                  mpif90
+%LDFLAGS             
+%FPPFLAGS            -P -traditional
+%AR                  ar
+%ARFLAGS             rs
+%MK                  gmake
+%USER_INC            %XIOS_INC %OASIS_INC %NCDF_INC
+%USER_LIB            %XIOS_LIB %OASIS_LIB %NCDF_LIB
+
+%CC                  cc
+%CFLAGS              -O0
diff --git a/arch/arch-osx_gfortran.fcm b/arch/arch-osx_gfortran.fcm
index 3ce12293..ece845b9 100644
--- a/arch/arch-osx_gfortran.fcm
+++ b/arch/arch-osx_gfortran.fcm
@@ -35,8 +35,8 @@
 
 %CPP	             cpp -Dkey_nosignedzero 
 %FC	             mpif90 
-%PROD_FCFLAGS        -fdefault-real-8 -O3 -funroll-all-loops -fcray-pointer -ffree-line-length-none  -fallow-argument-mismatch 
-%DEBUG_FCFLAGS       -fdefault-real-8 -O0 -g -fbacktrace -funroll-all-loops -fcray-pointer -ffree-line-length-none -fcheck=all -finit-real=nan
+%PROD_FCFLAGS        -fdefault-real-8 -O3 -funroll-all-loops -fcray-pointer -ffree-line-length-none -fallow-argument-mismatch 
+%DEBUG_FCFLAGS       -fdefault-real-8 -O0 -g -fbacktrace -funroll-all-loops -fcray-pointer -ffree-line-length-none -fcheck=all -finit-real=nan -fallow-argument-mismatch 
 %FFLAGS              %FCFLAGS
 %LD                  %FC
 %LDFLAGS             
diff --git a/cfgs/AGRIF_DEMO/EXPREF/file_def_nemo-oce.xml b/cfgs/AGRIF_DEMO/EXPREF/file_def_nemo-oce.xml
index 0d0368d7..6cb04ff0 100644
--- a/cfgs/AGRIF_DEMO/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/AGRIF_DEMO/EXPREF/file_def_nemo-oce.xml
@@ -34,6 +34,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -44,7 +46,6 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
           <field field_ref="uocetr_eff"   name="uocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="u_masstr"     name="vozomatr" />
@@ -56,7 +57,6 @@
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
           <field field_ref="vocetr_eff"   name="vocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="v_masstr"     name="vomematr" />
diff --git a/cfgs/AGRIF_DEMO/cpp_AGRIF_DEMO.fcm b/cfgs/AGRIF_DEMO/cpp_AGRIF_DEMO.fcm
index c601304c..0e63a0c8 100644
--- a/cfgs/AGRIF_DEMO/cpp_AGRIF_DEMO.fcm
+++ b/cfgs/AGRIF_DEMO/cpp_AGRIF_DEMO.fcm
@@ -1 +1 @@
-bld::tool::fppkeys   key_si3 key_top key_xios key_agrif key_qco
+bld::tool::fppkeys   key_si3 key_top key_xios key_agrif key_qco key_vco_1d3d
diff --git a/cfgs/AMM12/EXPREF/file_def_nemo-oce.xml b/cfgs/AMM12/EXPREF/file_def_nemo-oce.xml
index 776def80..d8c72914 100644
--- a/cfgs/AMM12/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/AMM12/EXPREF/file_def_nemo-oce.xml
@@ -100,6 +100,8 @@
 	  <field field_ref="qsr"          name="rsntds" />
 	  <field field_ref="qt"           name="tohfls" />
 	  <field field_ref="taum"     />
+	  <field field_ref="utau"         name="tauuo" />
+	  <field field_ref="vtau"         name="tauvo" />
 	  <field field_ref="mldkz5"   />
 	  <field field_ref="mldr10_1" />
 	</file>
@@ -107,13 +109,11 @@
 	<file id="file5" name_suffix="_grid_U" description="ocean U grid variables" >
 	  <field field_ref="uoce"         name="uo"    />
 	  <field field_ref="ssu"          name="uos"   />
-	  <field field_ref="utau"         name="tauuo" />
 	</file>
 	
 	<file id="file6" name_suffix="_grid_V" description="ocean V grid variables" >
 	  <field field_ref="voce"         name="vo"    />
 	  <field field_ref="ssv"          name="vos"   />
-	  <field field_ref="vtau"         name="tauvo" />
 	</file>
 	
 	<file id="file7" name_suffix="_grid_W" description="ocean W grid variables" >
diff --git a/cfgs/AMM12/cpp_AMM12.fcm b/cfgs/AMM12/cpp_AMM12.fcm
index f336c666..da62ce79 100644
--- a/cfgs/AMM12/cpp_AMM12.fcm
+++ b/cfgs/AMM12/cpp_AMM12.fcm
@@ -1 +1 @@
- bld::tool::fppkeys   key_diainstant key_xios key_qco
+ bld::tool::fppkeys   key_diainstant key_xios key_qco key_vco_3d
diff --git a/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml b/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml
index e24e2271..57144055 100644
--- a/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml
+++ b/cfgs/GYRE_PISCES/EXPREF/file_def_nemo.xml
@@ -32,16 +32,16 @@
 	  <field field_ref="qt"           name="sohefldo"  />
 	  <field field_ref="mldr10_1"     name="somxl010"  />
 	  <field field_ref="mldkz5"       name="somixhgt"  />
+          <field field_ref="utau"         name="sozotaux"  />
+          <field field_ref="vtau"         name="sometauy"  /> 
         </file>
 	
         <file id="file2" name_suffix="_grid_U" description="ocean U grid variables" >
           <field field_ref="uoce"         name="vozocrtx"  />
-          <field field_ref="utau"         name="sozotaux"  />
         </file>
 	
         <file id="file3" name_suffix="_grid_V" description="ocean V grid variables" >
           <field field_ref="voce"         name="vomecrty"  /> 
-          <field field_ref="vtau"         name="sometauy"  /> 
         </file>
 	
         <file id="file4" name_suffix="_grid_W" description="ocean W grid variables" >
diff --git a/cfgs/GYRE_PISCES/cpp_GYRE_PISCES.fcm b/cfgs/GYRE_PISCES/cpp_GYRE_PISCES.fcm
index c1b9eb39..e9e766e9 100644
--- a/cfgs/GYRE_PISCES/cpp_GYRE_PISCES.fcm
+++ b/cfgs/GYRE_PISCES/cpp_GYRE_PISCES.fcm
@@ -1 +1 @@
-bld::tool::fppkeys   key_top key_linssh key_xios
+bld::tool::fppkeys   key_top key_linssh key_vco_1d key_xios
diff --git a/cfgs/ORCA2_ICE_ABL/EXPREF/file_def_nemo-oce.xml b/cfgs/ORCA2_ICE_ABL/EXPREF/file_def_nemo-oce.xml
index 6d6df82d..9ba0c304 100644
--- a/cfgs/ORCA2_ICE_ABL/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/ORCA2_ICE_ABL/EXPREF/file_def_nemo-oce.xml
@@ -30,6 +30,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -40,14 +42,12 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       />
-	  <field field_ref="utau"         name="tauuo"    />
 	</file>
 	
 	<file id="file13" name_suffix="_grid_V" description="ocean V grid variables" >
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       />
-	  <field field_ref="vtau"         name="tauvo"    />
 	</file>
 	
 	<file id="file14" name_suffix="_grid_ABL" description="ABL grid variables" >
diff --git a/cfgs/ORCA2_ICE_PISCES/EXPREF/file_def_nemo-oce.xml b/cfgs/ORCA2_ICE_PISCES/EXPREF/file_def_nemo-oce.xml
index c043f56f..04590b55 100644
--- a/cfgs/ORCA2_ICE_PISCES/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/ORCA2_ICE_PISCES/EXPREF/file_def_nemo-oce.xml
@@ -34,6 +34,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -44,7 +46,6 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
           <field field_ref="uocetr_eff"   name="uocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="u_masstr"     name="vozomatr" />
@@ -56,7 +57,6 @@
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
           <field field_ref="vocetr_eff"   name="vocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="v_masstr"     name="vomematr" />
diff --git a/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg b/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg
index 4b17c102..c6e94339 100644
--- a/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg
+++ b/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg
@@ -118,6 +118,17 @@
 &namsbc_abl    !   Atmospheric Boundary Layer formulation           (ln_abl = T)
 !-----------------------------------------------------------------------
    cn_dom           = 'dom_cfg_abl_L25Z10'
+
+   nn_dyn_restore = 2         ! restoring option for dynamical ABL variables: = 0 no restoring
+                              !                                               = 1 equatorial restoring
+                              !                                               = 2 global restoring
+                              !                                               = 1 equatorial restoring
+                              !                                               = 2 global restoring
+   rn_ldyn_min   = 24.        ! dynamics nudging magnitude inside the ABL [hour] (~3 rn_Dt)
+   rn_ldyn_max   =  6.        ! dynamics nudging magnitude above  the ABL [hour] (~1 rn_Dt)
+   rn_ltra_min   = 24.        ! tracers  nudging magnitude inside the ABL [hour] (~3 rn_Dt)
+   rn_ltra_max   =  6.        ! tracers  nudging magnitude above  the ABL [hour] (~1 rn_Dt)
+   rn_vfac       =  1.
 /
 !-----------------------------------------------------------------------
 &namtra_qsr    !   penetrative solar radiation                          (ln_traqsr =T)
diff --git a/cfgs/ORCA2_ICE_PISCES/cpp_ORCA2_ICE_PISCES.fcm b/cfgs/ORCA2_ICE_PISCES/cpp_ORCA2_ICE_PISCES.fcm
index 26738163..6a78b61f 100644
--- a/cfgs/ORCA2_ICE_PISCES/cpp_ORCA2_ICE_PISCES.fcm
+++ b/cfgs/ORCA2_ICE_PISCES/cpp_ORCA2_ICE_PISCES.fcm
@@ -1 +1 @@
-bld::tool::fppkeys   key_si3 key_top key_xios key_qco 
+bld::tool::fppkeys   key_si3 key_top key_xios key_qco key_vco_1d3d 
diff --git a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_cfg b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_cfg
index 8e1b5a14..31af4cd1 100644
--- a/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_cfg
+++ b/cfgs/ORCA2_OFF_PISCES/EXPREF/namelist_cfg
@@ -325,7 +325,7 @@
    sn_sal      = 'dyna_grid_T'           ,       120.        , 'vosaline'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_mld      = 'dyna_grid_T'           ,       120.        , 'somixhgt'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_emp      = 'dyna_grid_T'           ,       120.        , 'sowaflcd'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
-   sn_fmf      = 'dyna_grid_T'           ,       120.        , 'iowaflup'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
+   sn_fwf      = 'dyna_grid_T'           ,       120.        , 'iowaflup'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_ice      = 'dyna_grid_T'           ,       120.        , 'soicecov'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_qsr      = 'dyna_grid_T'           ,       120.        , 'soshfldo'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_wnd      = 'dyna_grid_T'           ,       120.        , 'sowindsp'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
diff --git a/cfgs/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm b/cfgs/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm
index 4f4c1500..306244c6 100644
--- a/cfgs/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm
+++ b/cfgs/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm
@@ -1 +1 @@
-bld::tool::fppkeys   key_top key_xios
+bld::tool::fppkeys   key_top key_xios key_linssh key_vco_1d3d
diff --git a/cfgs/ORCA2_OFF_TRC/EXPREF/file_def_nemo-innerttrc.xml b/cfgs/ORCA2_OFF_TRC/EXPREF/file_def_nemo-innerttrc.xml
index 747e6cd3..d1d25f86 100644
--- a/cfgs/ORCA2_OFF_TRC/EXPREF/file_def_nemo-innerttrc.xml
+++ b/cfgs/ORCA2_OFF_TRC/EXPREF/file_def_nemo-innerttrc.xml
@@ -36,12 +36,23 @@
            <field field_ref="ssh"    name="zos"  />
          </file>
 
-	 <file id="file1" name_suffix="_trc" description="passive tracers variables" >
+	 <file id="file2" name_suffix="_trc" description="passive tracers variables" >
            <field field_ref="Age"     name="Age"     operation="average" freq_op="1y"  > @Age_e3t / @e3t   </field>		      
            <field field_ref="CFC11"   name="CFC11"   operation="average" freq_op="1y"  > @CFC11_e3t / @e3t </field>
            <field field_ref="CFC12"   name="CFC12"   operation="average" freq_op="1y"  > @CFC12_e3t / @e3t </field>
            <field field_ref="SF6"     name="SF6"     operation="average" freq_op="1y"  > @SF6_e3t / @e3t   </field>
-           <field field_ref="RC14"    name="RC14"    operation="average" freq_op="1y"  > @RC14_e3t / @e3t  </field>
+	   <field field_ref="RC14"    name="RC14"    operation="average" freq_op="1y"  > @RC14_e3t / @e3t  </field>
+           <field field_ref="qtr_CFC11"    />
+           <field field_ref="qint_CFC11"   />
+           <field field_ref="qtr_CFC12"    />
+           <field field_ref="qint_CFC12"  />
+           <field field_ref="qtr_SF6"     />
+           <field field_ref="qint_SF6"    />
+           <field field_ref="qtr_c14"    />
+           <field field_ref="qint_c14"  />
+           <field field_ref="DeltaC14"    />
+           <field field_ref="C14Age"      />
+           <field field_ref="RAge"       />
          </file>
 
       </file_group>
diff --git a/cfgs/ORCA2_OFF_TRC/EXPREF/namelist_cfg b/cfgs/ORCA2_OFF_TRC/EXPREF/namelist_cfg
index e365edaa..380fbc57 100644
--- a/cfgs/ORCA2_OFF_TRC/EXPREF/namelist_cfg
+++ b/cfgs/ORCA2_OFF_TRC/EXPREF/namelist_cfg
@@ -324,7 +324,7 @@
    sn_mld      = 'dyna_grid_T'           ,       120.        , 'mldr10_1'  ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_emp      = 'dyna_grid_T'           ,       120.        , 'wfo'       ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_empb     = 'dyna_grid_T'           ,       120.        , 'wfob'      ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
-   sn_fmf      = 'dyna_grid_T'           ,       120.        , 'fmmflx'    ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
+   sn_fwf      = 'dyna_grid_T'           ,       120.        , 'iowaflup'  ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_rnf      = 'dyna_grid_T'           ,       120.        , 'runoffs'   ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_ice      = 'dyna_grid_T'           ,       120.        , 'siconc'    ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_qsr      = 'dyna_grid_T'           ,       120.        , 'rsntds'    ,    .true.   , .true. , 'yearly'  , ''               , ''       , ''
diff --git a/cfgs/ORCA2_SAS_ICE/EXPREF/file_def_nemo-oce.xml b/cfgs/ORCA2_SAS_ICE/EXPREF/file_def_nemo-oce.xml
index 5c75b892..2cdea4e2 100644
--- a/cfgs/ORCA2_SAS_ICE/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/ORCA2_SAS_ICE/EXPREF/file_def_nemo-oce.xml
@@ -34,6 +34,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -44,7 +46,6 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
           <field field_ref="uocetr_eff"   name="uocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="u_masstr"     name="vozomatr" />
@@ -56,7 +57,6 @@
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
           <field field_ref="vocetr_eff"   name="vocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="v_masstr"     name="vomematr" />
diff --git a/cfgs/ORCA2_SAS_ICE/cpp_ORCA2_SAS_ICE.fcm b/cfgs/ORCA2_SAS_ICE/cpp_ORCA2_SAS_ICE.fcm
index 9f59e30a..361bb033 100644
--- a/cfgs/ORCA2_SAS_ICE/cpp_ORCA2_SAS_ICE.fcm
+++ b/cfgs/ORCA2_SAS_ICE/cpp_ORCA2_SAS_ICE.fcm
@@ -1 +1 @@
- bld::tool::fppkeys   key_si3 key_linssh key_xios
+ bld::tool::fppkeys   key_si3 key_linssh key_vco_1d3d key_xios
diff --git a/cfgs/SHARED/field_def_nemo-ice.xml b/cfgs/SHARED/field_def_nemo-ice.xml
index 6f444b45..2768a890 100644
--- a/cfgs/SHARED/field_def_nemo-ice.xml
+++ b/cfgs/SHARED/field_def_nemo-ice.xml
@@ -18,7 +18,7 @@
   <field_group id="SBC" > <!-- time step automaticaly defined based on nn_fsbc -->
 
     <!-- 2D variables -->
-    <field_group id="SBC_2D" grid_ref="grid_T_2D" >
+    <field_group id="SBC_2D" grid_ref="grid_T_2D_inner" >
 
       <!-- =================== -->
       <!-- standard ice fields -->
@@ -69,8 +69,8 @@
       <field id="icesalm"      long_name="Mass of salt in sea ice per area"                        standard_name="sea_ice_salt_mass"                         unit="kg/m2" />
 
       <!-- momentum (rheology) -->
-      <field id="uice"         long_name="X-component of sea ice velocity"                         standard_name="sea_ice_x_velocity"                        unit="m/s"  />
-      <field id="vice"         long_name="Y-component of sea ice velocity"                         standard_name="sea_ice_y_velocity"                        unit="m/s"  />
+      <field id="uice"         long_name="X-component of sea ice velocity"                         standard_name="sea_ice_x_velocity"                        unit="m/s" grid_ref="grid_T_2D" />
+      <field id="vice"         long_name="Y-component of sea ice velocity"                         standard_name="sea_ice_y_velocity"                        unit="m/s" grid_ref="grid_T_2D" />
       <field id="icevel"       long_name="Sea-ice speed"                                           standard_name="sea_ice_speed"                             unit="m/s"  />
       <field id="utau_ai"      long_name="X-component of atmospheric stress on sea ice"            standard_name="surface_downward_x_stress"                 unit="N/m2" />
       <field id="vtau_ai"      long_name="Y-component of atmospheric stress on sea ice"            standard_name="surface_downward_y_stress"                 unit="N/m2" />
@@ -93,7 +93,7 @@
       <field id="yield11"      long_name="yield surface tensor component 11"                       standard_name="yield11"                                   unit="N/m"  />
       <field id="yield22"      long_name="yield surface tensor component 22"                       standard_name="yield22"                                   unit="N/m"  />
       <field id="yield12"      long_name="yield surface tensor component 12"                       standard_name="yield12"                                   unit="N/m"  />
-      <field id="beta_evp"     long_name="Relaxation parameter of ice rheology (beta)"             standard_name="relaxation_parameter_of_ice_rheology"      unit=""  />
+      <field id="beta_evp"     long_name="Relaxation parameter of ice rheology (beta)"             standard_name="relaxation_parameter_of_ice_rheology"      unit=""     grid_ref="grid_T_2D" />
 
       <!-- surface heat fluxes -->
       <field id="qt_ice"       long_name="total heat flux at ice surface"                          standard_name="surface_downward_heat_flux_in_air"         unit="W/m2" />
@@ -311,7 +311,7 @@
     </field_group> <!-- SBC_2D -->
 
     <!-- categories -->
-    <field_group id="SBC_3D" grid_ref="grid_T_ncatice" >
+    <field_group id="SBC_3D" grid_ref="grid_T_ncatice_inner" >
 
       <!-- standard ice fields -->
       <field id="iceconc_cat"  long_name="Sea-ice concentration per category"                unit=""        />
@@ -386,7 +386,7 @@
     -->
     <!-- output variables for my configuration (example) -->
 
-    <field_group id="myvarICE"        grid_ref="grid_T_2D" >
+    <field_group id="myvarICE" >
       <!-- ice mask -->
       <field field_ref="icemask"          name="simsk"   />
       <field field_ref="icemask05"        name="simsk05" />
@@ -495,7 +495,7 @@
     </field_group>
 
 
-    <field_group id="myvarICE_cat"        grid_ref="grid_T_ncatice" >
+    <field_group id="myvarICE_cat"  >
 
       <!-- categories -->
       <field field_ref="icemask_cat"      name="simskcat"/>
@@ -524,7 +524,7 @@
       <field field_ref="ilbgvol_tot"      name="ilbgvol_tot"  />
     </field_group>
     
-    <field_group id="ICE_budget"        grid_ref="grid_T_2D" >
+    <field_group id="ICE_budget"  >
       <!-- general -->
       <field field_ref="icemask"          name="simsk"      />
       <field field_ref="iceconc"          name="siconc"     />
@@ -579,7 +579,7 @@
     </field_group>
 
     <!-- SIMIP daily fields -->
-    <field_group id="SIday_fields"    grid_ref="grid_T_2D" >
+    <field_group id="SIday_fields"   >
       <field field_ref="icepres"          name="sitimefrac"   />
       <field field_ref="iceconc_pct"      name="siconc"       />
       <field field_ref="icethic_cmip"     name="sithick"      />
@@ -591,7 +591,7 @@
     </field_group>
 
     <!-- SIMIP monthly fields -->
-    <field_group id="SImon_fields"    grid_ref="grid_T_2D"  >
+    <field_group id="SImon_fields"    >
       <!-- Sea-ice state variables -->
       <field field_ref="icepres"          name="sitimefrac"   />
       <field field_ref="iceconc_pct"      name="siconc"       />
diff --git a/cfgs/SHARED/field_def_nemo-innerttrc.xml b/cfgs/SHARED/field_def_nemo-innerttrc.xml
index d54a667b..ccf4b8b5 100644
--- a/cfgs/SHARED/field_def_nemo-innerttrc.xml
+++ b/cfgs/SHARED/field_def_nemo-innerttrc.xml
@@ -16,7 +16,7 @@
   -->
 
 
-  <field_group id="inerttrc" grid_ref="grid_T_2D">
+  <field_group id="inerttrc" grid_ref="grid_T_2D_inner">
 
     <!-- CFC11 : variables available with ln_cfc11 -->
     <field id="CFC11"        long_name="Chlorofluoro carbon11 Concentration"      unit="umol/m3"   grid_ref="grid_T_3D" />
@@ -39,8 +39,8 @@
     <!-- C14 : variables available with ln_c14 -->
     <field id="RC14"         long_name="Radiocarbon ratio"                        unit="-"         grid_ref="grid_T_3D"  />
     <field id="RC14_e3t"     long_name="RC14 * e3t"                               unit="m"         grid_ref="grid_T_3D"   > RC14 * e3t </field >
-    <field id="DeltaC14"     long_name="Delta C14"                                unit="permil"    grid_ref="grid_T_3D"  />
-    <field id="C14Age"       long_name="Radiocarbon age"                          unit="yr"        grid_ref="grid_T_3D"  />
+    <field id="DeltaC14"     long_name="Delta C14"                                unit="permil"    grid_ref="grid_T_3D_inner"  />
+    <field id="C14Age"       long_name="Radiocarbon age"                          unit="yr"        grid_ref="grid_T_3D_inner"  />
     <field id="RAge"         long_name="Reservoir Age"                            unit="yr"       />
     <field id="qtr_c14"      long_name="Air-sea flux of C14"                      unit="1/m2/s"   />
     <field id="qint_c14"     long_name="Cumulative air-sea flux of C14"           unit="1/m2"     />
@@ -52,7 +52,7 @@
 
     <!-- AGE : variables available with ln_age -->
     <field id="Age"          long_name="Sea water age since surface contact"      unit="yr"        grid_ref="grid_T_3D"  />
-    <field id="Age_e3t"      long_name="Age * e3t"                                unit="yr * m"   grid_ref="grid_T_3D"    > Age * e3t </field >
+    <field id="Age_e3t"      long_name="Age * e3t"                                unit="yr * m"    grid_ref="grid_T_3D"    > Age * e3t </field >
 
   </field_group>
 
diff --git a/cfgs/SHARED/field_def_nemo-oce.xml b/cfgs/SHARED/field_def_nemo-oce.xml
index 8c6362f3..750a3f93 100644
--- a/cfgs/SHARED/field_def_nemo-oce.xml
+++ b/cfgs/SHARED/field_def_nemo-oce.xml
@@ -25,7 +25,7 @@ that are available in the tidal-forcing implementation (see
     -->
 
     <!-- Time -->
-    <field id="diamlr_time" grid_ref="diamlr_grid_T_2D" prec="8" />
+    <field id="diamlr_time" grid_ref="diamlr_grid_T_2D_inner" prec="8" />
 
     <!-- Regressors for tidal harmonic analysis -->
     <field id="diamlr_r001"  field_ref="diamlr_time" expr="sin( __TDE_M2_omega__   * diamlr_time )" enabled=".TRUE."  comment="harmonic:sin:M2"   />
@@ -109,62 +109,60 @@ that are available in the tidal-forcing implementation (see
   <!-- T grid -->
 
   <field_group id="grid_T" grid_ref="grid_T_2D" >
-    <field id="e3t"          long_name="T-cell thickness"                    standard_name="cell_thickness"        unit="m"   grid_ref="grid_T_3D" />
-    <field id="e3ts"         long_name="T-cell thickness"   field_ref="e3t"  standard_name="cell_thickness"        unit="m"   grid_ref="grid_T_SFC"/>
-    <field id="e3t_0"        long_name="Initial T-cell thickness"            standard_name="ref_cell_thickness"    unit="m"   grid_ref="grid_T_3D" />
-    <field id="e3tb"         long_name="bottom T-cell thickness"             standard_name="bottom_cell_thickness" unit="m"   grid_ref="grid_T_2D"/>
-    <field id="e3t_300"      field_ref="e3t"                grid_ref="grid_T_zoom_300"       detect_missing_value="true" />
-    <field id="e3t_vsum300"  field_ref="e3t_300"            grid_ref="grid_T_vsum"   detect_missing_value="true" />
-    <field id="masscello"    long_name="Sea Water Mass per unit area"   standard_name="sea_water_mass_per_unit_area"   unit="kg/m2"   grid_ref="grid_T_3D"/>
-    <field id="volcello"     long_name="Ocean Volume"                   standard_name="ocean_volume"   unit="m3"       grid_ref="grid_T_3D"/>
-    <field id="toce"         long_name="temperature"                         standard_name="sea_water_potential_temperature"   unit="degC"     grid_ref="grid_T_3D"/>
-    <field id="toce_e3t"     long_name="temperature (thickness weighted)"                                                      unit="degC"     grid_ref="grid_T_3D" > toce * e3t </field >
-    <field id="soce"         long_name="salinity"                            standard_name="sea_water_practical_salinity"      unit="1e-3"     grid_ref="grid_T_3D"/>
-    <field id="soce_e3t"     long_name="salinity    (thickness weighted)"                                                      unit="1e-3"     grid_ref="grid_T_3D" > soce * e3t </field >
-
-    <field id="toce_e3t_300"      field_ref="toce_e3t"          unit="degree_C"     grid_ref="grid_T_zoom_300"      detect_missing_value="true" />
-    <field id="toce_e3t_vsum300"  field_ref="toce_e3t_300"      unit="degress_C*m"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-    <field id="toce_vmean300"     field_ref="toce_e3t_vsum300"  unit="degree_C"     grid_ref="grid_T_vsum"  detect_missing_value="true" > toce_e3t_vsum300/e3t_vsum300 </field>
+    <field id="e3t"          long_name="T-cell thickness"                    standard_name="cell_thickness"        unit="m"   grid_ref="grid_T_3D_inner" />
+    <field id="e3ts"         long_name="T-cell thickness"   field_ref="e3t"  standard_name="cell_thickness"        unit="m"   grid_ref="grid_T_SFC_inner"      />
+    <field id="e3t_0"        long_name="Initial T-cell thickness"            standard_name="ref_cell_thickness"    unit="m"   grid_ref="grid_T_3D"       />
+    <field id="e3tb"         long_name="bottom T-cell thickness"             standard_name="bottom_cell_thickness" unit="m"   grid_ref="grid_T_2D_inner" />
+    <field id="e3t_300"      field_ref="e3t"                                                                                  grid_ref="grid_T_zoom_300_inner" detect_missing_value="true" />
+    <field id="e3t_vsum300"  field_ref="e3t_300"                                                                              grid_ref="grid_T_vsum_inner"     detect_missing_value="true" />
+
+    <field id="masscello"    long_name="Sea Water Mass per unit area"        standard_name="sea_water_mass_per_unit_area"    unit="kg/m2" grid_ref="grid_T_3D_inner"/>
+    <field id="volcello"     long_name="Ocean Volume"                        standard_name="ocean_volume"                    unit="m3"    grid_ref="grid_T_3D_inner"/>
+    <field id="toce"         long_name="temperature"                         standard_name="sea_water_potential_temperature" unit="degC"  grid_ref="grid_T_3D"/>
+    <field id="toce_e3t"     long_name="temperature (thickness weighted)"                                                    unit="degC"  grid_ref="grid_T_3D" > toce * e3t </field >
+    <field id="soce"         long_name="salinity"                            standard_name="sea_water_practical_salinity"    unit="1e-3"  grid_ref="grid_T_3D"/>
+    <field id="soce_e3t"     long_name="salinity    (thickness weighted)"                                                    unit="1e-3"  grid_ref="grid_T_3D" > soce * e3t </field >
+
+    <field id="toce_e3t_300"      field_ref="toce_e3t"          unit="degree_C"     grid_ref="grid_T_zoom_300" detect_missing_value="true" />
+    <field id="toce_e3t_vsum300"  field_ref="toce_e3t_300"      unit="degress_C*m"  grid_ref="grid_T_vsum"     detect_missing_value="true" />
+    <field id="toce_vmean300"     field_ref="toce_e3t_vsum300"  unit="degree_C"     grid_ref="grid_T_vsum"     detect_missing_value="true"  > toce_e3t_vsum300/e3t_vsum300 </field>
 
     <!-- AGRIF sponge -->
     <field id="agrif_spt"         long_name=" AGRIF t-sponge coefficient"   unit=" " />
 
     <!-- additions to diawri.F90 -->
-    <field id="sssgrad"     long_name="module of surface salinity gradient"              unit="1e-3/m"   grid_ref="grid_T_2D_inner"/>
-    <field id="sssgrad2"    long_name="square of module of surface salinity gradient"    unit="1e-6/m2"  grid_ref="grid_T_2D_inner"/>
-    <field id="ke"          long_name="kinetic energy"          standard_name="specific_kinetic_energy_of_sea_water"   unit="m2/s2"  grid_ref="grid_T_3D" />
-    <field id="ke_int"      long_name="vertical integration of kinetic energy"   unit="m3/s2"  grid_ref="grid_T_2D_inner" />
+    <field id="sssgrad"     long_name="module of surface salinity gradient"                                    unit="1e-3/m"   grid_ref="grid_T_2D_inner" />
+    <field id="sssgrad2"    long_name="square of module of surface salinity gradient"                          unit="1e-6/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="ke"          long_name="kinetic energy"  standard_name="specific_kinetic_energy_of_sea_water"   unit="m2/s2"    grid_ref="grid_T_3D_inner" />
+    <field id="ke_int"      long_name="vertical integration of kinetic energy"                                 unit="m3/s2"    grid_ref="grid_T_2D_inner" />
+    <field id="taubot"      long_name="bottom stress module"                                                   unit="N/m2"     grid_ref="grid_T_2D_inner" />
 
     <!-- t-eddy viscosity coefficients (ldfdyn) -->
     <field id="ahmt_2d"      long_name=" surface t-eddy viscosity coefficient"   unit="m2/s or m4/s"                      />
     <field id="ahmt_3d"      long_name=" 3D      t-eddy viscosity coefficient"   unit="m2/s or m4/s"  grid_ref="grid_T_3D"/>
 
     <field id="sst"          long_name="Bulk sea surface temperature"                       standard_name="bulk_sea_surface_temperature"        unit="degC"     />
-    <field id="t_skin"       long_name="Skin temperature aka SSST"                          standard_name="skin_temperature"                    unit="degC"     />
+    <field id="sss"          long_name="sea surface salinity"                               standard_name="sea_surface_salinity"                unit="1e-3"     />
     <field id="sst2"         long_name="square of sea surface temperature"                  standard_name="square_of_sea_surface_temperature"   unit="degC2"     > sst * sst </field >
+    <field id="sss2"         long_name="square of sea surface salinity"                                                                         unit="1e-6"      > sss * sss </field >
     <field id="sstmax"       long_name="max of sea surface temperature"   field_ref="sst"   operation="maximum"                                                 />
+    <field id="sssmax"       long_name="max of sea surface salinity"      field_ref="sss"   operation="maximum"                                                 />
     <field id="sstmin"       long_name="min of sea surface temperature"   field_ref="sst"   operation="minimum"                                                 />
+    <field id="sssmin"       long_name="min of sea surface salinity"      field_ref="sss"   operation="minimum"                                                 />
     <field id="sstgrad"      long_name="module of sst gradient"                                                                                 unit="degC/m"   grid_ref="grid_T_2D_inner" />
     <field id="sstgrad2"     long_name="square of module of sst gradient"                                                                       unit="degC2/m2" grid_ref="grid_T_2D_inner" />
     <field id="sbt"          long_name="sea bottom temperature"                                                                                 unit="degC"     grid_ref="grid_T_2D_inner" />
-    <field id="tosmint"      long_name="vertical integral of temperature times density"     standard_name="integral_wrt_depth_of_product_of_density_and_potential_temperature"  unit="(kg m2) degree_C" grid_ref="grid_T_2D_inner" />
-    <field id="sst_wl"       long_name="Delta SST of warm layer"                                                                                unit="degC"     />
-    <field id="sst_cs"       long_name="Delta SST of cool skin"                                                                                 unit="degC"     />
-    <field id="temp_3m"      long_name="temperature at 3m"                                                                                      unit="degC"     />
-
-    <field id="sss"          long_name="sea surface salinity"                               standard_name="sea_surface_salinity"                unit="1e-3"     />
-    <field id="sss2"         long_name="square of sea surface salinity"                                                                         unit="1e-6"      > sss * sss </field >
-    <field id="sssmax"       long_name="max of sea surface salinity"      field_ref="sss"   operation="maximum"                                                 />
-    <field id="sssmin"       long_name="min of sea surface salinity"      field_ref="sss"   operation="minimum"                                                 />
-    <field id="sbs"          long_name="sea bottom salinity"                                                                                    unit="0.001"   grid_ref="grid_T_2D_inner" />
-    <field id="somint"       long_name="vertical integral of salinity times density"        standard_name="integral_wrt_depth_of_product_of_density_and_salinity"  unit="(kg m2) x (1e-3)" grid_ref="grid_T_2D_inner" />
+    <field id="sbs"          long_name="sea bottom salinity"                                                                                    unit="0.001"    grid_ref="grid_T_2D_inner" />
+    <field id="sst_wl"       long_name="Delta SST of warm layer"                                                                                unit="degC"     grid_ref="grid_T_2D_inner" />
+    <field id="sst_cs"       long_name="Delta SST of cool skin"                                                                                 unit="degC"     grid_ref="grid_T_2D_inner" />
 
-    <field id="taubot"       long_name="bottom stress module"   unit="N/m2"   grid_ref="grid_T_2D_inner" />
+    <field id="tosmint"      long_name="vertical integral of temperature times density" standard_name="integral_wrt_depth_of_product_of_density_and_potential_temperature" unit="(kg m2) degree_C" grid_ref="grid_T_2D_inner" />
+    <field id="somint"       long_name="vertical integral of salinity times density"    standard_name="integral_wrt_depth_of_product_of_density_and_salinity"              unit="(kg m2) x (1e-3)" grid_ref="grid_T_2D_inner" />
 
     <!-- Case EOS = TEOS-10 : output potential temperature -->
-    <field id="toce_pot"     long_name="Sea Water Potential Temperature"              standard_name="sea_water_potential_temperature"   unit="degC"     grid_ref="grid_T_3D"/>
-    <field id="sst_pot"      long_name="potential sea surface temperature"             standard_name="sea_surface_temperature"             unit="degC"     />
-    <field id="tosmint_pot"  long_name="vertical integral of potential temperature times density"   standard_name="integral_wrt_depth_of_product_of_density_and_potential_temperature"  unit="(kg m2) degree_C" />
+    <field id="toce_pot"     long_name="Sea Water Potential Temperature"                          standard_name="sea_water_potential_temperature"                                    unit="degC"             grid_ref="grid_T_3D_inner"/>
+    <field id="sst_pot"      long_name="potential sea surface temperature"                        standard_name="sea_surface_temperature"                                            unit="degC"             grid_ref="grid_T_2D_inner"/>
+    <field id="tosmint_pot"  long_name="vertical integral of potential temperature times density" standard_name="integral_wrt_depth_of_product_of_density_and_potential_temperature" unit="(kg m2) degree_C" grid_ref="grid_T_2D_inner"/>
 
     <field id="ht"           long_name="water column height at T point"                     standard_name="water_column_height_T"                      unit="m" />
     <field id="ssh"          long_name="sea surface height"                                 standard_name="sea_surface_height_above_geoid"             unit="m" />
@@ -172,13 +170,13 @@ that are available in the tidal-forcing implementation (see
     <field id="wetdep"       long_name="wet depth"                                          standard_name="wet_depth"                                  unit="m" />
     <field id="sshmax"       long_name="max of sea surface height"        field_ref="ssh"   operation="maximum"                                                 />
 
-    <field id="mldkz5"       long_name="Turbocline depth (Kz = 5e-4)"                       standard_name="ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity"                unit="m"          />
-    <field id="mldr10_1"     long_name="Mixed Layer Depth (dsigma = 0.01 wrt 10m)"          standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"          />
-    <field id="mldr10_1max"  long_name="Max of Mixed Layer Depth (dsigma = 0.01 wrt 10m)"   field_ref="mldr10_1"   operation="maximum"                                                                          />
-    <field id="mldr10_1min"  long_name="Min of Mixed Layer Depth (dsigma = 0.01 wrt 10m)"   field_ref="mldr10_1"   operation="minimum"                                                                          />
-    <field id="heatc"        long_name="Heat content vertically integrated"                 standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"      grid_ref="grid_T_2D_inner" />
-    <field id="saltc"        long_name="Salt content vertically integrated"                                                                                                                   unit="PSU*kg/m2"    grid_ref="grid_T_2D_inner" />
-    <field id="salt2c"       long_name="square of Salt content vertically integrated"                                                                                                         unit="PSU2*kg/m2"   grid_ref="grid_T_2D_inner" />
+    <field id="mldkz5"       long_name="Turbocline depth (Kz = 5e-4)"                     standard_name="ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity"              unit="m"          grid_ref="grid_T_2D_inner" />
+    <field id="mldr10_1"     long_name="Mixed Layer Depth (dsigma = 0.01 wrt 10m)"        standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                              unit="m"          grid_ref="grid_T_2D_inner" />
+    <field id="mldr10_1max"  long_name="Max of Mixed Layer Depth (dsigma = 0.01 wrt 10m)" field_ref="mldr10_1"   operation="maximum"                                                                        grid_ref="grid_T_2D_inner" />
+    <field id="mldr10_1min"  long_name="Min of Mixed Layer Depth (dsigma = 0.01 wrt 10m)" field_ref="mldr10_1"   operation="minimum"                                                                        grid_ref="grid_T_2D_inner" />
+    <field id="heatc"        long_name="Heat content vertically integrated"               standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content" unit="J/m2"       grid_ref="grid_T_2D_inner" />
+    <field id="saltc"        long_name="Salt content vertically integrated"                                                                                                               unit="PSU*kg/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="salt2c"       long_name="square of Salt content vertically integrated"                                                                                                     unit="PSU2*kg/m2" grid_ref="grid_T_2D_inner" />
 
     <!-- EOS -->
     <field id="alpha"        long_name="thermal expansion"                                                         unit="degC-1" grid_ref="grid_T_3D" />
@@ -199,83 +197,83 @@ that are available in the tidal-forcing implementation (see
     <field id="wi_cff"       long_name="Fraction of implicit vertical velocity"                                         unit="#"   grid_ref="grid_T_3D" />
 
     <!-- next variables available with key_diahth -->
-    <field id="mlddzt"       long_name="Thermocline Depth (depth of max dT/dz)"         standard_name="depth_at_maximum_upward_derivative_of_sea_water_potential_temperature"             unit="m"                         />
-    <field id="mldr10_3"     long_name="Mixed Layer Depth (dsigma = 0.03 wrt 10m)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"                         />
-    <field id="mldr0_1"      long_name="Mixed Layer Depth (dsigma = 0.01 wrt sfc)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"                         />
-    <field id="mldr0_3"      long_name="Mixed Layer Depth (dsigma = 0.03 wrt sfc)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"                         />
-    <field id="mld_dt02"     long_name="Mixed Layer Depth (|dT| = 0.2 wrt 10m)"         standard_name="ocean_mixed_layer_thickness_defined_by_temperature"                                unit="m"                         />
-    <field id="topthdep"     long_name="Top of Thermocline Depth (dT = -0.2 wrt 10m)"   standard_name="ocean_mixed_layer_thickness_defined_by_temperature"                                unit="m"                         />
-    <field id="pycndep"      long_name="Pycnocline Depth (dsigma[dT=-0.2] wrt 10m)"     standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"                         />
-    <field id="BLT"          long_name="Barrier Layer Thickness"                                                                                                                          unit="m"   > topthdep - pycndep </field>
-    <field id="tinv"         long_name="Max of vertical invertion of temperature"                                                                                                         unit="degC"                      />
-    <field id="depti"        long_name="Depth of max. vert. inv. of temperature"                                                                                                          unit="m"                         />
-    <field id="20d"          long_name="Depth of 20C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"   axis_ref="iax_20C" />
-    <field id="26d"          long_name="Depth of 26C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"   axis_ref="iax_26C"   />
-    <field id="28d"          long_name="Depth of 28C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"   axis_ref="iax_28C" />
-    <field id="hc300"        long_name="Heat content 0-300m"                            standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"                      />
-    <field id="hc700"        long_name="Heat content 0-700m"                            standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"                      />
-    <field id="hc2000"       long_name="Heat content 0-2000m"                           standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"                      />
+    <field id="mlddzt"       long_name="Thermocline Depth (depth of max dT/dz)"         standard_name="depth_at_maximum_upward_derivative_of_sea_water_potential_temperature"             unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="mldr10_3"     long_name="Mixed Layer Depth (dsigma = 0.03 wrt 10m)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="mldr0_1"      long_name="Mixed Layer Depth (dsigma = 0.01 wrt sfc)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="mldr0_3"      long_name="Mixed Layer Depth (dsigma = 0.03 wrt sfc)"      standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="mld_dt02"     long_name="Mixed Layer Depth (|dT| = 0.2 wrt 10m)"         standard_name="ocean_mixed_layer_thickness_defined_by_temperature"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="topthdep"     long_name="Top of Thermocline Depth (dT = -0.2 wrt 10m)"   standard_name="ocean_mixed_layer_thickness_defined_by_temperature"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="pycndep"      long_name="Pycnocline Depth (dsigma[dT=-0.2] wrt 10m)"     standard_name="ocean_mixed_layer_thickness_defined_by_sigma_theta"                                unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="BLT"          long_name="Barrier Layer Thickness"                                                                                                                          unit="m"      grid_ref="grid_T_2D_inner" > topthdep - pycndep </field>
+    <field id="tinv"         long_name="Max of vertical invertion of temperature"                                                                                                         unit="degC"   grid_ref="grid_T_2D_inner" />
+    <field id="depti"        long_name="Depth of max. vert. inv. of temperature"                                                                                                          unit="m"      grid_ref="grid_T_2D_inner" />
+    <field id="20d"          long_name="Depth of 20C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"      grid_ref="grid_T_2D_inner"  axis_ref="iax_20C" />
+    <field id="26d"          long_name="Depth of 26C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"      grid_ref="grid_T_2D_inner"  axis_ref="iax_26C"   />
+    <field id="28d"          long_name="Depth of 28C isotherm"                          standard_name="depth_of_isosurface_of_sea_water_potential_temperature"                            unit="m"      grid_ref="grid_T_2D_inner"  axis_ref="iax_28C" />
+    <field id="hc300"        long_name="Heat content 0-300m"                            standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"   grid_ref="grid_T_2D_inner"  />
+    <field id="hc700"        long_name="Heat content 0-700m"                            standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"   grid_ref="grid_T_2D_inner"  />
+    <field id="hc2000"       long_name="Heat content 0-2000m"                           standard_name="integral_of_sea_water_potential_temperature_wrt_depth_expressed_as_heat_content"   unit="J/m2"   grid_ref="grid_T_2D_inner"  />
 
     <!-- variables available with diaar5 -->
-    <field id="botpres"      long_name="Sea Water Pressure at Sea Floor"          standard_name="sea_water_pressure_at_sea_floor"                    unit="dbar" />
+    <field id="botpres"      long_name="Sea Water Pressure at Sea Floor"          standard_name="sea_water_pressure_at_sea_floor"                    unit="dbar" grid_ref="grid_T_2D_inner" />
     <field id="sshdyn"       long_name="dynamic sea surface height"               standard_name="dynamic_sea_surface_height_above_geoid"             unit="m"    />
     <field id="sshdyn2"      long_name="square of dynamic sea surface height"     standard_name="dynamic_sea_surface_height_above_geoid_squared"     unit="m2"    > sshdyn * sshdyn </field>
-    <field id="tnpeo"      long_name="Tendency of ocean potential energy content"                                                                    unit="W/m2" />
+    <field id="tnpeo"      long_name="Tendency of ocean potential energy content"                         unit="W/m2"   grid_ref="grid_T_2D_inner"  />
 
     <!-- variables available ln_linssh=.FALSE. -->
-    <field id="tpt_dep"      long_name="T-point depth"                  standard_name="depth_below_geoid"   unit="m"   grid_ref="grid_T_3D" />
-    <field id="e3tdef"       long_name="T-cell thickness deformation"                                       unit="%"   grid_ref="grid_T_3D" />
+    <field id="tpt_dep"      long_name="T-point depth"                  standard_name="depth_below_geoid"   unit="m"   grid_ref="grid_T_3D_inner" />
+    <field id="e3tdef"       long_name="T-cell thickness deformation"                                       unit="%"   grid_ref="grid_T_3D_inner" />
 
     <!-- variables available with ln_diacfl=.true. -->
-    <field id="cfl_cu"       long_name="u-courant number"   unit="#" />
-    <field id="cfl_cv"       long_name="v-courant number"   unit="#" />
-    <field id="cfl_cw"       long_name="w-courant number"   unit="#" />
+    <field id="cfl_cu"       long_name="u-courant number"   unit="#" grid_ref="grid_T_2D_inner" />
+    <field id="cfl_cv"       long_name="v-courant number"   unit="#" grid_ref="grid_T_2D_inner" />
+    <field id="cfl_cw"       long_name="w-courant number"   unit="#" grid_ref="grid_T_2D_inner" />
 
     <!-- variables available with ln_zdfmfc=.true. -->
-    <field id="mf_Tp"       long_name="plume_temperature"      standard_name="plume_temperature"     unit="degC"   grid_ref="grid_T_3D" />
-    <field id="mf_Sp"       long_name="plume_salinity"         standard_name="plume_salinity"        unit="1e-3"   grid_ref="grid_T_3D" />
-    <field id="mf_mf"       long_name="mass flux"              standard_name="mf_mass_flux"          unit="m"      grid_ref="grid_T_3D" />
+    <field id="mf_Tp"       long_name="plume_temperature"      standard_name="plume_temperature"     unit="degC"   grid_ref="grid_T_3D_inner" />
+    <field id="mf_Sp"       long_name="plume_salinity"         standard_name="plume_salinity"        unit="1e-3"   grid_ref="grid_T_3D_inner" />
+    <field id="mf_mf"       long_name="mass flux"              standard_name="mf_mass_flux"          unit="m"      grid_ref="grid_T_3D_inner" />
 
     <!-- fluxes from damping -->
-    <field id="sflx_dmp_cea"  long_name="salt flux due to damping"  standard_name="salt_flux_due_to_damping"          unit="g/m2/s"   />
-    <field id="hflx_dmp_cea"  long_name="heat flux due to damping"  standard_name="heat_flux_due_to_damping"          unit="W/m2"     />
+    <field id="sflx_dmp_cea"  long_name="salt flux due to damping"  standard_name="salt_flux_due_to_damping"          unit="g/m2/s"  grid_ref="grid_T_2D_inner" />
+    <field id="hflx_dmp_cea"  long_name="heat flux due to damping"  standard_name="heat_flux_due_to_damping"          unit="W/m2"    grid_ref="grid_T_2D_inner" />
 
     <!-- * variable related to ice shelf forcing * -->
 
     <!-- * fwf * -->
-    <field id="fwfisf_cav"      long_name="Ice shelf fresh water flux ( from isf to oce )"                    unit="kg/m2/s"  />
-    <field id="fwfisf_par"      long_name="Ice shelf fresh water flux ( from isf to oce )"                    unit="kg/m2/s"  />
-    <field id="fwfisf3d_cav"    long_name="3d Ice shelf fresh water flux ( from isf to oce )"                 unit="kg/m2/s"  grid_ref="grid_T_3D" />
-    <field id="fwfisf3d_par"    long_name="3d Ice shelf fresh water flux ( from isf to oce )"                 unit="kg/m2/s"  grid_ref="grid_T_3D" />
+    <field id="fwfisf_cav"      long_name="Ice shelf fresh water flux ( from isf to oce )"                    unit="kg/m2/s"  grid_ref="grid_T_2D_inner" />
+    <field id="fwfisf_par"      long_name="Ice shelf fresh water flux ( from isf to oce )"                    unit="kg/m2/s"  grid_ref="grid_T_2D_inner" />
+    <field id="fwfisf3d_cav"    long_name="3d Ice shelf fresh water flux ( from isf to oce )"                 unit="kg/m2/s"  grid_ref="grid_T_3D_inner" />
+    <field id="fwfisf3d_par"    long_name="3d Ice shelf fresh water flux ( from isf to oce )"                 unit="kg/m2/s"  grid_ref="grid_T_3D_inner" />
 
     <!-- * heat fluxes * -->
-    <field id="qoceisf_cav"     long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"     />
-    <field id="qoceisf_par"     long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"     />
-    <field id="qlatisf_cav"     long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"     />
-    <field id="qlatisf_par"     long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"     />
-    <field id="qhcisf_cav"      long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"     />
-    <field id="qhcisf_par"      long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"     />
-    <field id="qoceisf3d_cav"   long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qoceisf3d_par"   long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qlatisf3d_cav"   long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qlatisf3d_par"   long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qhcisf3d_cav"    long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qhcisf3d_par"    long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"     grid_ref="grid_T_3D" />
-    <field id="qconisf"         long_name="Conductive heat flux through the ice shelf ( from isf to oce )"    unit="W/m2"     />
+    <field id="qoceisf_cav"     long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qoceisf_par"     long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qlatisf_cav"     long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qlatisf_par"     long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qhcisf_cav"      long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qhcisf_par"      long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"  grid_ref="grid_T_2D_inner" />
+    <field id="qoceisf3d_cav"   long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qoceisf3d_par"   long_name="Ice shelf ocean  heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qlatisf3d_cav"   long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qlatisf3d_par"   long_name="Ice shelf latent heat flux ( from isf to oce )"                    unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qhcisf3d_cav"    long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qhcisf3d_par"    long_name="Ice shelf heat content flux of injected water ( from isf to oce )" unit="W/m2"  grid_ref="grid_T_3D_inner" />
+    <field id="qconisf"         long_name="Conductive heat flux through the ice shelf ( from isf to oce )"    unit="W/m2"  grid_ref="grid_T_2D_inner" />
 
     <!-- top boundary layer properties -->
-    <field id="isftfrz_cav"     long_name="freezing point temperature at ocean/isf interface"                unit="degC"     />
-    <field id="isftfrz_par"     long_name="freezing point temperature in the parametrization boundary layer" unit="degC"     />
-    <field id="isfthermald_cav" long_name="thermal driving of ice shelf melting"          unit="degC"     />
-    <field id="isfthermald_par" long_name="thermal driving of ice shelf melting"          unit="degC"     />
-    <field id="isfgammat"       long_name="Ice shelf heat-transfert velocity"             unit="m/s"      />
-    <field id="isfgammas"       long_name="Ice shelf salt-transfert velocity"             unit="m/s"      />
-    <field id="ttbl_cav"        long_name="temperature in Losch tbl"                      unit="degC"     />
-    <field id="ttbl_par"        long_name="temperature in the parametrisation boundary layer" unit="degC" />
-    <field id="stbl"            long_name="salinity in the Losh tbl"                      unit="1e-3"     />
-    <field id="utbl"            long_name="zonal current in the Losh tbl at T point"      unit="m/s"      />
-    <field id="vtbl"            long_name="merid current in the Losh tbl at T point"      unit="m/s"      />
-    <field id="isfustar"        long_name="ustar at T point used in ice shelf melting"    unit="m/s"      />
+    <field id="isftfrz_cav"     long_name="freezing point temperature at ocean/isf interface"                unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="isftfrz_par"     long_name="freezing point temperature in the parametrization boundary layer" unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="isfthermald_cav" long_name="thermal driving of ice shelf melting"                             unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="isfthermald_par" long_name="thermal driving of ice shelf melting"                             unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="isfgammat"       long_name="Ice shelf heat-transfert velocity"                                unit="m/s"   grid_ref="grid_T_2D_inner" />
+    <field id="isfgammas"       long_name="Ice shelf salt-transfert velocity"                                unit="m/s"   grid_ref="grid_T_2D_inner" />
+    <field id="ttbl_cav"        long_name="temperature in Losch tbl"                                         unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="ttbl_par"        long_name="temperature in the parametrisation boundary layer"                unit="degC"  grid_ref="grid_T_2D_inner" />
+    <field id="stbl"            long_name="salinity in the Losh tbl"                                         unit="1e-3"  grid_ref="grid_T_2D_inner" />
+    <field id="utbl"            long_name="zonal current in the Losh tbl"                                    unit="m/s"   grid_ref="grid_T_2D_inner" />
+    <field id="vtbl"            long_name="meridional current in the Losh tbl"                               unit="m/s"   grid_ref="grid_T_2D_inner" />
+    <field id="isfustar"        long_name="ustar at T point used in ice shelf melting"                       unit="m/s"   grid_ref="grid_T_2D_inner" />
 
   </field_group> <!-- grid_T -->
 
@@ -415,61 +413,64 @@ that are available in the tidal-forcing implementation (see
   <!-- SBC -->
   <field_group id="SBC" > <!-- time step automaticaly defined based on nn_fsbc -->
 
-    <field_group id="SBC_2D" grid_ref="grid_T_2D" >
+    <field_group id="SBC_2D" grid_ref="grid_T_2D_inner" >
 
       <field id="empmr"        long_name="Net Upward Water Flux"                standard_name="water_flux_out_of_sea_ice_and_sea_water"                              unit="kg/m2/s"   />
       <field id="empbmr"       long_name="Net Upward Water Flux at pre. tstep"  standard_name="water_flux_out_of_sea_ice_and_sea_water"                              unit="kg/m2/s"   />
       <field id="emp_oce"      long_name="Evap minus Precip over ocean"         standard_name="evap_minus_precip_over_sea_water"                                     unit="kg/m2/s"   />
       <field id="emp_ice"      long_name="Evap minus Precip over ice"           standard_name="evap_minus_precip_over_sea_ice"                                       unit="kg/m2/s"   />
       <field id="saltflx"      long_name="Downward salt flux"                                                                                                        unit="g/m2/s"    />
-      <field id="fmmflx"       long_name="Water flux due to freezing/melting"                                                                                        unit="kg/m2/s"   />
+      <field id="fwfice"       long_name="Ice-Ocean Freshwater Flux (>0 to the ocean)"                                                                               unit="kg/m2/s"   />
       <field id="snowpre"      long_name="Snow precipitation"                   standard_name="snowfall_flux"                                                        unit="kg/m2/s"   />
-      <field id="runoffs"      long_name="River Runoffs"                        standard_name="water_flux_into_sea_water_from_rivers"                                unit="kg/m2/s"   />
+      <field id="runoffs"      long_name="River Runoffs"                        standard_name="water_flux_into_sea_water_from_rivers"                                unit="kg/m2/s" grid_ref="grid_T_2D"   />
       <field id="precip"       long_name="Total precipitation"                  standard_name="precipitation_flux"                                                   unit="kg/m2/s"   />
       <field id="wclosea"      long_name="closed sea empmr correction"          standard_name="closea_empmr"                                                         unit="kg/m2/s"   />
 
-      <field id="qt"           long_name="Net Downward Heat Flux"                standard_name="surface_downward_heat_flux_in_sea_water"                              unit="W/m2"                           />
-      <field id="qns"          long_name="non solar Downward Heat Flux"                                                                                               unit="W/m2"                           />
-      <field id="qsr"          long_name="Shortwave Radiation"                   standard_name="net_downward_shortwave_flux_at_sea_water_surface"                     unit="W/m2"                           />
-      <field id="qsr3d"        long_name="Shortwave Radiation 3D distribution"   standard_name="downwelling_shortwave_flux_in_sea_water"                              unit="W/m2"      grid_ref="grid_T_3D" />
-      <field id="qrp"          long_name="Surface Heat Flux: Damping"            standard_name="heat_flux_into_sea_water_due_to_newtonian_relaxation"                 unit="W/m2"                           />
+      <field id="qt"           long_name="Net Downward Heat Flux"                standard_name="surface_downward_heat_flux_in_sea_water"                              unit="W/m2"                      />
+      <field id="qns"          long_name="non solar Downward Heat Flux"                                                                                               unit="W/m2"                      />
+      <field id="qsr"          long_name="Shortwave Radiation"                   standard_name="net_downward_shortwave_flux_at_sea_water_surface"                     unit="W/m2"                      />
+      <field id="qsr3d"        long_name="Shortwave Radiation 3D distribution"   standard_name="downwelling_shortwave_flux_in_sea_water"                              unit="W/m2" grid_ref="grid_T_3D" />
+      <field id="qrp"          long_name="Surface Heat Flux: Damping"            standard_name="heat_flux_into_sea_water_due_to_newtonian_relaxation"                 unit="W/m2"                      />
       <field id="qclosea"      long_name="closed sea heat content flux"          standard_name="closea_heat_content_downward_flux"                                    unit="W/m2"     />
-      <field id="erp"          long_name="Surface Water Flux: Damping"           standard_name="water_flux_out_of_sea_water_due_to_newtonian_relaxation"              unit="kg/m2/s"                        />
-      <field id="taum"         long_name="wind stress module"                    standard_name="magnitude_of_surface_downward_stress"                                 unit="N/m2"                           />
-      <field id="wspd"         long_name="wind speed module"                     standard_name="wind_speed"                                                           unit="m/s"                            />
+      <field id="erp"          long_name="Surface Water Flux: Damping"           standard_name="water_flux_out_of_sea_water_due_to_newtonian_relaxation"              unit="kg/m2/s"                   />
+      <field id="taum"         long_name="wind stress module"                    standard_name="magnitude_of_surface_downward_stress"                                 unit="N/m2"                      />
+      <field id="wspd"         long_name="wind speed module"                     standard_name="wind_speed"                                                           unit="m/s"                       />
+      <field id="utau"         long_name="Wind Stress along i-axis"              standard_name="surface_downward_x_stress"                                            unit="N/m2"                    grid_ref="grid_T_2D" />
+      <field id="vtau"         long_name="Wind Stress along j-axis"              standard_name="surface_downward_y_stress"                                            unit="N/m2"                    grid_ref="grid_T_2D" />
 
       <!-- * variable relative to atmospheric pressure forcing : available with ln_apr_dyn -->
-      <field id="ssh_ib"       long_name="Inverse barometer sea surface height"  standard_name="sea_surface_height_correction_due_to_air_pressure_at_low_frequency"   unit="m"        />
+      <field id="ssh_ib"       long_name="Inverse barometer sea surface height"  standard_name="sea_surface_height_correction_due_to_air_pressure_at_low_frequency"   unit="m" grid_ref="grid_T_2D" />
 
       <!-- *_oce variables available with ln_blk_clio or ln_blk_core -->
-      <field id="rho_air"      long_name="Air density at 10m above sea surface"         standard_name="rho_air_10m"                                        unit="kg/m3" />
-      <field id="dt_skin"      long_name="SSST-SST temperature difference"              standard_name="SSST-SST"                                             unit="K"   />
-      <field id="qlw_oce"      long_name="Longwave Downward Heat Flux over open ocean"  standard_name="surface_net_downward_longwave_flux"                 unit="W/m2"  />
-      <field id="qsb_oce"      long_name="Sensible Downward Heat Flux over open ocean"  standard_name="surface_downward_sensible_heat_flux"                unit="W/m2"  />
-      <field id="qla_oce"      long_name="Latent Downward Heat Flux over open ocean"    standard_name="surface_downward_latent_heat_flux"                  unit="W/m2"  />
-      <field id="evap_oce"     long_name="Evaporation over open ocean"                  standard_name="evaporation"                                        unit="kg/m2/s" />
-      <field id="qt_oce"       long_name="total flux at ocean surface"                  standard_name="surface_downward_heat_flux_in_sea_water"            unit="W/m2"  />
-      <field id="qsr_oce"      long_name="solar heat flux at ocean surface"             standard_name="net_downward_shortwave_flux_at_sea_water_surface"   unit="W/m2"  />
-      <field id="qns_oce"      long_name="non-solar heat flux at ocean surface (including E-P)"                                                            unit="W/m2"  />
-      <field id="qemp_oce"     long_name="Downward Heat Flux from E-P over open ocean"                                                                     unit="W/m2"  />
-      <field id="taum_oce"     long_name="wind stress module over open ocean"           standard_name="magnitude_of_surface_downward_stress"               unit="N/m2"  />
-      <field id="utau_oce"     long_name="Wind Stress along i-axis over open ocean (T-points)"  standard_name="surf_down_x_stress_open_oce_Tpoints"        unit="N/m2"   />
-      <field id="vtau_oce"     long_name="Wind Stress along j-axis over open ocean (T-points)"  standard_name="surf_down_y_stress_open_oce_Tpoints"        unit="N/m2"    />
+      <field id="rho_air"      long_name="Air density at 10m above sea surface"         standard_name="rho_air_10m"                                        unit="kg/m3"  />
+      <field id="t_skin"       long_name="Skin temperature aka SSST"                    standard_name="skin_temperature"                                   unit="degC"   />
+      <field id="dt_skin"      long_name="SSST-SST temperature difference"              standard_name="SSST-SST"                                           unit="K"      />
+      <field id="qlw_oce"      long_name="Longwave Downward Heat Flux over open ocean"  standard_name="surface_net_downward_longwave_flux"                 unit="W/m2"   />
+      <field id="qsb_oce"      long_name="Sensible Downward Heat Flux over open ocean"  standard_name="surface_downward_sensible_heat_flux"                unit="W/m2"   />
+      <field id="qla_oce"      long_name="Latent Downward Heat Flux over open ocean"    standard_name="surface_downward_latent_heat_flux"                  unit="W/m2"   />
+      <field id="evap_oce"     long_name="Evaporation over open ocean"                  standard_name="evaporation"                                        unit="kg/m2/s"/>
+      <field id="qt_oce"       long_name="total flux at ocean surface"                  standard_name="surface_downward_heat_flux_in_sea_water"            unit="W/m2"   />
+      <field id="qsr_oce"      long_name="solar heat flux at ocean surface"             standard_name="net_downward_shortwave_flux_at_sea_water_surface"   unit="W/m2"   />
+      <field id="qns_oce"      long_name="non-solar heat flux at ocean surface (including E-P)"                                                            unit="W/m2"   />
+      <field id="qemp_oce"     long_name="Downward Heat Flux from E-P over open ocean"                                                                     unit="W/m2"   />
+      <field id="taum_oce"     long_name="wind stress module over open ocean"           standard_name="magnitude_of_surface_downward_stress"               unit="N/m2"   />
+      <field id="utau_oce"     long_name="Wind Stress along i-axis over open ocean (T-points)"  standard_name="surf_down_x_stress_open_oce_Tpoints"        unit="N/m2" grid_ref="grid_T_2D"   />
+      <field id="vtau_oce"     long_name="Wind Stress along j-axis over open ocean (T-points)"  standard_name="surf_down_y_stress_open_oce_Tpoints"        unit="N/m2" grid_ref="grid_T_2D"   />
 
       <!-- variables computed by the bulk parameterization algorithms (ln_blk) -->
-      <field id="Cd_oce"      long_name="Drag coefficient over open ocean"              standard_name="drag_coefficient_water"                unit=""  />
-      <field id="Ce_oce"      long_name="Evaporaion coefficient over open ocean"        standard_name="evap_coefficient_water"                unit=""  />
-      <field id="Ch_oce"      long_name="Sensible heat coefficient over open ocean"     standard_name="sensible_heat_coefficient_water"       unit=""  />
+      <field id="Cd_oce"      long_name="Drag coefficient over open ocean"              standard_name="drag_coefficient_water"                unit=""     />
+      <field id="Ce_oce"      long_name="Evaporaion coefficient over open ocean"        standard_name="evap_coefficient_water"                unit=""     />
+      <field id="Ch_oce"      long_name="Sensible heat coefficient over open ocean"     standard_name="sensible_heat_coefficient_water"       unit=""     />
       <field id="theta_zt"    long_name="Potential air temperature at z=zt"             standard_name="potential_air_temperature_at_zt"       unit="degC" />
-      <field id="q_zt"        long_name="Specific air humidity at z=zt"                 standard_name="specific_air_humidity_at_zt"           unit="kg/kg" />
+      <field id="q_zt"        long_name="Specific air humidity at z=zt"                 standard_name="specific_air_humidity_at_zt"           unit="kg/kg"/>
       <field id="theta_zu"    long_name="Potential air temperature at z=zu"             standard_name="potential_air_temperature_at_zu"       unit="degC" />
-      <field id="q_zu"        long_name="Specific air humidity at z=zu"                 standard_name="specific_air_humidity_at_zu"           unit="kg/kg" />
-      <field id="ssq"         long_name="Saturation specific humidity of air at z=0"    standard_name="surface_air_saturation_spec_humidity"  unit="kg/kg" />
-      <field id="wspd_blk"    long_name="Bulk wind speed at z=zu"                       standard_name="bulk_wind_speed_at_zu"                 unit="m/s"   />
+      <field id="q_zu"        long_name="Specific air humidity at z=zu"                 standard_name="specific_air_humidity_at_zu"           unit="kg/kg"/>
+      <field id="ssq"         long_name="Saturation specific humidity of air at z=0"    standard_name="surface_air_saturation_spec_humidity"  unit="kg/kg"/>
+      <field id="wspd_blk"    long_name="Bulk wind speed at z=zu"                       standard_name="bulk_wind_speed_at_zu"                 unit="m/s"  />
       <!-- ln_blk + key_si3 -->
-      <field id="Cd_ice"      long_name="Drag coefficient over ice"                     standard_name="drag_coefficient_ice"                 unit=""  />
-      <field id="Ce_ice"      long_name="Evaporaion coefficient over ice"               standard_name="evap_coefficient_ice"                 unit=""  />
-      <field id="Ch_ice"      long_name="Sensible heat coefficient over ice"            standard_name="sensible_heat_coefficient_ice"        unit=""  />
+      <field id="Cd_ice"      long_name="Drag coefficient over ice"                     standard_name="drag_coefficient_ice"                  unit=""  />
+      <field id="Ce_ice"      long_name="Evaporaion coefficient over ice"               standard_name="evap_coefficient_ice"                  unit=""  />
+      <field id="Ch_ice"      long_name="Sensible heat coefficient over ice"            standard_name="sensible_heat_coefficient_ice"         unit=""  />
 
       <!-- available key_oasis3 -->
       <field id="snow_ao_cea"  long_name="Snow over ice-free ocean (cell average)"   standard_name="snowfall_flux"                             unit="kg/m2/s"  />
@@ -515,22 +516,22 @@ that are available in the tidal-forcing implementation (see
       <field id="vflx_fwb_cea"  long_name="volume flux due to fwb"        standard_name="volume_flux_due_to_fwb"        unit="kg/m2/s"  />
       
       <!-- ice field (nn_ice=1)  -->
-      <field id="ice_cover"    long_name="Ice fraction"                                                 standard_name="sea_ice_area_fraction"                              unit="1"            />
+      <field id="ice_cover"    long_name="Ice fraction"  standard_name="sea_ice_area_fraction"  unit="1"  grid_ref="grid_T_2D" />
 
       <!-- dilution -->
-      <field id="emp_x_sst"    long_name="Concentration/Dilution term on SST"                                                                                              unit="kg*degC/m2/s" />
-      <field id="emp_x_sss"    long_name="Concentration/Dilution term on SSS"                                                                                              unit="kg*1e-3/m2/s" />
-      <field id="rnf_x_sst"    long_name="Runoff term on SST"                                                                                                              unit="kg*degC/m2/s" />
-      <field id="rnf_x_sss"    long_name="Runoff term on SSS"                                                                                                              unit="kg*1e-3/m2/s" />
+      <field id="emp_x_sst"    long_name="Concentration/Dilution term on SST"   unit="kg*degC/m2/s" grid_ref="grid_T_2D" />
+      <field id="emp_x_sss"    long_name="Concentration/Dilution term on SSS"   unit="kg*1e-3/m2/s" grid_ref="grid_T_2D" />
+      <field id="rnf_x_sst"    long_name="Runoff term on SST"                   unit="kg*degC/m2/s" grid_ref="grid_T_2D" />
+      <field id="rnf_x_sss"    long_name="Runoff term on SSS"                   unit="kg*1e-3/m2/s" grid_ref="grid_T_2D" />
 
       <!-- sbcssm variables -->
-      <field id="sst_m"    unit="degC" />
-      <field id="sss_m"    unit="psu"  />
-      <field id="ssu_m"    unit="m/s"  />
-      <field id="ssv_m"    unit="m/s"  />
-      <field id="ssh_m"    unit="m"    />
-      <field id="e3t_m"    unit="m"    />
-      <field id="frq_m"    unit="-"    />
+      <field id="sst_m"    unit="degC" grid_ref="grid_T_2D" />
+      <field id="sss_m"    unit="psu"  grid_ref="grid_T_2D" />
+      <field id="ssu_m"    unit="m/s"  grid_ref="grid_T_2D" />
+      <field id="ssv_m"    unit="m/s"  grid_ref="grid_T_2D" />
+      <field id="ssh_m"    unit="m"    grid_ref="grid_T_2D" />
+      <field id="e3t_m"    unit="m"    grid_ref="grid_T_2D" />
+      <field id="frq_m"    unit="-"    grid_ref="grid_T_2D" />
 
     </field_group>
 
@@ -585,18 +586,17 @@ that are available in the tidal-forcing implementation (see
 
   <field_group id="grid_U"   grid_ref="grid_U_2D">
     <field id="hu"            long_name="water column height at U point"                         standard_name="water_column_height_U"       unit="m" />
-    <field id="e2u"           long_name="U-cell width in meridional direction"                   standard_name="cell_width"                  unit="m"                               />
-    <field id="e3u"           long_name="U-cell thickness"                                       standard_name="cell_thickness"              unit="m"          grid_ref="grid_U_3D" />
-    <field id="e3u_0"         long_name="Initial U-cell thickness"                               standard_name="ref_cell_thickness"          unit="m"          grid_ref="grid_U_3D"/>
-    <field id="utau"          long_name="Wind Stress along i-axis"                               standard_name="surface_downward_x_stress"   unit="N/m2"                            />
-    <field id="uoce"          long_name="ocean current along i-axis"                             standard_name="sea_water_x_velocity"        unit="m/s"        grid_ref="grid_U_3D" />
-    <field id="uoce_e3u"      long_name="ocean current along i-axis  (thickness weighted)"                                                   unit="m/s"        grid_ref="grid_U_3D"  > uoce * e3u </field>
-    <field id="uoce_e3u_vsum" long_name="ocean current along i-axis * e3u summed on the vertical"  field_ref="uoce_e3u"    unit="m3/s"       grid_ref="grid_U_vsum"/>
-    <field id="uocetr_vsum"   long_name="ocean transport along i-axis  summed on the vertical"         field_ref="e2u"       unit="m3/s"> this * uoce_e3u_vsum  </field>
-
-    <field id="uocetr_vsum_op"    long_name="ocean current along i-axis * e3u * e2u summed on the vertical"  read_access="true"  freq_op="1mo"    field_ref="e2u"       unit="m3/s"> @uocetr_vsum </field>
+    <field id="e2u"           long_name="U-cell width in meridional direction"                   standard_name="cell_width"                  unit="m"                                 />
+    <field id="e3u"           long_name="U-cell thickness"                                       standard_name="cell_thickness"              unit="m"          grid_ref="grid_U_3D_inner"   />
+    <field id="e3u_0"         long_name="Initial U-cell thickness"                               standard_name="ref_cell_thickness"          unit="m"          grid_ref="grid_U_3D"   />
+    <field id="uoce"          long_name="ocean current along i-axis"                             standard_name="sea_water_x_velocity"        unit="m/s"        grid_ref="grid_U_3D"   />
+    <field id="uoce_e3u"      long_name="ocean current along i-axis  (thickness weighted)"                                                   unit="m/s"        grid_ref="grid_U_3D"    > uoce * e3u </field>
+    <field id="uoce_e3u_vsum" long_name="ocean current along i-axis * e3u summed on the vertical"  field_ref="uoce_e3u"                      unit="m3/s"       grid_ref="grid_U_vsum" />
+    <field id="uocetr_vsum"   long_name="ocean transport along i-axis  summed on the vertical"     field_ref="e2u"                           unit="m3/s"                               > this * uoce_e3u_vsum  </field>
+
+    <field id="uocetr_vsum_op"    long_name="ocean current along i-axis * e3u * e2u summed on the vertical"  read_access="true"  freq_op="1mo" field_ref="e2u" unit="m3/s"             > @uocetr_vsum </field>
     <field id="uocetr_vsum_cumul" long_name="ocean current along i-axis * e3u * e2u cumulated from southwest point" freq_offset="_reset_" operation="instant" freq_op="1mo"  unit="m3/s" />
-    <field id="msftbarot"         long_name="ocean_barotropic_mass_streamfunction"   unit="kg s-1" > uocetr_vsum_cumul * $rho0 </field>
+    <field id="msftbarot"         long_name="ocean_barotropic_mass_streamfunction"                                                                             unit="kg s-1"           > uocetr_vsum_cumul * $rho0 </field>
 
 
     <field id="ssu"          long_name="ocean surface current along i-axis"                                                                 unit="m/s"                             />
@@ -610,21 +610,21 @@ that are available in the tidal-forcing implementation (see
     <field id="agrif_spu"    long_name=" AGRIF u-sponge coefficient"   unit=" " />
     <!-- u-eddy diffusivity coefficients (available if ln_traldf_OFF=F) -->
     <field id="ahtu_2d"      long_name=" surface u-eddy diffusivity coefficient"   unit="m2/s or m4/s" />
-    <field id="ahtu_3d"      long_name=" 3D u-EIV coefficient"                     unit="m2/s or m4/s"      grid_ref="grid_U_3D"/>
+    <field id="ahtu_3d"      long_name=" 3D u-EIV coefficient"                     unit="m2/s or m4/s" grid_ref="grid_U_3D" />
     <!-- u-eiv diffusivity coefficients (available if ln_ldfeiv=F) -->
-    <field id="aeiu_2d"      long_name=" surface u-EIV coefficient"                unit="m2/s" />
-    <field id="aeiu_3d"      long_name=" 3D u-EIV coefficient"                     unit="m2/s"              grid_ref="grid_U_3D"/>
+    <field id="aeiu_2d"      long_name=" surface u-EIV coefficient"                unit="m2/s"         />
+    <field id="aeiu_3d"      long_name=" 3D u-EIV coefficient"                     unit="m2/s"         grid_ref="grid_U_3D" />
 
     <!-- variables available with MLE (ln_mle=T) -->
-    <field id="psiu_mle"     long_name="MLE streamfunction along i-axis"   unit="m3/s"   grid_ref="grid_U_3D" />
+    <field id="psiu_mle"     long_name="MLE streamfunction along i-axis"           unit="m3/s"         grid_ref="grid_U_3D" />
 
     <!-- uoce_eiv: available EIV (ln_ldfeiv=T and ln_ldfeiv_dia=T) -->
-    <field id="uoce_eiv"      long_name="EIV ocean current along i-axis"                                  standard_name="bolus_sea_water_x_velocity"                     unit="m/s"   grid_ref="grid_U_3D" />
-    <field id="ueiv_masstr"   long_name="EIV Ocean Mass X Transport"                                      standard_name="bolus_ocean_mass_x_transport"                   unit="kg/s"  grid_ref="grid_U_3D" />
-    <field id="ueiv_heattr"   long_name="ocean bolus heat transport along i-axis"                         standard_name="ocean_heat_x_transport_due_to_bolus_advection"  unit="W"                         />
-    <field id="ueiv_salttr"   long_name="ocean bolus salt transport along i-axis"                         standard_name="ocean_salt_x_transport_due_to_bolus_advection"  unit="Kg"                        />
-    <field id="ueiv_heattr3d" long_name="ocean bolus heat transport along i-axis"                         standard_name="ocean_heat_x_transport_due_to_bolus_advection"  unit="W"     grid_ref="grid_U_3D" />
-    <field id="ueiv_salttr3d" long_name="ocean bolus salt transport along i-axis"                         standard_name="ocean_salt_x_transport_due_to_bolus_advection"  unit="kg"    grid_ref="grid_U_3D" />
+    <field id="uoce_eiv"      long_name="EIV ocean current along i-axis"            standard_name="bolus_sea_water_x_velocity"                     unit="m/s"   grid_ref="grid_U_3D_inner" />
+    <field id="ueiv_masstr"   long_name="EIV Ocean Mass X Transport"                standard_name="bolus_ocean_mass_x_transport"                   unit="kg/s"  grid_ref="grid_U_3D_inner" />
+    <field id="ueiv_heattr"   long_name="ocean bolus heat transport along i-axis"   standard_name="ocean_heat_x_transport_due_to_bolus_advection"  unit="W"     grid_ref="grid_U_2D_inner" />
+    <field id="ueiv_salttr"   long_name="ocean bolus salt transport along i-axis"   standard_name="ocean_salt_x_transport_due_to_bolus_advection"  unit="Kg"    grid_ref="grid_U_2D_inner" />
+    <field id="ueiv_heattr3d" long_name="ocean bolus heat transport along i-axis"   standard_name="ocean_heat_x_transport_due_to_bolus_advection"  unit="W"     grid_ref="grid_U_3D_inner" />
+    <field id="ueiv_salttr3d" long_name="ocean bolus salt transport along i-axis"   standard_name="ocean_salt_x_transport_due_to_bolus_advection"  unit="kg"    grid_ref="grid_U_3D_inner" />
 
     <!-- uoce_bbl: available with ln_trabbl=T and nn_bbl_adv=1 -->
     <field id="uoce_bbl"     long_name="BBL ocean current along i-axis"    unit="m/s"  />
@@ -635,28 +635,24 @@ that are available in the tidal-forcing implementation (see
     <field id="ustokes"      long_name="Stokes Drift Velocity i-axis"      standard_name="StokesDrift_x_velocity"      unit="m/s"        grid_ref="grid_U_3D" />
     <field id="ustokes_e3u"  long_name="Stokes Drift Velocity i-axis  (thickness weighted)"                            unit="m/s"        grid_ref="grid_U_3D"  > ustokes * e3u </field>
 
-    <!-- variable for ice shelves -->
-    <field id="utbl"         long_name="zonal current in the Losh tbl"     unit="m/s" />
-
     <!-- variables available with diaar5 -->
-    <field id="u_masstr"      long_name="Ocean Mass X Transport"                                          standard_name="ocean_mass_x_transport"                         unit="kg/s"   grid_ref="grid_U_3D" />
-    <field id="u_masstr_vint" long_name="vertical integral of ocean eulerian mass transport along i-axis" standard_name="vertical_integral_of_ocean_mass_x_transport"    unit="kg/s"   grid_ref="grid_U_2D_inner" />
-    <field id="u_heattr"      long_name="ocean eulerian heat transport along i-axis"                      standard_name="ocean_heat_x_transport"                         unit="W"      grid_ref="grid_U_2D_inner" />
+    <field id="u_masstr"      long_name="Ocean Mass X Transport"                                          standard_name="ocean_mass_x_transport"                         unit="kg/s"      grid_ref="grid_U_3D_inner" />
+    <field id="u_masstr_vint" long_name="vertical integral of ocean eulerian mass transport along i-axis" standard_name="vertical_integral_of_ocean_mass_x_transport"    unit="kg/s"      grid_ref="grid_U_2D_inner" />
+    <field id="u_heattr"      long_name="ocean eulerian heat transport along i-axis"                      standard_name="ocean_heat_x_transport"                         unit="W"         grid_ref="grid_U_2D_inner" />
     <field id="u_salttr"      long_name="ocean eulerian salt transport along i-axis"                      standard_name="ocean_salt_x_transport"                         unit="1e-3*kg/s" grid_ref="grid_U_2D_inner" />
-    <field id="uadv_heattr"   long_name="ocean advective heat transport along i-axis"                     standard_name="advectice_ocean_heat_x_transport"               unit="W"                         />
-    <field id="uadv_salttr"   long_name="ocean advective salt transport along i-axis"                     standard_name="advectice_ocean_salt_x_transport"               unit="1e-3*kg/s"                 />
-    <field id="udiff_heattr"  long_name="ocean diffusion heat transport along i-axis"                     standard_name="ocean_heat_x_transport_due_to_diffusion"        unit="W"                         />
-    <field id="udiff_salttr"  long_name="ocean diffusion salt transport along i-axis"                     standard_name="ocean_salt_x_transport_due_to_diffusion"        unit="1e-3*kg/s"                 />
+    <field id="uadv_heattr"   long_name="ocean advective heat transport along i-axis"                     standard_name="advectice_ocean_heat_x_transport"               unit="W"         grid_ref="grid_U_2D_inner" />
+    <field id="uadv_salttr"   long_name="ocean advective salt transport along i-axis"                     standard_name="advectice_ocean_salt_x_transport"               unit="1e-3*kg/s" grid_ref="grid_U_2D_inner" />
+    <field id="udiff_heattr"  long_name="ocean diffusion heat transport along i-axis"                     standard_name="ocean_heat_x_transport_due_to_diffusion"        unit="W"         grid_ref="grid_U_2D_inner" />
+    <field id="udiff_salttr"  long_name="ocean diffusion salt transport along i-axis"                     standard_name="ocean_salt_x_transport_due_to_diffusion"        unit="1e-3*kg/s" grid_ref="grid_U_2D_inner" />
   </field_group>
 
   <!-- V grid -->
 
   <field_group id="grid_V"   grid_ref="grid_V_2D">
-    <field id="e1v"          long_name="V-cell width in longitudinal direction"                 standard_name="cell_width"                  unit="m"                              />
-    <field id="e3v"          long_name="V-cell thickness"                                       standard_name="cell_thickness"              unit="m"          grid_ref="grid_V_3D" />
+    <field id="e1v"          long_name="V-cell width in longitudinal direction"                 standard_name="cell_width"                  unit="m"                               />
+    <field id="e3v"          long_name="V-cell thickness"                                       standard_name="cell_thickness"              unit="m"          grid_ref="grid_V_3D_inner" />
     <field id="e3v_0"        long_name="Initial V-cell thickness"                               standard_name="ref_cell_thickness"          unit="m"          grid_ref="grid_V_3D" />
     <field id="hv"            long_name="water column height at V point"                        standard_name="water_column_height_V"       unit="m" />
-    <field id="vtau"         long_name="Wind Stress along j-axis"                               standard_name="surface_downward_y_stress"   unit="N/m2"                            />
     <field id="voce"         long_name="ocean current along j-axis"                             standard_name="sea_water_y_velocity"        unit="m/s"        grid_ref="grid_V_3D" />
     <field id="voce_e3v"     long_name="ocean current along j-axis  (thickness weighted)"                                                   unit="m/s"        grid_ref="grid_V_3D"  > voce * e3v </field>
     <field id="ssv"          long_name="ocean surface current along j-axis"                                                                 unit="m/s"                             />
@@ -670,21 +666,21 @@ that are available in the tidal-forcing implementation (see
     <field id="agrif_spv"    long_name=" AGRIF v-sponge coefficient"   unit=" " />
     <!-- v-eddy diffusivity coefficients (available if ln_traldf_OFF=F) -->
     <field id="ahtv_2d"      long_name=" surface v-eddy diffusivity coefficient"     unit="m2/s or (m4/s)^1/2" />
-    <field id="ahtv_3d"      long_name=" 3D v-eddy diffusivity coefficient"          unit="m2/s or (m4/s)^1/2"           grid_ref="grid_V_3D"/>
+    <field id="ahtv_3d"      long_name=" 3D v-eddy diffusivity coefficient"          unit="m2/s or (m4/s)^1/2" grid_ref="grid_V_3D" />
     <!-- v-eiv diffusivity coefficients (available if ln_ldfeiv=F) -->
-    <field id="aeiv_2d"      long_name=" surface v-EIV coefficient"                  unit="m2/s" />
-    <field id="aeiv_3d"      long_name=" 3D v-EIV coefficient"                       unit="m2/s"                         grid_ref="grid_V_3D" />
+    <field id="aeiv_2d"      long_name=" surface v-EIV coefficient"                  unit="m2/s"               />
+    <field id="aeiv_3d"      long_name=" 3D v-EIV coefficient"                       unit="m2/s"               grid_ref="grid_V_3D" />
 
     <!-- variables available with MLE (ln_mle=T) -->
-    <field id="psiv_mle"     long_name="MLE streamfunction along j-axis"   unit="m3/s"   grid_ref="grid_V_3D" />
+    <field id="psiv_mle"     long_name="MLE streamfunction along j-axis"             unit="m3/s"               grid_ref="grid_V_3D" />
 
     <!-- voce_eiv: available EIV (ln_ldfeiv=T and ln_ldfeiv_dia=T)  -->
-    <field id="voce_eiv"     long_name="EIV ocean current along j-axis"  standard_name="bolus_sea_water_y_velocity"     unit="m/s"   grid_ref="grid_V_3D" />
-    <field id="veiv_masstr"  long_name="EIV Ocean Mass Y Transport"      standard_name="bolus_ocean_mass_y_transport"   unit="kg/s"  grid_ref="grid_V_3D" />
-    <field id="veiv_heattr"   long_name="ocean bolus heat transport along j-axis"       standard_name="ocean_heat_y_transport_due_to_bolus_advection"   unit="W"                         />
-    <field id="veiv_salttr"   long_name="ocean bolus salt transport along j-axis"       standard_name="ocean_salt_x_transport_due_to_bolus_advection"   unit="Kg"                        />
-    <field id="veiv_heattr3d" long_name="ocean bolus heat transport along j-axis"       standard_name="ocean_heat_y_transport_due_to_bolus_advection"   unit="W"    grid_ref="grid_V_3D" />
-    <field id="veiv_salttr3d" long_name="ocean bolus salt transport along j-axis"       standard_name="ocean_salt_y_transport_due_to_bolus_advection"   unit="kg"   grid_ref="grid_V_3D" />
+    <field id="voce_eiv"      long_name="EIV ocean current along j-axis"           standard_name="bolus_sea_water_y_velocity"                     unit="m/s"  grid_ref="grid_V_3D_inner" />
+    <field id="veiv_masstr"   long_name="EIV Ocean Mass Y Transport"               standard_name="bolus_ocean_mass_y_transport"                   unit="kg/s" grid_ref="grid_V_3D_inner" />
+    <field id="veiv_heattr"   long_name="ocean bolus heat transport along j-axis"  standard_name="ocean_heat_y_transport_due_to_bolus_advection"  unit="W"    grid_ref="grid_V_2D_inner" />
+    <field id="veiv_salttr"   long_name="ocean bolus salt transport along j-axis"  standard_name="ocean_salt_x_transport_due_to_bolus_advection"  unit="Kg"   grid_ref="grid_V_2D_inner" />
+    <field id="veiv_heattr3d" long_name="ocean bolus heat transport along j-axis"  standard_name="ocean_heat_y_transport_due_to_bolus_advection"  unit="W"    grid_ref="grid_V_3D_inner" />
+    <field id="veiv_salttr3d" long_name="ocean bolus salt transport along j-axis"  standard_name="ocean_salt_y_transport_due_to_bolus_advection"  unit="kg"   grid_ref="grid_V_3D_inner" />
 
 
     <!-- voce_bbl: available with ln_trabbl=T and nn_bbl_adv=1 -->
@@ -696,91 +692,88 @@ that are available in the tidal-forcing implementation (see
     <field id="vstokes"      long_name="Stokes Drift Velocity j-axis"      standard_name="StokesDrift_y_velocity"      unit="m/s"        grid_ref="grid_V_3D" />
     <field id="vstokes_e3v"  long_name="Stokes Drift Velocity j-axis  (thickness weighted)"                            unit="m/s"        grid_ref="grid_V_3D"  > vstokes * e3v </field>
 
-    <!-- variable for ice shelves -->
-    <field id="vtbl"         long_name="meridional current in the Losh tbl"   unit="m/s" />
-
     <!-- variables available with diaar5 -->
-    <field id="v_masstr"      long_name="ocean eulerian mass transport along j-axis"    standard_name="ocean_mass_y_transport"                          unit="kg/s" grid_ref="grid_V_3D" />
+    <field id="v_masstr"      long_name="ocean eulerian mass transport along j-axis"    standard_name="ocean_mass_y_transport"                          unit="kg/s"       grid_ref="grid_V_3D_inner" />
     <field id="v_heattr"      long_name="ocean eulerian heat transport along j-axis"    standard_name="ocean_heat_y_transport"                          unit="W"          grid_ref="grid_V_2D_inner" />
     <field id="v_salttr"      long_name="ocean eulerian salt transport along i-axis"    standard_name="ocean_salt_y_transport"                          unit="1e-3*kg/s"  grid_ref="grid_V_2D_inner" />
-    <field id="vadv_heattr"   long_name="ocean advective heat transport along j-axis"   standard_name="advectice_ocean_heat_y_transport"                unit="W"                         />
-    <field id="vadv_salttr"   long_name="ocean advective salt transport along j-axis"   standard_name="advectice_ocean_salt_y_transport"                unit="1e-3*kg/s"                 />
-    <field id="vdiff_heattr"  long_name="ocean diffusion heat transport along j-axis"   standard_name="ocean_heat_y_transport_due_to_diffusion"         unit="W"                         />
-    <field id="vdiff_salttr"  long_name="ocean diffusion salt transport along j-axis"   standard_name="ocean_salt_y_transport_due_to_diffusion"         unit="1e-3*kg/s"                 />
+    <field id="vadv_heattr"   long_name="ocean advective heat transport along j-axis"   standard_name="advectice_ocean_heat_y_transport"                unit="W"          grid_ref="grid_V_2D_inner" />
+    <field id="vadv_salttr"   long_name="ocean advective salt transport along j-axis"   standard_name="advectice_ocean_salt_y_transport"                unit="1e-3*kg/s"  grid_ref="grid_V_2D_inner" />
+    <field id="vdiff_heattr"  long_name="ocean diffusion heat transport along j-axis"   standard_name="ocean_heat_y_transport_due_to_diffusion"         unit="W"          grid_ref="grid_V_2D_inner" />
+    <field id="vdiff_salttr"  long_name="ocean diffusion salt transport along j-axis"   standard_name="ocean_salt_y_transport_due_to_diffusion"         unit="1e-3*kg/s"  grid_ref="grid_V_2D_inner" />
   </field_group>
 
   <!-- W grid -->
 
   <field_group id="grid_W" grid_ref="grid_W_3D">
-    <field id="e3w"          long_name="W-cell thickness"                              standard_name="cell_thickness"                         unit="m"    />
+    <field id="e3w"          long_name="W-cell thickness"                              standard_name="cell_thickness"                         unit="m"  grid_ref="grid_W_3D_inner"  />
     <field id="woce"         long_name="ocean vertical velocity"                       standard_name="upward_sea_water_velocity"              unit="m/s"  />
     <field id="woce_e3w"     long_name="ocean vertical velocity * e3w"                                                                        unit="m2/s"  > woce * e3w </field>
     <field id="wocetr_eff"   long_name="effective ocean vertical transport"                                                                   unit="m3/s" />
 
-    <!-- woce_eiv: available with EIV  (ln_ldfeiv=T and ln_ldfeiv_dia=T)  -->
-    <field id="woce_eiv"     long_name="EIV ocean vertical velocity"                    standard_name="bolus_upward_sea_water_velocity"       unit="m/s"  />
-    <field id="weiv_masstr"  long_name="EIV Upward Ocean Mass Transport"  standard_name="bolus_upward_ocean_mass_transport"             unit="kg/s"   />
-    <field id="weiv_heattr3d" long_name="ocean bolus heat transport"    standard_name="ocean_heat_z_transport_due_to_bolus_advection"   unit="W"    />
-    <field id="weiv_salttr3d" long_name="ocean bolus salt transport"    standard_name="ocean_salt_z_transport_due_to_bolus_advection"   unit="kg"   />
+    <!-- variables available with WAVE (ln_wave=T) -->
+    <field id="wstokes"      long_name="Stokes Drift vertical velocity"                 standard_name="upward_StokesDrift_velocity"           unit="m/s"  />
 
-    <field id="avt"          long_name="vertical eddy diffusivity"                      standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s" />
-    <field id="avt_e3w"      long_name="vertical heat diffusivity * e3w"                unit="m3/s" > avt * e3w </field>
-    <field id="logavt"       long_name="logarithm of vertical eddy diffusivity"         standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s" />
-    <field id="avm"          long_name="vertical eddy viscosity"                        standard_name="ocean_vertical_momentum_diffusivity"   unit="m2/s" />
-    <field id="avm_e3w"      long_name="vertical eddy viscosity * e3w"   unit="m3/s" > avm * e3w </field>
+    <!-- woce_eiv: available with EIV  (ln_ldfeiv=T and ln_ldfeiv_dia=T)  -->
+    <field id="woce_eiv"     long_name="EIV ocean vertical velocity"                    standard_name="bolus_upward_sea_water_velocity"               unit="m/s"  grid_ref="grid_W_3D_inner" />
+    <field id="weiv_masstr"  long_name="EIV Upward Ocean Mass Transport"                standard_name="bolus_upward_ocean_mass_transport"             unit="kg/s" grid_ref="grid_W_3D_inner" />
+    <field id="weiv_heattr3d" long_name="ocean bolus heat transport"                    standard_name="ocean_heat_z_transport_due_to_bolus_advection" unit="W"    grid_ref="grid_W_3D_inner" />
+    <field id="weiv_salttr3d" long_name="ocean bolus salt transport"                    standard_name="ocean_salt_z_transport_due_to_bolus_advection" unit="kg"   grid_ref="grid_W_3D_inner" />
+
+    <!-- avt, avm -->
+    <field id="avt"          long_name="vertical eddy diffusivity"                      standard_name="ocean_vertical_heat_diffusivity"     unit="m2/s" grid_ref="grid_W_3D_inner" />
+    <field id="avt_e3w"      long_name="vertical heat diffusivity * e3w"                                                                    unit="m3/s"                             > avt * e3w </field>
+    <field id="logavt"       long_name="logarithm of vertical eddy diffusivity"         standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s"   grid_ref="grid_W_3D_inner" />
+    <field id="avm"          long_name="vertical eddy viscosity"                        standard_name="ocean_vertical_momentum_diffusivity"   unit="m2/s"   />
+    <field id="avm_e3w"      long_name="vertical eddy viscosity * e3w"                                                                      unit="m3/s"                             > avm * e3w </field>
 
     <!-- avs: /= avt with ln_zdfddm=T -->
-    <field id="avs"          long_name="salt vertical eddy diffusivity"                 standard_name="ocean_vertical_salt_diffusivity"       unit="m2/s" />
-    <field id="avs_e3w"      long_name="vertical salt diffusivity * e3w"   unit="m3/s" > avs * e3w </field>
-    <field id="logavs"       long_name="logarithm of salt vertical eddy diffusivity"    standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s" />
+    <field id="avs"          long_name="salt vertical eddy diffusivity"                 standard_name="ocean_vertical_salt_diffusivity"       unit="m2/s"   grid_ref="grid_W_3D_inner" />
+    <field id="avs_e3w"      long_name="vertical salt diffusivity * e3w"                                                                    unit="m3/s"                             > avs * e3w </field>
+    <field id="logavs"       long_name="logarithm of salt vertical eddy diffusivity"    standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s"   grid_ref="grid_W_3D_inner" />
 
     <!-- avt_evd and avm_evd: available with ln_zdfevd -->
-    <field id="avt_evd"      long_name="convective enhancement of vertical diffusivity" standard_name="ocean_vertical_tracer_diffusivity_due_to_convection"     unit="m2/s" />
-    <field id="avt_evd_e3w"  long_name="convective enhancement to vertical diffusivity * e3w "    unit="m3/s" > avt_evd * e3w </field>
-    <field id="avm_evd"      long_name="convective enhancement of vertical viscosity"   standard_name="ocean_vertical_momentum_diffusivity_due_to_convection"   unit="m2/s" />
+    <field id="avt_evd"      long_name="convective enhancement of vertical diffusivity" standard_name="ocean_vertical_tracer_diffusivity_due_to_convection"     unit="m2/s"    grid_ref="grid_W_3D_inner" />
+    <field id="avt_evd_e3w"  long_name="convective enhancement to vertical diffusivity * e3w "                                                                unit="m3/s"                             > avt_evd * e3w </field>
+    <field id="avm_evd"      long_name="convective enhancement of vertical viscosity"   standard_name="ocean_vertical_momentum_diffusivity_due_to_convection"   unit="m2/s"    grid_ref="grid_W_3D_inner" />
 
     <!-- mf_app and mf_wp: available with ln_zdfmfc -->
-    <field id="mf_app"      long_name="convective area"        standard_name="mf_convective_area"    unit="%"      grid_ref="grid_W_3D" />
-    <field id="mf_wp"       long_name="convective velocity"    standard_name="mf_convective_velo"    unit="m/s"    grid_ref="grid_W_3D" />
-
+    <field id="mf_app"      long_name="convective area"        standard_name="mf_convective_area"    unit="%"      grid_ref="grid_W_3D_inner" />
+    <field id="mf_wp"       long_name="convective velocity"    standard_name="mf_convective_velo"    unit="m/s"    grid_ref="grid_W_3D_inner" />
 
     <!-- avt_tide: available with ln_zdfiwm=T -->
-    <field id="av_ratio"     long_name="S over T diffusivity ratio"                     standard_name="salinity_over_temperature_diffusivity_ratio"                     unit="1"    />
-    <field id="av_wave"      long_name="internal wave-induced vertical diffusivity"     standard_name="ocean_vertical_tracer_diffusivity_due_to_internal_waves"         unit="m2/s" />
-    <field id="bflx_iwm"     long_name="internal wave-induced buoyancy flux"            standard_name="buoyancy_flux_due_to_internal_waves"                             unit="W/kg" />
-    <field id="pcmap_iwm"    long_name="power consumed by wave-driven mixing"           standard_name="vertically_integrated_power_consumption_by_wave_driven_mixing"   unit="W/m2"      grid_ref="grid_W_2D" />
-    <field id="emix_iwm"     long_name="power density available for mixing"             standard_name="power_available_for_mixing_from_breaking_internal_waves"         unit="W/kg" />
-
-    <!-- variables available with WAVE (ln_wave=T) -->
-    <field id="wstokes"      long_name="Stokes Drift vertical velocity"                 standard_name="upward_StokesDrift_velocity"   unit="m/s" />
+    <field id="av_ratio"     long_name="S over T diffusivity ratio"                     standard_name="salinity_over_temperature_diffusivity_ratio"                     unit="1"    grid_ref="grid_W_3D_inner" />
+    <field id="av_wave"      long_name="internal wave-induced vertical diffusivity"     standard_name="ocean_vertical_tracer_diffusivity_due_to_internal_waves"         unit="m2/s" grid_ref="grid_W_3D_inner" />
+    <field id="bflx_iwm"     long_name="internal wave-induced buoyancy flux"            standard_name="buoyancy_flux_due_to_internal_waves"                             unit="W/kg" grid_ref="grid_W_3D_inner" />
+    <field id="pcmap_iwm"    long_name="power consumed by wave-driven mixing"           standard_name="vertically_integrated_power_consumption_by_wave_driven_mixing"   unit="W/m2" grid_ref="grid_W_2D_inner" />
+    <field id="emix_iwm"     long_name="power density available for mixing"             standard_name="power_available_for_mixing_from_breaking_internal_waves"         unit="W/kg" grid_ref="grid_W_3D_inner" />
 
     <!-- variables available with diaar5 -->
-    <field id="w_masstr"     long_name="vertical mass transport"                        standard_name="upward_ocean_mass_transport"             unit="kg/s"   />
-    <field id="w_masstr2"    long_name="square of vertical mass transport"              standard_name="square_of_upward_ocean_mass_transport"   unit="kg2/s2" />
+    <field id="w_masstr"     long_name="vertical mass transport"                        standard_name="upward_ocean_mass_transport"             unit="kg/s"   grid_ref="grid_W_3D_inner" />
+    <field id="w_masstr2"    long_name="square of vertical mass transport"              standard_name="square_of_upward_ocean_mass_transport"   unit="kg2/s2" grid_ref="grid_W_3D_inner" />
 
     <!-- EOS -->
     <field id="bn2"          long_name="squared Brunt-Vaisala frequency"                unit="s-2" />
 
     <!-- dissipation diagnostics (note: ediss_k is only available with tke scheme) -->   
-    <field id="avt_k"        long_name="vertical eddy diffusivity from closure schemes" standard_name="ocean_vertical_eddy_diffusivity"       unit="m2/s" />
-    <field id="avm_k"        long_name="vertical eddy viscosity from closure schemes"   standard_name="ocean_vertical_eddy_viscosity"         unit="m2/s" />
-    <field id="ediss_k"      long_name="Kolmogorov energy dissipation (tke scheme)"     standard_name="Kolmogorov_energy_dissipation"         unit="W/kg" />
-    <field id="eshear_k"     long_name="energy source from vertical shear"              standard_name="energy_source_from_shear"              unit="W/kg" />
-    <field id="estrat_k"     long_name="energy sink from stratification"                standard_name="energy_sink_from_stratification"       unit="W/kg" />
+    <field id="avt_k"        long_name="vertical eddy diffusivity from closure schemes" standard_name="ocean_vertical_eddy_diffusivity"       unit="m2/s"   grid_ref="grid_W_3D_inner" />
+    <field id="avm_k"        long_name="vertical eddy viscosity from closure schemes"   standard_name="ocean_vertical_eddy_viscosity"         unit="m2/s"   />
+    <field id="ediss_k"      long_name="Kolmogorov energy dissipation (tke scheme)"     standard_name="Kolmogorov_energy_dissipation"         unit="W/kg"   grid_ref="grid_W_3D_inner" />
+    <field id="eshear_k"     long_name="energy source from vertical shear"              standard_name="energy_source_from_shear"              unit="W/kg"   grid_ref="grid_W_3D_inner" />
+    <field id="estrat_k"     long_name="energy sink from stratification"                standard_name="energy_sink_from_stratification"       unit="W/kg"   grid_ref="grid_W_3D_inner" />
     
   </field_group>
 
   <!-- F grid -->
   <field_group id="grid_F" grid_ref="grid_F_2D">
-    <field id="e3f"          long_name="F-cell thickness"                      standard_name="cell_thickness"         unit="m"   grid_ref="grid_F_3D" />
-    <field id="e3f_0"        long_name="F-cell thickness"                      standard_name="cell_thickness"         unit="m"   grid_ref="grid_F_3D" />
-    <field id="hf"           long_name="water column height at F point"        standard_name="water_column_height_F"  unit="m"                     />
-    <field id="ssKEf"        long_name="surface kinetic energy at F point"     standard_name="specific_kinetic_energy_of_sea_water"   unit="m2/s2" grid_ref="grid_F_2D_inner" />
-    <field id="ssrelvor"     long_name="surface relative vorticity"            standard_name="relative_vorticity"     unit="1/s"       grid_ref="grid_F_2D_inner" />
-    <field id="ssplavor"     long_name="surface planetary vorticity"           standard_name="planetary_vorticity"    unit="1/s"       />
-    <field id="ssrelpotvor"  long_name="surface relative potential vorticity"  standard_name="relpot_vorticity"       unit="1/m.s"     grid_ref="grid_F_2D_inner" />
-    <field id="ssabspotvor"  long_name="surface absolute potential vorticity"  standard_name="abspot_vorticity"       unit="1/m.s"     grid_ref="grid_F_2D_inner" />
-    <field id="ssEns"        long_name="surface enstrophy"                     standard_name="enstrophy"              unit="1/m2.s2"   grid_ref="grid_F_2D_inner" />
+    <field id="e3f"          long_name="F-cell thickness"                      standard_name="cell_thickness"                       unit="m"       grid_ref="grid_F_3D_inner" />
+    <field id="e3f_0"        long_name="F-cell thickness"                      standard_name="cell_thickness"                       unit="m"       grid_ref="grid_F_3D"       />
+    <field id="hf"           long_name="water column height at F point"        standard_name="water_column_height_F"                unit="m"                                  />
+    <field id="ssKEf"        long_name="surface kinetic energy at F point"     standard_name="specific_kinetic_energy_of_sea_water" unit="m2/s2"   grid_ref="grid_F_2D_inner" />
+    <field id="ssrelvor"     long_name="surface relative vorticity"            standard_name="relative_vorticity"                   unit="1/s"     grid_ref="grid_F_2D_inner" />
+    <field id="ssplavor"     long_name="surface planetary vorticity"           standard_name="planetary_vorticity"                  unit="1/s"     grid_ref="grid_F_2D_inner" />
+    <field id="ssrelpotvor"  long_name="surface relative potential vorticity"  standard_name="relpot_vorticity"                     unit="1/m.s"   grid_ref="grid_F_2D_inner" />
+    <field id="ssabspotvor"  long_name="surface absolute potential vorticity"  standard_name="abspot_vorticity"                     unit="1/m.s"   grid_ref="grid_F_2D_inner" />
+    <field id="ssEns"        long_name="surface enstrophy"                     standard_name="enstrophy"                            unit="1/m2.s2" grid_ref="grid_F_2D_inner" />
   </field_group>
 
   <!-- AGRIF sponge -->
@@ -822,16 +815,16 @@ that are available in the tidal-forcing implementation (see
 
   <!-- transects -->
   <field_group id="oce_straits">
-    <field id="uoce_e3u_ave"         long_name="Monthly average of u*e3u"                        field_ref="uoce_e3u"                    freq_op="1mo"   freq_offset="_reset_" > @uoce_e3u </field>
-    <field id="uoce_e3u_ave_vsum"    long_name="Vertical sum of u*e3u"                           field_ref="uoce_e3u_ave"         grid_ref="grid_U_vsum"     />
+    <field id="uoce_e3u_ave"         long_name="Monthly average of u*e3u"                        field_ref="uoce_e3u"             freq_op="1mo"   freq_offset="_reset_" > @uoce_e3u </field>
+    <field id="uoce_e3u_ave_vsum"    long_name="Vertical sum of u*e3u"                           field_ref="uoce_e3u_ave"         grid_ref="grid_U_vsum"    />
     <field id="uocetr_vsum_section"  long_name="Total 2D transport in i-direction"               field_ref="uoce_e3u_ave_vsum"    grid_ref="grid_U_scalar"  detect_missing_value="true"> this * e2u </field>
     <field id="uocetr_strait"        long_name="Total transport across lines in i-direction"     field_ref="uocetr_vsum_section"  grid_ref="grid_U_4strait" />
     <field id="u_masstr_strait"      long_name="Sea water transport across line in i-direction"  field_ref="uocetr_strait"        grid_ref="grid_U_4strait_hsum" unit="kg/s"> this * maskMFO_u * $rho0 </field>
 
-    <field id="voce_e3v_ave"         long_name="Monthly average of v*e3v"                        field_ref="voce_e3v"                    freq_op="1mo"   freq_offset="_reset_" > @voce_e3v </field>
-    <field id="voce_e3v_ave_vsum"    long_name="Vertical sum of v*e3v"                           field_ref="voce_e3v_ave"         grid_ref="grid_V_vsum"      />
+    <field id="voce_e3v_ave"         long_name="Monthly average of v*e3v"                        field_ref="voce_e3v"             freq_op="1mo"   freq_offset="_reset_" > @voce_e3v </field>
+    <field id="voce_e3v_ave_vsum"    long_name="Vertical sum of v*e3v"                           field_ref="voce_e3v_ave"         grid_ref="grid_V_vsum"    />
     <field id="vocetr_vsum_section"  long_name="Total 2D transport of in j-direction"            field_ref="voce_e3v_ave_vsum"    grid_ref="grid_V_scalar"  detect_missing_value="true"> this * e1v </field>
-    <field id="vocetr_strait"        long_name="Total transport across lines in j-direction"     field_ref="vocetr_vsum_section"  grid_ref="grid_V_4strait"  />
+    <field id="vocetr_strait"        long_name="Total transport across lines in j-direction"     field_ref="vocetr_vsum_section"  grid_ref="grid_V_4strait" />
     <field id="v_masstr_strait"      long_name="Sea water transport across line in j-direction"  field_ref="vocetr_strait"        grid_ref="grid_V_4strait_hsum" unit="kg/s"> this * maskMFO_v * $rho0 </field>
 
     <field id="masstr_strait"        long_name="Sea water transport across line"                                                  grid_ref="grid_4strait"  > u_masstr_strait + v_masstr_strait </field>
@@ -1024,7 +1017,7 @@ that are available in the tidal-forcing implementation (see
   </field_group>
 
   <!--  Total trends calculated every time step-->
-  <field_group id="trendT" grid_ref="grid_T_3D">
+  <field_group id="trendT" grid_ref="grid_T_3D_inner">
     <field id="ttrd_tot"      long_name="temperature-trend: total model trend"         unit="degC/s" />
     <field id="strd_tot"      long_name="salinity   -trend: total model trend"         unit="1e-3/s" />
     <!-- Thickness weighted versions: -->
@@ -1040,10 +1033,10 @@ that are available in the tidal-forcing implementation (see
     <field id="ketrd_spg"     long_name="ke-trend: surface     pressure gradient"          unit="W/s^3"                        />
     <field id="ketrd_spgexp"  long_name="ke-trend: surface pressure gradient (explicit)"   unit="W/s^3"                        />
     <field id="ketrd_spgflt"  long_name="ke-trend: surface pressure gradient (filter)"     unit="W/s^3"                        />
-    <field id="ssh_flt"       long_name="filtered contribution to ssh (dynspg_flt)"        unit="m"       grid_ref="grid_T_2D" />
-    <field id="w0"            long_name="surface vertical velocity"                        unit="m/s"     grid_ref="grid_T_2D" />
-    <field id="pw0_exp"       long_name="surface pressure flux due to ssh"                 unit="W/s^2"   grid_ref="grid_T_2D" />
-    <field id="pw0_flt"       long_name="surface pressure flux due to filtered ssh"        unit="W/s^2"   grid_ref="grid_T_2D" />
+    <field id="ssh_flt"       long_name="filtered contribution to ssh (dynspg_flt)"        unit="m"       grid_ref="grid_T_2D_inner" />
+    <field id="w0"            long_name="surface vertical velocity"                        unit="m/s"     grid_ref="grid_T_2D_inner" />
+    <field id="pw0_exp"       long_name="surface pressure flux due to ssh"                 unit="W/s^2"   grid_ref="grid_T_2D_inner" />
+    <field id="pw0_flt"       long_name="surface pressure flux due to filtered ssh"        unit="W/s^2"   grid_ref="grid_T_2D_inner" />
     <field id="ketrd_keg"     long_name="ke-trend: KE gradient         or hor. adv."       unit="W/s^3"                        />
     <field id="ketrd_rvo"     long_name="ke-trend: relative  vorticity or metric term"     unit="W/s^3"                        />
     <field id="ketrd_pvo"     long_name="ke-trend: planetary vorticity"                    unit="W/s^3"                        />
@@ -1051,24 +1044,18 @@ that are available in the tidal-forcing implementation (see
     <field id="ketrd_udx"     long_name="ke-trend: U.dx[U]"                                unit="W/s^3"                        />
     <field id="ketrd_ldf"     long_name="ke-trend: lateral   diffusion"                    unit="W/s^3"                        />
     <field id="ketrd_zdf"     long_name="ke-trend: vertical  diffusion"                    unit="W/s^3"                        />
-    <field id="ketrd_tau"     long_name="ke-trend: wind stress "                           unit="W/s^3"   grid_ref="grid_T_2D" />
+    <field id="ketrd_tau"     long_name="ke-trend: wind stress "                           unit="W/s^3"   grid_ref="grid_T_2D_inner" />
     <field id="ketrd_bfr"     long_name="ke-trend: bottom friction (explicit)"             unit="W/s^3"                        />
     <field id="ketrd_bfri"    long_name="ke-trend: bottom friction (implicit)"             unit="W/s^3"                        />
     <field id="ketrd_atf"     long_name="ke-trend: asselin time filter trend"              unit="W/s^3"                        />
     <field id="ketrd_convP2K" long_name="ke-trend: conversion (potential to kinetic)"      unit="W/s^3"                        />
     <field id="KE"            long_name="kinetic energy: u(n)*u(n+1)/2"                    unit="W/s^2"                        />
 
-    <!-- variables available when explicit lateral mixing is used (ln_dynldf_OFF=F) -->
-    <field id="dispkexyfo"    long_name="KE-trend: lateral  mixing induced dissipation"   standard_name="ocean_kinetic_energy_dissipation_per_unit_area_due_to_xy_friction"                   unit="W/m^2" grid_ref="grid_T_2D" />
-    <field id="dispkevfo"     long_name="KE-trend: vertical mixing induced dissipation"   standard_name="ocean_kinetic_energy_dissipation_per_unit_area_due_to_vertical_friction"             unit="W/m^2" grid_ref="grid_T_2D" />
-    <!-- variables available with ln_traadv_eiv=T and ln_diaeiv=T -->
-    <field id="eketrd_eiv"    long_name="EKE-trend due to parameterized eddy advection"   standard_name="tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection"   unit="W/m^2" grid_ref="grid_T_2D" />
-
     <!-- variables available with ln_PE_trd -->
     <field id="petrd_xad"     long_name="pe-trend: i-advection"                unit="W/m^3"                        />
     <field id="petrd_yad"     long_name="pe-trend: j-advection"                unit="W/m^3"                        />
     <field id="petrd_zad"     long_name="pe-trend: k-advection"                unit="W/m^3"                        />
-    <field id="petrd_sad"     long_name="pe-trend: surface adv. (linssh true)" unit="W/m^3"   grid_ref="grid_T_2D" />
+    <field id="petrd_sad"     long_name="pe-trend: surface adv. (linssh true)" unit="W/m^3"   grid_ref="grid_T_2D_inner" />
     <field id="petrd_ldf"     long_name="pe-trend: lateral  diffusion"         unit="W/m^3"                        />
     <field id="petrd_zdf"     long_name="pe-trend: vertical diffusion"         unit="W/m^3"                        />
     <field id="petrd_zdfp"    long_name="pe-trend: pure vert. diffusion"       unit="W/m^3"                        />
@@ -1086,42 +1073,42 @@ that are available in the tidal-forcing implementation (see
 
   <field_group id="trendU" grid_ref="grid_U_3D">
     <!-- variables available with ln_dyn_trd -->
-    <field id="utrd_hpg"       long_name="i-trend: hydrostatic pressure gradient"          unit="m/s^2"                        />
-    <field id="utrd_spg"       long_name="i-trend: surface     pressure gradient"          unit="m/s^2"                        />
-    <field id="utrd_spgexp"    long_name="i-trend: surface pressure gradient (explicit)"   unit="m/s^2"                        />
-    <field id="utrd_spgflt"    long_name="i-trend: surface pressure gradient (filtered)"   unit="m/s^2"                        />
-    <field id="utrd_keg"       long_name="i-trend: KE gradient         or hor. adv."       unit="m/s^2"                        />
-    <field id="utrd_rvo"       long_name="i-trend: relative  vorticity or metric term"     unit="m/s^2"                        />
-    <field id="utrd_pvo"       long_name="i-trend: planetary vorticity"                    unit="m/s^2"                        />
-    <field id="utrd_zad"       long_name="i-trend: vertical  advection"                    unit="m/s^2"                        />
-    <field id="utrd_udx"       long_name="i-trend: U.dx[U]"                                unit="m/s^2"                        />
-    <field id="utrd_ldf"       long_name="i-trend: lateral   diffusion"                    unit="m/s^2"                        />
-    <field id="utrd_zdf"       long_name="i-trend: vertical  diffusion"                    unit="m/s^2"                        />
-    <field id="utrd_tau"       long_name="i-trend: wind stress "                           unit="m/s^2"   grid_ref="grid_U_2D" />
-    <field id="utrd_bfr"       long_name="i-trend: bottom friction (explicit)"             unit="m/s^2"                        />
-    <field id="utrd_bfri"      long_name="i-trend: bottom friction (implicit)"             unit="m/s^2"                        />
-    <field id="utrd_tot"       long_name="i-trend: total momentum trend before atf"        unit="m/s^2"                        />
-    <field id="utrd_atf"       long_name="i-trend: asselin time filter trend"              unit="m/s^2"                        />
+    <field id="utrd_hpg"       long_name="i-trend: hydrostatic pressure gradient"          unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_spg"       long_name="i-trend: surface     pressure gradient"          unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_spgexp"    long_name="i-trend: surface pressure gradient (explicit)"   unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_spgflt"    long_name="i-trend: surface pressure gradient (filtered)"   unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_keg"       long_name="i-trend: KE gradient         or hor. adv."       unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_rvo"       long_name="i-trend: relative  vorticity or metric term"     unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_pvo"       long_name="i-trend: planetary vorticity"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_zad"       long_name="i-trend: vertical  advection"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_udx"       long_name="i-trend: U.dx[U]"                                unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_ldf"       long_name="i-trend: lateral   diffusion"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_zdf"       long_name="i-trend: vertical  diffusion"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_tau"       long_name="i-trend: wind stress "                           unit="m/s^2"   grid_ref="grid_U_2D_inner"  />
+    <field id="utrd_bfr"       long_name="i-trend: bottom friction (explicit)"             unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_bfri"      long_name="i-trend: bottom friction (implicit)"             unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_tot"       long_name="i-trend: total momentum trend before atf"        unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="utrd_atf"       long_name="i-trend: asselin time filter trend"              unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
   </field_group>
 
   <field_group id="trendV" grid_ref="grid_V_3D">
     <!-- variables available with ln_dyn_trd -->
-    <field id="vtrd_hpg"       long_name="j-trend: hydrostatic pressure gradient"          unit="m/s^2"                        />
-    <field id="vtrd_spg"       long_name="j-trend: surface     pressure gradient"          unit="m/s^2"                        />
-    <field id="vtrd_spgexp"    long_name="j-trend: surface pressure gradient (explicit)"   unit="m/s^2"                        />
-    <field id="vtrd_spgflt"    long_name="j-trend: surface pressure gradient (filtered)"   unit="m/s^2"                        />
-    <field id="vtrd_keg"       long_name="j-trend: KE gradient         or hor. adv."       unit="m/s^2"                        />
-    <field id="vtrd_rvo"       long_name="j-trend: relative  vorticity or metric term"     unit="m/s^2"                        />
-    <field id="vtrd_pvo"       long_name="j-trend: planetary vorticity"                    unit="m/s^2"                        />
-    <field id="vtrd_zad"       long_name="j-trend: vertical  advection"                    unit="m/s^2"                        />
-    <field id="vtrd_vdy"       long_name="i-trend: V.dx[V]"                                unit="m/s^2"                        />
-    <field id="vtrd_ldf"       long_name="j-trend: lateral   diffusion"                    unit="m/s^2"                        />
-    <field id="vtrd_zdf"       long_name="j-trend: vertical  diffusion"                    unit="m/s^2"                        />
-    <field id="vtrd_tau"       long_name="j-trend: wind stress "                           unit="m/s^2"   grid_ref="grid_V_2D" />
-    <field id="vtrd_bfr"       long_name="j-trend: bottom friction (explicit)"             unit="m/s^2"                        />
-    <field id="vtrd_bfri"      long_name="j-trend: bottom friction (implicit)"             unit="m/s^2"                        />
-    <field id="vtrd_tot"       long_name="j-trend: total momentum trend before atf"        unit="m/s^2"                        />
-    <field id="vtrd_atf"       long_name="j-trend: asselin time filter trend"              unit="m/s^2"                        />
+    <field id="vtrd_hpg"       long_name="j-trend: hydrostatic pressure gradient"          unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_spg"       long_name="j-trend: surface     pressure gradient"          unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_spgexp"    long_name="j-trend: surface pressure gradient (explicit)"   unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_spgflt"    long_name="j-trend: surface pressure gradient (filtered)"   unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_keg"       long_name="j-trend: KE gradient         or hor. adv."       unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_rvo"       long_name="j-trend: relative  vorticity or metric term"     unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_pvo"       long_name="j-trend: planetary vorticity"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_zad"       long_name="j-trend: vertical  advection"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_vdy"       long_name="i-trend: V.dx[V]"                                unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_ldf"       long_name="j-trend: lateral   diffusion"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_zdf"       long_name="j-trend: vertical  diffusion"                    unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_tau"       long_name="j-trend: wind stress "                           unit="m/s^2"   grid_ref="grid_V_2D_inner"  />
+    <field id="vtrd_bfr"       long_name="j-trend: bottom friction (explicit)"             unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_bfri"      long_name="j-trend: bottom friction (implicit)"             unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_tot"       long_name="j-trend: total momentum trend before atf"        unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
+    <field id="vtrd_atf"       long_name="j-trend: asselin time filter trend"              unit="m/s^2"   grid_ref="grid_T_3D_inner"  />
   </field_group>
 
   <!-- shared variables available with TOP interface -->
@@ -1195,6 +1182,8 @@ that are available in the tidal-forcing implementation (see
     <field field_ref="qsr"          name="rsntds"   long_name="surface_net_downward_shortwave_flux"           />
     <field field_ref="qt"           name="tohfls"   long_name="surface_net_downward_total_heat_flux"          />
     <field field_ref="taum"                                                                                   />
+    <field field_ref="utau"         name="tauuo"    long_name="surface_downward_x_stress"                     />
+    <field field_ref="vtau"         name="tauvo"    long_name="surface_downward_y_stress"                     />
     <field field_ref="20d"                                                                                    />
     <field field_ref="mldkz5"                                                                                 />
     <field field_ref="mldr10_1"                                                                               />
@@ -1209,12 +1198,10 @@ that are available in the tidal-forcing implementation (see
 
   <field_group id="groupU" >
     <field field_ref="uoce"         name="uo"      long_name="sea_water_x_velocity"      />
-    <field field_ref="utau"         name="tauuo"   long_name="surface_downward_x_stress" />
   </field_group>
 
   <field_group id="groupV" >
     <field field_ref="voce"         name="vo"      long_name="sea_water_y_velocity"      />
-    <field field_ref="vtau"         name="tauvo"   long_name="surface_downward_y_stress" />
   </field_group>
 
   <field_group id="groupW" >
diff --git a/cfgs/SHARED/field_def_nemo-pisces.xml b/cfgs/SHARED/field_def_nemo-pisces.xml
index d73853f0..a2490377 100644
--- a/cfgs/SHARED/field_def_nemo-pisces.xml
+++ b/cfgs/SHARED/field_def_nemo-pisces.xml
@@ -172,140 +172,137 @@
 
   <!-- PISCES additional diagnostics on T grid  -->
 
-  <field_group id="diad_T" grid_ref="grid_T_2D">
-    <field id="PH"          long_name="PH"                                      unit="1"          grid_ref="grid_T_3D" />
-    <field id="CO3"         long_name="Bicarbonates"                            unit="mol/m3"     grid_ref="grid_T_3D" />
-    <field id="CO3sat"      long_name="CO3 saturation"                          unit="mol/m3"     grid_ref="grid_T_3D" />
-    <field id="PAR"         long_name="Photosynthetically Available Radiation"  unit="W/m2"       grid_ref="grid_T_3D" />
-    <field id="PPPHYN"      long_name="Primary production of nanophyto"         unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PPPHYP"      long_name="Primary production of picophyto"         unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PPPHYD"      long_name="Primary production of diatoms"           unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PPNEWN"      long_name="New Primary production of nanophyto"     unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PPNEWP"      long_name="New Primary production of picophyto"     unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PPNEWD"      long_name="New Primary production of diatoms"       unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PBSi"        long_name="Primary production of Si diatoms"        unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PFeN"        long_name="Primary production of nano iron"         unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PFeP"        long_name="Primary production of pico iron"         unit="molC/m3/s"  grid_ref="grid_T_3D" />
-    <field id="PFeD"        long_name="Primary production of diatoms iron"      unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="xfracal"     long_name="Calcifying fraction"                     unit="1"          grid_ref="grid_T_3D" />
-    <field id="PCAL"        long_name="Calcite production"                      unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="DCAL"        long_name="Calcite dissolution"                     unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="GRAZ1"       long_name="Grazing by microzooplankton"             unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="GRAZ2"       long_name="Grazing by mesozooplankton"              unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="REMIN"       long_name="Oxic remineralization of OM"             unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="DENIT"       long_name="Anoxic remineralization of OM"           unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="REMINP"       long_name="Oxic remineralization rate of POC"      unit="d-1"        grid_ref="grid_T_3D" />
-    <field id="REMING"       long_name="Oxic remineralization rate of GOC"      unit="d-1"        grid_ref="grid_T_3D" />
-    <field id="Nfix"        long_name="Nitrogen fixation"                       unit="mol/m3/s"   grid_ref="grid_T_3D" />
-    <field id="Mumax"       long_name="Maximum growth rate"                     unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MuN"         long_name="Realized growth rate for nanophyto"      unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MuP"         long_name="Realized growth rate for picophyto"      unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MuD"         long_name="Realized growth rate for diatomes"       unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MunetN"      long_name="Net growth rate for nanophyto"           unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MunetP"      long_name="Net growth rate for picophyto"           unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="MunetD"      long_name="Net growth rate for diatomes"            unit="s-1"        grid_ref="grid_T_3D" />
-    <field id="LNnut"       long_name="Nutrient limitation term in Nanophyto"   unit=""           grid_ref="grid_T_3D" />
-    <field id="LPnut"       long_name="Nutrient limitation term in Picophyto"   unit="-"          grid_ref="grid_T_3D" />
-    <field id="LDnut"       long_name="Nutrient limitation term in Diatoms"     unit=""           grid_ref="grid_T_3D" />
-    <field id="LNFe"        long_name="Iron limitation term in Nanophyto"       unit=""           grid_ref="grid_T_3D" />
-    <field id="LPFe"        long_name="Iron limitation term in Picophyto"       unit="-"          grid_ref="grid_T_3D" />
-    <field id="LDFe"        long_name="Iron limitation term in Diatoms"         unit=""           grid_ref="grid_T_3D" />
-    <field id="LNlight"     long_name="Light limitation term in Nanophyto"      unit=""           grid_ref="grid_T_3D" />
-    <field id="LPlight"     long_name="Light limitation term in Picophyto"      unit="-"          grid_ref="grid_T_3D" />
-    <field id="LDlight"     long_name="Light limitation term in Diatoms"        unit=""           grid_ref="grid_T_3D" />
-    <field id="SIZEN"       long_name="Mean relative size of nanophyto."        unit="-"          grid_ref="grid_T_3D" />
-    <field id="SIZEP"       long_name="Mean relative size of picophyto."        unit="-"          grid_ref="grid_T_3D" />
-    <field id="SIZED"       long_name="Mean relative size of diatoms"           unit="-"          grid_ref="grid_T_3D" />
-    <field id="RASSD"       long_name="Size of the protein machinery (Diat.)"   unit="-"          grid_ref="grid_T_3D" />
-    <field id="RASSN"       long_name="Size of the protein machinery (Nano.)"   unit="-"          grid_ref="grid_T_3D" />
-    <field id="RASSP"       long_name="Size of the protein machinery (Pico.)"   unit="-"          grid_ref="grid_T_3D" />
-    <field id="Fe3"         long_name="Iron III concentration"                  unit="nmol/m3"    grid_ref="grid_T_3D" />
-    <field id="FeL1"        long_name="Complexed Iron concentration with L1"    unit="nmol/m3"    grid_ref="grid_T_3D" />
-    <field id="TL1"         long_name="Total L1 concentration"                  unit="nmol/m3"    grid_ref="grid_T_3D" />
-    <field id="pdust"       long_name="dust concentration"                      unit="g/m3"                            />
-    <field id="Totlig"      long_name="Total ligand concentation"               unit="nmol/m3"    grid_ref="grid_T_3D" />
-    <field id="Biron"       long_name="Bioavailable iron"                       unit="nmol/m3"    grid_ref="grid_T_3D" />
-    <field id="Sdenit"      long_name="Nitrate reduction in the sediments"      unit="mol/m2/s"                        />
-    <field id="Ironice"     long_name="Iron input/uptake due to sea ice"        unit="mol/m2/s"                        />
-    <field id="SedCal"      long_name="Calcite burial in the sediments"         unit="molC/m2/s"                       />
-    <field id="SedSi"       long_name="Silicon burial in the sediments"         unit="molSi/m2/s"                      />
-    <field id="SedC"        long_name="Organic C burial in the sediments"       unit="molC/m2/s"                       />
-    <field id="HYDR"        long_name="Iron input from hydrothemal vents"       unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="EPC100"      long_name="Export of carbon particles at 100 m"     unit="mol/m2/s"                        />
-    <field id="EPFE100"     long_name="Export of biogenic iron at 100 m"        unit="mol/m2/s"                        />
-    <field id="EPSI100"     long_name="Export of Silicate at 100 m"             unit="mol/m2/s"                        />
-    <field id="EPCAL100"    long_name="Export of Calcite at 100 m"              unit="mol/m2/s"                        />
-    <field id="EXPC"        long_name="Export of carbon"                        unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="EXPFE"       long_name="Export of biogenic iron"                 unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="EXPSI"       long_name="Export of Silicate"                      unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="EXPCAL"      long_name="Export of Calcite"                       unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="Cflx"        long_name="DIC flux"                                unit="mol/m2/s"                        />
-    <field id="Oflx"        long_name="Oxygen flux"                             unit="mol/m2/s"                        />
-    <field id="Kg"          long_name="Gas transfer"                            unit="mol/m2/s/uatm"                   />
-    <field id="Dpco2"       long_name="Delta CO2"                               unit="uatm"                            />
-    <field id="pCO2sea"     long_name="surface ocean pCO2"                      unit="uatm"                            />
-    <field id="Dpo2"        long_name="Delta O2"                                unit="uatm"                            />
-    <field id="Heup"        long_name="Euphotic layer depth"                    unit="m"                               />
-    <field id="AtmCo2"      long_name="Atmospheric CO2 concentration"           unit="ppm"                               />
-    <field id="Irondep"     long_name="Iron deposition from dust"               unit="mol/m2/s"                        />
-    <field id="Ironsed"     long_name="Iron deposition from sediment"           unit="mol/m2/s"   grid_ref="grid_T_3D" />
-    <field id="FESCAV"      long_name="Scavenging of Iron"                      unit="mmol-Fe/m3/s"   grid_ref="grid_T_3D" />
-    <field id="FECOLL"      long_name="Colloidal Pumping of FeL"                unit="mmol-FeL/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LGWCOLL"     long_name="Coagulation loss of ligands"             unit="mmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="REMINF"      long_name="Oxic remineralization suppy of Fe"       unit="mmol-Fe/m3/s"  grid_ref="grid_T_3D" />
-    <field id="BACT"        long_name="Bacterial Biomass"                       unit="mmol/m3"  grid_ref="grid_T_3D" />
-    <field id="FEBACT"      long_name="Bacterial uptake of Fe"                  unit="molFe/m3/s"  grid_ref="grid_T_3D" />
-    <field id="FEPREC"      long_name="Precipitation of Fe"                     unit="molFe/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LPRODR"      long_name="OM remineralisation ligand production rate" unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LPRODP"      long_name="phytoplankton ligand production rate"    unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LIGREM"      long_name="Remineralisation loss of ligands"        unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LIGPR"       long_name="Photochemical loss of ligands"           unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LDETP"       long_name="Ligand destruction during phytoplankton uptake" unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LPRODZ2"     long_name="mesozooplankton ligand production rate"  unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="LPRODZ"      long_name="microzooplankton ligand production rate" unit="nmol-L/m3/s"  grid_ref="grid_T_3D" />
-    <field id="FEZOO"       long_name="microzooplankton iron recycling rate"    unit="nmol-FeL/m3/s"  grid_ref="grid_T_3D" />
-    <field id="FEZOO2"      long_name="mesozooplankton iron recycling rate"     unit="nmol-FeL/m3/s"  grid_ref="grid_T_3D" />
+  <field_group id="diad_T" grid_ref="grid_T_2D_inner" >
+    <field id="PH"          long_name="PH"                                      unit="1"          grid_ref="grid_T_3D_inner" />
+    <field id="CO3"         long_name="Bicarbonates"                            unit="mol/m3"     grid_ref="grid_T_3D_inner" />
+    <field id="CO3sat"      long_name="CO3 saturation"                          unit="mol/m3"     grid_ref="grid_T_3D_inner" />
+    <field id="DCAL"        long_name="Calcite dissolution"                     unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="PAR"         long_name="Photosynthetically Available Radiation"  unit="W/m2"       grid_ref="grid_T_3D_inner" />
+    <field id="PPPHYN"      long_name="Primary production of nanophyto"         unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PPPHYP"      long_name="Primary production of picophyto"         unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PPPHYD"      long_name="Primary production of diatoms"           unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PPNEWN"      long_name="New Primary production of nanophyto"     unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PPNEWP"      long_name="New Primary production of picophyto"     unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PPNEWD"      long_name="New Primary production of diatoms"       unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PBSi"        long_name="Primary production of Si diatoms"        unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PFeN"        long_name="Primary production of nano iron"         unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PFeP"        long_name="Primary production of pico iron"         unit="molC/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="PFeD"        long_name="Primary production of diatoms iron"      unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="xfracal"     long_name="Calcifying fraction"                     unit="1"          grid_ref="grid_T_3D_inner" />
+    <field id="PCAL"        long_name="Calcite production"                      unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="GRAZ1"       long_name="Grazing by microzooplankton"             unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="GRAZ2"       long_name="Grazing by mesozooplankton"              unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="REMIN"       long_name="Oxic remineralization of OM"             unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="DENIT"       long_name="Anoxic remineralization of OM"           unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="REMINP"       long_name="Oxic remineralization rate of POC"      unit="d-1"        grid_ref="grid_T_3D_inner" />
+    <field id="REMING"       long_name="Oxic remineralization rate of GOC"      unit="d-1"        grid_ref="grid_T_3D_inner" />
+    <field id="Nfix"        long_name="Nitrogen fixation"                       unit="mol/m3/s"   grid_ref="grid_T_3D_inner" />
+    <field id="Mumax"       long_name="Maximum growth rate"                     unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MuN"         long_name="Realized growth rate for nanophyto"      unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MuP"         long_name="Realized growth rate for picophyto"      unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MuD"         long_name="Realized growth rate for diatomes"       unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MunetN"      long_name="Net growth rate for nanophyto"           unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MunetP"      long_name="Net growth rate for picophyto"           unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="MunetD"      long_name="Net growth rate for diatomes"            unit="s-1"        grid_ref="grid_T_3D_inner" />
+    <field id="LNnut"       long_name="Nutrient limitation term in Nanophyto"   unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="LPnut"       long_name="Nutrient limitation term in Picophyto"   unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="LDnut"       long_name="Nutrient limitation term in Diatoms"     unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="LNFe"        long_name="Iron limitation term in Nanophyto"       unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="LPFe"        long_name="Iron limitation term in Picophyto"       unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="LDFe"        long_name="Iron limitation term in Diatoms"         unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="LNlight"     long_name="Light limitation term in Nanophyto"      unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="LPlight"     long_name="Light limitation term in Picophyto"      unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="LDlight"     long_name="Light limitation term in Diatoms"        unit=""           grid_ref="grid_T_3D_inner" />
+    <field id="SIZEN"       long_name="Mean relative size of nanophyto."        unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="SIZEP"       long_name="Mean relative size of picophyto."        unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="SIZED"       long_name="Mean relative size of diatoms"           unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="RASSD"       long_name="Size of the protein machinery (Diat.)"   unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="RASSN"       long_name="Size of the protein machinery (Nano.)"   unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="RASSP"       long_name="Size of the protein machinery (Pico.)"   unit="-"          grid_ref="grid_T_3D_inner" />
+    <field id="Fe3"         long_name="Iron III concentration"                  unit="nmol/m3"    grid_ref="grid_T_3D_inner" />
+    <field id="FeL1"        long_name="Complexed Iron concentration with L1"    unit="nmol/m3"    grid_ref="grid_T_3D_inner" />
+    <field id="TL1"         long_name="Total L1 concentration"                  unit="nmol/m3"    grid_ref="grid_T_3D_inner" />
+    <field id="pdust"       long_name="dust concentration"                      unit="g/m3"         />
+    <field id="Totlig"      long_name="Total ligand concentation"               unit="nmol/m3"    grid_ref="grid_T_3D_inner" />
+    <field id="Biron"       long_name="Bioavailable iron"                       unit="nmol/m3"    grid_ref="grid_T_3D_inner" />
+    <field id="Sdenit"      long_name="Nitrate reduction in the sediments"      unit="mol/m2/s"    />
+    <field id="Ironice"     long_name="Iron input/uptake due to sea ice"        unit="mol/m2/s"     />
+    <field id="SedCal"      long_name="Calcite burial in the sediments"         unit="molC/m2/s"   />
+    <field id="SedSi"       long_name="Silicon burial in the sediments"         unit="molSi/m2/s"  />
+    <field id="SedC"        long_name="Organic C burial in the sediments"       unit="molC/m2/s"   />
+    <field id="HYDR"        long_name="Iron input from hydrothemal vents"       unit="mol/m2/s"   grid_ref="grid_T_3D_inner" />
+    <field id="EPC100"      long_name="Export of carbon particles at 100 m"     unit="mol/m2/s"    />
+    <field id="EPFE100"     long_name="Export of biogenic iron at 100 m"        unit="mol/m2/s"    />
+    <field id="EPSI100"     long_name="Export of Silicate at 100 m"             unit="mol/m2/s"    />
+    <field id="EPCAL100"    long_name="Export of Calcite at 100 m"              unit="mol/m2/s"    />
+    <field id="EXPC"        long_name="Export of carbon"                        unit="mol/m2/s"   grid_ref="grid_T_3D_inner" />
+    <field id="EXPFE"       long_name="Export of biogenic iron"                 unit="mol/m2/s"   grid_ref="grid_T_3D_inner" />
+    <field id="EXPSI"       long_name="Export of Silicate"                      unit="mol/m2/s"   grid_ref="grid_T_3D_inner" />
+    <field id="EXPCAL"      long_name="Export of Calcite"                       unit="mol/m2/s"   grid_ref="grid_T_3D_inner" />
+    <field id="Cflx"        long_name="DIC flux"                                unit="mol/m2/s"     />
+    <field id="Oflx"        long_name="Oxygen flux"                             unit="mol/m2/s"    />
+    <field id="Kg"          long_name="Gas transfer"                            unit="mol/m2/s/uatm"   />
+    <field id="Dpco2"       long_name="Delta CO2"                               unit="uatm"        />
+    <field id="pCO2sea"     long_name="surface ocean pCO2"                      unit="uatm"        />
+    <field id="Dpo2"        long_name="Delta O2"                                unit="uatm"        />
+    <field id="Heup"        long_name="Euphotic layer depth"                    unit="m"      grid_ref="grid_T_2D_inner"       />
+    <field id="AtmCo2"      long_name="Atmospheric CO2 concentration"           unit="ppm"          />
+    <field id="Irondep"     long_name="Iron deposition from dust"               unit="mol/m2/s"    />
+    <field id="Ironsed"     long_name="Iron deposition from sediment"           unit="mol/m2/s"            grid_ref="grid_T_3D_inner" />
+    <field id="FESCAV"      long_name="Scavenging of Iron"                      unit="mmol-Fe/m3/s"        grid_ref="grid_T_3D_inner" />
+    <field id="FECOLL"      long_name="Colloidal Pumping of FeL"                unit="mmol-FeL/m3/s"       grid_ref="grid_T_3D_inner" />
+    <field id="LGWCOLL"     long_name="Coagulation loss of ligands"             unit="mmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="REMINF"      long_name="Oxic remineralization suppy of Fe"       unit="mmol-Fe/m3/s"        grid_ref="grid_T_3D_inner" />
+    <field id="BACT"        long_name="Bacterial Biomass"                       unit="mmol/m3"             grid_ref="grid_T_3D_inner" />
+    <field id="FEBACT"      long_name="Bacterial uptake of Fe"                  unit="molFe/m3/s"          grid_ref="grid_T_3D_inner" />
+    <field id="FEPREC"      long_name="Precipitation of Fe"                     unit="molFe/m3/s"          grid_ref="grid_T_3D_inner" />
+    <field id="LPRODR"      long_name="OM remineralisation ligand production rate" unit="nmol-L/m3/s"      grid_ref="grid_T_3D_inner" />
+    <field id="LPRODP"      long_name="phytoplankton ligand production rate"    unit="nmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="LIGREM"      long_name="Remineralisation loss of ligands"        unit="nmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="LIGPR"       long_name="Photochemical loss of ligands"           unit="nmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="LDETP"       long_name="Ligand destruction during phytoplankton uptake" unit="nmol-L/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="LPRODZ2"     long_name="mesozooplankton ligand production rate"  unit="nmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="LPRODZ"      long_name="microzooplankton ligand production rate" unit="nmol-L/m3/s"         grid_ref="grid_T_3D_inner" />
+    <field id="FEZOO"       long_name="microzooplankton iron recycling rate"    unit="nmol-FeL/m3/s"       grid_ref="grid_T_3D_inner" />
+    <field id="FEZOO2"      long_name="mesozooplankton iron recycling rate"     unit="nmol-FeL/m3/s"       grid_ref="grid_T_3D_inner" />
 
     <!-- PISCES tracers trends -->
-    <field id="INTdtAlk"    long_name="Vertically int. of change of alkalinity"             unit="mol/m2/s"                       />
-    <field id="INTdtDIC"    long_name="Vertically int. of change of dissic    "             unit="mol/m2/s"                       />
-    <field id="INTdtFer"    long_name="Vertically int. of change of iron      "             unit="mol/m2/s"                       />
-    <field id="INTdtDIN"    long_name="Vertically int. of change of nitrogen  "             unit="mol/m2/s"                       />
-    <field id="INTdtDIP"    long_name="Vertically int. of change of phophate  "             unit="mol/m2/s"                       />
-    <field id="INTdtSil"    long_name="Vertically int. of change of silicon   "             unit="mol/m2/s"                       />
+    <field id="INTdtAlk"    long_name="Vertically int. of change of alkalinity"             unit="mol/m2/s" />
+    <field id="INTdtDIC"    long_name="Vertically int. of change of dissic    "             unit="mol/m2/s" />
+    <field id="INTdtFer"    long_name="Vertically int. of change of iron      "             unit="mol/m2/s" />
+    <field id="INTdtDIN"    long_name="Vertically int. of change of nitrogen  "             unit="mol/m2/s" />
+    <field id="INTdtDIP"    long_name="Vertically int. of change of phophate  "             unit="mol/m2/s" />
+    <field id="INTdtSil"    long_name="Vertically int. of change of silicon   "             unit="mol/m2/s" />
 
+    <field id="TPP"         long_name="Total Primary production of phyto"                   unit="mol/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="TPNEW"       long_name="New Primary production of phyto"                     unit="mol/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="TPBFE"       long_name="Total biogenic iron production"                      unit="mol/m3/s"  grid_ref="grid_T_3D_inner" />
+    <field id="INTDIC"      long_name="DIC content"                                         unit="kg/m2"                                />
+    <field id="O2MIN"       long_name="Oxygen minimum concentration"                        unit="mol/m3"                               />
+    <field id="ZO2MIN"      long_name="Depth of oxygen minimum concentration"               unit="m"                                    />
 
-    <!-- dbio_T on T grid : variables available with diaar5 -->
-     <field id="TPP"         long_name="Total Primary production of phyto"                   unit="mol/m3/s"  grid_ref="grid_T_3D" />
-     <field id="TPNEW"       long_name="New Primary production of phyto"                     unit="mol/m3/s"  grid_ref="grid_T_3D" />
-     <field id="TPBFE"       long_name="Total biogenic iron production"                      unit="mol/m3/s"  grid_ref="grid_T_3D" />
-     <field id="INTDIC"      long_name="DIC content"                                         unit="kg/m2"                          />
-     <field id="O2MIN"       long_name="Oxygen minimum concentration"                        unit="mol/m3"                          />
-     <field id="ZO2MIN"      long_name="Depth of oxygen minimum concentration"               unit="m"                              />
+    <field id="Nfix_e3t"    long_name="Nfix * e3t"        unit="molN/m2/s" grid_ref="grid_T_3D_inner"  > Nfix   * e3t </field >
+    <field id="PPPHYN_e3t"  long_name="PPPHYN * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > PPPHYN * e3t </field >
+    <field id="PPPHYD_e3t"  long_name="PPPHYD * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > PPPHYD * e3t </field >
+    <field id="PPPHYP_e3t"  long_name="PPPHYP * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > PPPHYP * e3t </field >
+    <field id="PBSi_e3t"    long_name="PBSi * e3t"        unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > PBSi   * e3t </field >
+    <field id="TPP_e3t"     long_name="TPP * e3t"         unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > TPP    * e3t </field >
+    <field id="TPNEW_e3t"   long_name="TPNEW * e3t"       unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > TPNEW  * e3t </field >
+    <field id="TPBFE_e3t"   long_name="TPBFE * e3t"       unit="mol/m2/s"  grid_ref="grid_T_3D_inner"  > TPBFE  * e3t </field >
 
-
-     <field id="Nfix_e3t"    long_name="Nfix * e3t"        unit="molN/m2/s" grid_ref="grid_T_3D"  > Nfix   * e3t </field >  
-     <field id="PPPHYN_e3t"  long_name="PPPHYN * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D"  > PPPHYN * e3t </field >  
-     <field id="PPPHYD_e3t"  long_name="PPPHYD * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D"  > PPPHYD * e3t </field >  
-     <field id="PPPHYP_e3t"  long_name="PPPHYP * e3t"      unit="mol/m2/s"  grid_ref="grid_T_3D"  > PPPHYP * e3t </field >  
-     <field id="PBSi_e3t"    long_name="PBSi * e3t"        unit="mol/m2/s"  grid_ref="grid_T_3D"  > PBSi   * e3t </field >  
-     <field id="TPP_e3t"     long_name="TPP * e3t"         unit="mol/m2/s"  grid_ref="grid_T_3D"  > TPP    * e3t </field >  
-     <field id="TPNEW_e3t"   long_name="TPNEW * e3t"       unit="mol/m2/s"  grid_ref="grid_T_3D"  > TPNEW  * e3t </field >  
-     <field id="TPBFE_e3t"   long_name="TPBFE * e3t"       unit="mol/m2/s"  grid_ref="grid_T_3D"  > TPBFE  * e3t </field >  
-
-     <field id="INTNFIX"     long_name="Nitrogen fixation rate : vert. integrated"           field_ref="Nfix_e3t"     unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPPPHYN"   long_name="Vertically integrated primary production by nanophy" field_ref="PPPHYN_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPPPHYD"   long_name="Vertically integrated primary production by diatom"  field_ref="PPPHYD_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPPPHYP"   long_name="Vertically integrated primary production by picophy" field_ref="PPPHYP_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPP"       long_name="Vertically integrated primary production by phyto"   field_ref="TPP_e3t"      unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPNEW"     long_name="Vertically integrated new primary production"        field_ref="TPNEW_e3t"    unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPBFE"     long_name="Vertically integrated of biogenic iron production"   field_ref="TPBFE_e3t"    unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
-     <field id="INTPBSI"     long_name="Vertically integrated of biogenic Si production"     field_ref="PBSi_e3t"     unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTNFIX"     long_name="Nitrogen fixation rate : vert. integrated"           field_ref="Nfix_e3t"     unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPPPHYN"   long_name="Vertically integrated primary production by nanophy" field_ref="PPPHYN_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPPPHYD"   long_name="Vertically integrated primary production by diatom"  field_ref="PPPHYD_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPPPHYP"   long_name="Vertically integrated primary production by picophy" field_ref="PPPHYP_e3t"   unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPP"       long_name="Vertically integrated primary production by phyto"   field_ref="TPP_e3t"      unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPNEW"     long_name="Vertically integrated new primary production"        field_ref="TPNEW_e3t"    unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPBFE"     long_name="Vertically integrated of biogenic iron production"   field_ref="TPBFE_e3t"    unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
+    <field id="INTPBSI"     long_name="Vertically integrated of biogenic Si production"     field_ref="PBSi_e3t"     unit="mol/m2/s"  grid_ref="grid_T_vsum"  detect_missing_value="true" />
 
     <!-- PISCES light : variables available with key_pisces_reduced -->
-    <field id="FNO3PHY"     long_name="FNO3PHY"                                 unit=""          grid_ref="grid_T_3D" />
-    <field id="FNH4PHY"     long_name="FNH4PHY"                                 unit=""          grid_ref="grid_T_3D" />
-    <field id="FNH4NO3"     long_name="FNH4NO3"                                 unit=""          grid_ref="grid_T_3D" />
+    <field id="FNO3PHY"     long_name="FNO3PHY"                                 unit=""     grid_ref="grid_T_3D_inner" />
+    <field id="FNH4PHY"     long_name="FNH4PHY"                                 unit=""     grid_ref="grid_T_3D_inner" />
+    <field id="FNH4NO3"     long_name="FNH4NO3"                                 unit=""     grid_ref="grid_T_3D_inner" />
     <field id="TNO3PHY"     long_name="TNO3PHY"                                 unit=""  />
     <field id="TNH4PHY"     long_name="TNH4PHY"                                 unit=""  />
     <field id="TPHYDOM"     long_name="TPHYDOM"                                 unit=""  />
diff --git a/cfgs/SHARED/grid_def_nemo.xml b/cfgs/SHARED/grid_def_nemo.xml
index d66b314f..eb0aab01 100644
--- a/cfgs/SHARED/grid_def_nemo.xml
+++ b/cfgs/SHARED/grid_def_nemo.xml
@@ -184,6 +184,12 @@
       <extract_axis position="0" />
     </scalar>
   </grid>
+  <grid id="grid_T_SFC_inner">
+    <domain domain_ref="grid_T_inner" name="grid_T" />
+    <scalar>
+      <extract_axis position="0" />
+    </scalar>
+  </grid>
 
   <grid id="grid_T_vsum">
     <domain domain_ref="grid_T"/>
@@ -191,6 +197,12 @@
       <reduce_axis operation="sum" />
     </scalar>
   </grid>
+  <grid id="grid_T_vsum_inner">
+    <domain domain_ref="grid_T_inner" name="grid_T"/>
+    <scalar>
+      <reduce_axis operation="sum" />
+    </scalar>
+  </grid>
 
   <grid id="grid_U_vsum">
     <domain domain_ref="grid_U"/>
@@ -232,6 +244,10 @@
     <domain domain_ref="grid_T" />
     <axis axis_ref="deptht300" />
   </grid>
+  <grid id="grid_T_zoom_300_inner">
+    <domain domain_ref="grid_T_inner" name="grid_T" />
+    <axis axis_ref="deptht300" />
+  </grid>
 
   <grid id="grid_U_scalar" >
     <domain domain_ref="grid_U" />
@@ -318,14 +334,14 @@
 
   <!-- ABL grid definition -->
   <grid id="grid_TA_2D">
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
   </grid>
   <grid id="grid_TA_3D">
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <axis  id="ght_abl" />
   </grid>
   <grid id="grid_WA_3D">
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <axis  id="ghw_abl" />
   </grid>
   <!--  -->
@@ -336,41 +352,44 @@
     <scalar />
   </grid>
   <grid id="diamlr_grid_T_2D" >
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <scalar />
   </grid>
+  <grid id="diamlr_grid_T_2D_inner" >
+    <domain domain_ref="grid_T_inner" name="grid_T" />
+  </grid>
   <grid id="diamlr_grid_U_2D" >
-    <domain domain_ref="grid_U" />
+    <domain domain_ref="grid_U_inner" name="grid_U" />
     <scalar />
   </grid>
   <grid id="diamlr_grid_V_2D" >
-    <domain domain_ref="grid_V" />
+    <domain domain_ref="grid_V_inner" name="grid_V" />
     <scalar />
   </grid>
   <grid id="diamlr_grid_W_2D" >
-    <domain domain_ref="grid_W" />
+    <domain domain_ref="grid_W_inner" name="grid_W" />
     <scalar />
   </grid>
   <grid id="diamlr_grid_2D_to_grid_T_3D" >
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <axis axis_ref="deptht">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diamlr_grid_2D_to_grid_U_3D" >
-    <domain domain_ref="grid_U" />
+    <domain domain_ref="grid_U_inner" name="grid_U" />
     <axis axis_ref="depthu">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diamlr_grid_2D_to_grid_V_3D" >
-    <domain domain_ref="grid_V" />
+    <domain domain_ref="grid_V_inner" name="grid_V" />
     <axis axis_ref="depthv">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diamlr_grid_2D_to_grid_W_3D" >
-    <domain domain_ref="grid_W" />
+    <domain domain_ref="grid_W_inner" name="grid_W" />
     <axis axis_ref="depthw">
       <duplicate_scalar />
     </axis>
@@ -383,37 +402,37 @@
   </grid>
   <!-- grid definitions for the computation of daily detided model diagnostics (diadetide) -->
   <grid id="diadetide_grid_T_2D" >
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <scalar />
   </grid>
   <grid id="diadetide_grid_U_2D" >
-    <domain domain_ref="grid_U" />
+    <domain domain_ref="grid_U_inner" name="grid_U" />
     <scalar />
   </grid>
   <grid id="diadetide_grid_V_2D" >
-    <domain domain_ref="grid_V" />
+    <domain domain_ref="grid_V_inner" name="grid_V" />
     <scalar />
   </grid>
   <grid id="diadetide_grid_2D_to_grid_T_3D" >
-    <domain domain_ref="grid_T" />
+    <domain domain_ref="grid_T_inner" name="grid_T" />
     <axis axis_ref="deptht">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diadetide_grid_2D_to_grid_U_3D" >
-    <domain domain_ref="grid_U" />
+    <domain domain_ref="grid_U_inner" name="grid_U" />
     <axis axis_ref="depthu">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diadetide_grid_2D_to_grid_V_3D" >
-    <domain domain_ref="grid_V" />
+    <domain domain_ref="grid_V_inner" name="grid_V" />
     <axis axis_ref="depthv">
       <duplicate_scalar />
     </axis>
   </grid>
   <grid id="diadetide_grid_2D_to_grid_W_3D" >
-    <domain domain_ref="grid_W" />
+    <domain domain_ref="grid_W_inner" name="grid_W" />
     <axis axis_ref="depthw">
       <duplicate_scalar />
     </axis>
diff --git a/cfgs/SHARED/namelist_ref b/cfgs/SHARED/namelist_ref
index 72affc4a..4e241a48 100644
--- a/cfgs/SHARED/namelist_ref
+++ b/cfgs/SHARED/namelist_ref
@@ -312,7 +312,7 @@
 &namsbc_abl    !   Atmospheric Boundary Layer formulation           (ln_abl = T)
 !-----------------------------------------------------------------------
    cn_dir           = './'      !  root directory for the location of the ABL grid file
-   cn_dom           = 'dom_cfg_abl.nc'
+   cn_dom           = 'dom_cfg_abl'
 
    cn_ablrst_in     = "restart_abl"   !  suffix of abl restart name (input)
    cn_ablrst_out    = "restart_abl"   !  suffix of abl restart name (output)
@@ -326,11 +326,11 @@
    nn_dyn_restore = 0         ! restoring option for dynamical ABL variables: = 0 no restoring
                               !                                               = 1 equatorial restoring
                               !                                               = 2 global restoring
-   rn_vfac       = 0.
-   rn_ldyn_min   =  4.5       ! dynamics nudging magnitude inside the ABL [hour] (~3 rn_Dt)
-   rn_ldyn_max   =  1.5       ! dynamics nudging magnitude above  the ABL [hour] (~1 rn_Dt)
-   rn_ltra_min   =  4.5       ! tracers  nudging magnitude inside the ABL [hour] (~3 rn_Dt)
-   rn_ltra_max   =  1.5       ! tracers  nudging magnitude above  the ABL [hour] (~1 rn_Dt)
+   rn_ldyn_min   =  0.        ! dynamics nudging magnitude inside the ABL [hour] (~3 rn_Dt)
+   rn_ldyn_max   =  0.        ! dynamics nudging magnitude above  the ABL [hour] (~1 rn_Dt)
+   rn_ltra_min   =  0.        ! tracers  nudging magnitude inside the ABL [hour] (~3 rn_Dt)
+   rn_ltra_max   =  0.        ! tracers  nudging magnitude above  the ABL [hour] (~1 rn_Dt)
+   rn_vfac       =  0.
    nn_amxl       =  0         ! mixing length: = 0 Deardorff 80 length-scale
                               !                = 1 length-scale based on the distance to the PBL height
                               !                = 2 Bougeault & Lacarrere 89 length-scale
@@ -370,7 +370,7 @@
 !***  receive  ***
    sn_rcv_w10m   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_taumod =   'coupled'              ,    'no'    ,     ''      ,         ''           ,   ''
-   sn_rcv_tau    =   'oce only'             ,    'no'    , 'cartesian' , 'eastward-northward' ,  'U,V'
+   sn_rcv_tau    =   'oce only'             ,    'no'    , 'cartesian' , 'eastward-northward' ,   ''
    sn_rcv_dqnsdt =   'coupled'              ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_qsr    =   'oce and ice'          ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_qns    =   'oce and ice'          ,    'no'    ,     ''      ,         ''           ,   ''
@@ -381,21 +381,22 @@
    sn_rcv_iceflx =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_mslp   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_ts_ice =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_qtrice =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_isf    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
    sn_rcv_icb    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
-   sn_rcv_hsig   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_phioc  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_sdrfx  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_sdrfy  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_wper   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_wnum   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_wstrf  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_wdrag  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_charn  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_taw    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'U,V'
-   sn_rcv_bhd    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_tusd   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
-   sn_rcv_tvsd   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   'T'
+   sn_rcv_hsig   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_phioc  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_sdrfx  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_sdrfy  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_wper   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_wnum   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_wstrf  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_wdrag  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_charn  =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_taw    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_bhd    =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_tusd   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
+   sn_rcv_tvsd   =   'none'                 ,    'no'    ,     ''      ,         ''           ,   ''
 /
 !-----------------------------------------------------------------------
 &namsbc_sas    !   Stand-Alone Surface module: ocean data               (SAS_SRC  only)
@@ -440,7 +441,7 @@
    !                       !  RGB & 2BD choices:
    rn_abs      =   0.58       !  RGB & 2BD: fraction absorbed in the very near surface
    rn_si0      =   0.35       !  RGB & 2BD: shortess depth of extinction
-   nn_chldta   =      0       !  RGB : Chl data (=1) or cst value (=0)
+   nn_chldta   =      0       !  RGB : 3D Chl data (=2), Surface Chl data (=1) or Cst value (=0)
    rn_si1      =   23.0       !  2BD : longest depth of extinction
 
    cn_dir      = './'      !  root directory for the chlorophyl data location
@@ -888,6 +889,9 @@
                                  !
    !                     ! S-EOS coefficients (ln_seos=T):
    !                             !  rd(T,S,Z)*rho0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS
+   !                             !    dT = T-rn_T0 ; dS = S-rn_S0
+   rn_T0       = 10.             !  reference temperature
+   rn_S0       = 35.             !  reference salinity
    rn_a0       =  1.6550e-1      !  thermal expension coefficient
    rn_b0       =  7.6554e-1      !  saline  expension coefficient
    rn_lambda1  =  5.9520e-2      !  cabbeling coeff in T^2  (=0 for linear eos)
@@ -1118,7 +1122,7 @@
    sn_sal      = 'dyna_grid_T'           ,       120.        , 'vosaline'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_mld      = 'dyna_grid_T'           ,       120.        , 'somixhgt'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_emp      = 'dyna_grid_T'           ,       120.        , 'sowaflup'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
-   sn_fmf      = 'dyna_grid_T'           ,       120.        , 'iowaflup'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
+   sn_fwf      = 'dyna_grid_T'           ,       120.        , 'iowaflup'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_ice      = 'dyna_grid_T'           ,       120.        , 'soicecov'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_qsr      = 'dyna_grid_T'           ,       120.        , 'soshfldo'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
    sn_wnd      = 'dyna_grid_T'           ,       120.        , 'sowindsp'  ,  .true.   , .true. , 'yearly'  , ''               , ''       , ''
@@ -1519,7 +1523,7 @@
    ln_nnogather =  .true.  !  activate code to avoid mpi_allgather use at the northfold
    jpni        =   0       !  number of processors following i (set automatically if < 1), see also ln_listonly = T
    jpnj        =   0       !  number of processors following j (set automatically if < 1), see also ln_listonly = T
-   nn_hls      =   1       !  halo width (applies to both rows and columns)
+   nn_hls      =   2       !  halo width (applies to both rows and columns)
    nn_comm     =   1       !  comm choice
 /
 !-----------------------------------------------------------------------
diff --git a/cfgs/SPITZ12/EXPREF/file_def_nemo-oce.xml b/cfgs/SPITZ12/EXPREF/file_def_nemo-oce.xml
index aa6deff5..ee098229 100644
--- a/cfgs/SPITZ12/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/SPITZ12/EXPREF/file_def_nemo-oce.xml
@@ -34,6 +34,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -44,7 +46,6 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
           <field field_ref="uocetr_eff"   name="uocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="u_masstr"     name="vozomatr" />
@@ -56,7 +57,6 @@
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
           <field field_ref="vocetr_eff"   name="vocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="v_masstr"     name="vomematr" />
diff --git a/cfgs/WED025/EXPREF/file_def_nemo-oce.xml b/cfgs/WED025/EXPREF/file_def_nemo-oce.xml
index 8d9d89e5..d08f13e1 100644
--- a/cfgs/WED025/EXPREF/file_def_nemo-oce.xml
+++ b/cfgs/WED025/EXPREF/file_def_nemo-oce.xml
@@ -31,6 +31,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <field field_ref="snowpre"                      />
@@ -67,14 +69,12 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
 	</file>
 	
 	<file id="file13" name_suffix="_grid_V" description="ocean V grid variables" >
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
 	</file>
 	
 	<file id="file14" name_suffix="_grid_W" description="ocean W grid variables" >
diff --git a/cfgs/WED025/cpp_WED025.fcm b/cfgs/WED025/cpp_WED025.fcm
index 43fb50e4..d3199f14 100644
--- a/cfgs/WED025/cpp_WED025.fcm
+++ b/cfgs/WED025/cpp_WED025.fcm
@@ -1 +1 @@
- bld::tool::fppkeys key_xios key_si3 key_qco key_isf
+ bld::tool::fppkeys key_xios key_si3 key_qco key_vco_1d3d key_isf
diff --git a/mk/Flist_cfgs.sh b/mk/Flist_cfgs.sh
index 8a19b67d..34c8b36c 100755
--- a/mk/Flist_cfgs.sh
+++ b/mk/Flist_cfgs.sh
@@ -8,9 +8,6 @@ echo -e "\n  ¤ Demonstrations cases (see https://github.com/sflavoni/NEMO-test-
 cat ${MAIN_DIR}/tests/demo_cfgs.txt \
 | awk '{printf "%-20s", $1}{$1 = ""; printf "%s\n", $0}'
 
-echo -e "\n  ¤ Full scripted remote configurations (CPP file + EXP00 inputs + MY_SRC + ...)"
-cat ${MAIN_DIR}/tests/rmt_cfgs.txt
-
 echo -e "\n  ¤ Available sub-components ('OCE' is mandatory in any set)"
 ls  ${MAIN_DIR}/src | awk -F/ '{ print $NF }' | column
 
diff --git a/sette/BATCH_TEMPLATE/batch-X64_AA_INTEL_OMPI b/sette/BATCH_TEMPLATE/batch-X64_AA_INTEL_OMPI
index bdd075c6..3eca6d7c 100644
--- a/sette/BATCH_TEMPLATE/batch-X64_AA_INTEL_OMPI
+++ b/sette/BATCH_TEMPLATE/batch-X64_AA_INTEL_OMPI
@@ -98,7 +98,7 @@ EOF
 #
 # Run SPMD case
 #
-    time ./nemo
+    $MPIRUN --ntasks=TOTAL_NPROCS ./nemo
   fi
 #
 
diff --git a/sette/BATCH_TEMPLATE/batch-X64_IRENE_GCC b/sette/BATCH_TEMPLATE/batch-X64_IRENE_GCC
index bc2856cf..e8259541 100644
--- a/sette/BATCH_TEMPLATE/batch-X64_IRENE_GCC
+++ b/sette/BATCH_TEMPLATE/batch-X64_IRENE_GCC
@@ -1,5 +1,5 @@
 #!/bin/bash
-#MSUB -T 2000                # elapsed time limit in seconds   (60 minutes)
+#MSUB -T 3600                # elapsed time limit in seconds   (60 minutes)
 #MSUB -r SETTE_JOB           # Job name
 #MSUB -o sette.jobid_%I.txt  # standard output
 #MSUB -e sette.jobid_%I.txt  # standard error
@@ -21,9 +21,9 @@
   module purge
   module load gnu/8.3.0
   module load flavor/buildcompiler/gcc/8
-  module load flavor/buildmpi/openmpi/2.0
+  module load flavor/buildmpi/openmpi/4.0
   module load flavor/hdf5/parallel
-  module load mpi/openmpi/2.0.4
+  module load mpi/openmpi/4.0.5.3
   module load hdf5/1.8.20
   module load netcdf-c/4.6.0
   module load netcdf-fortran/4.4.4
diff --git a/sette/BATCH_TEMPLATE/batch-X64_JEANZAY b/sette/BATCH_TEMPLATE/batch-X64_JEANZAY
index e7af8cea..cafaff21 100644
--- a/sette/BATCH_TEMPLATE/batch-X64_JEANZAY
+++ b/sette/BATCH_TEMPLATE/batch-X64_JEANZAY
@@ -2,6 +2,7 @@
 #SBATCH -A GROUP_IDRIS@cpu
 #SBATCH --job-name=SETTE_JOB      # nom du job
 #SBATCH --partition=cpu_p1        # Nom de la partition d'exécution
+#SBATCH --qos=qos_cpu-dev           # quality of service
 #SBATCH --ntasks=NPROCS                # Nombre total de processus MPI
 #SBATCH --ntasks-per-node=40       # Nombre de processus MPI par noeud
 # /!\ Attention, la ligne suivante est trompeuse mais dans le vocabulaire
diff --git a/sette/BATCH_TEMPLATE/batch-X64_JEANZAY_GCC b/sette/BATCH_TEMPLATE/batch-X64_JEANZAY_GCC
new file mode 100644
index 00000000..68a5a334
--- /dev/null
+++ b/sette/BATCH_TEMPLATE/batch-X64_JEANZAY_GCC
@@ -0,0 +1,93 @@
+#!/bin/bash
+#SBATCH -A GROUP_IDRIS@cpu
+#SBATCH --job-name=SETTE_JOB      # nom du job
+#SBATCH --partition=cpu_p1        # Nom de la partition d'exécution
+#SBATCH --qos=qos_cpu-dev           # quality of service
+#SBATCH --ntasks=NPROCS                # Nombre total de processus MPI
+#SBATCH --ntasks-per-node=40       # Nombre de processus MPI par noeud
+# /!\ Attention, la ligne suivante est trompeuse mais dans le vocabulaire
+# de Slurm "multithread" fait bien référence à l'hyperthreading.
+#SBATCH --hint=nomultithread       # 1 processus MPI par coeur physique (pas d'hyperthreading)
+#SBATCH --time=00:59:00            # Temps d’exécution maximum demande (HH:MM:SS)
+#SBATCH --output=sette.jobid_%j.out  # Nom du fichier de sortie
+#SBATCH --error=sette.jobid_%j.out   # Nom du fichier d'erreur (ici commun avec la sortie)
+##########################################################################
+#
+# Test specific settings. Do not hand edit these lines; the fcm_job.sh script will set these
+# (via sed operating on this template job file). 
+#
+
+module purge
+module load gcc/8.3.1
+module load openmpi/4.1.1
+module load hdf5/1.12.0-mpi
+module load netcdf-c/4.7.4-mpi
+module load netcdf-fortran/4.5.3-mpi
+module load subversion/1.9.7
+module load git/2.31.1
+
+export SETTE_COMPILER=X64_JEANZAY_GCC
+
+#
+  OCEANCORES=NPROCS
+  export SETTE_DIR=DEF_SETTE_DIR
+#
+# set up mpp computing environment
+#
+# Local settings for machine BULL (TITANE at CCRT France)
+#
+export MPIRUN="srun "
+
+#
+# load sette functions (only post_test_tidyup needed)
+#
+  . ${SETTE_DIR}/all_functions.sh
+#
+
+# modules to load
+
+# Don't remove neither change the following line
+# BODY
+
+#
+# These variables are needed by post_test_tidyup function in all_functions.sh
+#
+  export EXE_DIR=DEF_EXE_DIR
+  export INPUT_DIR=DEF_INPUT_DIR
+  export CONFIG_DIR=DEF_CONFIG_DIR
+  export TOOLS_DIR=DEF_TOOLS_DIR
+  export NEMO_VALIDATION_DIR=DEF_NEMO_VALIDATION
+  export NEW_CONF=DEF_NEW_CONF
+  export CMP_NAM=DEF_CMP_NAM
+  export TEST_NAME=DEF_TEST_NAME
+#
+# end of set up
+###############################################################
+#
+# change to the working directory 
+#
+cd ${EXE_DIR}
+
+  echo Running on host `hostname`
+  echo Time is `date`
+  echo Directory is `pwd`
+# 
+#  Run the parallel MPI executable 
+#
+  echo "Running time ${MPIRUN} ./nemo"
+#
+  if [ MPI_FLAG == "yes" ]; then
+     time ${MPIRUN} ./nemo
+  else
+     time ./nemo
+  fi
+
+#
+  post_test_tidyup
+
+# END_BODY
+# Don't remove neither change the previous line
+
+
+  exit
+
diff --git a/sette/sette.sh b/sette/sette.sh
index 9de659ab..9aa98eb8 100755
--- a/sette/sette.sh
+++ b/sette/sette.sh
@@ -40,10 +40,10 @@ export USER_INPUT='yes'        # Default: yes => request user input on decisions
 #
 # Check that git branch is usable
 export DETACHED_HEAD="no"
-git branch --show-current >& /dev/null
+git -C ${MAIN_DIR} branch --show-current >& /dev/null
 if [[ $? == 0 ]] ; then
   # subdirectory below NEMO_VALIDATION_DIR defaults to branchname
-  export SETTE_SUB_VAL="$(git branch --show-current)"
+  export SETTE_SUB_VAL="$(git -C ${MAIN_DIR} branch --show-current)"
   if [ -z $SETTE_SUB_VAL ] ; then
    # Probabably on a detached HEAD (possibly testing an old commit).
    # Verify this and try to recover original commit
@@ -76,6 +76,7 @@ if [ $# -gt 0 ]; then
         y) dry_run=1
            echo "";;
         b) NEMO_DEBUG="-b"
+           echo "-b: Nemo will be compiled with DEBUG options"
            echo "";;
         r) NO_REPORT=1
            echo "";;
diff --git a/sette/sette_reference-configurations.sh b/sette/sette_reference-configurations.sh
index 6fdae259..88536464 100755
--- a/sette/sette_reference-configurations.sh
+++ b/sette/sette_reference-configurations.sh
@@ -1608,7 +1608,7 @@ fi
 
 if [ ${config} == "WED025" ] && [ ${DO_REPRO} == "1" ] ;  then
 ## Reproducibility tests
-    export TEST_NAME="REPRO_5_6"
+    export TEST_NAME="REPRO_6_7"
     cd ${MAIN_DIR}
     cd ${SETTE_DIR}
     . ./prepare_exe_dir.sh
@@ -1618,7 +1618,7 @@ if [ ${config} == "WED025" ] && [ ${DO_REPRO} == "1" ] ;  then
     NPROC=32
     if [ -f ${JOB_FILE} ] ; then \rm ${JOB_FILE} ; fi
     cd ${EXE_DIR}
-    set_namelist namelist_cfg cn_exp \"WED025_56\"
+    set_namelist namelist_cfg cn_exp \"WED025_67\"
     set_namelist namelist_cfg nn_it000 1
     set_namelist namelist_cfg nn_itend ${ITEND}
     set_namelist namelist_cfg nn_date0 20000115
diff --git a/src/ABL/abl.F90 b/src/ABL/abl.F90
index ccffa088..c89f0c1b 100644
--- a/src/ABL/abl.F90
+++ b/src/ABL/abl.F90
@@ -41,6 +41,8 @@ MODULE abl
    !
    INTEGER , PUBLIC :: nt_n, nt_a       !: now / after indices (equal 1 or 2)
    ! 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OPA 4.0 , NEMO Consortium (2011)
    !! $Id: abl.F90 4990 2014-12-15 16:42:49Z timgraham $ 
@@ -55,18 +57,18 @@ CONTAINS
       INTEGER :: ierr
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( u_abl   (1:jpi,1:jpj,1:jpka,jptime     ), &
-         &      v_abl   (1:jpi,1:jpj,1:jpka,jptime     ), &
-         &      tq_abl  (1:jpi,1:jpj,1:jpka,jptime,jptq), &
-         &      tke_abl (1:jpi,1:jpj,1:jpka,jptime     ), &
-         &      avm_abl (1:jpi,1:jpj,1:jpka            ), &
-         &      avt_abl (1:jpi,1:jpj,1:jpka            ), &
-         &      mxld_abl(1:jpi,1:jpj,1:jpka            ), &
-         &      mxlm_abl(1:jpi,1:jpj,1:jpka            ), &
-         &      fft_abl (1:jpi,1:jpj                   ), &
-         &      pblh    (1:jpi,1:jpj                   ), &
-         &      msk_abl (1:jpi,1:jpj                   ), &
-         &      rest_eq (1:jpi,1:jpj                   ), &
+      ALLOCATE( u_abl   (A2D(0),1:jpka,jptime     ), &
+         &      v_abl   (A2D(0),1:jpka,jptime     ), &
+         &      tq_abl  (A2D(0),1:jpka,jptime,jptq), &
+         &      tke_abl (A2D(0),1:jpka,jptime     ), &
+         &      avm_abl (A2D(0),1:jpka            ), &
+         &      avt_abl (A2D(0),1:jpka            ), &
+         &      mxld_abl(A2D(0),1:jpka            ), &
+         &      mxlm_abl(A2D(0),1:jpka            ), &
+         &      fft_abl (A2D(0)                   ), &
+         &      pblh    (A2D(1)                   ), &   ! needed for optional smoothing
+         &      msk_abl (A2D(0)                   ), &
+         &      rest_eq (A2D(0)                   ), &
          &      e3t_abl (1:jpka), e3w_abl(1:jpka)       , &
          &      ght_abl (1:jpka), ghw_abl(1:jpka)       , STAT=ierr )
          !
diff --git a/src/ABL/ablmod.F90 b/src/ABL/ablmod.F90
index b5b66b8a..d14691e4 100644
--- a/src/ABL/ablmod.F90
+++ b/src/ABL/ablmod.F90
@@ -67,54 +67,50 @@ CONTAINS
       !!              - Finalize flux computation in psen, pevp, pwndm, ptaui, ptauj, ptaum
       !!
       !!----------------------------------------------------------------------
-      INTEGER  , INTENT(in   )                   ::   kt         ! time step index
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   psst       ! sea-surface temperature [Celsius]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssu       ! sea-surface u (U-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssv       ! sea-surface v (V-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssq       ! sea-surface humidity
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pu_dta     ! large-scale windi
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pv_dta     ! large-scale windj
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pgu_dta    ! large-scale hpgi
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pgv_dta    ! large-scale hpgj
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pt_dta     ! large-scale pot. temp.
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:,:) ::   pq_dta     ! large-scale humidity
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pslp_dta   ! sea-level pressure
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pcd_du     ! Cd x Du (T-point)
-      REAL(wp) , INTENT(inout), DIMENSION(:,:  ) ::   psen       ! Ch x Du
-      REAL(wp) , INTENT(inout), DIMENSION(:,:  ) ::   pevp       ! Ce x Du
-      REAL(wp) , INTENT(inout), DIMENSION(:,:  ) ::   pwndm      ! ||uwnd - uoce||
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   plat       ! latent heat flux
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   ptaui      ! taux
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   ptauj      ! tauy
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   ptaum      ! ||tau||
-      !
+
+      INTEGER  , INTENT(in   )                           ::   kt         ! time step index
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   psst       ! sea-surface temperature [Celsius]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(nn_hls))   ::   pssu       ! sea-surface u (U-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(nn_hls))   ::   pssv       ! sea-surface v (V-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pssq       ! sea-surface humidity
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pu_dta     ! large-scale windi
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pv_dta     ! large-scale windj
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pgu_dta    ! large-scale hpgi
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pgv_dta    ! large-scale hpgj
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pt_dta     ! large-scale pot. temp.
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0),1:jpka) ::   pq_dta     ! large-scale humidity
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pslp_dta   ! sea-level pressure
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pcd_du     ! Cd x Du (T-point)
+      REAL(wp) , INTENT(inout), DIMENSION(A2D(0))        ::   psen       ! Ch x Du
+      REAL(wp) , INTENT(inout), DIMENSION(A2D(0))        ::   pevp       ! Ce x Du
+      REAL(wp) , INTENT(inout), DIMENSION(A2D(0))        ::   pwndm      ! ||uwnd - uoce||
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0))        ::   plat       ! latent heat flux
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(nn_hls))   ::   ptaui      ! taux
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(nn_hls))   ::   ptauj      ! tauy
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0))        ::   ptaum      ! ||tau||
 #if defined key_si3
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   ptm_su       ! ice-surface temperature [K]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssu_ice     ! ice-surface u (U-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssv_ice     ! ice-surface v (V-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pssq_ice     ! ice-surface humidity
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pcd_du_ice   ! Cd x Du over ice (T-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   psen_ice     ! Ch x Du over ice (T-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pevp_ice     ! Ce x Du over ice (T-point)
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pwndm_ice    ! ||uwnd - uice||
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pfrac_oce    ! ocean fraction
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   ptaui_ice    ! ice-surface taux stress (U-point)
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ) ::   ptauj_ice    ! ice-surface tauy stress (V-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   ptm_su     ! ice-surface temperature [K]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(nn_hls))   ::   pssu_ice   ! ice-surface u (U-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(nn_hls))   ::   pssv_ice   ! ice-surface v (V-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pssq_ice   ! ice-surface humidity
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pcd_du_ice ! Cd x Du over ice (T-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   psen_ice   ! Ch x Du over ice (T-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pevp_ice   ! Ce x Du over ice (T-point)
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pwndm_ice  ! ||uwnd - uice||
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0))        ::   pfrac_oce  ! ocean fraction
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(nn_hls))   ::   ptaui_ice  ! ice-surface taux stress (T-point)
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(nn_hls))   ::   ptauj_ice  ! ice-surface tauy stress (T-point)
 #endif
       !
-      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   zwnd_i, zwnd_j
-      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   zsspt
-      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   ztabs, zpre
-      REAL(wp), DIMENSION(1:jpi      ,2:jpka)    ::   zCF
+      REAL(wp), DIMENSION(A2D(0))         ::   zwnd_i, zwnd_j
+      REAL(wp), DIMENSION(A2D(0))         ::   zsspt, ztabs, zpre
+      REAL(wp), DIMENSION(A1Di(0),2:jpka) ::   zCF
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   z_elem_a, z_elem_b, z_elem_c
       !
-      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_a
-      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_b
-      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_c
-      !
-      INTEGER             ::   ji, jj, jk, jtra, jbak               ! dummy loop indices
-      REAL(wp)            ::   zztmp, zcff, ztemp, zhumi, zcff1, zztmp1, zztmp2
-      REAL(wp)            ::   zcff2, zfcor, zmsk, zsig, zcffu, zcffv, zzice,zzoce
-      LOGICAL             ::   SemiImp_Cor = .TRUE.
+      INTEGER  ::   ji, jj, jk, jtra, jbak               ! dummy loop indices
+      REAL(wp) ::   zztmp, zcff, ztemp, zhumi, zcff1, zztmp1, zztmp2
+      REAL(wp) ::   zcff2, zfcor, zmsk, zsig, zcffu, zcffv, zzice,zzoce
+      LOGICAL  ::   SemiImp_Cor = .TRUE.
       !
       !!---------------------------------------------------------------------
       !
@@ -124,12 +120,12 @@ CONTAINS
          WRITE(numout,*) '~~~~~~'
       ENDIF
       !
-      IF( kt == nit000 ) ALLOCATE ( ustar2( 1:jpi, 1:jpj ) )
-      IF( kt == nit000 ) ALLOCATE ( zrough( 1:jpi, 1:jpj ) )
+      IF( kt == nit000 ) ALLOCATE ( ustar2( A2D(0) ) )
+      IF( kt == nit000 ) ALLOCATE ( zrough( A2D(0) ) )
       !! Compute ustar squared as Cd || Uatm-Uoce ||^2
       !! needed for surface boundary condition of TKE
       !! pwndm contains | U10m - U_oce | (see blk_oce_1 in sbcblk)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zzoce         = pCd_du    (ji,jj) * pwndm    (ji,jj)
 #if defined key_si3
          zzice         = pCd_du_ice(ji,jj) * pwndm_ice(ji,jj)
@@ -137,39 +133,40 @@ CONTAINS
 #else
          ustar2(ji,jj) = zzoce
 #endif
-         !#LB: sorry Cdn_oce is gone:
-         !zrough(ji,jj) = ght_abl(2) * EXP( - vkarmn / SQRT( MAX( Cdn_oce(ji,jj), 1.e-4 ) ) ) !<-- recover the value of z0 from Cdn_oce
+         zsspt(ji,jj) = theta_exner( psst(ji,jj)+rt0, pslp_dta(ji,jj) )   ! potential SST [K]
       END_2D
 
+      !#LB: sorry Cdn_oce is gone:
+      !zrough(:,:) = ght_abl(2) * EXP( - vkarmn / SQRT( MAX( Cdn_oce(:,:), 1.e-4 ) ) ) !<-- recover the value of z0 from Cdn_oce
       zrough(:,:) = z0_from_Cd( ght_abl(2), pCd_du(:,:) / MAX( pwndm(:,:), 0.5_wp ) ) ! #LB: z0_from_Cd is define in sbc_phy.F90...
 
       ! sea surface potential temperature [K]
-      zsspt(:,:) = theta_exner( psst(:,:)+rt0, pslp_dta(:,:) )
+      !zsspt(:,:) = theta_exner( psst(A2D(0))+rt0, pslp_dta(:,:) )
+
 
-      !
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !                            !  1 *** Advance TKE to time n+1 and compute Avm_abl, Avt_abl, PBLh
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
-      CALL abl_zdf_tke( )                       !--> Avm_abl, Avt_abl, pblh defined on (1,jpi) x (1,jpj)
+      CALL abl_zdf_tke( )                       !--> Avm_abl, Avt_abl, pblh defined on (A1Di(0)) x (A1Dj(0))
 
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !                            !  2 *** Advance tracers to time n+1
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
       !-------------
-      DO jj = 1, jpj    ! outer loop             !--> tq_abl computed on (1:jpi) x (1:jpj)
+      DO_1Dj(0,0)   ! outer loop                !--> tq_abl computed on (A1Di(0)) x (A1Dj(0))
       !-------------
          ! Compute matrix elements for interior points
          DO jk = 3, jpkam1
-            DO ji = 1, jpi   ! vector opt.
+            DO_1Di(0,0)
                z_elem_a( ji, jk ) = - rDt_abl * Avt_abl( ji, jj, jk-1 ) / e3w_abl( jk-1 )   ! lower-diagonal
                z_elem_c( ji, jk ) = - rDt_abl * Avt_abl( ji, jj, jk   ) / e3w_abl( jk   )   ! upper-diagonal
                z_elem_b( ji, jk ) = e3t_abl(jk) - z_elem_a( ji, jk ) - z_elem_c( ji, jk )   !       diagonal
-            END DO
+            END_1D
          END DO
          ! Boundary conditions
-         DO ji = 1, jpi   ! vector opt.
+         DO_1Di(0,0)
             ! Neumann at the bottom
             z_elem_a( ji,    2 ) = 0._wp
             z_elem_c( ji,    2 ) = - rDt_abl * Avt_abl( ji, jj,    2 ) / e3w_abl(    2 )
@@ -177,19 +174,18 @@ CONTAINS
             z_elem_a( ji, jpka ) = - rDt_abl * Avt_abl( ji, jj, jpka ) / e3w_abl( jpka )
             z_elem_c( ji, jpka ) = 0._wp
             z_elem_b( ji, jpka ) = e3t_abl( jpka ) - z_elem_a( ji, jpka )
-         END DO
+         END_1D
 
          DO jtra = 1,jptq  ! loop on active tracers
 
             DO jk = 3, jpkam1
-               !DO ji = 2, jpim1
-               DO ji = 1,jpi  !!GS: to be checked if needed
+               DO_1Di(0,0)
                   tq_abl( ji, jj, jk, nt_a, jtra ) = e3t_abl(jk) * tq_abl( ji, jj, jk, nt_n, jtra )   ! initialize right-hand-side
-               END DO
+               END_1D
             END DO
 
             IF(jtra == jp_ta) THEN
-               DO ji = 1,jpi  ! surface boundary condition for temperature
+               DO_1Di(0,0)   ! surface boundary condition for temperature
                   zztmp1 = psen(ji, jj)
                   zztmp2 = psen(ji, jj) * zsspt(ji, jj)
 #if defined key_si3
@@ -199,9 +195,9 @@ CONTAINS
                   z_elem_b( ji,        2             ) = e3t_abl(    2 ) - z_elem_c( ji,        2             ) + rDt_abl * zztmp1
                   tq_abl  ( ji, jj,    2, nt_a, jtra ) = e3t_abl(    2 ) * tq_abl  ( ji, jj,    2, nt_n, jtra ) + rDt_abl * zztmp2
                   tq_abl  ( ji, jj, jpka, nt_a, jtra ) = e3t_abl( jpka ) * tq_abl  ( ji, jj, jpka, nt_n, jtra )
-               END DO
+               END_1D
             ELSE ! jp_qa
-               DO ji = 1,jpi  ! surface boundary condition for humidity
+               DO_1Di(0,0)   ! surface boundary condition for humidity
                   zztmp1 = pevp(ji, jj)
                   zztmp2 = pevp(ji, jj) * pssq(ji, jj)
 #if defined key_si3
@@ -211,31 +207,31 @@ CONTAINS
                   z_elem_b( ji,     2                ) = e3t_abl(    2 ) - z_elem_c( ji,        2             ) + rDt_abl * zztmp1
                   tq_abl  ( ji, jj, 2   , nt_a, jtra ) = e3t_abl(    2 ) * tq_abl  ( ji, jj,    2, nt_n, jtra ) + rDt_abl * zztmp2
                   tq_abl  ( ji, jj, jpka, nt_a, jtra ) = e3t_abl( jpka ) * tq_abl  ( ji, jj, jpka, nt_n, jtra )
-               END DO
+               END_1D
             END IF
             !!
             !! Matrix inversion
             !! ----------------------------------------------------------
-            DO ji = 1,jpi
+            DO_1Di(0,0)
                zcff                            =  1._wp / z_elem_b( ji, 2 )
                zCF   ( ji,     2             ) = - zcff * z_elem_c( ji, 2 )
                tq_abl( ji, jj, 2, nt_a, jtra ) =   zcff * tq_abl( ji, jj, 2, nt_a, jtra )
-            END DO
+            END_1D
 
             DO jk = 3, jpka
-               DO ji = 1,jpi
+               DO_1Di(0,0)
                   zcff = 1._wp / ( z_elem_b( ji, jk ) + z_elem_a( ji, jk ) * zCF( ji, jk-1 ) )
                   zCF(ji,jk) = - zcff * z_elem_c( ji, jk )
                   tq_abl(ji,jj,jk,nt_a,jtra) = zcff * ( tq_abl(ji,jj,jk  ,nt_a,jtra)   &
                      &           - z_elem_a(ji, jk) *   tq_abl(ji,jj,jk-1,nt_a,jtra) )
-               END DO
+               END_1D
             END DO
             !!FL at this point we could check positivity of tq_abl(:,:,:,nt_a,jp_qa) ... test to do ...
             DO jk = jpkam1,2,-1
-               DO ji = 1,jpi
+               DO_1Di(0,0)
                   tq_abl(ji,jj,jk,nt_a,jtra) = tq_abl(ji,jj,jk,nt_a,jtra) +    &
                      &                        zCF(ji,jk) * tq_abl(ji,jj,jk+1,nt_a,jtra)
-               END DO
+               END_1D
             END DO
 
          END DO   !<-- loop on tracers
@@ -254,7 +250,7 @@ CONTAINS
          !-------------
             !
             ! Advance u_abl & v_abl to time n+1
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zcff = ( fft_abl(ji,jj) * rDt_abl )*( fft_abl(ji,jj) * rDt_abl )  ! (f dt)**2
 
                u_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *(                                          &
@@ -269,13 +265,13 @@ CONTAINS
             END_2D
             !
          !-------------
-         END DO             ! end outer loop  !<-- u_abl and v_abl are properly updated on (1:jpi) x (1:jpj)
+         END DO             ! end outer loop  !<-- u_abl and v_abl are properly updated on (A1Di(0)) x (A1Dj(0))
          !-------------
          !
          IF( ln_geos_winds ) THEN
-            DO jj = 1, jpj    ! outer loop
+            DO_1Dj( 0, 0 )   ! outer loop
                DO jk = 1, jpka
-                  DO ji = 1, jpi
+                  DO_1Di( 0, 0 )
                      u_abl( ji, jj, jk, nt_a ) = u_abl( ji, jj, jk, nt_a )   &
                         &                      - rDt_abl * e3t_abl(jk) * fft_abl(ji  , jj) * pgv_dta(ji  ,jj  ,jk)
                      v_abl( ji, jj, jk, nt_a ) = v_abl( ji, jj, jk, nt_a )   &
@@ -286,14 +282,14 @@ CONTAINS
          END IF
          !
          IF( ln_hpgls_frc ) THEN
-            DO jj = 1, jpj    ! outer loop
+            DO_1Dj( 0, 0 )    ! outer loop
                DO jk = 1, jpka
-                  DO ji = 1, jpi
+                  DO_1Di( 0, 0 )
                      u_abl( ji, jj, jk, nt_a ) = u_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * pgu_dta(ji,jj,jk)
                      v_abl( ji, jj, jk, nt_a ) = v_abl( ji, jj, jk, nt_a ) - rDt_abl * e3t_abl(jk) * pgv_dta(ji,jj,jk)
-                  ENDDO
+                  END_1D
                ENDDO
-            ENDDO
+            END_1D
          END IF
 
       ELSE ! SemiImp_Cor = .FALSE.
@@ -306,29 +302,25 @@ CONTAINS
                !
                IF( MOD( kt, 2 ) == 0 ) then
                   ! Advance u_abl & v_abl to time n+1
-                  DO jj = 1, jpj
-                     DO ji = 1, jpi
-                        zcff = fft_abl(ji,jj) * ( v_abl ( ji , jj  , jk, nt_n ) - pgv_dta(ji  ,jj  ,jk)  )
-                        u_abl( ji, jj, jk, nt_a ) =                u_abl( ji, jj, jk, nt_n ) + rDt_abl * zcff
-                        zcff = fft_abl(ji,jj) * ( u_abl ( ji , jj  , jk, nt_a ) - pgu_dta(ji  ,jj  ,jk)  )
-                        v_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *( v_abl( ji, jj, jk, nt_n ) - rDt_abl * zcff )
-                        u_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *  u_abl( ji, jj, jk, nt_a )
-                     END DO
-                  END DO
+                  DO_2D( 0, 0, 0, 0 )
+                     zcff = fft_abl(ji,jj) * ( v_abl ( ji , jj  , jk, nt_n ) - pgv_dta(ji  ,jj  ,jk)  )
+                     u_abl( ji, jj, jk, nt_a ) =                u_abl( ji, jj, jk, nt_n ) + rDt_abl * zcff
+                     zcff = fft_abl(ji,jj) * ( u_abl ( ji , jj  , jk, nt_a ) - pgu_dta(ji  ,jj  ,jk)  )
+                     v_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *( v_abl( ji, jj, jk, nt_n ) - rDt_abl * zcff )
+                     u_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *  u_abl( ji, jj, jk, nt_a )
+                  END_2D
                ELSE
-                  DO jj = 1, jpj
-                     DO ji = 1, jpi
-                        zcff = fft_abl(ji,jj) * ( u_abl ( ji , jj  , jk, nt_n ) - pgu_dta(ji  ,jj  ,jk)  )
-                        v_abl( ji, jj, jk, nt_a ) =                v_abl( ji, jj, jk, nt_n ) - rDt_abl * zcff
-                        zcff = fft_abl(ji,jj) * ( v_abl ( ji , jj  , jk, nt_a ) - pgv_dta(ji  ,jj  ,jk)  )
-                        u_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *( u_abl( ji, jj, jk, nt_n ) + rDt_abl * zcff )
-                        v_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *  v_abl( ji, jj, jk, nt_a )
-                     END DO
-                  END DO
+                  DO_2D( 0, 0, 0, 0 )
+                     zcff = fft_abl(ji,jj) * ( u_abl ( ji , jj  , jk, nt_n ) - pgu_dta(ji  ,jj  ,jk)  )
+                     v_abl( ji, jj, jk, nt_a ) =                v_abl( ji, jj, jk, nt_n ) - rDt_abl * zcff
+                     zcff = fft_abl(ji,jj) * ( v_abl ( ji , jj  , jk, nt_a ) - pgv_dta(ji  ,jj  ,jk)  )
+                     u_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *( u_abl( ji, jj, jk, nt_n ) + rDt_abl * zcff )
+                     v_abl( ji, jj, jk, nt_a ) = e3t_abl(jk) *  v_abl( ji, jj, jk, nt_a )
+                  END_2D
                END IF
                !
             !-------------
-            END DO             ! end outer loop  !<-- u_abl and v_abl are properly updated on (1:jpi) x (1:jpj)
+            END DO             ! end outer loop  !<-- u_abl and v_abl are properly updated on (A1Di(0)) x (A1Dj(0))
             !-------------
 
          ENDIF ! ln_geos_winds
@@ -340,18 +332,19 @@ CONTAINS
       !
       !  Vertical diffusion for u_abl
       !-------------
-      DO jj = 1, jpj    ! outer loop
+      DO_1Dj(0,0)   ! outer loop
       !-------------
 
          DO jk = 3, jpkam1
-            DO ji = 1, jpi
+            DO_1Di(0,0)
                z_elem_a( ji, jk ) = - rDt_abl * Avm_abl( ji, jj, jk-1 ) / e3w_abl( jk-1 )   ! lower-diagonal
                z_elem_c( ji, jk ) = - rDt_abl * Avm_abl( ji, jj, jk   ) / e3w_abl( jk   )   ! upper-diagonal
                z_elem_b( ji, jk ) = e3t_abl(jk) - z_elem_a( ji, jk ) - z_elem_c( ji, jk )   !       diagonal
-            END DO
+            END_1D
          END DO
 
-         DO ji = 2, jpi   ! boundary conditions (Avm_abl and pcd_du must be available at ji=jpi)
+         DO_1Di(0,0)   ! boundary conditions
+
             !++ Surface boundary condition
             z_elem_a( ji, 2 ) = 0._wp
             z_elem_c( ji, 2 ) = - rDt_abl * Avm_abl( ji, jj, 2 ) / e3w_abl( 2 )
@@ -381,29 +374,29 @@ CONTAINS
                u_abl   ( ji, jj, jpka, nt_a ) = e3t_abl( jpka ) * pu_dta(ji,jj,jk)
             !ENDIF
 
-         END DO
+         END_1D
          !!
          !! Matrix inversion
          !! ----------------------------------------------------------
-         DO ji = 1, jpi  !DO ji = 2, jpi !!GS: TBI
+         DO_1Di(0,0)
             zcff                 =   1._wp / z_elem_b( ji, 2 )
             zCF   (ji,   2     ) =  - zcff * z_elem_c( ji,     2       )
             u_abl (ji,jj,2,nt_a) =    zcff * u_abl   ( ji, jj, 2, nt_a )
-         END DO
+         END_1D
 
          DO jk = 3, jpka
-            DO ji = 2, jpi
+            DO_1Di(0,0)
                zcff = 1._wp / ( z_elem_b( ji, jk ) + z_elem_a( ji, jk ) * zCF   (ji, jk-1 ) )
                zCF(ji,jk) = - zcff * z_elem_c( ji, jk )
                u_abl(ji,jj,jk,nt_a) = zcff * ( u_abl(ji,jj,jk  ,nt_a)   &
                &          - z_elem_a(ji, jk) * u_abl(ji,jj,jk-1,nt_a) )
-            END DO
+            END_1D
          END DO
 
          DO jk = jpkam1,2,-1
-            DO ji = 2, jpi
+            DO_1Di(0,0)
                u_abl(ji,jj,jk,nt_a) = u_abl(ji,jj,jk,nt_a) + zCF(ji,jk) * u_abl(ji,jj,jk+1,nt_a)
-            END DO
+            END_1D
          END DO
 
       !-------------
@@ -413,18 +406,19 @@ CONTAINS
       !
       !  Vertical diffusion for v_abl
       !-------------
-      DO jj = 2, jpj   ! outer loop
+      DO_1Dj(0,0)   ! outer loop
       !-------------
          !
          DO jk = 3, jpkam1
-            DO ji = 1, jpi
+            DO_1Di(0,0)
                z_elem_a( ji, jk ) = - rDt_abl * Avm_abl( ji, jj, jk-1 ) / e3w_abl( jk-1 )   ! lower-diagonal
                z_elem_c( ji, jk ) = - rDt_abl * Avm_abl( ji, jj, jk   ) / e3w_abl( jk   )   ! upper-diagonal
                z_elem_b( ji, jk ) = e3t_abl(jk) - z_elem_a( ji, jk ) - z_elem_c( ji, jk )   !       diagonal
-            END DO
+            END_1D
          END DO
 
-         DO ji = 1, jpi   ! boundary conditions (Avm_abl and pcd_du must be available at jj=jpj)
+         DO_1Di(0,0)   ! boundary conditions
+
             !++ Surface boundary condition
             z_elem_a( ji, 2 ) = 0._wp
             z_elem_c( ji, 2 ) = - rDt_abl * Avm_abl( ji, jj, 2 ) / e3w_abl( 2 )
@@ -454,29 +448,29 @@ CONTAINS
                v_abl   ( ji, jj, jpka, nt_a ) = e3t_abl( jpka ) * pv_dta(ji,jj,jk)
             !ENDIF
 
-         END DO
+         END_1D
          !!
          !! Matrix inversion
          !! ----------------------------------------------------------
-         DO ji = 1, jpi
+         DO_1Di(0,0)
             zcff                 =   1._wp / z_elem_b( ji, 2 )
             zCF   (ji,   2     ) =  - zcff * z_elem_c( ji,     2       )
             v_abl (ji,jj,2,nt_a) =    zcff * v_abl   ( ji, jj, 2, nt_a )
-         END DO
+         END_1D
 
          DO jk = 3, jpka
-            DO ji = 1, jpi
+            DO_1Di(0,0)
                zcff = 1._wp / ( z_elem_b( ji, jk ) + z_elem_a( ji, jk ) * zCF   (ji, jk-1 ) )
                zCF(ji,jk) = - zcff * z_elem_c( ji, jk )
                v_abl(ji,jj,jk,nt_a) = zcff * ( v_abl(ji,jj,jk  ,nt_a)   &
                &          - z_elem_a(ji, jk) * v_abl(ji,jj,jk-1,nt_a) )
-            END DO
+            END_1D
          END DO
 
          DO jk = jpkam1,2,-1
-            DO ji = 1, jpi
+            DO_1Di(0,0)
                v_abl(ji,jj,jk,nt_a) = v_abl(ji,jj,jk,nt_a) + zCF(ji,jk) * v_abl(ji,jj,jk+1,nt_a)
-            END DO
+            END_1D
          END DO
          !
       !-------------
@@ -491,7 +485,7 @@ CONTAINS
          !-------------
          DO jk = 2, jpka    ! outer loop
          !-------------
-            DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+            DO_2D( 0, 0, 0, 0)
                zcff1 = pblh( ji, jj )
                zsig  = ght_abl(jk) / MAX( jp_pblh_min,  MIN(  jp_pblh_max, zcff1  ) )
                zsig  =               MIN( jp_bmax    ,  MAX(         zsig, jp_bmin) )
@@ -514,7 +508,7 @@ CONTAINS
       !-------------
       DO jk = 2, jpka    ! outer loop
       !-------------
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0)
             zcff1 = pblh( ji, jj )
             zsig  = ght_abl(jk) / MAX( jp_pblh_min,  MIN(  jp_pblh_max, zcff1  ) )
             zsig  =               MIN( jp_bmax    ,  MAX(         zsig, jp_bmin) )
@@ -528,21 +522,17 @@ CONTAINS
 
             tq_abl( ji, jj, jk, nt_a, jp_qa ) = (1._wp - zcff ) * tq_abl( ji, jj, jk, nt_a, jp_qa )   &
                &                                       + zcff   * pq_dta( ji, jj, jk )
-
          END_2D
       !-------------
       END DO             ! end outer loop
       !-------------
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      !                            !  6 *** MPI exchanges & IOM outputs
+      !                            !  6 *** IOM outputs
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !
-      CALL lbc_lnk( 'ablmod',  u_abl(:,:,:,nt_a      ), 'T', -1._wp,  v_abl(:,:,:,nt_a)      , 'T', -1._wp                            )
-      !CALL lbc_lnk( 'ablmod', tq_abl(:,:,:,nt_a,jp_ta), 'T',  1._wp, tq_abl(:,:,:,nt_a,jp_qa), 'T',  1._wp, kfillmode = jpfillnothing )   ! ++++ this should not be needed...
-      !
 #if defined key_xios
       ! 2D & first ABL level
-      IF ( iom_use("pblh"   ) ) CALL iom_put (    "pblh",    pblh(:,:             ) )
+      IF ( iom_use("pblh"   ) ) CALL iom_put (    "pblh",    pblh(A2D(0)          ) )
       IF ( iom_use("uz1_abl") ) CALL iom_put ( "uz1_abl",   u_abl(:,:,2,nt_a      ) )
       IF ( iom_use("vz1_abl") ) CALL iom_put ( "vz1_abl",   v_abl(:,:,2,nt_a      ) )
       IF ( iom_use("tz1_abl") ) CALL iom_put ( "tz1_abl",  tq_abl(:,:,2,nt_a,jp_ta) )
@@ -588,7 +578,7 @@ CONTAINS
       !                            !  7 *** Finalize flux computation
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ztemp          = tq_abl( ji, jj, 2, nt_a, jp_ta )
          zhumi          = tq_abl( ji, jj, 2, nt_a, jp_qa )
          zpre( ji, jj ) = pres_temp( zhumi, pslp_dta(ji,jj), ght_abl(2), ptpot=ztemp, pta=ztabs( ji, jj ) )
@@ -599,15 +589,13 @@ CONTAINS
          rhoa( ji, jj ) = zcff
       END_2D
 
-      DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zwnd_i(ji,jj) = u_abl(ji  ,jj,2,nt_a) - 0.5_wp * ( pssu(ji  ,jj) + pssu(ji-1,jj) ) * rn_vfac
          zwnd_j(ji,jj) = v_abl(ji,jj  ,2,nt_a) - 0.5_wp * ( pssv(ji,jj  ) + pssv(ji,jj-1) ) * rn_vfac
       END_2D
       !
-      CALL lbc_lnk( 'ablmod', zwnd_i(:,:) , 'T', -1.0_wp, zwnd_j(:,:) , 'T', -1.0_wp )
-      !
       ! ... scalar wind ( = | U10m - U_oce | ) at T-point (masked)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zcff          = SQRT(  zwnd_i(ji,jj) * zwnd_i(ji,jj)   &
             &                 + zwnd_j(ji,jj) * zwnd_j(ji,jj) )   ! * msk_abl(ji,jj)
          zztmp         = rhoa(ji,jj) * pcd_du(ji,jj)
@@ -617,25 +605,18 @@ CONTAINS
          zwnd_i(ji,jj) = zztmp * zwnd_i(ji,jj)
          zwnd_j(ji,jj) = zztmp * zwnd_j(ji,jj)
       END_2D
-      ! ... utau, vtau at U- and V_points, resp.
-      !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
-      !     Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+      CALL iom_put( "taum_oce", ptaum )
+
+      ! ... utau, vtau at T-points
       DO_2D( 0, 0, 0, 0 )
-         zcff  = 0.5_wp * ( 2._wp - msk_abl(ji,jj)*msk_abl(ji+1,jj) )
-         zztmp = MAX(msk_abl(ji,jj),msk_abl(ji+1,jj))
-         ptaui(ji,jj) = zcff * zztmp * ( zwnd_i(ji,jj) + zwnd_i(ji+1,jj  ) )
-         zcff  = 0.5_wp * ( 2._wp - msk_abl(ji,jj)*msk_abl(ji,jj+1) )
-         zztmp = MAX(msk_abl(ji,jj),msk_abl(ji,jj+1))
-         ptauj(ji,jj) = zcff * zztmp * ( zwnd_j(ji,jj) + zwnd_j(ji  ,jj+1) )
+         ptaui(ji,jj) = zwnd_i(ji,jj) * msk_abl(ji,jj)
+         ptauj(ji,jj) = zwnd_j(ji,jj) * msk_abl(ji,jj)
       END_2D
-      !
-      CALL lbc_lnk( 'ablmod', ptaui(:,:), 'U', -1.0_wp, ptauj(:,:), 'V', -1.0_wp )
-
-      CALL iom_put( "taum_oce", ptaum )
+      CALL lbc_lnk( 'ablmod', ptaui(:,:) , 'T', -1.0_wp, ptauj(:,:) , 'T', -1.0_wp )
 
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl( tab2d_1=ptaui , clinfo1=' abl_stp: utau   : ', mask1=umask,   &
-            &          tab2d_2=ptauj , clinfo2='          vtau   : ', mask2=vmask )
+         CALL prt_ctl( tab2d_1=ptaui , clinfo1=' abl_stp: utau   : ', mask1=tmask,   &
+            &          tab2d_2=ptauj , clinfo2='          vtau   : ', mask2=tmask )
          CALL prt_ctl( tab2d_1=pwndm , clinfo1=' abl_stp: wndm   : ' )
       ENDIF
 
@@ -643,37 +624,16 @@ CONTAINS
       ! ------------------------------------------------------------ !
       !    Wind stress relative to the moving ice ( U10m - U_ice )   !
       ! ------------------------------------------------------------ !
-      !DO_2D( 0, 0, 0, 0 )
-      !   ptaui_ice(ji,jj) = 0.5_wp * ( rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   &
-      !      &                      * ( 0.5_wp * ( u_abl(ji+1,jj,2,nt_a) + u_abl(ji,jj,2,nt_a) ) - pssu_ice(ji,jj) )
-      !   ptauj_ice(ji,jj) = 0.5_wp * ( rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   &
-      !      &                      * ( 0.5_wp * ( v_abl(ji,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) ) - pssv_ice(ji,jj) )
-      !END_2D
-      !CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice, 'V', -1.0_wp )
-      !!
-      !IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=ptaui_ice  , clinfo1=' abl_stp: putaui : '   &
-      !   &                                , tab2d_2=ptauj_ice  , clinfo2='          pvtaui : ' )
-
-      ! ------------------------------------------------------------ !
-      !    Wind stress relative to the moving ice ( U10m - U_ice )   !
-      ! ------------------------------------------------------------ !
-      DO_2D( 0, 0, 0, 0 )
-
-         zztmp1 = 0.5_wp * ( u_abl(ji+1,jj  ,2,nt_a) + u_abl(ji,jj,2,nt_a) )
-         zztmp2 = 0.5_wp * ( v_abl(ji  ,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) )
-
-         ptaui_ice(ji,jj) = 0.5_wp * (  rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj)             &
-            &                      +    rhoa(ji  ,jj) * pCd_du_ice(ji  ,jj)  )          &
-            &         * ( zztmp1 - pssu_ice(ji,jj) * rn_vfac )
-         ptauj_ice(ji,jj) = 0.5_wp * (  rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1)             &
-            &                      +    rhoa(ji,jj  ) * pCd_du_ice(ji,jj  )  )          &
-            &         * ( zztmp2 - pssv_ice(ji,jj) * rn_vfac )
+      DO_2D(0,0,0,0)
+         zztmp            = rhoa(ji,jj) * pCd_du_ice(ji,jj)
+         ptaui_ice(ji,jj) = zztmp * ( u_abl(ji,jj,2,nt_a) - 0.5_wp * ( pssu_ice(ji,jj) + pssu_ice(ji-1,jj  ) ) * rn_vfac )
+         ptauj_ice(ji,jj) = zztmp * ( v_abl(ji,jj,2,nt_a) - 0.5_wp * ( pssv_ice(ji,jj) + pssv_ice(ji  ,jj-1) ) * rn_vfac )
       END_2D
-      CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice,'V', -1.0_wp )
+      CALL lbc_lnk( 'ablmod', ptaui_ice(:,:) , 'T', -1.0_wp, ptauj_ice(:,:) , 'T', -1.0_wp )
       !
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl( tab2d_1=ptaui_ice , clinfo1=' abl_stp: utau_ice : ', mask1=umask,   &
-            &          tab2d_2=ptauj_ice , clinfo2='          vtau_ice : ', mask2=vmask )
+         CALL prt_ctl( tab2d_1=ptaui_ice , clinfo1=' abl_stp: utau_ice : ', mask1=tmask,   &
+            &          tab2d_2=ptauj_ice , clinfo2='          vtau_ice : ', mask2=tmask )
       END IF
 #endif
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@@ -707,21 +667,22 @@ CONTAINS
       !!              - avmu, avmv : production of TKE by shear at u and v-points
       !!                (= Kz dz[Ub] * dz[Un] )
       !! ---------------------------------------------------------------------
-      INTEGER                                 ::   ji, jj, jk, tind, jbak, jkup, jkdwn
-      INTEGER, DIMENSION(1:jpi          )     ::   ikbl
-      REAL(wp)                                ::   zcff, zcff2, ztken, zesrf, zetop, ziRic, ztv
-      REAL(wp)                                ::   zdU , zdV , zcff1, zshear, zbuoy, zsig, zustar2
-      REAL(wp)                                ::   zdU2, zdV2, zbuoy1, zbuoy2    ! zbuoy for BL89
-      REAL(wp)                                ::   zwndi, zwndj
-      REAL(wp), DIMENSION(1:jpi,      1:jpka) ::   zsh2
-      REAL(wp), DIMENSION(1:jpi,1:jpj,1:jpka) ::   zbn2
-      REAL(wp), DIMENSION(1:jpi,1:jpka  )     ::   zFC, zRH, zCF
-      REAL(wp), DIMENSION(1:jpi,1:jpka  )     ::   z_elem_a
-      REAL(wp), DIMENSION(1:jpi,1:jpka  )     ::   z_elem_b
-      REAL(wp), DIMENSION(1:jpi,1:jpka  )     ::   z_elem_c
-      LOGICAL                                 ::   ln_Patankar    = .FALSE.
-      LOGICAL                                 ::   ln_dumpvar     = .FALSE.
-      LOGICAL , DIMENSION(1:jpi         )     ::   ln_foundl
+
+      INTEGER                             ::   ji, jj, jk, tind, jbak, jkup, jkdwn
+      INTEGER, DIMENSION(A1Di(0))         ::   ikbl
+      REAL(wp)                            ::   zcff, zcff2, ztken, zesrf, zetop, ziRic, ztv
+      REAL(wp)                            ::   zdU , zdV , zcff1, zshear, zbuoy, zsig, zustar2
+      REAL(wp)                            ::   zdU2, zdV2, zbuoy1, zbuoy2    ! zbuoy for BL89
+      REAL(wp)                            ::   zwndi, zwndj
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   zsh2
+      REAL(wp), DIMENSION(A2D(0) ,1:jpka) ::   zbn2
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   zFC, zRH, zCF
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   z_elem_a
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   z_elem_b
+      REAL(wp), DIMENSION(A1Di(0),1:jpka) ::   z_elem_c
+      LOGICAL                             ::   ln_Patankar    = .FALSE.
+      LOGICAL                             ::   ln_dumpvar     = .FALSE.
+      LOGICAL , DIMENSION(A1Di(0))        ::   ln_foundl
       !
       tind  = nt_n
       ziRic = 1._wp / rn_Ric
@@ -730,33 +691,33 @@ CONTAINS
       !                            !  Advance TKE equation to time n+1
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !-------------
-      DO jj = 1, jpj    ! outer loop
+      DO_1Dj( 0, 0 )   ! outer loop
       !-------------
          !
          ! Compute vertical shear
          DO jk = 2, jpkam1
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zcff        = 1.0_wp / e3w_abl( jk )**2
                zdU         = zcff* Avm_abl(ji,jj,jk) * (u_abl( ji, jj, jk+1, tind)-u_abl( ji, jj, jk  , tind) )**2
                zdV         = zcff* Avm_abl(ji,jj,jk) * (v_abl( ji, jj, jk+1, tind)-v_abl( ji, jj, jk  , tind) )**2
                zsh2(ji,jk) = zdU+zdV   !<-- zsh2 = Km ( ( du/dz )^2 + ( dv/dz )^2 )
-            END DO
+            END_1D
          END DO
          !
          ! Compute brunt-vaisala frequency
          DO jk = 2, jpkam1
-            DO ji = 1,jpi
+            DO_1Di( 0, 0 )
                zcff  = grav * itvref / e3w_abl( jk )
                zcff1 =  tq_abl( ji, jj, jk+1, tind, jp_ta) - tq_abl( ji, jj, jk  , tind, jp_ta)
                zcff2 =  tq_abl( ji, jj, jk+1, tind, jp_ta) * tq_abl( ji, jj, jk+1, tind, jp_qa)        &
                   &   - tq_abl( ji, jj, jk  , tind, jp_ta) * tq_abl( ji, jj, jk  , tind, jp_qa)
                zbn2(ji,jj,jk) = zcff * ( zcff1 + rctv0 * zcff2 )  !<-- zbn2 defined on (2,jpi)
-            END DO
+            END_1D
          END DO
          !
          ! Terms for the tridiagonal problem
          DO jk = 2, jpkam1
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zshear      = zsh2( ji, jk )                           ! zsh2 is already multiplied by Avm_abl at this point
                zsh2(ji,jk) = zsh2( ji, jk ) / Avm_abl( ji, jj, jk )   ! reformulate zsh2 as a 'true' vertical shear for PBLH computation
                zbuoy       = - Avt_abl( ji, jj, jk ) * zbn2( ji, jj, jk )
@@ -773,10 +734,10 @@ CONTAINS
                      &               - e3w_abl(jk) * rDt_abl * zbuoy
                   tke_abl( ji, jj, jk, nt_a ) = e3w_abl(jk) * ( tke_abl( ji, jj, jk, nt_n ) + rDt_abl *  zshear )                    ! right-hand-side
                END IF
-            END DO
+            END_1D
          END DO
 
-         DO ji = 1,jpi    ! vector opt.
+         DO_1Di( 0, 0 )
             zesrf = MAX( rn_Esfc * ustar2(ji,jj), tke_min )
             zetop = tke_min
 
@@ -805,44 +766,41 @@ CONTAINS
          !!
          !! Matrix inversion
          !! ----------------------------------------------------------
-         DO ji = 1,jpi
+         DO_1Di( 0, 0 )
             zcff                  =  1._wp / z_elem_b( ji, 1 )
             zCF    (ji,   1     ) = - zcff * z_elem_c( ji,     1       )
             tke_abl(ji,jj,1,nt_a) =   zcff * tke_abl ( ji, jj, 1, nt_a )
-         END DO
+         END_1D
 
          DO jk = 2, jpka
-            DO ji = 1,jpi
+            DO_1Di( 0, 0 )
                zcff = 1._wp / ( z_elem_b( ji, jk ) + z_elem_a( ji, jk ) * zCF(ji, jk-1 ) )
                zCF(ji,jk) = - zcff * z_elem_c( ji, jk )
                tke_abl(ji,jj,jk,nt_a) =   zcff * ( tke_abl(ji,jj,jk  ,nt_a)   &
                &          - z_elem_a(ji, jk) * tke_abl(ji,jj,jk-1,nt_a) )
-            END DO
+            END_1D
          END DO
 
          DO jk = jpkam1,1,-1
-            DO ji = 1,jpi
+            DO_1Di( 0, 0 )
                tke_abl(ji,jj,jk,nt_a) = tke_abl(ji,jj,jk,nt_a) + zCF(ji,jk) * tke_abl(ji,jj,jk+1,nt_a)
-            END DO
+            END_1D
          END DO
 
-!!FL should not be needed because of Patankar procedure
-         tke_abl(2:jpi,jj,1:jpka,nt_a) = MAX( tke_abl(2:jpi,jj,1:jpka,nt_a), tke_min )
+         !!FL should not be needed because of Patankar procedure
+         tke_abl(A2D(0),1:jpka,nt_a) = MAX( tke_abl(A2D(0),1:jpka,nt_a), tke_min )
 
          !!
          !! Diagnose PBL height
          !! ----------------------------------------------------------
-
-
-         !
          ! arrays zRH, zFC and zCF are available at this point
          ! and zFC(:, 1 ) = 0.
          ! diagnose PBL height based on zsh2 and zbn2
          zFC (  :  ,1) = 0._wp
-         ikbl( 1:jpi ) = 0
+         ikbl( A1Di(0) ) = 0
 
          DO jk = 2,jpka
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zcff  = ghw_abl( jk-1 )
                zcff1 = zcff / ( zcff + rn_epssfc * pblh ( ji, jj ) )
                zcff  = ghw_abl( jk   )
@@ -854,11 +812,11 @@ CONTAINS
                            - rn_Cek  * ( fft_abl( ji, jj  ) * fft_abl( ji, jj ) ) ) &
                            &                                                 )
                IF( ikbl(ji) == 0 .and. zFC( ji, jk ).lt.0._wp ) ikbl(ji)=jk
-            END DO
+            END_1D
          END DO
          !
          ! finalize the computation of the PBL height
-         DO ji = 1, jpi
+         DO_1Di( 0, 0 )
             jk = ikbl(ji)
             IF( jk > 2 ) THEN ! linear interpolation to get subgrid value of pblh
                pblh( ji, jj ) =  (  ghw_abl( jk-1 ) * zFC( ji, jk   )       &
@@ -869,16 +827,16 @@ CONTAINS
             ELSE
                pblh( ji, jj ) = ghw_abl(jpka)
             END IF
-         END DO
+         END_1D
       !-------------
       END DO
       !-------------
       !
       ! Optional : could add pblh smoothing if pblh is noisy horizontally ...
       IF(ln_smth_pblh) THEN
-         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.0_wp) !, kfillmode = jpfillnothing)
-         CALL smooth_pblh( pblh, msk_abl )
-         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.0_wp) !, kfillmode = jpfillnothing)
+         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.0_wp )
+         CALL smooth_pblh( pblh, tmask(A2D(0),1) )
+         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.0_wp )
       ENDIF
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !                            !  Diagnostic mixing length computation
@@ -889,55 +847,55 @@ CONTAINS
       CASE ( 0 )           ! Deardroff 80 length-scale bounded by the distance to surface and bottom
 #   define zlup zRH
 #   define zldw zFC
-         DO jj = 1, jpj     ! outer loop
+         DO_1Dj(0,0)   ! outer loop
             !
-            DO ji = 1, jpi
+            DO_1Di(0,0)
                mxld_abl( ji, jj,    1 ) = mxl_min
                mxld_abl( ji, jj, jpka ) = mxl_min
                mxlm_abl( ji, jj,    1 ) = mxl_min
                mxlm_abl( ji, jj, jpka ) = mxl_min
                zldw    ( ji,        1 ) = zrough(ji,jj) * rn_Lsfc
                zlup    ( ji,     jpka ) = mxl_min
-            END DO
+            END_1D
             !
             DO jk = 2, jpkam1
-               DO ji = 1, jpi
+               DO_1Di(0,0)
                   zbuoy = MAX( zbn2(ji, jj, jk), rsmall )
                   mxlm_abl( ji, jj, jk ) = MAX( mxl_min,  &
                      &               SQRT( 2._wp * tke_abl( ji, jj, jk, nt_a ) / zbuoy ) )
-               END DO
+               END_1D
             END DO
             !
             ! Limit mxl
             DO jk = jpkam1,1,-1
-               DO ji = 1, jpi
+               DO_1Di(0,0)
                   zlup(ji,jk) = MIN( zlup(ji,jk+1) + (ghw_abl(jk+1)-ghw_abl(jk)) , mxlm_abl(ji, jj, jk) )
-               END DO
+               END_1D
             END DO
             !
             DO jk = 2, jpka
-               DO ji = 1, jpi
+               DO_1Di(0,0)
                   zldw(ji,jk) = MIN( zldw(ji,jk-1) + (ghw_abl(jk)-ghw_abl(jk-1)) , mxlm_abl(ji, jj, jk) )
-               END DO
+               END_1D
             END DO
             !
 !            DO jk = 1, jpka
-!               DO ji = 1, jpi
+!               DO_1Di(0,0)
 !                  mxlm_abl( ji, jj, jk ) = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
 !                  mxld_abl( ji, jj, jk ) = MIN ( zldw( ji, jk ),  zlup( ji, jk ) )
-!               END DO
+!               END_1D
 !            END DO
             !
             DO jk = 1, jpka
-               DO ji = 1, jpi
+               DO_1Di(0,0)
 !                  zcff = 2.*SQRT(2.)*(  zldw( ji, jk )**(-2._wp/3._wp) + zlup( ji, jk )**(-2._wp/3._wp)  )**(-3._wp/2._wp)
                   zcff = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
                   mxlm_abl( ji, jj, jk ) = MAX( zcff, mxl_min )
                   mxld_abl( ji, jj, jk ) = MAX( MIN( zldw( ji, jk ),  zlup( ji, jk ) ), mxl_min )
-               END DO
+               END_1D
             END DO
             !
-         END DO
+         END_1D   ! outer loop
 #   undef zlup
 #   undef zldw
          !
@@ -945,18 +903,18 @@ CONTAINS
       CASE ( 1 )           ! Modified Deardroff 80 length-scale bounded by the distance to surface and bottom
 #   define zlup zRH
 #   define zldw zFC
-         DO jj = 1, jpj     ! outer loop
+         DO_1Dj( 0, 0 )   ! outer loop
             !
             DO jk = 2, jpkam1
-               DO ji = 1,jpi
-                              zcff        = 1.0_wp / e3w_abl( jk )**2
+               DO_1Di( 0, 0 )
+                  zcff        = 1.0_wp / e3w_abl( jk )**2
                   zdU         = zcff* (u_abl( ji, jj, jk+1, tind)-u_abl( ji, jj, jk  , tind) )**2
                   zdV         = zcff* (v_abl( ji, jj, jk+1, tind)-v_abl( ji, jj, jk  , tind) )**2
                   zsh2(ji,jk) = SQRT(zdU+zdV)   !<-- zsh2 = SQRT ( ( du/dz )^2 + ( dv/dz )^2 )
-                           ENDDO
-                        ENDDO
-                        !
-            DO ji = 1, jpi
+               END_1D
+            END DO
+            !
+            DO_1Di( 0, 0 )
                zcff                      = zrough(ji,jj) * rn_Lsfc
                mxld_abl ( ji, jj,    1 ) = zcff
                mxld_abl ( ji, jj, jpka ) = mxl_min
@@ -964,42 +922,42 @@ CONTAINS
                mxlm_abl ( ji, jj, jpka ) = mxl_min
                zldw     ( ji,        1 ) = zcff
                zlup     ( ji,     jpka ) = mxl_min
-            END DO
+            END_1D
             !
             DO jk = 2, jpkam1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zbuoy    = MAX( zbn2(ji, jj, jk), rsmall )
                   zcff     = 2.0_wp*SQRT(tke_abl( ji, jj, jk, nt_a )) / ( rn_Rod*zsh2(ji,jk) &
                                 &             + SQRT(rn_Rod*rn_Rod*zsh2(ji,jk)*zsh2(ji,jk)+2.0_wp*zbuoy ) )
                                   mxlm_abl( ji, jj, jk ) = MAX( mxl_min, zcff )
-               END DO
+               END_1D
             END DO
             !
             ! Limit mxl
             DO jk = jpkam1,1,-1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zlup(ji,jk) = MIN( zlup(ji,jk+1) + (ghw_abl(jk+1)-ghw_abl(jk)) , mxlm_abl(ji, jj, jk) )
-               END DO
+               END_1D
             END DO
             !
             DO jk = 2, jpka
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zldw(ji,jk) = MIN( zldw(ji,jk-1) + (ghw_abl(jk)-ghw_abl(jk-1)) , mxlm_abl(ji, jj, jk) )
-               END DO
+               END_1D
             END DO
             !
             DO jk = 1, jpka
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   !mxlm_abl( ji, jj, jk ) = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
                   !zcff = 2.*SQRT(2.)*(  zldw( ji, jk )**(-2._wp/3._wp) + zlup( ji, jk )**(-2._wp/3._wp)  )**(-3._wp/2._wp)
                   zcff = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
                   mxlm_abl( ji, jj, jk ) = MAX( zcff, mxl_min )
                   !mxld_abl( ji, jj, jk ) = MIN( zldw( ji, jk ), zlup( ji, jk ) )
                   mxld_abl( ji, jj, jk ) = MAX( MIN( zldw( ji, jk ),  zlup( ji, jk ) ), mxl_min )
-               END DO
+               END_1D
             END DO
- !
-         END DO
+            !
+         END_1D   ! outer loop
 #   undef zlup
 #   undef zldw
          !
@@ -1009,35 +967,35 @@ CONTAINS
 #   define zldw zFC
 ! zCF is used for matrix inversion
 !
-       DO jj = 1, jpj      ! outer loop
+       DO_1Dj( 0, 0 )   ! outer loop
 
-         DO ji = 1, jpi
+         DO_1Di( 0, 0 )
             zcff             = zrough(ji,jj) * rn_Lsfc
             zlup( ji,    1 ) = zcff
             zldw( ji,    1 ) = zcff
             zlup( ji, jpka ) = mxl_min
             zldw( ji, jpka ) = mxl_min
-         END DO
+         END_1D
 
          DO jk = 2,jpka-1
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zlup(ji,jk) = ghw_abl(jpka) - ghw_abl(jk)
                zldw(ji,jk) = ghw_abl(jk  ) - ghw_abl( 1)
-            END DO
+            END_1D
          END DO
          !!
          !! BL89 search for lup
          !! ----------------------------------------------------------
          DO jk=2,jpka-1
             !
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zCF(ji,1:jpka) = 0._wp
                zCF(ji,  jk  ) = - tke_abl( ji, jj, jk, nt_a )
                ln_foundl(ji ) = .false.
-            END DO
+            END_1D
             !
             DO jkup=jk+1,jpka-1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zbuoy1 = MAX( zbn2(ji,jj,jkup  ), rsmall )
                   zbuoy2 = MAX( zbn2(ji,jj,jkup-1), rsmall )
                   zCF (ji,jkup) = zCF (ji,jkup-1) + 0.5_wp * e3t_abl(jkup) * &
@@ -1052,7 +1010,7 @@ CONTAINS
                      zlup(ji,jk) = ghw_abl(jkup  ) - ghw_abl(jk)
                      ln_foundl(ji) = .true.
                   END IF
-               END DO
+               END_1D
             END DO
             !
          END DO
@@ -1061,14 +1019,14 @@ CONTAINS
          !! ----------------------------------------------------------
          DO jk=2,jpka-1
             !
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zCF(ji,1:jpka) = 0._wp
                zCF(ji,  jk  ) = - tke_abl( ji, jj, jk, nt_a )
                ln_foundl(ji ) = .false.
-            END DO
+            END_1D
             !
             DO jkdwn=jk-1,1,-1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zbuoy1 = MAX( zbn2(ji,jj,jkdwn+1), rsmall )
                   zbuoy2 = MAX( zbn2(ji,jj,jkdwn  ), rsmall )
                   zCF (ji,jkdwn) = zCF (ji,jkdwn+1) + 0.5_wp * e3t_abl(jkdwn+1)  &
@@ -1083,21 +1041,21 @@ CONTAINS
                      zldw(ji,jk) = ghw_abl(jk) - ghw_abl(jkdwn  )
                      ln_foundl(ji) = .true.
                   END IF
-               END DO
+               END_1D
             END DO
             !
          END DO
 
          DO jk = 1, jpka
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                !zcff = 2.*SQRT(2.)*(  zldw( ji, jk )**(-2._wp/3._wp) + zlup( ji, jk )**(-2._wp/3._wp)  )**(-3._wp/2._wp)
                zcff = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
                mxlm_abl( ji, jj, jk ) = MAX( zcff, mxl_min )
                mxld_abl( ji, jj, jk ) = MAX( MIN( zldw( ji, jk ),  zlup( ji, jk ) ), mxl_min )
-            END DO
+            END_1D
          END DO
 
-      END DO
+      END_1D   ! outer loop
 #   undef zlup
 #   undef zldw
          !
@@ -1107,46 +1065,46 @@ CONTAINS
 #   define zldw zFC
 ! zCF is used for matrix inversion
 !
-       DO jj = 1, jpj      ! outer loop
+       DO_1Dj( 0, 0 )   ! outer loop
           !
           DO jk = 2, jpkam1
-             DO ji = 1,jpi
+             DO_1Di( 0, 0 )
                             zcff        = 1.0_wp / e3w_abl( jk )**2
                 zdU         = zcff* (u_abl( ji, jj, jk+1, tind)-u_abl( ji, jj, jk  , tind) )**2
                 zdV         = zcff* (v_abl( ji, jj, jk+1, tind)-v_abl( ji, jj, jk  , tind) )**2
                 zsh2(ji,jk) = SQRT(zdU+zdV)   !<-- zsh2 = SQRT ( ( du/dz )^2 + ( dv/dz )^2 )
-                         ENDDO
-                  ENDDO
+             END_1D
+          ENDDO
           zsh2(:,      1) = zsh2( :,      2)
           zsh2(:,   jpka) = zsh2( :, jpkam1)
 
-                 DO ji = 1, jpi
-            zcff              = zrough(ji,jj) * rn_Lsfc
-                        zlup( ji,    1 )  = zcff
-            zldw( ji,    1 )  = zcff
-            zlup( ji, jpka ) = mxl_min
-            zldw( ji, jpka ) = mxl_min
-         END DO
+          DO_1Di( 0, 0 )
+             zcff              = zrough(ji,jj) * rn_Lsfc
+             zlup( ji,    1 )  = zcff
+             zldw( ji,    1 )  = zcff
+             zlup( ji, jpka ) = mxl_min
+             zldw( ji, jpka ) = mxl_min
+          END_1D
 
          DO jk = 2,jpka-1
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zlup(ji,jk) = ghw_abl(jpka) - ghw_abl(jk)
                zldw(ji,jk) = ghw_abl(jk  ) - ghw_abl( 1)
-            END DO
+            END_1D
          END DO
          !!
          !! BL89 search for lup
          !! ----------------------------------------------------------
          DO jk=2,jpka-1
             !
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zCF(ji,1:jpka) = 0._wp
                zCF(ji,  jk  ) = - tke_abl( ji, jj, jk, nt_a )
                ln_foundl(ji ) = .false.
-            END DO
+            END_1D
             !
             DO jkup=jk+1,jpka-1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zbuoy1             = MAX( zbn2(ji,jj,jkup  ), rsmall )
                   zbuoy2             = MAX( zbn2(ji,jj,jkup-1), rsmall )
                   zCF (ji,jkup) = zCF (ji,jkup-1) + 0.5_wp * e3t_abl(jkup) *                 &
@@ -1165,7 +1123,7 @@ CONTAINS
                      zlup(ji,jk) = ghw_abl(jkup  ) - ghw_abl(jk)
                      ln_foundl(ji) = .true.
                   END IF
-               END DO
+               END_1D
             END DO
             !
          END DO
@@ -1174,14 +1132,14 @@ CONTAINS
          !! ----------------------------------------------------------
          DO jk=2,jpka-1
             !
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                zCF(ji,1:jpka) = 0._wp
                zCF(ji,  jk  ) = - tke_abl( ji, jj, jk, nt_a )
                ln_foundl(ji ) = .false.
-            END DO
+            END_1D
             !
             DO jkdwn=jk-1,1,-1
-               DO ji = 1, jpi
+               DO_1Di( 0, 0 )
                   zbuoy1             = MAX( zbn2(ji,jj,jkdwn+1), rsmall )
                   zbuoy2             = MAX( zbn2(ji,jj,jkdwn  ), rsmall )
                   zCF (ji,jkdwn) = zCF (ji,jkdwn+1) + 0.5_wp * e3t_abl(jkdwn+1)  &
@@ -1200,18 +1158,18 @@ CONTAINS
                      zldw(ji,jk) = ghw_abl(jk) - ghw_abl(jkdwn  )
                      ln_foundl(ji) = .true.
                   END IF
-               END DO
+               END_1D
             END DO
             !
          END DO
 
          DO jk = 1, jpka
-            DO ji = 1, jpi
+            DO_1Di( 0, 0 )
                !zcff = 2.*SQRT(2.)*(  zldw( ji, jk )**(-2._wp/3._wp) + zlup( ji, jk )**(-2._wp/3._wp)  )**(-3._wp/2._wp)
                zcff = SQRT( zldw( ji, jk ) * zlup( ji, jk ) )
                mxlm_abl( ji, jj, jk ) = MAX( zcff, mxl_min )
                mxld_abl( ji, jj, jk ) = MAX(  MIN( zldw( ji, jk ),  zlup( ji, jk ) ), mxl_min )
-            END DO
+            END_1D
          END DO
 
       END DO
@@ -1225,10 +1183,10 @@ CONTAINS
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
       !-------------
-      DO jj = 1, jpj     ! outer loop
+      DO_1Dj( 0, 0 )   ! outer loop
       !-------------
          DO jk = 1, jpka
-            DO ji = 1, jpi  ! vector opt.
+            DO_1Di( 0, 0 )
                zcff  = MAX( rn_phimax, rn_Ric * mxlm_abl( ji, jj, jk ) * mxld_abl( ji, jj, jk )  &
                &     * MAX( zbn2(ji, jj, jk), rsmall ) / tke_abl( ji, jj, jk, nt_a ) )
                zcff2 =  1. / ( 1. + zcff )   !<-- phi_z(z)
@@ -1236,10 +1194,10 @@ CONTAINS
                !!FL: MAX function probably useless because of the definition of mxl_min
                Avm_abl( ji, jj, jk ) = MAX( rn_Cm * zcff         , avm_bak   )
                Avt_abl( ji, jj, jk ) = MAX( rn_Ct * zcff * zcff2 , avt_bak   )
-            END DO
+            END_1D
          END DO
       !-------------
-      END DO
+      END_1D   ! outer loop
       !-------------
 
 !---------------------------------------------------------------------------------------------------
@@ -1257,46 +1215,47 @@ CONTAINS
       !! ** Purpose :   2D Hanning filter on atmospheric PBL height
       !!
       !! ---------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: msk
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pvar2d
-      INTEGER                                     :: ji,jj
-      REAL(wp)                                    :: smth_a, smth_b
-      REAL(wp), DIMENSION(jpi,jpj)                :: zdX,zdY,zFX,zFY
-      REAL(wp)                                    :: zumsk,zvmsk
-      !!
+
+      REAL(wp), DIMENSION(A2D(1)), INTENT(in   ) :: msk
+      REAL(wp), DIMENSION(A2D(1)), INTENT(inout) :: pvar2d
+      INTEGER                                    :: ji,jj
+      REAL(wp)                                   :: smth_a, smth_b
+      REAL(wp), DIMENSION(A2D(1))                :: zdX,zdY,zFX,zFY
+      REAL(wp)                                   :: zumsk,zvmsk
+
       !!=========================================================
       !!
       !! Hanning filter
       smth_a = 1._wp / 8._wp
       smth_b = 1._wp / 4._wp
       !
-      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls )
+      DO_2D( 1, 0, 1, 1 )
          zumsk = msk(ji,jj) * msk(ji+1,jj)
          zdX ( ji, jj ) = ( pvar2d( ji+1,jj ) - pvar2d( ji  ,jj ) ) * zumsk
       END_2D
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls-1 )
+      DO_2D( 1, 1, 1, 0 )
          zvmsk = msk(ji,jj) * msk(ji,jj+1)
          zdY ( ji, jj ) = ( pvar2d( ji, jj+1 ) - pvar2d( ji  ,jj ) ) * zvmsk
       END_2D
 
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls-1 )
+      DO_2D( 0, 0, 1, 0 )
          zFY ( ji, jj  ) =   zdY ( ji, jj   )                        &
-            & +  smth_a*  ( (zdX ( ji, jj+1 ) - zdX( ji-1, jj+1 ))   &
+            & +  smth_a*  ( (zdX ( ji, jj+1 ) - zdX( ji-1, jj+1 ))   &   ! add () for NP repro
             &            -  (zdX ( ji, jj   ) - zdX( ji-1, jj   ))  )
       END_2D
 
-      DO_2D( nn_hls, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 1, 0, 0, 0 )
          zFX( ji, jj  ) =    zdX( ji, jj   )                         &
-           &    + smth_a*(  (zdY( ji+1, jj ) - zdY( ji+1, jj-1))     &
+           &    + smth_a*(  (zdY( ji+1, jj ) - zdY( ji+1, jj-1))     &   ! add () for NP repro
            &             -  (zdY( ji  , jj ) - zdY( ji  , jj-1)) )
       END_2D
 
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          pvar2d( ji  ,jj ) = pvar2d( ji  ,jj )              &
   &         + msk(ji,jj) * smth_b * (                       &
-  &                  zFX( ji, jj ) - zFX( ji-1, jj )        &
-  &                 +zFY( ji, jj ) - zFY( ji, jj-1 )  )
+  &                   ( zFX( ji, jj ) - zFX( ji-1, jj ) )   &   ! add () for NP repro
+  &                 + ( zFY( ji, jj ) - zFY( ji, jj-1 ) ) )
       END_2D
 
 !---------------------------------------------------------------------------------------------------
diff --git a/src/ABL/ablrst.F90 b/src/ABL/ablrst.F90
index 925234b3..de417297 100644
--- a/src/ABL/ablrst.F90
+++ b/src/ABL/ablrst.F90
@@ -202,12 +202,12 @@ CONTAINS
       ! --- mandatory fields --- ! 
       CALL iom_get( numrar, jpdom_auto,   'u_abl',   u_abl(:,:,:,nt_n      ), cd_type = 'T', psgn = -1._wp )
       CALL iom_get( numrar, jpdom_auto,   'v_abl',   v_abl(:,:,:,nt_n      ), cd_type = 'T', psgn = -1._wp )
-      CALL iom_get( numrar, jpdom_auto,   't_abl',  tq_abl(:,:,:,nt_n,jp_ta), kfill = jpfillcopy )
+      CALL iom_get( numrar, jpdom_auto,   't_abl',  tq_abl(:,:,:,nt_n,jp_ta) ) !, kfill = jpfillcopy )
       CALL iom_get( numrar, jpdom_auto,   'q_abl',  tq_abl(:,:,:,nt_n,jp_qa) )
       CALL iom_get( numrar, jpdom_auto, 'tke_abl', tke_abl(:,:,:,nt_n      ) )
-      CALL iom_get( numrar, jpdom_auto, 'avm_abl', avm_abl(:,:,:           ), kfill = jpfillcopy )
+      CALL iom_get( numrar, jpdom_auto, 'avm_abl', avm_abl(:,:,:           ) ) !, kfill = jpfillcopy )
       CALL iom_get( numrar, jpdom_auto, 'avt_abl', avt_abl(:,:,:           ) )
-      CALL iom_get( numrar, jpdom_auto,'mxld_abl',mxld_abl(:,:,:           ), kfill = jpfillcopy )
+      CALL iom_get( numrar, jpdom_auto,'mxld_abl',mxld_abl(:,:,:           ) ) !, kfill = jpfillcopy )
       CALL iom_get( numrar, jpdom_auto,    'pblh',    pblh(:,:             ), kfill = jpfillcopy )
 
       IF(.NOT.lrxios) CALL iom_delay_rst( 'READ', 'ABL', numrar )   ! read only abl delayed global communication variables
diff --git a/src/ABL/sbcabl.F90 b/src/ABL/sbcabl.F90
index c3977c5b..f4ac4657 100644
--- a/src/ABL/sbcabl.F90
+++ b/src/ABL/sbcabl.F90
@@ -44,6 +44,8 @@ MODULE sbcabl
    PUBLIC   sbc_abl_init       ! routine called in sbcmod module
    PUBLIC   sbc_abl            ! routine called in sbcmod module
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OPA 3.7 , NEMO-consortium (2014)
    !! $Id: sbcabl.F90 6416 2016-04-01 12:22:17Z clem $
@@ -259,7 +261,7 @@ CONTAINS
          rest_eq(:,:) = 1._wp
       END IF
       ! T-mask
-      msk_abl(:,:) = tmask(:,:,1)
+      msk_abl(:,:) = tmask(A2D(0),1)
 
       !!-------------------------------------------------------------------------------------------
 
@@ -307,8 +309,8 @@ CONTAINS
       !!              - Perform 1 time-step of the ABL model
       !!              - Finalize flux computation in blk_oce_2
       !!
-      !! ** Outputs : - utau    : i-component of the stress at U-point  (N/m2)
-      !!              - vtau    : j-component of the stress at V-point  (N/m2)
+      !! ** Outputs : - utau    : i-component of the stress at T-point  (N/m2)
+      !!              - vtau    : j-component of the stress at T-point  (N/m2)
       !!              - taum    : Wind stress module at T-point         (N/m2)
       !!              - wndm    : Wind speed module at T-point          (m/s)
       !!              - qsr     : Solar heat flux over the ocean        (W/m2)
@@ -318,9 +320,11 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER ,         INTENT(in) ::   kt   ! ocean time step
       !!
-      REAL(wp), DIMENSION(jpi,jpj) ::   zssq, zcd_du, zsen, zlat, zevp
+      !REAL(wp), DIMENSION(jpi,jpj) ::   zssq, zcd_du, zsen, zlat, zevp
+      REAL(wp), DIMENSION(A2D(0))  ::   zssq, zcd_du, zsen, zlat, zevp
 #if defined key_si3
-      REAL(wp), DIMENSION(jpi,jpj) ::   zssqi, zcd_dui, zseni, zevpi
+      !REAL(wp), DIMENSION(jpi,jpj) ::   zssqi, zcd_dui, zseni, zevpi
+      REAL(wp), DIMENSION(A2D(0))  ::   zssqi, zcd_dui, zseni, zevpi
 #endif
       INTEGER                      ::   jbak, jbak_dta, ji, jj
       !!---------------------------------------------------------------------
@@ -339,7 +343,7 @@ CONTAINS
 
          CALL blk_oce_1( kt,  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),   &   !   <<= in
             &                tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),   &   !   <<= in
-            &                sf(jp_slp )%fnow(:,:,1) , sst_m, ssu_m, ssv_m     ,   &   !   <<= in
+            &                sf(jp_slp )%fnow(:,:,1) , sst_m(A2D(0)), ssu_m(A2D(0)), ssv_m(A2D(0)),   &   !   <<= in
             &                sf(jp_uoatm)%fnow(:,:,1), sf(jp_voatm)%fnow(:,:,1),   &   !   <<= in
             &                sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1) ,   &   !   <<= in
             &                tsk_m, zssq, zcd_du, zsen, zlat, zevp                 )   !   =>> out
@@ -347,7 +351,7 @@ CONTAINS
 #if defined key_si3
          CALL blk_ice_1(  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),    &   !   <<= in
             &            tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),    &   !   <<= in
-            &            sf(jp_slp)%fnow(:,:,1)  ,  u_ice, v_ice, tm_su    ,    &   !   <<= in
+            &            sf(jp_slp)%fnow(:,:,1)  ,  tm_su(:,:)             ,    &   !   <<= in
             &            pseni=zseni, pevpi=zevpi, pssqi=zssqi, pcd_dui=zcd_dui )   !   <<= out
 #endif
 
@@ -355,7 +359,7 @@ CONTAINS
          !! 3 - Advance ABL variables from now (n) to after (n+1)
          !!-------------------------------------------------------------------------------------------
 
-         CALL abl_stp( kt, tsk_m, ssu_m, ssv_m, zssq,                          &   !   <<= in
+         CALL abl_stp( kt, tsk_m(A2D(0)), ssu_m, ssv_m, zssq,                  &   !   <<= in
             &              sf(jp_wndi)%fnow(:,:,:), sf(jp_wndj)%fnow(:,:,:),   &   !   <<= in
             &              sf(jp_tair)%fnow(:,:,:), sf(jp_humi)%fnow(:,:,:),   &   !   <<= in
             &              sf(jp_slp )%fnow(:,:,1),                            &   !   <<= in
@@ -364,7 +368,7 @@ CONTAINS
             &              zlat, wndm, utau, vtau, taum                        &   !   =>> out
 #if defined key_si3
             &            , tm_su, u_ice, v_ice, zssqi, zcd_dui                 &   !   <<= in
-            &            , zseni, zevpi, wndm_ice, ato_i                       &   !   <<= in
+            &            , zseni, zevpi, wndm_ice, ato_i(A2D(0))               &   !   <<= in
             &            , utau_ice, vtau_ice                                  &   !   =>> out
 #endif
             &                                                                  )
diff --git a/src/ICE/ice.F90 b/src/ICE/ice.F90
index 67bce2c4..1eb9d994 100644
--- a/src/ICE/ice.F90
+++ b/src/ICE/ice.F90
@@ -257,7 +257,6 @@ MODULE ice
    REAL(wp), PUBLIC ::   r1_Dt_ice        !: = 1. / rDt_ice
    REAL(wp), PUBLIC ::   r1_nlay_i        !: 1 / nlay_i
    REAL(wp), PUBLIC ::   r1_nlay_s        !: 1 / nlay_s
-   REAL(wp), PUBLIC ::   rswitch          !: switch for the presence of ice (1) or not (0)
    REAL(wp), PUBLIC ::   rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft   !: conservation diagnostics
    REAL(wp), PUBLIC, PARAMETER ::   epsi06 = 1.e-06_wp  !: small number
    REAL(wp), PUBLIC, PARAMETER ::   epsi10 = 1.e-10_wp  !: small number
@@ -451,6 +450,8 @@ MODULE ice
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qcn_ice_bot     !: Bottom  conduction flux (W/m2)
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qcn_ice_top     !: Surface conduction flux (W/m2)
    !
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/ICE 4.0 , NEMO Consortium (2018)
    !! $Id: ice.F90 15388 2021-10-17 11:33:47Z clem $
@@ -464,71 +465,99 @@ CONTAINS
       !!-----------------------------------------------------------------
       INTEGER :: ice_alloc
       !
-      INTEGER :: ierr(16), ii
+      INTEGER :: ierr(21), ii
       !!-----------------------------------------------------------------
       ierr(:) = 0
-
-      ii = 1
-      ALLOCATE( u_oce    (jpi,jpj) , v_oce    (jpi,jpj) , ht_i_new (jpi,jpj) , fraz_frac (jpi,jpj) ,  &
-         &      strength (jpi,jpj) , stress1_i(jpi,jpj) , stress2_i(jpi,jpj) , stress12_i(jpi,jpj) ,  &
-         &      delta_i  (jpi,jpj) , divu_i   (jpi,jpj) , shear_i  (jpi,jpj) ,                        &
-         &      aniso_11 (jpi,jpj) , aniso_12 (jpi,jpj) , rdg_conv (jpi,jpj) , STAT=ierr(ii) )
+      ii = 0
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      
+      ! * Ice global state variables
+      ii = ii + 1
+      ALLOCATE( u_ice(jpi,jpj) , v_ice(jpi,jpj) , STAT=ierr(ii) )
 
       ii = ii + 1
-      ALLOCATE( t_bo       (jpi,jpj) , wfx_snw_sni(jpi,jpj) ,                                                &
-         &      wfx_snw    (jpi,jpj) , wfx_snw_dyn(jpi,jpj) , wfx_snw_sum(jpi,jpj) , wfx_snw_sub(jpi,jpj) ,  &
-         &      wfx_ice    (jpi,jpj) , wfx_sub    (jpi,jpj) , wfx_ice_sub(jpi,jpj) , wfx_lam    (jpi,jpj) ,  &
-         &      wfx_pnd    (jpi,jpj) ,                                                                       &
-         &      wfx_bog    (jpi,jpj) , wfx_dyn   (jpi,jpj) , wfx_bom(jpi,jpj) , wfx_sum(jpi,jpj) ,           &
-         &      wfx_res    (jpi,jpj) , wfx_sni   (jpi,jpj) , wfx_opw(jpi,jpj) , wfx_spr(jpi,jpj) ,           &
-         &      rn_amax_2d (jpi,jpj) ,                                                                       &
-         &      qsb_ice_bot(jpi,jpj) , qlead     (jpi,jpj) ,                                                 &
-         &      sfx_res    (jpi,jpj) , sfx_bri   (jpi,jpj) , sfx_dyn(jpi,jpj) , sfx_sub(jpi,jpj) , sfx_lam(jpi,jpj) ,  &
-         &      sfx_bog    (jpi,jpj) , sfx_bom   (jpi,jpj) , sfx_sum(jpi,jpj) , sfx_sni(jpi,jpj) , sfx_opw(jpi,jpj) ,  &
-         &      hfx_res    (jpi,jpj) , hfx_snw   (jpi,jpj) , hfx_sub(jpi,jpj) ,                        &
-         &      qt_atm_oi  (jpi,jpj) , qt_oce_ai (jpi,jpj) , fhld   (jpi,jpj) ,                        &
-         &      hfx_sum    (jpi,jpj) , hfx_bom   (jpi,jpj) , hfx_bog(jpi,jpj) , hfx_dif(jpi,jpj) ,     &
-         &      hfx_opw    (jpi,jpj) , hfx_thd   (jpi,jpj) , hfx_dyn(jpi,jpj) , hfx_spr(jpi,jpj) ,     &
-         &      hfx_err_dif(jpi,jpj) , wfx_err_sub(jpi,jpj)                   , STAT=ierr(ii) )
+      ALLOCATE( h_i  (jpi,jpj,jpl) , a_i (jpi,jpj,jpl) , v_i   (jpi,jpj,jpl) ,  &
+         &      v_s  (jpi,jpj,jpl) , h_s (jpi,jpj,jpl) ,                        &
+         &      s_i  (jpi,jpj,jpl) , sv_i(jpi,jpj,jpl) , o_i   (jpi,jpj,jpl) , oa_i (jpi,jpj,jpl) , &
+         &      a_ip (jpi,jpj,jpl) , v_ip(jpi,jpj,jpl) , h_ip(jpi,jpj,jpl),     &
+         &      v_il (jpi,jpj,jpl) , h_il(jpi,jpj,jpl) ,                        &
+         &      t_su (jpi,jpj,jpl) , t_s (jpi,jpj,nlay_s,jpl) , t_i(jpi,jpj,nlay_i,jpl) , sz_i(jpi,jpj,nlay_i,jpl) , &
+         &      ato_i(jpi,jpj)     , STAT = ierr(ii) )
 
-      ! * Ice global state variables
       ii = ii + 1
-      ALLOCATE( qtr_ice_bot(jpi,jpj,jpl) , cnd_ice(jpi,jpj,jpl) , t1_ice(jpi,jpj,jpl) ,  &
-         &      h_i        (jpi,jpj,jpl) , a_i    (jpi,jpj,jpl) , v_i   (jpi,jpj,jpl) ,  &
-         &      v_s        (jpi,jpj,jpl) , h_s    (jpi,jpj,jpl) , t_su  (jpi,jpj,jpl) ,  &
-         &      s_i        (jpi,jpj,jpl) , sv_i   (jpi,jpj,jpl) , o_i   (jpi,jpj,jpl) ,  &
-         &      oa_i       (jpi,jpj,jpl) , bv_i   (jpi,jpj,jpl) , STAT=ierr(ii) )
+      ALLOCATE( e_s(jpi,jpj,nlay_s,jpl) , e_i(jpi,jpj,nlay_i,jpl) , STAT=ierr(ii) )
 
+      ! * Before values of global variables
       ii = ii + 1
-      ALLOCATE( u_ice(jpi,jpj) , v_ice(jpi,jpj) ,                                   &
-         &      vt_i (jpi,jpj) , vt_s (jpi,jpj) , st_i(jpi,jpj) , at_i(jpi,jpj) , ato_i(jpi,jpj) ,  &
-         &      et_i (jpi,jpj) , et_s (jpi,jpj) , tm_i(jpi,jpj) , tm_s(jpi,jpj) ,  &
-         &      sm_i (jpi,jpj) , tm_su(jpi,jpj) , hm_i(jpi,jpj) , hm_s(jpi,jpj) ,  &
-         &      om_i (jpi,jpj) , bvm_i(jpi,jpj) , tau_icebfr(jpi,jpj), icb_mask(jpi,jpj), STAT=ierr(ii) )
+      ALLOCATE( u_ice_b(jpi,jpj) , v_ice_b(jpi,jpj) , STAT=ierr(ii) )
+
+      ! * ice rheology
+      ii = ii+1
+      ALLOCATE( u_oce    (jpi,jpj) , v_oce    (jpi,jpj) ,  &
+         &      strength (jpi,jpj) , stress1_i(jpi,jpj) , stress2_i(jpi,jpj) , stress12_i(jpi,jpj) ,  &
+         &      aniso_11 (jpi,jpj) , aniso_12 (jpi,jpj) , rdg_conv (jpi,jpj) , &
+         &      icb_mask (jpi,jpj) , STAT=ierr(ii) )
 
+      ! * mean and total
       ii = ii + 1
-      ALLOCATE( t_s(jpi,jpj,nlay_s,jpl) , e_s(jpi,jpj,nlay_s,jpl) , STAT=ierr(ii) )
+      ALLOCATE( vt_i (jpi,jpj) , vt_s (jpi,jpj) , at_i (jpi,jpj) , & ! full arrays since they are used in rheology
+         &      vt_ip(jpi,jpj) , vt_il(jpi,jpj) , at_ip(jpi,jpj) , STAT=ierr(ii) )
+      
+      ! * others
+      ii = ii + 1
+      ALLOCATE( rn_amax_2d(jpi,jpj) , STAT=ierr(ii) )
+
 
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ! * Ice global state variables
       ii = ii + 1
-      ALLOCATE( t_i(jpi,jpj,nlay_i,jpl) , e_i(jpi,jpj,nlay_i,jpl) , sz_i(jpi,jpj,nlay_i,jpl) , STAT=ierr(ii) )
+      ALLOCATE(  bv_i(A2D(0),jpl) , a_ip_frac(A2D(0),jpl) , a_ip_eff(A2D(0),jpl) , STAT=ierr(ii) )
 
+      ! * Before values of global variables
       ii = ii + 1
-      ALLOCATE( a_ip(jpi,jpj,jpl) , v_ip(jpi,jpj,jpl) , a_ip_frac(jpi,jpj,jpl) , h_ip(jpi,jpj,jpl),  &
-         &      v_il(jpi,jpj,jpl) , h_il(jpi,jpj,jpl) , a_ip_eff (jpi,jpj,jpl) ,                     &
-         &      dh_i_sum_2d(jpi,jpj,jpl) , dh_s_mlt_2d(jpi,jpj,jpl) , STAT = ierr(ii) )
+      ALLOCATE( at_i_b(A2D(0))     , h_i_b (A2D(0),jpl) , a_i_b(A2D(0),jpl) , v_i_b(A2D(0),jpl) ,  &
+         &      v_s_b (A2D(0),jpl) , h_s_b (A2D(0),jpl) ,                                          &
+         &      v_ip_b(A2D(0),jpl) , v_il_b(A2D(0),jpl) ,                                          &
+         &      sv_i_b(A2D(0),jpl) , e_i_b (A2D(0),nlay_i,jpl) , e_s_b(A2D(0),nlay_s,jpl) , STAT=ierr(ii) )
 
+      ! * fluxes
+      ii = ii + 1
+      ALLOCATE( qsb_ice_bot(A2D(0)) , qlead      (A2D(0)) , qt_atm_oi  (A2D(0)) , qt_oce_ai  (A2D(0)) , fhld       (A2D(0)) , &
+         &      wfx_snw_sni(A2D(0)) , wfx_snw    (A2D(0)) , wfx_snw_dyn(A2D(0)) , wfx_snw_sum(A2D(0)) , wfx_snw_sub(A2D(0)) , &
+         &      wfx_ice    (A2D(0)) , wfx_sub    (A2D(0)) , wfx_ice_sub(A2D(0)) , wfx_lam    (A2D(0)) ,                       &
+         &      wfx_pnd    (A2D(0)) , wfx_bog    (A2D(0)) , wfx_dyn    (A2D(0)) , wfx_bom    (A2D(0)) , wfx_sum    (A2D(0)) , &
+         &      wfx_sni    (A2D(0)) , wfx_opw    (A2D(0)) , wfx_spr(A2D(0)) ,                                     &
+         &      sfx_bri    (A2D(0)) , sfx_dyn    (A2D(0)) , sfx_sub(A2D(0)) , sfx_lam(A2D(0)) ,                   &
+         &      sfx_bog    (A2D(0)) , sfx_bom    (A2D(0)) , sfx_sum(A2D(0)) , sfx_sni(A2D(0)) , sfx_opw(A2D(0)) , &
+         &      hfx_snw    (A2D(0)) , hfx_sub    (A2D(0)) ,                                                       &
+         &      hfx_sum    (A2D(0)) , hfx_bom    (A2D(0)) , hfx_bog(A2D(0)) , hfx_dif(A2D(0)) ,                   &
+         &      hfx_opw    (A2D(0)) , hfx_thd    (A2D(0)) , hfx_dyn(A2D(0)) , hfx_spr(A2D(0)) ,                   &
+         &      hfx_err_dif(A2D(0)) , wfx_err_sub(A2D(0))                   , STAT=ierr(ii) )
       ii = ii + 1
-      ALLOCATE( at_ip(jpi,jpj) , hm_ip(jpi,jpj) , vt_ip(jpi,jpj) , hm_il(jpi,jpj) , vt_il(jpi,jpj) , STAT = ierr(ii) )
+      ALLOCATE( wfx_res(A2D(0)) , sfx_res(A2D(0)) , hfx_res(A2D(0)) , STAT=ierr(ii) )
+      ii = ii + 1
+      ALLOCATE( qtr_ice_bot(A2D(0),jpl) , cnd_ice(A2D(0),jpl) , t1_ice(A2D(0),jpl) , STAT=ierr(ii) )
+
+      ! * ice rheology
+      ii = ii+1
+      ALLOCATE( delta_i(A2D(0)) , divu_i(A2D(0)) , shear_i(A2D(0)) , STAT=ierr(ii) )
 
-      ! * Old values of global variables
+      ! * mean and total
       ii = ii + 1
-      ALLOCATE( v_s_b (jpi,jpj,jpl) , v_i_b (jpi,jpj,jpl) , h_s_b(jpi,jpj,jpl)        , h_i_b(jpi,jpj,jpl),         &
-         &      v_ip_b(jpi,jpj,jpl) , v_il_b(jpi,jpj,jpl) ,                                                         &
-         &      a_i_b (jpi,jpj,jpl) , sv_i_b(jpi,jpj,jpl) , e_i_b(jpi,jpj,nlay_i,jpl) , e_s_b(jpi,jpj,nlay_s,jpl) , &
-         &      STAT=ierr(ii) )
+      ALLOCATE( t_bo (A2D(0)) , st_i (A2D(0)) , et_i(A2D(0)) , et_s (A2D(0)) , hm_i (A2D(0)) ,  &
+         &      hm_ip(A2D(0)) , hm_il(A2D(0)) , tm_i(A2D(0)) , tm_s (A2D(0)) ,  &
+         &      sm_i (A2D(0)) , hm_s (A2D(0)) , om_i(A2D(0)) , bvm_i(A2D(0)) ,  &
+         &      tm_su(A2D(0)) , STAT=ierr(ii) )
 
+      ! * others
       ii = ii + 1
-      ALLOCATE( u_ice_b(jpi,jpj) , v_ice_b(jpi,jpj) , at_i_b(jpi,jpj) , STAT=ierr(ii) )
+      ALLOCATE( tau_icebfr(A2D(0)) , dh_i_sum_2d(A2D(0),jpl) , dh_s_mlt_2d(A2D(0),jpl) ,  STAT=ierr(ii) )
+      ii = 1
+      ALLOCATE( ht_i_new (A2D(0)) , fraz_frac (A2D(0)) , STAT=ierr(ii) )
 
       ! * Ice thickness distribution variables
       ii = ii + 1
@@ -536,19 +565,19 @@ CONTAINS
 
       ! * Ice diagnostics
       ii = ii + 1
-      ALLOCATE( diag_trp_vi(jpi,jpj) , diag_trp_vs (jpi,jpj) , diag_trp_ei(jpi,jpj),                      &
-         &      diag_trp_es(jpi,jpj) , diag_trp_sv (jpi,jpj) , diag_heat  (jpi,jpj),                      &
-         &      diag_sice  (jpi,jpj) , diag_vice   (jpi,jpj) , diag_vsnw  (jpi,jpj), diag_aice(jpi,jpj), diag_vpnd(jpi,jpj),  &
-         &      diag_adv_mass(jpi,jpj), diag_adv_salt(jpi,jpj), diag_adv_heat(jpi,jpj), STAT=ierr(ii) )
+      ALLOCATE( diag_trp_vi  (A2D(0)) , diag_trp_vs  (A2D(0)) , diag_trp_ei  (A2D(0)) ,                                         &
+         &      diag_trp_es  (A2D(0)) , diag_trp_sv  (A2D(0)) , diag_heat    (A2D(0)) ,                                         &
+         &      diag_sice    (A2D(0)) , diag_vice    (A2D(0)) , diag_vsnw    (A2D(0)) , diag_aice(A2D(0)) , diag_vpnd(A2D(0)) , &
+         &      diag_adv_mass(A2D(0)) , diag_adv_salt(A2D(0)) , diag_adv_heat(A2D(0)) , STAT=ierr(ii) )
 
       ! * Ice conservation
       ii = ii + 1
-      ALLOCATE( diag_v (jpi,jpj) , diag_s (jpi,jpj) , diag_t (jpi,jpj),   &
-         &      diag_fv(jpi,jpj) , diag_fs(jpi,jpj) , diag_ft(jpi,jpj), STAT=ierr(ii) )
+      ALLOCATE( diag_v (A2D(0)) , diag_s (A2D(0)) , diag_t (A2D(0)),   &
+         &      diag_fv(A2D(0)) , diag_fs(A2D(0)) , diag_ft(A2D(0)), STAT=ierr(ii) )
 
       ! * SIMIP diagnostics
       ii = ii + 1
-      ALLOCATE( t_si(jpi,jpj,jpl) , tm_si(jpi,jpj) , qcn_ice_bot(jpi,jpj,jpl) , qcn_ice_top(jpi,jpj,jpl) , STAT = ierr(ii) )
+      ALLOCATE( t_si(A2D(0),jpl) , tm_si(A2D(0)) , qcn_ice_bot(A2D(0),jpl) , qcn_ice_top(A2D(0),jpl) , STAT = ierr(ii) )
 
       ice_alloc = MAXVAL( ierr(:) )
       IF( ice_alloc /= 0 )   CALL ctl_stop( 'STOP', 'ice_alloc: failed to allocate arrays.' )
diff --git a/src/ICE/ice1d.F90 b/src/ICE/ice1d.F90
index 8c610bf4..a0afce7e 100644
--- a/src/ICE/ice1d.F90
+++ b/src/ICE/ice1d.F90
@@ -134,9 +134,6 @@ MODULE ice1D
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e_i_1d      !:    Ice  enthalpy per unit volume
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e_s_1d      !:    Snow enthalpy per unit volume
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   eh_i_old    !: ice heat content (q*h, J.m-2)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   h_i_old     !: ice thickness layer (m)
-
    ! Conduction flux diagnostics (SIMIP)
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qcn_ice_bot_1d
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qcn_ice_top_1d
@@ -163,9 +160,13 @@ MODULE ice1D
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   v_il_2d 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_su_2d 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   h_i_2d
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   s_i_2d
 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   a_ib_2d
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   h_ib_2d
+
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_i_2d 
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_s_2d 
    
    !!----------------------------------------------------------------------
    !! NEMO/ICE 4.0 , NEMO Consortium (2018)
@@ -179,62 +180,79 @@ CONTAINS
       !!                ***  ROUTINE ice1D_alloc ***
       !!---------------------------------------------------------------------!
       INTEGER ::   ice1D_alloc   ! return value
-      INTEGER ::   ierr(8), ii
+      INTEGER ::   ierr(12), ii
       !!---------------------------------------------------------------------!
       ierr(:) = 0
+      ii = 0
+      
+      ! * Ice global state variables
+      ii = ii + 1
+      ALLOCATE( nptidx  (jpij) , &
+         &      h_i_1d  (jpij) , a_i_1d (jpij) , v_i_1d  (jpij) , &
+         &      v_s_1d  (jpij) , h_s_1d (jpij) ,                  &
+         &      s_i_1d  (jpij) , sv_i_1d(jpij) , o_i_1d  (jpij) , oa_i_1d (jpij) , &
+         &      a_ip_1d (jpij) , v_ip_1d(jpij) , h_ip_1d (jpij) , &
+         &      v_il_1d (jpij) , h_il_1d(jpij) ,                  &
+         &      t_su_1d (jpij) , t_s_1d (jpij,nlay_s) , t_i_1d (jpij,nlay_i), sz_i_1d(jpij,nlay_i) , &
+         &      ato_i_1d(jpij) , STAT=ierr(ii) )  
+      ii = ii + 1
+      ALLOCATE( e_i_1d(jpij,nlay_i) , e_s_1d(jpij,nlay_s) , STAT=ierr(ii) )
 
-      ii = 1
-      ALLOCATE( nptidx    (jpij) ,   &
-         &      qlead_1d  (jpij) , qtr_ice_bot_1d(jpij) , qsr_ice_1d(jpij) ,   &
-         &      qns_ice_1d(jpij) , qml_ice_1d    (jpij) , qcn_ice_1d(jpij) , qtr_ice_top_1d(jpij) , &
-         &      cnd_ice_1d(jpij) , t1_ice_1d     (jpij) , t_bo_1d   (jpij) ,   &
+      ! * Before values of global variables
+      ii = ii + 1
+      ALLOCATE( a_ib_1d (jpij) , h_ib_1d (jpij) , STAT=ierr(ii) )
+
+      ! * heat fluxes
+      ii = ii + 1
+      ALLOCATE( qsr_ice_1d  (jpij) , qsb_ice_bot_1d(jpij) , qns_ice_1d    (jpij) , qml_ice_1d(jpij) , &
+         &      qprec_ice_1d(jpij) , dqns_ice_1d   (jpij) , qlead_1d      (jpij) , fhld_1d   (jpij) , &
+         &      qt_oce_ai_1d(jpij) , qtr_ice_bot_1d(jpij) , qtr_ice_top_1d(jpij) , &
          &      hfx_sum_1d(jpij) , hfx_bom_1d    (jpij) , hfx_bog_1d(jpij) ,   & 
          &      hfx_dif_1d(jpij) , hfx_opw_1d    (jpij) , hfx_dyn_1d(jpij) ,   &
-         &      rn_amax_1d(jpij) ,                                             &
          &      hfx_thd_1d(jpij) , hfx_spr_1d    (jpij) ,                      &
          &      hfx_snw_1d(jpij) , hfx_sub_1d    (jpij) ,                      &
-         &      hfx_res_1d(jpij) , hfx_err_dif_1d(jpij) , qt_oce_ai_1d(jpij), STAT=ierr(ii) )
-      !
+         &      hfx_res_1d(jpij) , hfx_err_dif_1d(jpij) , STAT=ierr(ii) )     
+      ii = ii + 1
+      ALLOCATE( qcn_ice_1d(jpij) , qcn_ice_bot_1d(jpij) , qcn_ice_top_1d(jpij) , &
+         &      cnd_ice_1d(jpij) , t1_ice_1d     (jpij) , STAT=ierr(ii) )
+      
+      ! * mass fluxes
       ii = ii + 1
-      ALLOCATE( sprecip_1d    (jpij) , at_i_1d       (jpij) , ato_i_1d      (jpij) ,                         &
-         &      qsb_ice_bot_1d(jpij) , wfx_snw_sni_1d(jpij) , wfx_spr_1d    (jpij) , wfx_snw_sum_1d(jpij) ,  &
-         &      fhld_1d       (jpij) , wfx_sub_1d    (jpij) , wfx_bog_1d    (jpij) , wfx_bom_1d    (jpij) ,  &
+      ALLOCATE( sprecip_1d    (jpij) , evap_ice_1d   (jpij) ,                         &
+         &      wfx_snw_sni_1d(jpij) , wfx_spr_1d    (jpij) , wfx_snw_sum_1d(jpij) ,  &
+         &      wfx_sub_1d    (jpij) , wfx_bog_1d    (jpij) , wfx_bom_1d    (jpij) ,  &
          &      wfx_sum_1d    (jpij) , wfx_sni_1d    (jpij) , wfx_opw_1d    (jpij) , wfx_res_1d    (jpij) ,  &
          &      wfx_snw_sub_1d(jpij) , wfx_snw_dyn_1d(jpij) , wfx_ice_sub_1d(jpij) , wfx_err_sub_1d(jpij) ,  &
-         &      wfx_lam_1d    (jpij) , wfx_dyn_1d    (jpij) , wfx_pnd_1d    (jpij) , dqns_ice_1d   (jpij) , evap_ice_1d (jpij) , &
-         &      qprec_ice_1d  (jpij) ,                                                             &  
-         &      sfx_bri_1d    (jpij) , sfx_bog_1d (jpij) , sfx_bom_1d (jpij) , sfx_sum_1d (jpij),  &
-         &      sfx_sni_1d    (jpij) , sfx_opw_1d (jpij) , sfx_res_1d (jpij) , sfx_sub_1d (jpij),  &
-         &      sfx_lam_1d    (jpij) , sfx_dyn_1d(jpij)  , STAT=ierr(ii) )
-      !
+         &      wfx_lam_1d    (jpij) , wfx_dyn_1d    (jpij) , wfx_pnd_1d    (jpij) , STAT=ierr(ii) )
+      
+      ! * salt fluxes
       ii = ii + 1
-      ALLOCATE( t_su_1d (jpij) , t_si_1d (jpij) , a_i_1d    (jpij) , a_ib_1d (jpij) ,                   &
-         &      h_i_1d  (jpij) , h_ib_1d (jpij) , h_s_1d    (jpij) ,                                    &    
-         &      dh_s_tot(jpij) , dh_i_sum(jpij) , dh_i_itm  (jpij) , dh_i_bom(jpij) , dh_i_bog(jpij) ,  &    
-         &      dh_i_sub(jpij) , dh_s_mlt(jpij) , dh_snowice(jpij) , s_i_1d  (jpij) , s_i_new (jpij) ,  &
-         &      a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d    (jpij) , v_s_1d  (jpij) , v_il_1d (jpij) ,  &
-         &      h_il_1d (jpij) , h_ip_1d (jpij) ,                                                       &
-         &      sv_i_1d (jpij) , oa_i_1d (jpij) , o_i_1d    (jpij) , STAT=ierr(ii) )
-      !
+      ALLOCATE( sfx_bri_1d(jpij) , sfx_bog_1d (jpij) , sfx_bom_1d (jpij) , sfx_sum_1d (jpij),  &
+         &      sfx_sni_1d(jpij) , sfx_opw_1d (jpij) , sfx_res_1d (jpij) , sfx_sub_1d (jpij),  &
+         &      sfx_lam_1d(jpij) , sfx_dyn_1d(jpij)  , STAT=ierr(ii) )
+      
+      ! * thermo tickness change
       ii = ii + 1
-      ALLOCATE( t_s_1d  (jpij,nlay_s)     , t_i_1d (jpij,nlay_i)     , sz_i_1d(jpij,nlay_i) ,  &            
-         &      e_i_1d  (jpij,nlay_i)     , e_s_1d (jpij,nlay_s)     ,                         &
-         &      eh_i_old(jpij,0:nlay_i+1) , h_i_old(jpij,0:nlay_i+1) , STAT=ierr(ii) )
-      !
-      ii = ii + 1
-      ALLOCATE( qcn_ice_bot_1d(jpij) , qcn_ice_top_1d(jpij) , STAT=ierr(ii) )
-      !
+      ALLOCATE( dh_s_tot(jpij) , dh_i_sum(jpij) , dh_i_itm  (jpij) , dh_i_bom(jpij) , dh_i_bog(jpij) ,  &    
+         &      dh_i_sub(jpij) , dh_s_mlt(jpij) , dh_snowice(jpij) , STAT=ierr(ii) )
+
+      ! * other
       ii = ii + 1
-      ALLOCATE( sst_1d(jpij) , sss_1d(jpij) , frq_m_1d(jpij) , STAT=ierr(ii) )
-      !
+      ALLOCATE( at_i_1d(jpij) , rn_amax_1d(jpij) , t_si_1d(jpij) , t_bo_1d (jpij) , &
+         &      s_i_new(jpij) , sst_1d    (jpij) , sss_1d (jpij) , frq_m_1d(jpij) , STAT=ierr(ii) )
       ii = ii + 1
       ALLOCATE( tice_cvgerr_1d(jpij) , tice_cvgstp_1d(jpij) , STAT=ierr(ii) )
       !
+      ! * 2d arrays
       ii = ii + 1
       ALLOCATE( a_i_2d (jpij,jpl) , a_ib_2d(jpij,jpl) , h_i_2d (jpij,jpl) , h_ib_2d(jpij,jpl) ,  &
          &      v_i_2d (jpij,jpl) , v_s_2d (jpij,jpl) , oa_i_2d(jpij,jpl) , sv_i_2d(jpij,jpl) ,  &
-         &      a_ip_2d(jpij,jpl) , v_ip_2d(jpij,jpl) , t_su_2d(jpij,jpl) , v_il_2d(jpij,jpl) ,  &
+         &      a_ip_2d(jpij,jpl) , v_ip_2d(jpij,jpl) , t_su_2d(jpij,jpl) , v_il_2d(jpij,jpl) , s_i_2d(jpij,jpl) , &
          &      STAT=ierr(ii) )
+      !
+      ! * 3d arrays
+      ii = ii + 1
+      ALLOCATE( e_i_2d(jpij,nlay_i,jpl) , e_s_2d(jpij,nlay_s,jpl) , STAT=ierr(ii) )
 
       ice1D_alloc = MAXVAL( ierr(:) )
       IF( ice1D_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice1D_alloc: failed to allocate arrays.'  )
diff --git a/src/ICE/icealb.F90 b/src/ICE/icealb.F90
index 7a7b3e42..af7e8686 100644
--- a/src/ICE/icealb.F90
+++ b/src/ICE/icealb.F90
@@ -48,7 +48,7 @@ MODULE icealb
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE ice_alb( pt_su, ph_ice, ph_snw, ld_pnd_alb, pafrac_pnd, ph_pnd, pcloud_fra, palb_ice )
+   SUBROUTINE ice_alb( ld_pnd_alb, pt_su, ph_ice, ph_snw, pafrac_pnd, ph_pnd, pcloud_fra, palb_ice )
       !!----------------------------------------------------------------------
       !!               ***  ROUTINE ice_alb  ***
       !!          
@@ -94,16 +94,16 @@ CONTAINS
       !!                Brandt et al. 2005, J. Climate, vol 18
       !!                Grenfell & Perovich 2004, JGR, vol 109 
       !!----------------------------------------------------------------------
-      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pt_su        !  ice surface temperature (Kelvin)
-      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_ice       !  sea-ice thickness
-      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_snw       !  snow depth
-      LOGICAL , INTENT(in   )                   ::   ld_pnd_alb   !  effect of melt ponds on albedo
-      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pafrac_pnd   !  melt pond relative fraction (per unit ice area)
-      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_pnd       !  melt pond depth
-      REAL(wp), INTENT(in   ), DIMENSION(:,:)   ::   pcloud_fra   !  cloud fraction
-      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   palb_ice     !  albedo of ice
+      LOGICAL , INTENT(in   )                        ::   ld_pnd_alb   !  effect of melt ponds on albedo
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpl) ::   pt_su        !  ice surface temperature (Kelvin)
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpl) ::   ph_ice       !  sea-ice thickness
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpl) ::   ph_snw       !  snow depth
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpl) ::   pafrac_pnd   !  melt pond relative fraction (per unit ice area)
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpl) ::   ph_pnd       !  melt pond depth
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0))     ::   pcloud_fra   !  cloud fraction
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0),jpl) ::   palb_ice     !  albedo of ice
       !
-      REAL(wp), DIMENSION(jpi,jpj,jpl) :: za_s_fra   ! ice fraction covered by snow
+      REAL(wp), DIMENSION(A2D(0),jpl) :: za_s_fra   ! ice fraction covered by snow
       INTEGER  ::   ji, jj, jl                ! dummy loop indices
       REAL(wp) ::   z1_c1, z1_c2,z1_c3, z1_c4 ! local scalar
       REAL(wp) ::   z1_href_pnd               ! inverse of the characteristic length scale (Lecomte et al. 2015)
@@ -121,10 +121,10 @@ CONTAINS
       z1_c3 = 1._wp / 0.02_wp
       z1_c4 = 1._wp / 0.03_wp
       !
-      CALL ice_var_snwfra( ph_snw, za_s_fra )   ! calculate ice fraction covered by snow
+      CALL ice_var_snwfra( ph_snw(:,:,:), za_s_fra(:,:,:) )   ! calculate ice fraction covered by snow
       !
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! palb_ice used over the full domain in icesbc
+         DO_2D( 0, 0, 0, 0 )   ! palb_ice used over the full domain in icesbc
             !
             !---------------------------------------------!
             !--- Specific snow, ice and pond fractions ---!
@@ -164,10 +164,10 @@ CONTAINS
             zalb_pnd = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd(ji,jj,jl) * z1_href_pnd ) 
             !
             !                       !--- Surface albedo is weighted mean of snow, ponds and bare ice contributions
-            zalb_os = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * tmask(ji,jj,1)
+            zalb_os = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * smask0(ji,jj)
             !
             zalb_cs = zalb_os - ( - 0.1010_wp * zalb_os * zalb_os  &
-               &                  + 0.1933_wp * zalb_os - 0.0148_wp ) * tmask(ji,jj,1)
+               &                  + 0.1933_wp * zalb_os - 0.0148_wp ) * smask0(ji,jj)
             !
             ! albedo depends on cloud fraction because of non-linear spectral effects
             palb_ice(ji,jj,jl) = ( 1._wp - pcloud_fra(ji,jj) ) * zalb_cs + pcloud_fra(ji,jj) * zalb_os
diff --git a/src/ICE/icecor.F90 b/src/ICE/icecor.F90
index 0b7b53e6..d2089560 100644
--- a/src/ICE/icecor.F90
+++ b/src/ICE/icecor.F90
@@ -25,7 +25,6 @@ MODULE icecor
    USE iom            ! I/O manager library
    USE lib_mpp        ! MPP library
    USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
-   USE lbclnk         ! lateral boundary conditions (or mpp links)
    USE timing         ! Timing
 
    IMPLICIT NONE
@@ -68,29 +67,32 @@ CONTAINS
       !                             !-----------------------------------------------------
       !                             !  ice thickness must exceed himin (for temp. diff.) !
       !                             !-----------------------------------------------------
-      WHERE( a_i(:,:,:) >= epsi20 )   ;   h_i(:,:,:) = v_i(:,:,:) / a_i(:,:,:)
-      ELSEWHERE                       ;   h_i(:,:,:) = 0._wp
+      WHERE( a_i(A2D(0),:) >= epsi20 )   ;   h_i(A2D(0),:) = v_i(A2D(0),:) / a_i(A2D(0),:)
+      ELSEWHERE                          ;   h_i(A2D(0),:) = 0._wp
       END WHERE
-      WHERE( h_i(:,:,:) < rn_himin )      a_i(:,:,:) = a_i(:,:,:) * h_i(:,:,:) / rn_himin
+      IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+         WHERE( h_i(A2D(0),:) < rn_himin )  a_ip(A2D(0),:) = a_ip(A2D(0),:) * h_i(A2D(0),:) / rn_himin
+      ENDIF
+      WHERE( h_i(A2D(0),:) < rn_himin )     a_i (A2D(0),:) = a_i (A2D(0),:) * h_i(A2D(0),:) / rn_himin
       !
       !                             !-----------------------------------------------------
       !                             !  ice concentration should not exceed amax          !
       !                             !-----------------------------------------------------
-      at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
+      at_i(A2D(0)) = SUM( a_i(A2D(0),:), dim=3 )
       DO jl = 1, jpl
-         WHERE( at_i(:,:) > rn_amax_2d(:,:) )   a_i(:,:,jl) = a_i(:,:,jl) * rn_amax_2d(:,:) / at_i(:,:)
+         WHERE( at_i(A2D(0)) > rn_amax_2d(A2D(0)) )   a_i(A2D(0),jl) = a_i(A2D(0),jl) * rn_amax_2d(A2D(0)) / at_i(A2D(0))
       END DO    
       !                             !-----------------------------------------------------
       !                             !  Rebin categories with thickness out of bounds     !
       !                             !-----------------------------------------------------
-      IF ( jpl > 1 )   CALL ice_itd_reb( kt )
+      IF( jpl > 1 )   CALL ice_itd_reb( kt )
       !
       !                             !-----------------------------------------------------
       IF ( nn_icesal == 2 ) THEN    !  salinity must stay in bounds [Simin,Simax]        !
          !                          !-----------------------------------------------------
          zzc = rhoi * r1_Dt_ice
          DO jl = 1, jpl
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zsal = sv_i(ji,jj,jl)
                sv_i(ji,jj,jl) = MIN(  MAX( rn_simin*v_i(ji,jj,jl) , sv_i(ji,jj,jl) ) , rn_simax*v_i(ji,jj,jl)  )
                IF( kn /= 0 ) & ! no ice-ocean exchanges if kn=0 (for bdy for instance) otherwise conservation diags will fail
diff --git a/src/ICE/icectl.F90 b/src/ICE/icectl.F90
index ad20e673..a235e056 100644
--- a/src/ICE/icectl.F90
+++ b/src/ICE/icectl.F90
@@ -83,25 +83,33 @@ CONTAINS
       CHARACTER(len=*), INTENT(in)    ::   cd_routine    ! name of the routine
       REAL(wp)        , INTENT(inout) ::   pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft
       !!
+      INTEGER  ::   ji, jj, jl           ! dummy loop index
       REAL(wp) ::   zdiag_mass, zdiag_salt, zdiag_heat
-      REAL(wp), DIMENSION(jpi,jpj,10)     ::   ztmp3
-      REAL(wp), DIMENSION(jpi,jpj,jpl,8)  ::   ztmp4
-      REAL(wp), DIMENSION(10)             ::   zchk3         
-      REAL(wp), DIMENSION(8)              ::   zchk4         
+      REAL(wp), DIMENSION(A2D(0),10)     ::   ztmp3
+      REAL(wp), DIMENSION(A2D(0),jpl,8)  ::   ztmp4
+      REAL(wp), DIMENSION(10)            ::   zchk3         
+      REAL(wp), DIMENSION(8)             ::   zchk4         
       !!-------------------------------------------------------------------
       !
-      ! -- quantities -- !
-      ztmp3(:,:,1) = SUM( v_i * rhoi + v_s * rhos + ( v_ip + v_il ) * rhow, dim=3 ) * e1e2t        ! volume
-      ztmp3(:,:,2) = SUM( sv_i * rhoi, dim=3 ) * e1e2t                                             ! salt
-      ztmp3(:,:,3) = ( SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 ) ) * e1e2t ! heat
-      !
-      ! -- fluxes -- !
-      ztmp3(:,:,4) = ( wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd &  ! mass
-         &          + wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr ) * e1e2t
-      ztmp3(:,:,5) = ( sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + sfx_opw &                                ! salt
-         &          + sfx_res + sfx_dyn + sfx_sub + sfx_lam ) * e1e2t
-      ztmp3(:,:,6) = ( hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw &                                ! heat
-         &          - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr ) * e1e2t
+      DO_2D( 0, 0, 0, 0 )
+         ! -- quantities -- !
+         ztmp3(ji,jj,1) = SUM(  v_i(ji,jj,:) * rhoi + v_s(ji,jj,:) * rhos + &
+            &                    ( v_ip(ji,jj,:) + v_il(ji,jj,:) ) * rhow ) * e1e2t(ji,jj)   ! volume
+         ztmp3(ji,jj,2) = SUM( sv_i(ji,jj,:) * rhoi ) * e1e2t(ji,jj)                         ! salt
+         ztmp3(ji,jj,3) = ( SUM( SUM( e_i(ji,jj,:,:), dim=2 ) ) + &                          ! heat
+            &               SUM( SUM( e_s(ji,jj,:,:), dim=2 ) ) ) * e1e2t(ji,jj)
+         !
+         ! -- fluxes -- !
+         ztmp3(ji,jj,4) = ( wfx_bog    (ji,jj) + wfx_bom    (ji,jj) + wfx_sum    (ji,jj) + wfx_sni    (ji,jj) &                   ! mass
+            &             + wfx_opw    (ji,jj) + wfx_res    (ji,jj) + wfx_dyn    (ji,jj) + wfx_lam    (ji,jj) + wfx_pnd(ji,jj) &
+            &             + wfx_snw_sni(ji,jj) + wfx_snw_sum(ji,jj) + wfx_snw_dyn(ji,jj) + wfx_snw_sub(ji,jj) &
+            &             + wfx_ice_sub(ji,jj) + wfx_spr(ji,jj) ) * e1e2t(ji,jj)
+         ztmp3(ji,jj,5) = ( sfx_bri(ji,jj) + sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) + sfx_opw(ji,jj) & ! salt
+            &             + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj) ) * e1e2t(ji,jj)
+         ztmp3(ji,jj,6) = ( hfx_sum(ji,jj) + hfx_bom(ji,jj) + hfx_bog(ji,jj) + hfx_dif(ji,jj) + hfx_opw(ji,jj) + hfx_snw(ji,jj) & ! heat
+            &             - hfx_thd(ji,jj) - hfx_dyn(ji,jj) - hfx_res(ji,jj) - hfx_sub(ji,jj) - hfx_spr(ji,jj) ) * e1e2t(ji,jj)
+         !
+      END_2D
       !
       ! -- global sum -- !
       zchk3(1:6) = glob_sum_vec( 'icectl', ztmp3(:,:,1:6) )
@@ -123,25 +131,33 @@ CONTAINS
          zdiag_heat = ( zchk3(3) - pdiag_t ) * r1_Dt_ice + ( zchk3(6) - pdiag_ft )
 
          ! -- max concentration diag -- !
-         ztmp3(:,:,7) = SUM( a_i, dim=3 )
-         zchk3(7)     = glob_max( 'icectl', ztmp3(:,:,7) )
-
+         DO_2D( 0, 0, 0, 0 )
+            ztmp3(ji,jj,7) = SUM( a_i(ji,jj,:) )
+         END_2D
+         zchk3(7) = glob_max( 'icectl', ztmp3(:,:,7) )
+         
          ! -- advection scheme is conservative? -- !
-         ztmp3(:,:,8 ) = diag_adv_mass * e1e2t 
-         ztmp3(:,:,9 ) = diag_adv_heat * e1e2t 
-         ztmp3(:,:,10) = SUM( a_i + epsi10, dim=3 ) * e1e2t ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
-         zchk3(8:10)   = glob_sum_vec( 'icectl', ztmp3(:,:,8:10) )
+         DO_2D( 0, 0, 0, 0 )
+            ztmp3(ji,jj,8 ) = diag_adv_mass(ji,jj) * e1e2t(ji,jj) 
+            ztmp3(ji,jj,9 ) = diag_adv_heat(ji,jj) * e1e2t(ji,jj) 
+            ztmp3(ji,jj,10) = SUM( a_i(ji,jj,:) + epsi10 ) * e1e2t(ji,jj) ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
+         END_2D
+         zchk3(8:10) = glob_sum_vec( 'icectl', ztmp3(:,:,8:10) )
          
          ! -- min diags -- !
-         ztmp4(:,:,:,1) = v_i
-         ztmp4(:,:,:,2) = v_s
-         ztmp4(:,:,:,3) = v_ip
-         ztmp4(:,:,:,4) = v_il
-         ztmp4(:,:,:,5) = a_i
-         ztmp4(:,:,:,6) = sv_i
-         ztmp4(:,:,:,7) = SUM( e_i, dim=3 )
-         ztmp4(:,:,:,8) = SUM( e_s, dim=3 )
-         zchk4(1:8)     = glob_min_vec( 'icectl', ztmp4(:,:,:,1:8) )
+         DO jl = 1, jpl
+            DO_2D( 0, 0, 0, 0 )
+               ztmp4(ji,jj,jl,1) = v_i(ji,jj,jl)
+               ztmp4(ji,jj,jl,2) = v_s(ji,jj,jl)
+               ztmp4(ji,jj,jl,3) = v_ip(ji,jj,jl)
+               ztmp4(ji,jj,jl,4) = v_il(ji,jj,jl)
+               ztmp4(ji,jj,jl,5) = a_i(ji,jj,jl)
+               ztmp4(ji,jj,jl,6) = sv_i(ji,jj,jl)
+               ztmp4(ji,jj,jl,7) = SUM( e_i(ji,jj,:,jl) )
+               ztmp4(ji,jj,jl,8) = SUM( e_s(ji,jj,:,jl) )
+            END_2D
+         ENDDO
+         zchk4(1:8) = glob_min_vec( 'icectl', ztmp4(:,:,:,1:8) )
 
          IF( lwp ) THEN
             ! check conservation issues
@@ -188,17 +204,21 @@ CONTAINS
       !!-------------------------------------------------------------------
       CHARACTER(len=*), INTENT(in) ::   cd_routine    ! name of the routine
       !!
-      REAL(wp), DIMENSION(jpi,jpj,4)     ::   ztmp
-      REAL(wp), DIMENSION(4)             ::   zchk         
+      INTEGER  ::   ji, jj           ! dummy loop index
+      REAL(wp), DIMENSION(A2D(0),4) ::   ztmp
+      REAL(wp), DIMENSION(4)        ::   zchk         
       !!-------------------------------------------------------------------
-
-      ztmp(:,:,1) = ( wfx_ice + wfx_snw + wfx_spr + wfx_sub + wfx_pnd + diag_vice + diag_vsnw + diag_vpnd - diag_adv_mass ) * e1e2t ! mass diag
-      ztmp(:,:,2) = ( sfx + diag_sice - diag_adv_salt ) * e1e2t                                                                     ! salt
-      ztmp(:,:,3) = ( qt_oce_ai - qt_atm_oi + diag_heat - diag_adv_heat ) * e1e2t                                                   ! heat
-      ! equivalent to this:
-      !! ( -diag_heat + hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw &
-      !!   &                                        - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr ) * e1e2t )
-      ztmp(:,:,4) =  SUM( a_i + epsi10, dim=3 ) * e1e2t      ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
+      DO_2D( 0, 0, 0, 0 )
+         !
+         ztmp(ji,jj,1) = ( wfx_ice  (ji,jj) + wfx_snw  (ji,jj) + wfx_pnd  (ji,jj) + wfx_spr(ji,jj) + wfx_sub(ji,jj)  &
+            &          + diag_vice(ji,jj) + diag_vsnw(ji,jj) + diag_vpnd(ji,jj) - diag_adv_mass(ji,jj) ) * e1e2t(ji,jj) ! mass diag
+         ztmp(ji,jj,2) = ( sfx(ji,jj) + diag_sice(ji,jj) - diag_adv_salt(ji,jj) ) * e1e2t(ji,jj)                          ! salt
+         ztmp(ji,jj,3) = ( qt_oce_ai(ji,jj) - qt_atm_oi(ji,jj) + diag_heat(ji,jj) - diag_adv_heat(ji,jj) ) * e1e2t(ji,jj) ! heat
+         ! equivalent to this:
+         !! ( -diag_heat + hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw &
+         !!   &                                        - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr ) * e1e2t )
+         ztmp(ji,jj,4) = SUM( a_i(ji,jj,:) + epsi10 ) * e1e2t(ji,jj) ! ice area (+epsi10 to set a threshold > 0 when there is no ice)
+      END_2D
 
       ! global sums
       zchk(1:4)   = glob_sum_vec( 'icectl', ztmp(:,:,1:4) )
@@ -226,11 +246,11 @@ CONTAINS
       !!-------------------------------------------------------------------
       INTEGER         , INTENT(in) ::   icount        ! called at: =0 the begining of the routine, =1  the end
       CHARACTER(len=*), INTENT(in) ::   cd_routine    ! name of the routine
-      REAL(wp)        , DIMENSION(jpi,jpj), INTENT(inout) ::   pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft
+      REAL(wp)        , DIMENSION(A2D(0)), INTENT(inout) ::   pdiag_v, pdiag_s, pdiag_t, pdiag_fv, pdiag_fs, pdiag_ft
       !!
-      REAL(wp), DIMENSION(jpi,jpj) ::   zdiag_mass, zdiag_salt, zdiag_heat, &
-         &                              zdiag_amin, zdiag_vmin, zdiag_smin, zdiag_emin !!, zdiag_amax
-      INTEGER ::   jl, jk
+      REAL(wp), DIMENSION(A2D(0)) ::   zdiag_mass, zdiag_salt, zdiag_heat, &
+         &                             zdiag_amin, zdiag_vmin, zdiag_smin, zdiag_emin !!, zdiag_amax
+      INTEGER ::   ji, jj, jl, jk
       LOGICAL ::   ll_stop_m = .FALSE.
       LOGICAL ::   ll_stop_s = .FALSE.
       LOGICAL ::   ll_stop_t = .FALSE.
@@ -239,62 +259,79 @@ CONTAINS
       !
       IF( icount == 0 ) THEN
 
-         pdiag_v = SUM( v_i  * rhoi + v_s * rhos + ( v_ip + v_il ) * rhow, dim=3 )
-         pdiag_s = SUM( sv_i * rhoi , dim=3 )
-         pdiag_t = SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 )
+      DO_2D( 0, 0, 0, 0 )
+         pdiag_v(ji,jj) = SUM( v_i(ji,jj,:)  * rhoi + v_s(ji,jj,:) * rhos + ( v_ip(ji,jj,:) + v_il(ji,jj,:) ) * rhow )
+         pdiag_s(ji,jj) = SUM( sv_i(ji,jj,:) * rhoi )
+         pdiag_t(ji,jj) = SUM( SUM( e_i(ji,jj,:,:), dim=2 ) ) + SUM( SUM( e_s(ji,jj,:,:), dim=2 ) )
 
          ! mass flux
-         pdiag_fv = wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd  +  &
-            &       wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr
+         pdiag_fv(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) &
+            &            + wfx_opw(ji,jj) + wfx_res(ji,jj) + wfx_dyn(ji,jj) + wfx_lam(ji,jj) + wfx_pnd (ji,jj) &
+            &            + wfx_snw_sni(ji,jj) + wfx_snw_sum(ji,jj) + wfx_snw_dyn(ji,jj) &
+            &            + wfx_snw_sub(ji,jj) + wfx_ice_sub(ji,jj) + wfx_spr(ji,jj)
          ! salt flux
-         pdiag_fs = sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam
+         pdiag_fs(ji,jj) = sfx_bri(ji,jj) + sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) &
+            &            + sfx_opw(ji,jj) + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj)
          ! heat flux
-         pdiag_ft =   hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw  &
-            &       - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr
+         pdiag_ft(ji,jj) = hfx_sum(ji,jj) + hfx_bom(ji,jj) + hfx_bog(ji,jj) + hfx_dif(ji,jj) + hfx_opw(ji,jj) + hfx_snw(ji,jj) &
+            &            - hfx_thd(ji,jj) - hfx_dyn(ji,jj) - hfx_res(ji,jj) - hfx_sub(ji,jj) - hfx_spr(ji,jj)
+      END_2D
 
       ELSEIF( icount == 1 ) THEN
-
+         
          ! -- mass diag -- !
-         zdiag_mass =   ( SUM( v_i * rhoi + v_s * rhos + ( v_ip + v_il ) * rhow, dim=3 ) - pdiag_v ) * r1_Dt_ice    &
-            &         + ( wfx_bog + wfx_bom + wfx_sum + wfx_sni + wfx_opw + wfx_res + wfx_dyn + wfx_lam + wfx_pnd + &
-            &             wfx_snw_sni + wfx_snw_sum + wfx_snw_dyn + wfx_snw_sub + wfx_ice_sub + wfx_spr )           &
-            &         - pdiag_fv
+         DO_2D( 0, 0, 0, 0 )
+            zdiag_mass(ji,jj) =  ( SUM( v_i(ji,jj,:) * rhoi + v_s(ji,jj,:) * rhos                                       &
+               &                   + ( v_ip(ji,jj,:) + v_il(ji,jj,:) ) * rhow ) - pdiag_v(ji,jj) ) * r1_Dt_ice          &
+               &               + (   wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) + wfx_opw(ji,jj) &
+               &                   + wfx_res(ji,jj) + wfx_dyn(ji,jj) + wfx_lam(ji,jj) + wfx_pnd(ji,jj)                  &
+               &                   + wfx_snw_sni(ji,jj) + wfx_snw_sum(ji,jj) + wfx_snw_dyn(ji,jj)                       &
+               &                   + wfx_snw_sub(ji,jj) + wfx_ice_sub(ji,jj) + wfx_spr(ji,jj) )                         &
+               &               - pdiag_fv(ji,jj)
+         END_2D
          IF( MAXVAL( ABS(zdiag_mass) ) > rchk_m * rn_icechk_cel )   ll_stop_m = .TRUE.
          !
          ! -- salt diag -- !
-         zdiag_salt =   ( SUM( sv_i * rhoi , dim=3 ) - pdiag_s ) * r1_Dt_ice                                                  &
-            &         + ( sfx_bri + sfx_bog + sfx_bom + sfx_sum + sfx_sni + sfx_opw + sfx_res + sfx_dyn + sfx_sub + sfx_lam ) &
-            &         - pdiag_fs
+         DO_2D( 0, 0, 0, 0 )
+            zdiag_salt(ji,jj) =   ( SUM( sv_i(ji,jj,:) * rhoi ) - pdiag_s(ji,jj) ) * r1_Dt_ice                           &
+               &                + ( sfx_bri(ji,jj) + sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj)   &
+               &                  + sfx_opw(ji,jj) + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj) ) &
+               &                - pdiag_fs(ji,jj)
+         END_2D
          IF( MAXVAL( ABS(zdiag_salt) ) > rchk_s * rn_icechk_cel )   ll_stop_s = .TRUE.
          !
          ! -- heat diag -- !
-         zdiag_heat =   ( SUM( SUM( e_i, dim=4 ), dim=3 ) + SUM( SUM( e_s, dim=4 ), dim=3 ) - pdiag_t ) * r1_Dt_ice &
-            &         + (  hfx_sum + hfx_bom + hfx_bog + hfx_dif + hfx_opw + hfx_snw                                &
-            &            - hfx_thd - hfx_dyn - hfx_res - hfx_sub - hfx_spr )                                        &
-            &         - pdiag_ft
+         DO_2D( 0, 0, 0, 0 )
+            zdiag_heat(ji,jj) = (   SUM( SUM( e_i(ji,jj,:,:), dim=2 ) )                                                  &
+               &                  + SUM( SUM( e_s(ji,jj,:,:), dim=2 ) ) - pdiag_t(ji,jj) ) * r1_Dt_ice                   &
+               &                + ( hfx_sum(ji,jj) + hfx_bom(ji,jj) + hfx_bog(ji,jj)                                     &
+               &                  + hfx_dif(ji,jj) + hfx_opw(ji,jj) + hfx_snw(ji,jj)                                     &
+               &                  - hfx_thd(ji,jj) - hfx_dyn(ji,jj) - hfx_res(ji,jj) - hfx_sub(ji,jj) - hfx_spr(ji,jj) ) &
+               &                - pdiag_ft(ji,jj)
+         END_2D
          IF( MAXVAL( ABS(zdiag_heat) ) > rchk_t * rn_icechk_cel )   ll_stop_t = .TRUE.
          !
          ! -- other diags -- !
          ! a_i < 0
          zdiag_amin(:,:) = 0._wp
          DO jl = 1, jpl
-            WHERE( a_i(:,:,jl) < 0._wp )   zdiag_amin(:,:) = 1._wp
+            WHERE( a_i(A2D(0),jl) < 0._wp )   zdiag_amin(:,:) = 1._wp
          ENDDO
          ! v_i < 0
          zdiag_vmin(:,:) = 0._wp
          DO jl = 1, jpl
-            WHERE( v_i(:,:,jl) < 0._wp )   zdiag_vmin(:,:) = 1._wp
+            WHERE( v_i(A2D(0),jl) < 0._wp )   zdiag_vmin(:,:) = 1._wp
          ENDDO
          ! s_i < 0
          zdiag_smin(:,:) = 0._wp
          DO jl = 1, jpl
-            WHERE( s_i(:,:,jl) < 0._wp )   zdiag_smin(:,:) = 1._wp
+            WHERE( s_i(A2D(0),jl) < 0._wp )   zdiag_smin(:,:) = 1._wp
          ENDDO
          ! e_i < 0
          zdiag_emin(:,:) = 0._wp
          DO jl = 1, jpl
             DO jk = 1, nlay_i
-               WHERE( e_i(:,:,jk,jl) < 0._wp )   zdiag_emin(:,:) = 1._wp
+               WHERE( e_i(A2D(0),jk,jl) < 0._wp )   zdiag_emin(:,:) = 1._wp
             ENDDO
          ENDDO
          ! a_i > amax
@@ -528,8 +565,8 @@ CONTAINS
       INTEGER :: jl, ji, jj
       !!-------------------------------------------------------------------
 
-      DO ji = mi0(ki), mi1(ki)
-         DO jj = mj0(kj), mj1(kj)
+      DO ji = mi0(ki,nn_hls), mi1(ki,nn_hls)
+         DO jj = mj0(kj,nn_hls), mj1(kj,nn_hls)
 
             WRITE(numout,*) ' time step ',kt,' ',cd1             ! print title
 
@@ -696,6 +733,7 @@ CONTAINS
       CALL prt_ctl(tab2d_1=ato_i      , clinfo1=' ato_i       :', mask1=tmask)
       CALL prt_ctl(tab2d_1=vt_i       , clinfo1=' vt_i        :', mask1=tmask)
       CALL prt_ctl(tab2d_1=vt_s       , clinfo1=' vt_s        :', mask1=tmask)
+      IF( ln_icedyn ) THEN
       CALL prt_ctl(tab2d_1=divu_i     , clinfo1=' divu_i      :', mask1=tmask)
       CALL prt_ctl(tab2d_1=delta_i    , clinfo1=' delta_i     :', mask1=tmask)
       CALL prt_ctl(tab2d_1=stress1_i  , clinfo1=' stress1_i   :', mask1=tmask)
@@ -703,6 +741,7 @@ CONTAINS
       CALL prt_ctl(tab2d_1=stress12_i , clinfo1=' stress12_i  :')   ! should be fmask
       CALL prt_ctl(tab2d_1=strength   , clinfo1=' strength    :', mask1=tmask)
       CALL prt_ctl(tab2d_1=delta_i    , clinfo1=' delta_i     :', mask1=tmask)
+      ENDIF
       CALL prt_ctl(tab2d_1=u_ice      , clinfo1=' u_ice       :', mask1=umask,   &
          &         tab2d_2=v_ice      , clinfo2=' v_ice       :', mask2=vmask)
 
@@ -733,10 +772,10 @@ CONTAINS
       CALL prt_ctl_info(' ')
       CALL prt_ctl_info(' - Stresses : ')
       CALL prt_ctl_info('   ~~~~~~~~~~ ')
-      CALL prt_ctl(tab2d_1=utau       , clinfo1= ' utau      : ', mask1 = umask,  &
-         &         tab2d_2=vtau       , clinfo2= ' vtau      : ', mask2 = vmask)
-      CALL prt_ctl(tab2d_1=utau_ice   , clinfo1= ' utau_ice  : ', mask1 = umask,  &
-         &         tab2d_2=vtau_ice   , clinfo2= ' vtau_ice  : ', mask2 = vmask)
+      CALL prt_ctl(tab2d_1=utau       , clinfo1= ' utau      : ', mask1 = tmask,  &
+         &         tab2d_2=vtau       , clinfo2= ' vtau      : ', mask2 = tmask)
+      CALL prt_ctl(tab2d_1=utau_ice   , clinfo1= ' utau_ice  : ', mask1 = tmask,  &
+         &         tab2d_2=vtau_ice   , clinfo2= ' vtau_ice  : ', mask2 = tmask)
 
    END SUBROUTINE ice_prt3D
 
@@ -751,8 +790,9 @@ CONTAINS
       !!-------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ice time-step index
       !
-      REAL(wp), DIMENSION(jpi,jpj,6) ::   ztmp
-      REAL(wp), DIMENSION(6)         ::   zchk
+      INTEGER ::   ji, jj           ! dummy loop index
+      REAL(wp), DIMENSION(A2D(0),6) ::   ztmp
+      REAL(wp), DIMENSION(6)        ::   zchk
       !!-------------------------------------------------------------------
       !
       IF( kt == nit000 .AND. lwp ) THEN
@@ -762,25 +802,27 @@ CONTAINS
       ENDIF
       !
       ! -- 2D budgets (must be close to 0) -- !
-      ztmp(:,:,1) =  wfx_ice  (:,:) + wfx_snw  (:,:) + wfx_spr  (:,:) + wfx_sub(:,:) + wfx_pnd(:,:) &
-         &         + diag_vice(:,:) + diag_vsnw(:,:) + diag_vpnd(:,:) - diag_adv_mass(:,:)
-      ztmp(:,:,2) = sfx(:,:) + diag_sice(:,:) - diag_adv_salt(:,:)
-      ztmp(:,:,3) = qt_oce_ai(:,:) - qt_atm_oi(:,:) + diag_heat(:,:) - diag_adv_heat(:,:)
-
+      DO_2D( 0, 0, 0, 0 )
+         ztmp(ji,jj,1) =  wfx_ice  (ji,jj) + wfx_snw  (ji,jj) + wfx_spr  (ji,jj) + wfx_sub(ji,jj) + wfx_pnd(ji,jj) &
+            &           + diag_vice(ji,jj) + diag_vsnw(ji,jj) + diag_vpnd(ji,jj) - diag_adv_mass(ji,jj)
+         ztmp(ji,jj,2) = sfx(ji,jj) + diag_sice(ji,jj) - diag_adv_salt(ji,jj)
+         ztmp(ji,jj,3) = qt_oce_ai(ji,jj) - qt_atm_oi(ji,jj) + diag_heat(ji,jj) - diag_adv_heat(ji,jj)
+      END_2D
       ! write outputs
       CALL iom_put( 'icedrift_mass', ztmp(:,:,1) )
       CALL iom_put( 'icedrift_salt', ztmp(:,:,2) )
       CALL iom_put( 'icedrift_heat', ztmp(:,:,3) )
 
       ! -- 1D budgets -- !
-      ztmp(:,:,1) = ztmp(:,:,1) * e1e2t * rDt_ice         ! mass
-      ztmp(:,:,2) = ztmp(:,:,2) * e1e2t * rDt_ice * 1.e-3 ! salt
-      ztmp(:,:,3) = ztmp(:,:,3) * e1e2t                   ! heat
-
-      ztmp(:,:,4) = diag_adv_mass * e1e2t * rDt_ice
-      ztmp(:,:,5) = diag_adv_salt * e1e2t * rDt_ice * 1.e-3
-      ztmp(:,:,6) = diag_adv_heat * e1e2t
-
+      DO_2D( 0, 0, 0, 0 )
+         ztmp(ji,jj,1) = ztmp(ji,jj,1) * e1e2t(ji,jj) * rDt_ice         ! mass
+         ztmp(ji,jj,2) = ztmp(ji,jj,2) * e1e2t(ji,jj) * rDt_ice * 1.e-3 ! salt
+         ztmp(ji,jj,3) = ztmp(ji,jj,3) * e1e2t(ji,jj)                   ! heat
+         
+         ztmp(ji,jj,4) = diag_adv_mass(ji,jj) * e1e2t(ji,jj) * rDt_ice
+         ztmp(ji,jj,5) = diag_adv_salt(ji,jj) * e1e2t(ji,jj) * rDt_ice * 1.e-3
+         ztmp(ji,jj,6) = diag_adv_heat(ji,jj) * e1e2t(ji,jj)
+      END_2D
       ! global sums
       zchk(1:6) = glob_sum_vec( 'icectl', ztmp(:,:,1:6) )
       
diff --git a/src/ICE/icedia.F90 b/src/ICE/icedia.F90
index 154d89de..197a6a6c 100644
--- a/src/ICE/icedia.F90
+++ b/src/ICE/icedia.F90
@@ -33,6 +33,9 @@ MODULE icedia
    PUBLIC   ice_dia        ! called by icestp.F90
    PUBLIC   ice_dia_init   ! called in icestp.F90
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
+
    REAL(wp), SAVE ::   r1_area  ! inverse of the ocean area
    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   vol_loc_ini, sal_loc_ini, tem_loc_ini                    ! initial volume, salt and heat contents
    REAL(wp)                              ::   frc_sal, frc_voltop, frc_volbot, frc_temtop, frc_tembot  ! global forcing trends
@@ -48,7 +51,7 @@ CONTAINS
       !!---------------------------------------------------------------------!
       !!                ***  ROUTINE ice_dia_alloc ***
       !!---------------------------------------------------------------------!
-      ALLOCATE( vol_loc_ini(jpi,jpj), sal_loc_ini(jpi,jpj), tem_loc_ini(jpi,jpj), STAT=ice_dia_alloc )
+      ALLOCATE( vol_loc_ini(A2D(0)), sal_loc_ini(A2D(0)), tem_loc_ini(A2D(0)), STAT=ice_dia_alloc )
 
       CALL mpp_sum ( 'icedia', ice_dia_alloc )
       IF( ice_dia_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice_dia_alloc: failed to allocate arrays'  )
@@ -64,8 +67,9 @@ CONTAINS
       !!---------------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ocean time step
       !!
-      REAL(wp), DIMENSION(jpi,jpj,16) ::   ztmp
-      REAL(wp), DIMENSION(16)         ::   zbg          
+      INTEGER ::   ji, jj           ! dummy loop index
+      REAL(wp), DIMENSION(A2D(0),16) ::   ztmp
+      REAL(wp), DIMENSION(16)        ::   zbg          
       !!---------------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('ice_dia')
 
@@ -85,31 +89,32 @@ CONTAINS
       ! 1 - Trends due to forcing  !
       ! ---------------------------!
       ! they must be kept outside an IF(iom_use) because of the call to dia_rst below
-      ztmp(:,:,1) = - ( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) ! freshwater flux ice/snow-ocean
-      ztmp(:,:,2) = - ( wfx_sub(:,:) + wfx_spr(:,:) )                    * e1e2t(:,:) ! freshwater flux ice/snow-atm
-      ztmp(:,:,3) = -   sfx    (:,:)                                     * e1e2t(:,:) ! salt fluxes ice/snow-ocean
-      ztmp(:,:,4) =   qt_atm_oi(:,:)                                     * e1e2t(:,:) ! heat on top of ice-ocean
-      ztmp(:,:,5) =   qt_oce_ai(:,:)                                     * e1e2t(:,:) ! heat on top of ocean (and below ice)
-      
+      DO_2D( 0, 0, 0, 0 )
+         ztmp(ji,jj,1) = - ( wfx_ice(ji,jj) + wfx_snw(ji,jj) + wfx_err_sub(ji,jj) ) * e1e2t(ji,jj) ! freshwater flux ice/snow-ocean
+         ztmp(ji,jj,2) = - ( wfx_sub(ji,jj) + wfx_spr(ji,jj) )                      * e1e2t(ji,jj) ! freshwater flux ice/snow-atm
+         ztmp(ji,jj,3) = -   sfx    (ji,jj)                                         * e1e2t(ji,jj) ! salt fluxes ice/snow-ocean
+         ztmp(ji,jj,4) =   qt_atm_oi(ji,jj)                                         * e1e2t(ji,jj) ! heat on top of ice-ocean
+         ztmp(ji,jj,5) =   qt_oce_ai(ji,jj)                                         * e1e2t(ji,jj) ! heat on top of ocean (and below ice)
+      END_2D
       ! ----------------------- !
       ! 2 -  Contents           !
       ! ----------------------- !
-      IF( iom_use('ibgvol_tot' ) )   ztmp(:,:,6 ) = vt_i (:,:) * e1e2t(:,:) ! ice volume
-      IF( iom_use('sbgvol_tot' ) )   ztmp(:,:,7 ) = vt_s (:,:) * e1e2t(:,:) ! snow volume
-      IF( iom_use('ibgarea_tot') )   ztmp(:,:,8 ) = at_i (:,:) * e1e2t(:,:) ! area
-      IF( iom_use('ibgsalt_tot') )   ztmp(:,:,9 ) = st_i (:,:) * e1e2t(:,:) ! salt content
-      IF( iom_use('ibgheat_tot') )   ztmp(:,:,10) = et_i (:,:) * e1e2t(:,:) ! heat content
-      IF( iom_use('sbgheat_tot') )   ztmp(:,:,11) = et_s (:,:) * e1e2t(:,:) ! heat content
-      IF( iom_use('ipbgvol_tot') )   ztmp(:,:,12) = vt_ip(:,:) * e1e2t(:,:) ! ice pond volume
-      IF( iom_use('ilbgvol_tot') )   ztmp(:,:,13) = vt_il(:,:) * e1e2t(:,:) ! ice pond lid volume
+      IF( iom_use('ibgvol_tot' ) )   ztmp(:,:,6 ) = vt_i (A2D(0)) * e1e2t(A2D(0)) ! ice volume
+      IF( iom_use('sbgvol_tot' ) )   ztmp(:,:,7 ) = vt_s (A2D(0)) * e1e2t(A2D(0)) ! snow volume
+      IF( iom_use('ibgarea_tot') )   ztmp(:,:,8 ) = at_i (A2D(0)) * e1e2t(A2D(0)) ! area
+      IF( iom_use('ibgsalt_tot') )   ztmp(:,:,9 ) = st_i (:,:)    * e1e2t(A2D(0)) ! salt content
+      IF( iom_use('ibgheat_tot') )   ztmp(:,:,10) = et_i (:,:)    * e1e2t(A2D(0)) ! heat content
+      IF( iom_use('sbgheat_tot') )   ztmp(:,:,11) = et_s (:,:)    * e1e2t(A2D(0)) ! heat content
+      IF( iom_use('ipbgvol_tot') )   ztmp(:,:,12) = vt_ip(A2D(0)) * e1e2t(A2D(0)) ! ice pond volume
+      IF( iom_use('ilbgvol_tot') )   ztmp(:,:,13) = vt_il(A2D(0)) * e1e2t(A2D(0)) ! ice pond lid volume
 
       ! ---------------------------------- !
       ! 3 -  Content variations and drifts !
       ! ---------------------------------- !
-      IF( iom_use('ibgvolume') ) ztmp(:,:,14) = ( rhoi*vt_i(:,:) + rhos*vt_s(:,:) - vol_loc_ini(:,:) ) * e1e2t(:,:) ! freshwater trend
-      IF( iom_use('ibgsaltco') ) ztmp(:,:,15) = ( rhoi*st_i(:,:)                  - sal_loc_ini(:,:) ) * e1e2t(:,:) ! salt content trend
+      IF( iom_use('ibgvolume') ) ztmp(:,:,14) = ( rhoi*vt_i(A2D(0)) + rhos*vt_s(A2D(0)) - vol_loc_ini(:,:) ) * e1e2t(A2D(0)) ! freshwater trend
+      IF( iom_use('ibgsaltco') ) ztmp(:,:,15) = ( rhoi*st_i(:,:)                        - sal_loc_ini(:,:) ) * e1e2t(A2D(0)) ! salt content trend
       IF( iom_use('ibgheatco') .OR. iom_use('ibgheatfx') ) &
-         &                       ztmp(:,:,16) = ( et_i(:,:) + et_s(:,:)           - tem_loc_ini(:,:) ) * e1e2t(:,:) ! heat content trend
+         &                       ztmp(:,:,16) = ( et_i(:,:) + et_s(:,:)                 - tem_loc_ini(:,:) ) * e1e2t(A2D(0)) ! heat content trend
       
       ! global sum
       zbg(1:16) = glob_sum_vec( 'icedia', ztmp(:,:,1:16) )
@@ -261,9 +266,9 @@ CONTAINS
             frc_tembot  = 0._wp
             frc_sal     = 0._wp
             ! record initial ice volume, salt and temp
-            vol_loc_ini(:,:) = rhoi * vt_i(:,:) + rhos * vt_s(:,:)  ! ice/snow volume (kg/m2)
-            tem_loc_ini(:,:) = et_i(:,:) + et_s(:,:)                ! ice/snow heat content (J)
-            sal_loc_ini(:,:) = rhoi * st_i(:,:)                     ! ice salt content (pss*kg/m2)
+            vol_loc_ini(:,:) = rhoi * vt_i(A2D(0)) + rhos * vt_s(A2D(0))  ! ice/snow volume (kg/m2)
+            tem_loc_ini(:,:) = et_i(:,:) + et_s(:,:)                      ! ice/snow heat content (J)
+            sal_loc_ini(:,:) = rhoi * st_i(:,:)                           ! ice salt content (pss*kg/m2)
          ENDIF
          !
       ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
diff --git a/src/ICE/icedyn.F90 b/src/ICE/icedyn.F90
index dcbe3e77..8ea874d6 100644
--- a/src/ICE/icedyn.F90
+++ b/src/ICE/icedyn.F90
@@ -93,8 +93,8 @@ CONTAINS
       !
       ! retrieve thickness from volume for landfast param. and UMx advection scheme
       WHERE( a_i(:,:,:) >= epsi20 )
-         h_i(:,:,:) = v_i(:,:,:) / a_i_b(:,:,:)
-         h_s(:,:,:) = v_s(:,:,:) / a_i_b(:,:,:)
+         h_i(:,:,:) = v_i(:,:,:) / a_i(:,:,:)
+         h_s(:,:,:) = v_s(:,:,:) / a_i(:,:,:)
       ELSEWHERE
          h_i(:,:,:) = 0._wp
          h_s(:,:,:) = 0._wp
@@ -142,6 +142,7 @@ CONTAINS
          END_2D
          ! ---
          CALL ice_dyn_adv   ( kt )                                          ! -- advection of ice
+         CALL ice_var_zapsmall                                              ! -- zap small areas
          !
       CASE ( np_dynADV2D )         !==  pure advection ==!   (2D w prescribed velocities)
          !
@@ -151,6 +152,7 @@ CONTAINS
          !CALL RANDOM_NUMBER(v_ice(:,:)) ; v_ice(:,:) = v_ice(:,:) * 0.1 + rn_vice * 0.9 * vmask(:,:,1)
          ! ---
          CALL ice_dyn_adv   ( kt )                                          ! -- advection of ice
+         CALL ice_var_zapsmall                                              ! -- zap small areas
 
       END SELECT
       !
@@ -162,21 +164,30 @@ CONTAINS
 
          CASE ( np_dynADV1D , np_dynADV2D )
 
-            ALLOCATE( zdivu_i(jpi,jpj) )
+            ALLOCATE( zdivu_i(A2D(0)) )
             DO_2D( 0, 0, 0, 0 )
-               zdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-                  &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) ) * r1_e1e2t(ji,jj)
+               zdivu_i(ji,jj) = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &   ! add () for NP repro
+                  &             + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) ) ) * r1_e1e2t(ji,jj)
             END_2D
-            CALL lbc_lnk( 'icedyn', zdivu_i, 'T', 1.0_wp )
-            ! output
             CALL iom_put( 'icediv' , zdivu_i )
-
             DEALLOCATE( zdivu_i )
 
          END SELECT
          !
       ENDIF
       !
+      ! --- Lateral boundary conditions --- !
+      !     caution: t_su update needed from itd_reb
+      !              plus, one needs ldfull=T to deal with the NorthFold in case of Prather advection
+      IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+         CALL lbc_lnk( 'icedyn', a_i , 'T', 1._wp, v_i , 'T', 1._wp, v_s , 'T', 1._wp, sv_i, 'T', 1._wp, oa_i, 'T', 1._wp, &
+            &                    t_su, 'T', 1._wp, a_ip, 'T', 1._wp, v_ip, 'T', 1._wp, v_il, 'T', 1._wp, ldfull = .TRUE. )
+      ELSE
+         CALL lbc_lnk( 'icedyn', a_i , 'T', 1._wp, v_i , 'T', 1._wp, v_s , 'T', 1._wp, sv_i, 'T', 1._wp, oa_i, 'T', 1._wp, &
+            &                    t_su, 'T', 1._wp, ldfull = .TRUE. )
+      ENDIF
+      CALL lbc_lnk( 'icedyn', e_i, 'T', 1._wp, e_s, 'T', 1._wp, ldfull = .TRUE. )
+      
       ! controls
       IF( ln_timing )   CALL timing_stop ('ice_dyn')
       !
@@ -198,12 +209,13 @@ CONTAINS
       ! controls
       IF( ln_icediachk )   CALL ice_cons_hsm(0, 'Hpiling', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
       !
-      at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
+      at_i(A2D(0)) = SUM( a_i(A2D(0),:), dim=3 )
       DO jl = 1, jpl
-         WHERE( at_i(:,:) > epsi20 )
-            a_i(:,:,jl) = a_i(:,:,jl) * (  1._wp + MIN( rn_amax_2d(:,:) - at_i(:,:) , 0._wp ) / at_i(:,:)  )
+         WHERE( at_i(A2D(0)) > epsi20 )
+            a_i(A2D(0),jl) = a_i(A2D(0),jl) * (  1._wp + MIN( rn_amax_2d(A2D(0)) - at_i(A2D(0)) , 0._wp ) / at_i(A2D(0))  )
          END WHERE
       END DO
+      !
       ! controls
       IF( ln_icediachk )   CALL ice_cons_hsm(1, 'Hpiling', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
       !
diff --git a/src/ICE/icedyn_adv.F90 b/src/ICE/icedyn_adv.F90
index e2beb79a..6afabac0 100644
--- a/src/ICE/icedyn_adv.F90
+++ b/src/ICE/icedyn_adv.F90
@@ -25,7 +25,6 @@ MODULE icedyn_adv
    USE lib_mpp        ! MPP library
    USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
    USE timing         ! Timing
-   USE prtctl         ! Print control
 
    IMPLICIT NONE
    PRIVATE
@@ -41,6 +40,8 @@ MODULE icedyn_adv
    ! ** namelist (namdyn_adv) **
    INTEGER         ::   nn_UMx       ! order of the UMx advection scheme   
    !
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/ICE 4.0 , NEMO Consortium (2018)
    !! $Id: icedyn_adv.F90 13472 2020-09-16 13:05:19Z smasson $
@@ -92,11 +93,11 @@ CONTAINS
       !------------
       ! diagnostics
       !------------
-      diag_trp_ei(:,:) = SUM(SUM( e_i (:,:,1:nlay_i,:) - e_i_b (:,:,1:nlay_i,:), dim=4 ), dim=3 ) * r1_Dt_ice
-      diag_trp_es(:,:) = SUM(SUM( e_s (:,:,1:nlay_s,:) - e_s_b (:,:,1:nlay_s,:), dim=4 ), dim=3 ) * r1_Dt_ice
-      diag_trp_sv(:,:) = SUM(     sv_i(:,:,:)          - sv_i_b(:,:,:)                  , dim=3 ) * r1_Dt_ice
-      diag_trp_vi(:,:) = SUM(     v_i (:,:,:)          - v_i_b (:,:,:)                  , dim=3 ) * r1_Dt_ice
-      diag_trp_vs(:,:) = SUM(     v_s (:,:,:)          - v_s_b (:,:,:)                  , dim=3 ) * r1_Dt_ice
+      diag_trp_ei(:,:) = SUM(SUM( e_i (A2D(0),1:nlay_i,:) - e_i_b (A2D(0),1:nlay_i,:), dim=4 ), dim=3 ) * r1_Dt_ice
+      diag_trp_es(:,:) = SUM(SUM( e_s (A2D(0),1:nlay_s,:) - e_s_b (A2D(0),1:nlay_s,:), dim=4 ), dim=3 ) * r1_Dt_ice
+      diag_trp_sv(:,:) = SUM(     sv_i(A2D(0),:)          - sv_i_b(A2D(0),:)                  , dim=3 ) * r1_Dt_ice
+      diag_trp_vi(:,:) = SUM(     v_i (A2D(0),:)          - v_i_b (A2D(0),:)                  , dim=3 ) * r1_Dt_ice
+      diag_trp_vs(:,:) = SUM(     v_s (A2D(0),:)          - v_s_b (A2D(0),:)                  , dim=3 ) * r1_Dt_ice
       IF( iom_use('icemtrp') )   CALL iom_put( 'icemtrp' ,  diag_trp_vi * rhoi          )   ! ice mass transport
       IF( iom_use('snwmtrp') )   CALL iom_put( 'snwmtrp' ,  diag_trp_vs * rhos          )   ! snw mass transport
       IF( iom_use('salmtrp') )   CALL iom_put( 'salmtrp' ,  diag_trp_sv * rhoi * 1.e-03 )   ! salt mass transport (kg/m2/s)
@@ -106,6 +107,8 @@ CONTAINS
       ! controls
       IF( ln_icediachk )   CALL ice_cons_hsm(1, 'icedyn_adv', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
       IF( ln_icectl    )   CALL ice_prt     (kt, iiceprt, jiceprt,-1, ' - ice dyn & trp - ')                           ! prints
+      IF( sn_cfctl%l_prtctl )   &
+         &                 CALL ice_prt3D('icedyn_adv')                                                                ! prints
       IF( ln_timing    )   CALL timing_stop ('icedyn_adv')                                                             ! timing
       !
    END SUBROUTINE ice_dyn_adv
diff --git a/src/ICE/icedyn_adv_pra.F90 b/src/ICE/icedyn_adv_pra.F90
index 28c12eb8..7ad39b05 100644
--- a/src/ICE/icedyn_adv_pra.F90
+++ b/src/ICE/icedyn_adv_pra.F90
@@ -85,54 +85,27 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s       ! snw heat content
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i       ! ice heat content
       !
-      INTEGER  ::   ji, jj, jk, jl, jt      ! dummy loop indices
-      INTEGER  ::   icycle                  ! number of sub-timestep for the advection
-      REAL(wp) ::   zdt, z1_dt              !   -      -
-      REAL(wp), DIMENSION(1)                  ::   zcflprv, zcflnow   ! for global communication
-      REAL(wp), DIMENSION(jpi,jpj)            ::   zati1, zati2
-      REAL(wp), DIMENSION(jpi,jpj)            ::   zudy, zvdx
-      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zhi_max, zhs_max, zhip_max, zs_i, zsi_max
-      REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) ::   ze_i, zei_max
-      REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) ::   ze_s, zes_max
-      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zarea
-      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   z0ice, z0snw, z0ai, z0smi, z0oi
-      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   z0ap , z0vp, z0vl
-      REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) ::   z0es
-      REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) ::   z0ei
+      INTEGER  ::   ji, jj, jk, jl, jt, ihls ! dummy loop indices
+      INTEGER  ::   icycle                   ! number of sub-timestep for the advection
+      REAL(wp) ::   zdt, z1_dt               !   -      -
+      REAL(wp) ::   zati2
+      REAL(wp), DIMENSION(1)              ::   zcflprv, zcflnow   ! for global communication
+      REAL(wp), DIMENSION(jpi,jpj)        ::   zati1
+      REAL(wp), DIMENSION(jpi,jpj)        ::   zudy, zvdx
+      REAL(wp), DIMENSION(jpi,jpj)        ::   zh_i, zh_s, zh_ip, zs_i, zhi_max, zhs_max, zhip_max, zsi_max
+      REAL(wp), DIMENSION(jpi,jpj,nlay_i) ::   ze_i, zei_max
+      REAL(wp), DIMENSION(jpi,jpj,nlay_s) ::   ze_s, zes_max
+      REAL(wp), DIMENSION(jpi,jpj)        ::   zarea
+      REAL(wp), DIMENSION(jpi,jpj)        ::   z0ice, z0snw, z0ai, z0smi, z0oi
+      REAL(wp), DIMENSION(jpi,jpj)        ::   z0ap , z0vp, z0vl
+      REAL(wp), DIMENSION(jpi,jpj,nlay_s) ::   z0es
+      REAL(wp), DIMENSION(jpi,jpj,nlay_i) ::   z0ei
       !! diagnostics
-      REAL(wp), DIMENSION(jpi,jpj)            ::   zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat
+      REAL(wp), DIMENSION(A2D(0))         ::   zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat
       !!----------------------------------------------------------------------
       !
       IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_adv_pra: Prather advection scheme'
       !
-      ! --- Record max of the surrounding 9-pts (for call Hbig) --- !
-      ! thickness and salinity
-      WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:)
-      ELSEWHERE                      ; zs_i(:,:,:) = 0._wp
-      END WHERE
-      CALL icemax3D( ph_i , zhi_max )
-      CALL icemax3D( ph_s , zhs_max )
-      CALL icemax3D( ph_ip, zhip_max)
-      CALL icemax3D( zs_i , zsi_max )
-      CALL lbc_lnk( 'icedyn_adv_pra', zhi_max, 'T', 1._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp )
-      !
-      ! enthalpies
-      DO jk = 1, nlay_i
-         WHERE( pv_i(:,:,:) >= epsi10 ) ; ze_i(:,:,jk,:) = pe_i(:,:,jk,:) / pv_i(:,:,:)
-         ELSEWHERE                      ; ze_i(:,:,jk,:) = 0._wp
-         END WHERE
-      END DO
-      DO jk = 1, nlay_s
-         WHERE( pv_s(:,:,:) >= epsi10 ) ; ze_s(:,:,jk,:) = pe_s(:,:,jk,:) / pv_s(:,:,:)
-         ELSEWHERE                      ; ze_s(:,:,jk,:) = 0._wp
-         END WHERE
-      END DO
-      CALL icemax4D( ze_i , zei_max )
-      CALL icemax4D( ze_s , zes_max )
-      CALL lbc_lnk( 'icedyn_adv_pra', zei_max, 'T', 1._wp )
-      CALL lbc_lnk( 'icedyn_adv_pra', zes_max, 'T', 1._wp )
-      !
-      !
       ! --- If ice drift is too fast, use  subtime steps for advection (CFL test for stability) --- !
       !        Note: the advection split is applied at the next time-step in order to avoid blocking global comm.
       !              this should not affect too much the stability
@@ -142,9 +115,13 @@ CONTAINS
       ! non-blocking global communication send zcflnow and receive zcflprv
       CALL mpp_delay_max( 'icedyn_adv_pra', 'cflice', zcflnow(:), zcflprv(:), kt == nitend - nn_fsbc + 1 )
 
-      IF( zcflprv(1) > .5 ) THEN   ;   icycle = 2
-      ELSE                         ;   icycle = 1
+      IF    ( zcflprv(1) > 1.5 ) THEN   ;   icycle = 3
+      ELSEIF( zcflprv(1) >  .5 ) THEN   ;   icycle = 2
+      ELSE                              ;   icycle = 1
       ENDIF
+!!$      !!test clem
+!!$      icycle=3
+!!$      !!test clem      
       zdt = rDt_ice / REAL(icycle)
       z1_dt = 1._wp / zdt
 
@@ -152,209 +129,304 @@ CONTAINS
       zudy(:,:) = pu_ice(:,:) * e2u(:,:)
       zvdx(:,:) = pv_ice(:,:) * e1v(:,:)
 
+      !---------------!
+      !== advection ==!
+      !---------------!
       DO jt = 1, icycle
-
-         ! diagnostics
-         zdiag_adv_mass(:,:) =   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos &
-            &                  + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow
-         zdiag_adv_salt(:,:) =   SUM( psv_i(:,:,:) , dim=3 ) * rhoi
-         zdiag_adv_heat(:,:) = - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) &
-            &                  - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 )
-
+         
+         IF( icycle == 1 ) THEN   ;   ihls = 0                   ! optimization
+         ELSE                     ;   ihls = MAX( 0, nn_hls - jt )
+         ENDIF
+         !
          ! record at_i before advection (for open water)
-         zati1(:,:) = SUM( pa_i(:,:,:), dim=3 )
-
-         ! --- transported fields --- !
-         DO jl = 1, jpl
-            zarea(:,:,jl) = e1e2t(:,:)
-            z0snw(:,:,jl) = pv_s (:,:,jl) * e1e2t(:,:)        ! Snow volume
-            z0ice(:,:,jl) = pv_i (:,:,jl) * e1e2t(:,:)        ! Ice  volume
-            z0ai (:,:,jl) = pa_i (:,:,jl) * e1e2t(:,:)        ! Ice area
-            z0smi(:,:,jl) = psv_i(:,:,jl) * e1e2t(:,:)        ! Salt content
-            z0oi (:,:,jl) = poa_i(:,:,jl) * e1e2t(:,:)        ! Age content
-            DO jk = 1, nlay_s
-               z0es(:,:,jk,jl) = pe_s(:,:,jk,jl) * e1e2t(:,:) ! Snow heat content
-            END DO
-            DO jk = 1, nlay_i
-               z0ei(:,:,jk,jl) = pe_i(:,:,jk,jl) * e1e2t(:,:) ! Ice  heat content
-            END DO
-            IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-               z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:)      ! Melt pond fraction
-               z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:)      ! Melt pond volume
-               IF ( ln_pnd_lids ) THEN
-                  z0vl(:,:,jl) = pv_il(:,:,jl) * e1e2t(:,:)   ! Melt pond lid volume
-               ENDIF
-            ENDIF
-         END DO
+         DO_2D( ihls, ihls, ihls, ihls )
+            zati1(ji,jj) = SUM( pa_i(ji,jj,:) )
+         END_2D
          !
-         !                                                                  !--------------------------------------------!
-         IF( MOD( (kt - 1) / nn_fsbc , 2 ) ==  MOD( (jt - 1) , 2 ) ) THEN   !==  odd ice time step:  adv_x then adv_y  ==!
-            !                                                               !--------------------------------------------!
-            CALL adv_x( zdt , zudy , 1._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice ) !--- ice volume
-            CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice )
-            CALL adv_x( zdt , zudy , 1._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  ) !--- snow volume
-            CALL adv_y( zdt , zvdx , 0._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  )
-            CALL adv_x( zdt , zudy , 1._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal ) !--- ice salinity
-            CALL adv_y( zdt , zvdx , 0._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal )
-            CALL adv_x( zdt , zudy , 1._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   ) !--- ice concentration
-            CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   )
-            CALL adv_x( zdt , zudy , 1._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage ) !--- ice age
-            CALL adv_y( zdt , zvdx , 0._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage )
+         !                       ! =================== !
+         !                       ! Start cat loop here !
+         !                       ! =================== !
+         DO jl = 1, jpl
+            
+            ! --- Record max of the surrounding 9-pts (for call Hbig) --- !
+            ! thickness and salinity
+            zh_i (:,:) = ph_i (:,:,jl)
+            zh_s (:,:) = ph_s (:,:,jl)
+            zh_ip(:,:) = ph_ip(:,:,jl)
+            WHERE( pv_i(:,:,jl) >= epsi10 ) ; zs_i(:,:) = psv_i(:,:,jl) / pv_i(:,:,jl)
+            ELSEWHERE                       ; zs_i(:,:) = 0._wp
+            END WHERE
+            CALL icemax2D_pra( ihls, zh_i , zhi_max )
+            CALL icemax2D_pra( ihls, zh_s , zhs_max )
+            CALL icemax2D_pra( ihls, zh_ip, zhip_max)
+            CALL icemax2D_pra( ihls, zs_i , zsi_max )
             !
-            DO jk = 1, nlay_s                                                                           !--- snow heat content
-               CALL adv_x( zdt, zudy, 1._wp, zarea, z0es (:,:,jk,:), sxc0(:,:,jk,:),   &
-                  &                                 sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
-               CALL adv_y( zdt, zvdx, 0._wp, zarea, z0es (:,:,jk,:), sxc0(:,:,jk,:),   &
-                  &                                 sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
+            ! enthalpies
+            DO jk = 1, nlay_i
+               WHERE( pv_i(:,:,jl) >= epsi10 ) ; ze_i(:,:,jk) = pe_i(:,:,jk,jl) / pv_i(:,:,jl)
+               ELSEWHERE                       ; ze_i(:,:,jk) = 0._wp
+               END WHERE
             END DO
-            DO jk = 1, nlay_i                                                                           !--- ice heat content
-               CALL adv_x( zdt, zudy, 1._wp, zarea, z0ei(:,:,jk,:), sxe(:,:,jk,:),   &
-                  &                                 sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
-               CALL adv_y( zdt, zvdx, 0._wp, zarea, z0ei(:,:,jk,:), sxe(:,:,jk,:),   &
-                  &                                 sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
+            DO jk = 1, nlay_s
+               WHERE( pv_s(:,:,jl) >= epsi10 ) ; ze_s(:,:,jk) = pe_s(:,:,jk,jl) / pv_s(:,:,jl)
+               ELSEWHERE                       ; ze_s(:,:,jk) = 0._wp
+               END WHERE
             END DO
+            CALL icemax3D_pra( ihls, ze_i , zei_max )
+            CALL icemax3D_pra( ihls, ze_s , zes_max )
+
+            ! diagnostics
+            DO_2D( 0, 0, 0, 0 )
+               zdiag_adv_mass(ji,jj) =   pv_i (ji,jj,jl) * rhoi + pv_s (ji,jj,jl) * rhos &
+                  &                    + pv_ip(ji,jj,jl) * rhow + pv_il(ji,jj,jl) * rhow
+               zdiag_adv_salt(ji,jj) =   psv_i(ji,jj,jl) * rhoi
+               zdiag_adv_heat(ji,jj) = - SUM( pe_i(ji,jj,1:nlay_i,jl) ) - SUM( pe_s(ji,jj,1:nlay_s,jl) )
+            END_2D
             !
+
+            ! --- transported fields --- !
+            DO_2D( ihls+1, ihls+1, ihls+1, ihls+1 )
+               zarea(ji,jj) = e1e2t(ji,jj)
+               z0snw(ji,jj) = pv_s (ji,jj,jl) * e1e2t(ji,jj)        ! Snow volume
+               z0ice(ji,jj) = pv_i (ji,jj,jl) * e1e2t(ji,jj)        ! Ice  volume
+               z0ai (ji,jj) = pa_i (ji,jj,jl) * e1e2t(ji,jj)        ! Ice area
+               z0smi(ji,jj) = psv_i(ji,jj,jl) * e1e2t(ji,jj)        ! Salt content
+               z0oi (ji,jj) = poa_i(ji,jj,jl) * e1e2t(ji,jj)        ! Age content
+               DO jk = 1, nlay_s
+                  z0es(ji,jj,jk) = pe_s(ji,jj,jk,jl) * e1e2t(ji,jj) ! Snow heat content
+               END DO
+               DO jk = 1, nlay_i
+                  z0ei(ji,jj,jk) = pe_i(ji,jj,jk,jl) * e1e2t(ji,jj) ! Ice  heat content
+               END DO
+            END_2D
             IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-               CALL adv_x( zdt , zudy , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )    !--- melt pond fraction
-               CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )
-               CALL adv_x( zdt , zudy , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )    !--- melt pond volume
-               CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )
-               IF ( ln_pnd_lids ) THEN
-                  CALL adv_x( zdt , zudy , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume
-                  CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl )
-               ENDIF
-            ENDIF
-            !                                                               !--------------------------------------------!
-         ELSE                                                               !== even ice time step:  adv_y then adv_x  ==!
-            !                                                               !--------------------------------------------!
-            CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice ) !--- ice volume
-            CALL adv_x( zdt , zudy , 0._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice )
-            CALL adv_y( zdt , zvdx , 1._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  ) !--- snow volume
-            CALL adv_x( zdt , zudy , 0._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  )
-            CALL adv_y( zdt , zvdx , 1._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal ) !--- ice salinity
-            CALL adv_x( zdt , zudy , 0._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal )
-            CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   ) !--- ice concentration
-            CALL adv_x( zdt , zudy , 0._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   )
-            CALL adv_y( zdt , zvdx , 1._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage ) !--- ice age
-            CALL adv_x( zdt , zudy , 0._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage )
-            DO jk = 1, nlay_s                                                                           !--- snow heat content
-               CALL adv_y( zdt, zvdx, 1._wp, zarea, z0es (:,:,jk,:), sxc0(:,:,jk,:),   &
-                  &                                 sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
-               CALL adv_x( zdt, zudy, 0._wp, zarea, z0es (:,:,jk,:), sxc0(:,:,jk,:),   &
-                  &                                 sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
-            END DO
-            DO jk = 1, nlay_i                                                                           !--- ice heat content
-               CALL adv_y( zdt, zvdx, 1._wp, zarea, z0ei(:,:,jk,:), sxe(:,:,jk,:),   &
-                  &                                 sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
-               CALL adv_x( zdt, zudy, 0._wp, zarea, z0ei(:,:,jk,:), sxe(:,:,jk,:),   &
-                  &                                 sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
-            END DO
-            IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-               CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )    !--- melt pond fraction
-               CALL adv_x( zdt , zudy , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )
-               CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )    !--- melt pond volume
-               CALL adv_x( zdt , zudy , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )
+               DO_2D( ihls+1, ihls+1, ihls+1, ihls+1 )
+                  z0ap(ji,jj) = pa_ip(ji,jj,jl) * e1e2t(ji,jj)      ! Melt pond fraction
+                  z0vp(ji,jj) = pv_ip(ji,jj,jl) * e1e2t(ji,jj)      ! Melt pond volume
+               END_2D
                IF ( ln_pnd_lids ) THEN
-                  CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume
-                  CALL adv_x( zdt , zudy , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl )
+                  DO_2D( ihls+1, ihls+1, ihls+1, ihls+1 )
+                     z0vl(ji,jj) = pv_il(ji,jj,jl) * e1e2t(ji,jj)   ! Melt pond lid volume
+                  END_2D
                ENDIF
             ENDIF
             !
-         ENDIF
-
-         ! --- Lateral boundary conditions --- !
-         !     caution: for gradients (sx and sy) the sign changes
-         CALL lbc_lnk( 'icedyn_adv_pra', z0ice , 'T', 1._wp, sxice , 'T', -1._wp, syice , 'T', -1._wp  & ! ice volume
-            &                          , sxxice, 'T', 1._wp, syyice, 'T',  1._wp, sxyice, 'T',  1._wp  &
-            &                          , z0snw , 'T', 1._wp, sxsn  , 'T', -1._wp, sysn  , 'T', -1._wp  & ! snw volume
-            &                          , sxxsn , 'T', 1._wp, syysn , 'T',  1._wp, sxysn , 'T',  1._wp  &
-            &                          , z0smi , 'T', 1._wp, sxsal , 'T', -1._wp, sysal , 'T', -1._wp  & ! ice salinity
-            &                          , sxxsal, 'T', 1._wp, syysal, 'T',  1._wp, sxysal, 'T',  1._wp  &
-            &                          , z0ai  , 'T', 1._wp, sxa   , 'T', -1._wp, sya   , 'T', -1._wp  & ! ice concentration
-            &                          , sxxa  , 'T', 1._wp, syya  , 'T',  1._wp, sxya  , 'T',  1._wp  &
-            &                          , z0oi  , 'T', 1._wp, sxage , 'T', -1._wp, syage , 'T', -1._wp  & ! ice age
-            &                          , sxxage, 'T', 1._wp, syyage, 'T',  1._wp, sxyage, 'T',  1._wp  )
-         CALL lbc_lnk( 'icedyn_adv_pra', z0es  , 'T', 1._wp, sxc0  , 'T', -1._wp, syc0  , 'T', -1._wp  & ! snw enthalpy
-            &                          , sxxc0 , 'T', 1._wp, syyc0 , 'T',  1._wp, sxyc0 , 'T',  1._wp  )
-         CALL lbc_lnk( 'icedyn_adv_pra', z0ei  , 'T', 1._wp, sxe   , 'T', -1._wp, sye   , 'T', -1._wp  & ! ice enthalpy
-            &                          , sxxe  , 'T', 1._wp, syye  , 'T',  1._wp, sxye  , 'T',  1._wp  )
-         IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-            IF( ln_pnd_lids ) THEN
-               CALL lbc_lnk( 'icedyn_adv_pra', z0ap , 'T', 1._wp, sxap , 'T', -1._wp, syap , 'T', -1._wp  & ! melt pond fraction
-                  &                          , sxxap, 'T', 1._wp, syyap, 'T',  1._wp, sxyap, 'T',  1._wp  &
-                  &                          , z0vp , 'T', 1._wp, sxvp , 'T', -1._wp, syvp , 'T', -1._wp  & ! melt pond volume
-                  &                          , sxxvp, 'T', 1._wp, syyvp, 'T',  1._wp, sxyvp, 'T',  1._wp  &
-                  &                          , z0vl , 'T', 1._wp, sxvl , 'T', -1._wp, syvl , 'T', -1._wp  & ! melt pond lid volume
-                  &                          , sxxvl, 'T', 1._wp, syyvl, 'T',  1._wp, sxyvl, 'T',  1._wp  )
-            ELSE
-               CALL lbc_lnk( 'icedyn_adv_pra', z0ap , 'T', 1._wp, sxap , 'T', -1._wp, syap , 'T', -1._wp  & ! melt pond fraction
-                  &                          , sxxap, 'T', 1._wp, syyap, 'T',  1._wp, sxyap, 'T',  1._wp  &
-                  &                          , z0vp , 'T', 1._wp, sxvp , 'T', -1._wp, syvp , 'T', -1._wp  & ! melt pond volume
-                  &                          , sxxvp, 'T', 1._wp, syyvp, 'T',  1._wp, sxyvp, 'T',  1._wp  )
+            ! ----------------------- !
+            ! ==> start advection <== !
+            ! ----------------------- !
+            !                                                                  !--------------------------------------------!
+            IF( MOD( (kt - 1) / nn_fsbc , 2 ) ==  MOD( (jt - 1) , 2 ) ) THEN   !==  odd ice time step:  adv_x then adv_y  ==!
+               !                                                               !--------------------------------------------!
+               CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice ) !--- ice volume
+               CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice )
+               CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  ) !--- snow volume
+               CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  )
+               CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal ) !--- ice salinity
+               CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal )
+               CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   ) !--- ice concentration
+               CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   )
+               CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage ) !--- ice age
+               CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage )
+               !
+               DO jk = 1, nlay_s                                                                                     !--- snow heat content
+                  CALL adv_x( ihls, jl, zdt, zudy, 1._wp, zarea, z0es (:,:,jk)  , sxc0(:,:,jk,:),   &
+                     &                           sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
+                  CALL adv_y( ihls, jl, zdt, zvdx, 0._wp, zarea, z0es (:,:,jk)  , sxc0(:,:,jk,:),   &
+                     &                           sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
+               END DO
+               DO jk = 1, nlay_i                                                                                     !--- ice heat content
+                  CALL adv_x( ihls, jl, zdt, zudy, 1._wp, zarea, z0ei(:,:,jk)  , sxe(:,:,jk,:),   &
+                     &                               sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
+                  CALL adv_y( ihls, jl, zdt, zvdx, 0._wp, zarea, z0ei(:,:,jk)  , sxe(:,:,jk,:),   &
+                     &                               sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
+               END DO
+               !
+               IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+                  CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )    !--- melt pond fraction
+                  CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )
+                  CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )    !--- melt pond volume
+                  CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )
+                  IF ( ln_pnd_lids ) THEN
+                     CALL adv_x( ihls, jl, zdt , zudy , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume
+                     CALL adv_y( ihls, jl, zdt , zvdx , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl )
+                  ENDIF
+               ENDIF
+               !                                                               !--------------------------------------------!
+            ELSE                                                               !== even ice time step:  adv_y then adv_x  ==!
+               !                                                               !--------------------------------------------!
+               CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice ) !--- ice volume
+               CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0ice , sxice , sxxice , syice , syyice , sxyice )
+               CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  ) !--- snow volume
+               CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0snw , sxsn  , sxxsn  , sysn  , syysn  , sxysn  )
+               CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal ) !--- ice salinity
+               CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0smi , sxsal , sxxsal , sysal , syysal , sxysal )
+               CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   ) !--- ice concentration
+               CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0ai  , sxa   , sxxa   , sya   , syya   , sxya   )
+               CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage ) !--- ice age
+               CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0oi  , sxage , sxxage , syage , syyage , sxyage )
+               DO jk = 1, nlay_s                                                                               !--- snow heat content
+                  CALL adv_y( ihls, jl, zdt, zvdx, 1._wp, zarea, z0es (:,:,jk)  , sxc0(:,:,jk,:),   &
+                     &                           sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
+                  CALL adv_x( ihls, jl, zdt, zudy, 0._wp, zarea, z0es (:,:,jk)  , sxc0(:,:,jk,:),   &
+                     &                           sxxc0(:,:,jk,:), syc0(:,:,jk,:), syyc0(:,:,jk,:), sxyc0(:,:,jk,:) )
+               END DO
+               DO jk = 1, nlay_i                                                                               !--- ice heat content
+                  CALL adv_y( ihls, jl, zdt, zvdx, 1._wp, zarea, z0ei(:,:,jk)  , sxe(:,:,jk,:),   &
+                     &                               sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
+                  CALL adv_x( ihls, jl, zdt, zudy, 0._wp, zarea, z0ei(:,:,jk)  , sxe(:,:,jk,:),   &
+                     &                               sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) )
+               END DO
+               IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+                  CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )    !--- melt pond fraction
+                  CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap )
+                  CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )    !--- melt pond volume
+                  CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp )
+                  IF ( ln_pnd_lids ) THEN
+                     CALL adv_y( ihls, jl, zdt , zvdx , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume
+                     CALL adv_x( ihls, jl, zdt , zudy , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl )
+                  ENDIF
+               ENDIF
+               !
             ENDIF
-         ENDIF
 
-         ! --- Recover the properties from their contents --- !
-         DO jl = 1, jpl
-            pv_i (:,:,jl) = z0ice(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            pv_s (:,:,jl) = z0snw(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            psv_i(:,:,jl) = z0smi(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            poa_i(:,:,jl) = z0oi (:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            pa_i (:,:,jl) = z0ai (:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            DO jk = 1, nlay_s
-               pe_s(:,:,jk,jl) = z0es(:,:,jk,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            END DO
-            DO jk = 1, nlay_i
-               pe_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-            END DO
+            ! --- Recover the properties from their contents --- !
+            DO_2D( ihls, ihls, ihls, ihls )
+               pv_i (ji,jj,jl) = z0ice(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               pv_s (ji,jj,jl) = z0snw(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               psv_i(ji,jj,jl) = z0smi(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               poa_i(ji,jj,jl) = z0oi (ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               pa_i (ji,jj,jl) = z0ai (ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               DO jk = 1, nlay_s
+                  pe_s(ji,jj,jk,jl) = z0es(ji,jj,jk) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               END DO
+               DO jk = 1, nlay_i
+                  pe_i(ji,jj,jk,jl) = z0ei(ji,jj,jk) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               END DO
+            END_2D
             IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-               pa_ip(:,:,jl) = z0ap(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
-               pv_ip(:,:,jl) = z0vp(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
+               DO_2D( ihls, ihls, ihls, ihls )
+                  pa_ip(ji,jj,jl) = z0ap(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+                  pv_ip(ji,jj,jl) = z0vp(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+               END_2D
                IF ( ln_pnd_lids ) THEN
-                  pv_il(:,:,jl) = z0vl(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1)
+                  DO_2D( ihls, ihls, ihls, ihls )
+                     pv_il(ji,jj,jl) = z0vl(ji,jj) * r1_e1e2t(ji,jj) * tmask(ji,jj,1)
+                  END_2D
                ENDIF
             ENDIF
+            
+            ! --- diagnostics --- !
+            DO_2D( 0, 0, 0, 0 )
+               diag_adv_mass(ji,jj) = diag_adv_mass(ji,jj) + ( pv_i (ji,jj,jl) * rhoi + pv_s (ji,jj,jl) * rhos &
+                  &                                        +   pv_ip(ji,jj,jl) * rhow + pv_il(ji,jj,jl) * rhow &
+                  &                                          - zdiag_adv_mass(ji,jj) ) * z1_dt
+               diag_adv_salt(ji,jj) = diag_adv_salt(ji,jj) + ( psv_i(ji,jj,jl) * rhoi &
+                  &                                          - zdiag_adv_salt(ji,jj) ) * z1_dt
+               diag_adv_heat(ji,jj) = diag_adv_heat(ji,jj) + ( -SUM( pe_i(ji,jj,1:nlay_i,jl) ) -SUM( pe_s(ji,jj,1:nlay_s,jl) ) &
+                  &                                          - zdiag_adv_heat(ji,jj) ) * z1_dt
+            END_2D
+
+            ! --- Make sure ice thickness is not too big --- !
+            !     (because ice thickness can be too large where ice concentration is very small)
+            CALL Hbig_pra( ihls, jl, zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, &
+               &            pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i )
+            !
+            ! --- Ensure snow load is not too big --- !
+            CALL Hsnow_pra( ihls, jl, zdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+            !
          END DO
-         !
+         !                       ! ================= !
+         !                       ! End cat loop here !
+         !                       ! ================= !
+
          ! derive open water from ice concentration
-         zati2(:,:) = SUM( pa_i(:,:,:), dim=3 )
-         DO_2D( 0, 0, 0, 0 )
-            pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) &                        !--- open water
-               &                          - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt
+         DO_2D( ihls, ihls, ihls, ihls )
+            zati2 = SUM( pa_i(ji,jj,:) )
+            pato_i(ji,jj) = pato_i(ji,jj) - ( zati2 - zati1(ji,jj) )            &                                    !--- open water
+               &                          - (  ( zudy(ji,jj) - zudy(ji-1,jj) )  &    ! add () for NP repro
+               &                             + ( zvdx(ji,jj) - zvdx(ji,jj-1) )  ) * r1_e1e2t(ji,jj) * zdt
          END_2D
-         CALL lbc_lnk( 'icedyn_adv_pra', pato_i, 'T',  1.0_wp )
-         !
-         ! --- diagnostics --- !
-         diag_adv_mass(:,:) = diag_adv_mass(:,:) + (   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos &
-            &                                        + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow &
-            &                                        - zdiag_adv_mass(:,:) ) * z1_dt
-         diag_adv_salt(:,:) = diag_adv_salt(:,:) + (   SUM( psv_i(:,:,:) , dim=3 ) * rhoi &
-            &                                        - zdiag_adv_salt(:,:) ) * z1_dt
-         diag_adv_heat(:,:) = diag_adv_heat(:,:) + ( - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) &
-            &                                        - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) &
-            &                                        - zdiag_adv_heat(:,:) ) * z1_dt
-         !
+         
          ! --- Ensure non-negative fields --- !
          !     Remove negative values (conservation is ensured)
          !     (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20)
-         CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
+         CALL ice_var_zapneg( ihls, zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
          !
-         ! --- Make sure ice thickness is not too big --- !
-         !     (because ice thickness can be too large where ice concentration is very small)
-         CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, &
-            &            pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i )
-         !
-         ! --- Ensure snow load is not too big --- !
-         CALL Hsnow( zdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+         ! --- Lateral boundary conditions --- !
+         !     caution: for gradients (sx and sy) the sign changes
+         !              plus, one needs ldfull=T to deal with the NorthFold
+         IF( ihls == 0 .AND. jt /= icycle ) THEN ! comm. on all fields if ihls=0 and we are only at the 1st iteration (jt=1) over 2 (icycle=2) 
+            !
+            CALL lbc_lnk( 'icedyn_adv_pra', pv_i  , 'T', 1._wp, sxice , 'T', -1._wp, syice , 'T', -1._wp  & ! ice volume
+               &                          , sxxice, 'T', 1._wp, syyice, 'T',  1._wp, sxyice, 'T',  1._wp  &
+               &                          , pv_s  , 'T', 1._wp, sxsn  , 'T', -1._wp, sysn  , 'T', -1._wp  & ! snw volume
+               &                          , sxxsn , 'T', 1._wp, syysn , 'T',  1._wp, sxysn , 'T',  1._wp  &
+               &                          , psv_i , 'T', 1._wp, sxsal , 'T', -1._wp, sysal , 'T', -1._wp  & ! ice salinity
+               &                          , sxxsal, 'T', 1._wp, syysal, 'T',  1._wp, sxysal, 'T',  1._wp  &
+               &                          , pa_i  , 'T', 1._wp, sxa   , 'T', -1._wp, sya   , 'T', -1._wp  & ! ice concentration
+               &                          , sxxa  , 'T', 1._wp, syya  , 'T',  1._wp, sxya  , 'T',  1._wp  &
+               &                          , poa_i , 'T', 1._wp, sxage , 'T', -1._wp, syage , 'T', -1._wp  & ! ice age
+               &                          , sxxage, 'T', 1._wp, syyage, 'T',  1._wp, sxyage, 'T',  1._wp, ldfull = .TRUE.  )
+            CALL lbc_lnk( 'icedyn_adv_pra', pe_s  , 'T', 1._wp, sxc0  , 'T', -1._wp, syc0  , 'T', -1._wp  & ! snw enthalpy
+               &                          , sxxc0 , 'T', 1._wp, syyc0 , 'T',  1._wp, sxyc0 , 'T',  1._wp  &
+               &                          , pe_i  , 'T', 1._wp, sxe   , 'T', -1._wp, sye   , 'T', -1._wp  & ! ice enthalpy
+               &                          , sxxe  , 'T', 1._wp, syye  , 'T',  1._wp, sxye  , 'T',  1._wp, ldfull = .TRUE.  )
+            IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+               CALL lbc_lnk( 'icedyn_adv_pra', pa_ip, 'T', 1._wp, sxap , 'T', -1._wp, syap , 'T', -1._wp  & ! melt pond fraction
+                  &                          , sxxap, 'T', 1._wp, syyap, 'T',  1._wp, sxyap, 'T',  1._wp  &
+                  &                          , pv_ip, 'T', 1._wp, sxvp , 'T', -1._wp, syvp , 'T', -1._wp  & ! melt pond volume
+                  &                          , sxxvp, 'T', 1._wp, syyvp, 'T',  1._wp, sxyvp, 'T',  1._wp  &
+                  &                          , pv_il, 'T', 1._wp, sxvl , 'T', -1._wp, syvl , 'T', -1._wp  & ! melt pond lid volume
+                  &                          , sxxvl, 'T', 1._wp, syyvl, 'T',  1._wp, sxyvl, 'T',  1._wp, ldfull = .TRUE.  )
+            ENDIF
+            CALL lbc_lnk( 'icedyn_adv_pra', pato_i, 'T',  1.0_wp, ldfull = .TRUE. )
+            !
+         ELSEIF( jt == icycle ) THEN             ! comm. on the moments at the end of advection
+            !                                    ! comm. on the other fields are gathered in icedyn.F90
+            IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+               CALL lbc_lnk( 'icedyn_adv_pra', sxice , 'T', -1._wp, syice , 'T', -1._wp  &                   ! ice volume
+                  &                          , sxxice, 'T',  1._wp, syyice, 'T',  1._wp, sxyice, 'T',  1._wp &
+                  &                          , sxsn  , 'T', -1._wp, sysn  , 'T', -1._wp  &                   ! snw volume
+                  &                          , sxxsn , 'T',  1._wp, syysn , 'T',  1._wp, sxysn , 'T',  1._wp &
+                  &                          , sxsal , 'T', -1._wp, sysal , 'T', -1._wp  &                   ! ice salinity
+                  &                          , sxxsal, 'T',  1._wp, syysal, 'T',  1._wp, sxysal, 'T',  1._wp &
+                  &                          , sxa   , 'T', -1._wp, sya   , 'T', -1._wp  &                   ! ice concentration
+                  &                          , sxxa  , 'T',  1._wp, syya  , 'T',  1._wp, sxya  , 'T',  1._wp &
+                  &                          , sxage , 'T', -1._wp, syage , 'T', -1._wp  &                   ! ice age
+                  &                          , sxxage, 'T',  1._wp, syyage, 'T',  1._wp, sxyage, 'T',  1._wp &
+                  &                          , sxap  , 'T', -1._wp, syap  , 'T', -1._wp  &                   ! melt pond fraction
+                  &                          , sxxap , 'T',  1._wp, syyap , 'T',  1._wp, sxyap , 'T',  1._wp &
+                  &                          , sxvp  , 'T', -1._wp, syvp  , 'T', -1._wp  &                   ! melt pond volume
+                  &                          , sxxvp , 'T',  1._wp, syyvp , 'T',  1._wp, sxyvp , 'T',  1._wp &
+                  &                          , sxvl  , 'T', -1._wp, syvl  , 'T', -1._wp  &                   ! melt pond lid volume
+                  &                          , sxxvl , 'T',  1._wp, syyvl , 'T',  1._wp, sxyvl, 'T',  1._wp, ldfull = .TRUE. )
+            ELSE
+               CALL lbc_lnk( 'icedyn_adv_pra', sxice , 'T', -1._wp, syice , 'T', -1._wp  &                   ! ice volume
+                  &                          , sxxice, 'T',  1._wp, syyice, 'T',  1._wp, sxyice, 'T',  1._wp &
+                  &                          , sxsn  , 'T', -1._wp, sysn  , 'T', -1._wp  &                   ! snw volume
+                  &                          , sxxsn , 'T',  1._wp, syysn , 'T',  1._wp, sxysn , 'T',  1._wp &
+                  &                          , sxsal , 'T', -1._wp, sysal , 'T', -1._wp  &                   ! ice salinity
+                  &                          , sxxsal, 'T',  1._wp, syysal, 'T',  1._wp, sxysal, 'T',  1._wp &
+                  &                          , sxa   , 'T', -1._wp, sya   , 'T', -1._wp  &                   ! ice concentration
+                  &                          , sxxa  , 'T',  1._wp, syya  , 'T',  1._wp, sxya  , 'T',  1._wp &
+                  &                          , sxage , 'T', -1._wp, syage , 'T', -1._wp  &                   ! ice age
+                  &                          , sxxage, 'T',  1._wp, syyage, 'T',  1._wp, sxyage, 'T',  1._wp, ldfull = .TRUE. )
+            ENDIF
+            CALL lbc_lnk( 'icedyn_adv_pra', sxc0  , 'T', -1._wp, syc0  , 'T', -1._wp  &                      ! snw enthalpy
+               &                          , sxxc0 , 'T',  1._wp, syyc0 , 'T',  1._wp, sxyc0 , 'T',  1._wp &
+               &                          , sxe   , 'T', -1._wp, sye   , 'T', -1._wp  &                      ! ice enthalpy
+               &                          , sxxe  , 'T',  1._wp, syye  , 'T',  1._wp, sxye  , 'T',  1._wp, ldfull = .TRUE. )
+            !
+         ENDIF
          !
-      END DO
+      END DO ! jt
       !
       IF( lrst_ice )   CALL adv_pra_rst( 'WRITE', kt )   !* write Prather fields in the restart file
       !
    END SUBROUTINE ice_dyn_adv_pra
 
 
-   SUBROUTINE adv_x( pdt, put , pcrh, psm , ps0 ,   &
+   SUBROUTINE adv_x( ihls, jcat, pdt, put , pcrh, psm , ps0 ,   &
       &              psx, psxx, psy , psyy, psxy )
       !!----------------------------------------------------------------------
       !!                **  routine adv_x  **
@@ -362,194 +434,219 @@ CONTAINS
       !! ** purpose :   Computes and adds the advection trend to sea-ice
       !!                variable on x axis
       !!----------------------------------------------------------------------
-      REAL(wp)                  , INTENT(in   ) ::   pdt                ! the time step
+      INTEGER                   , INTENT(in   ) ::   ihls               ! loop index
+      INTEGER                   , INTENT(in   ) ::   jcat               ! category
+      REAL(wp)                  , INTENT(in   ) ::   pdt                ! time step
       REAL(wp)                  , INTENT(in   ) ::   pcrh               ! call adv_x then adv_y (=1) or the opposite (=0)
       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   put                ! i-direction ice velocity at U-point [m/s]
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psm                ! area
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ps0                ! field to be advected
+      REAL(wp), DIMENSION(:,:)  , INTENT(inout) ::   psm                ! area
+      REAL(wp), DIMENSION(:,:)  , INTENT(inout) ::   ps0                ! field to be advected
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psx , psy          ! 1st moments
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psxx, psyy, psxy   ! 2nd moments
       !!
-      INTEGER  ::   ji, jj, jl, jcat                     ! dummy loop indices
-      INTEGER  ::   jj0                                  ! dummy loop indices
-      REAL(wp) ::   zs1max, zslpmax, ztemp               ! local scalars
-      REAL(wp) ::   zs1new, zalf , zalfq , zbt           !   -      -
-      REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !   -      -
+      INTEGER  ::   ji, jj                               ! dummy loop indices
+      INTEGER  ::   ji0, jj0                             ! dummy loop indices
+      REAL(wp) ::   zs1max, zslpmax                      ! local scalars
+      REAL(wp) ::   zs1new, zalf , zalf2, zalf3          !   -      -
+      REAL(wp) ::   zs2new, z1malf, z1malf2, z1malf3     !   -      -
       REAL(wp) ::   zpsm, zps0
       REAL(wp) ::   zpsx, zpsy, zpsxx, zpsyy, zpsxy
-      REAL(wp), DIMENSION(jpi,jpj) ::   zf0 , zfx  , zfy   , zbet   ! 2D workspace
+      REAL(wp), DIMENSION(jpi,jpj) ::   zf0 , zfx  , zfy            ! 2D workspace
       REAL(wp), DIMENSION(jpi,jpj) ::   zfm , zfxx , zfyy  , zfxy   !  -      -
-      REAL(wp), DIMENSION(jpi,jpj) ::   zalg, zalg1, zalg1q         !  -      -
       !-----------------------------------------------------------------------
       ! in order to avoid lbc_lnk (communications):
       !    jj loop must be 1:jpj   if adv_x is called first
       !                and 2:jpj-1 if adv_x is called second
-      jj0 = NINT(pcrh)
+      ji0 = 1 + ihls
+      jj0 = NINT(pcrh) + ihls
       !
-      jcat = SIZE( ps0 , 3 )   ! size of input arrays
-      !
-      DO jl = 1, jcat   ! loop on categories
+      ! Limitation of moments.
+      DO_2D( ji0, ji0, jj0, jj0 )
          !
-         ! Limitation of moments.
-         DO jj = Njs0 - jj0, Nje0 + jj0
-
-            DO ji = Nis0 - 1, Nie0 + 1
-
-               zpsm  = psm (ji,jj,jl) ! optimization
-               zps0  = ps0 (ji,jj,jl)
-               zpsx  = psx (ji,jj,jl)
-               zpsxx = psxx(ji,jj,jl)
-               zpsy  = psy (ji,jj,jl)
-               zpsyy = psyy(ji,jj,jl)
-               zpsxy = psxy(ji,jj,jl)
-
-               !  Initialize volumes of boxes  (=area if adv_x first called, =psm otherwise)
-               zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20 )
-               !
-               zslpmax = MAX( 0._wp, zps0 )
-               zs1max  = 1.5 * zslpmax
-               zs1new  = MIN( zs1max, MAX( -zs1max, zpsx ) )
-               zs2new  = MIN( 2.0 * zslpmax - 0.3334 * ABS( zs1new ), MAX( ABS( zs1new ) - zslpmax, zpsxx ) )
-               rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1)   ! Case of empty boxes & Apply mask
+         zpsm  = psm (ji,jj) ! optimization
+         zps0  = ps0 (ji,jj)
+         zpsx  = psx (ji,jj,jcat)
+         zpsxx = psxx(ji,jj,jcat)
+         zpsy  = psy (ji,jj,jcat)
+         zpsyy = psyy(ji,jj,jcat)
+         zpsxy = psxy(ji,jj,jcat)
 
-               zps0  = zslpmax
-               zpsx  = zs1new  * rswitch
-               zpsxx = zs2new  * rswitch
-               zpsy  = zpsy    * rswitch
-               zpsyy = zpsyy   * rswitch
-               zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch
-
-               !  Calculate fluxes and moments between boxes i<-->i+1
-               !                                !  Flux from i to i+1 WHEN u GT 0
-               zbet(ji,jj)  =  MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) )
-               zalf         =  MAX( 0._wp, put(ji,jj) ) * pdt / zpsm
-               zalfq        =  zalf * zalf
-               zalf1        =  1.0 - zalf
-               zalf1q       =  zalf1 * zalf1
-               !
-               zfm (ji,jj)  =  zalf  *   zpsm
-               zf0 (ji,jj)  =  zalf  * ( zps0  + zalf1 * ( zpsx + (zalf1 - zalf) * zpsxx ) )
-               zfx (ji,jj)  =  zalfq * ( zpsx  + 3.0 * zalf1 * zpsxx )
-               zfxx(ji,jj)  =  zalf  *   zpsxx * zalfq
-               zfy (ji,jj)  =  zalf  * ( zpsy  + zalf1 * zpsxy )
-               zfxy(ji,jj)  =  zalfq *   zpsxy
-               zfyy(ji,jj)  =  zalf  *   zpsyy
-
-               !                                !  Readjust moments remaining in the box.
-               zpsm  =  zpsm  - zfm(ji,jj)
-               zps0  =  zps0  - zf0(ji,jj)
-               zpsx  =  zalf1q * ( zpsx - 3.0 * zalf * zpsxx )
-               zpsxx =  zalf1  * zalf1q * zpsxx
-               zpsy  =  zpsy  - zfy (ji,jj)
-               zpsyy =  zpsyy - zfyy(ji,jj)
-               zpsxy =  zalf1q * zpsxy
-               !
-               psm (ji,jj,jl) = zpsm ! optimization
-               ps0 (ji,jj,jl) = zps0
-               psx (ji,jj,jl) = zpsx
-               psxx(ji,jj,jl) = zpsxx
-               psy (ji,jj,jl) = zpsy
-               psyy(ji,jj,jl) = zpsyy
-               psxy(ji,jj,jl) = zpsxy
-               !
-            END DO
-
-            DO ji = Nis0 - 1, Nie0
-               !                                !  Flux from i+1 to i when u LT 0.
-               zalf          = MAX( 0._wp, -put(ji,jj) ) * pdt / psm(ji+1,jj,jl)
-               zalg  (ji,jj) = zalf
-               zalfq         = zalf * zalf
-               zalf1         = 1.0 - zalf
-               zalg1 (ji,jj) = zalf1
-               zalf1q        = zalf1 * zalf1
-               zalg1q(ji,jj) = zalf1q
-               !
-               zfm   (ji,jj) = zfm (ji,jj) + zalf  *    psm (ji+1,jj,jl)
-               zf0   (ji,jj) = zf0 (ji,jj) + zalf  * (  ps0 (ji+1,jj,jl) &
-                  &                                   - zalf1 * ( psx(ji+1,jj,jl) - (zalf1 - zalf ) * psxx(ji+1,jj,jl) ) )
-               zfx   (ji,jj) = zfx (ji,jj) + zalfq * (  psx (ji+1,jj,jl) - 3.0 * zalf1 * psxx(ji+1,jj,jl) )
-               zfxx  (ji,jj) = zfxx(ji,jj) + zalf  *    psxx(ji+1,jj,jl) * zalfq
-               zfy   (ji,jj) = zfy (ji,jj) + zalf  * (  psy (ji+1,jj,jl) - zalf1 * psxy(ji+1,jj,jl) )
-               zfxy  (ji,jj) = zfxy(ji,jj) + zalfq *    psxy(ji+1,jj,jl)
-               zfyy  (ji,jj) = zfyy(ji,jj) + zalf  *    psyy(ji+1,jj,jl)
-            END DO
+         !  Initialize volumes of boxes (=area if adv_x first called, =psm otherwise)
+         zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1._wp - pcrh ) * zpsm , epsi20 )
+         !
+         zslpmax = MAX( 0._wp, zps0 )
+         zps0    = zslpmax
+         !
+         IF( zslpmax > 0._wp ) THEN
+            zs1max = 1.5_wp * zslpmax
+            zs1new = MIN( zs1max, MAX( -zs1max, zpsx ) )
+            zs2new = MIN( 2._wp * zslpmax - 0.3334_wp * ABS( zs1new ), MAX( ABS( zs1new ) - zslpmax, zpsxx ) )
+            !
+            zpsx  = zs1new  * tmask(ji,jj,1)
+            zpsxx = zs2new  * tmask(ji,jj,1)
+            zpsy  = zpsy    * tmask(ji,jj,1)
+            zpsyy = zpsyy   * tmask(ji,jj,1)
+            zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * tmask(ji,jj,1)
+         ELSE
+            zpsx  = 0._wp
+            zpsxx = 0._wp
+            zpsy  = 0._wp
+            zpsyy = 0._wp
+            zpsxy = 0._wp
+         ENDIF
+         !
+         !  Calculate fluxes and moments between boxes i<-->i+1
+         !                                !  Flux from i to i+1 WHEN u GT 0
+         IF( put(ji,jj) >= 0._wp ) THEN
+            !
+            zalf    = put(ji,jj) * pdt / zpsm
+            z1malf  = 1._wp - zalf
+            !
+            zalf2   =   zalf  *   zalf
+            zalf3   =   zalf2 *   zalf
+            z1malf2 = z1malf  * z1malf
+            z1malf3 = z1malf2 * z1malf
+            
+            zfm (ji,jj) = zalf  *   zpsm
+            zf0 (ji,jj) = zalf  * ( zps0  +         z1malf * ( zpsx + (z1malf - zalf) * zpsxx ) )
+            zfx (ji,jj) = zalf2 * ( zpsx  + 3._wp * z1malf *   zpsxx )
+            zfxx(ji,jj) = zalf3 *   zpsxx
+            zfy (ji,jj) = zalf  * ( zpsy  +         z1malf *   zpsxy )
+            zfyy(ji,jj) = zalf  *   zpsyy
+            zfxy(ji,jj) = zalf2 *   zpsxy
+            !                                !  Readjust moments remaining in the box.
+            zpsm  = zpsm    -   zfm (ji,jj)
+            zps0  = zps0    -   zf0 (ji,jj)
+            zpsx  = z1malf2 * ( zpsx - 3._wp * zalf * zpsxx )
+            zpsxx = z1malf3 *   zpsxx
+            zpsy  = zpsy    -   zfy (ji,jj)
+            zpsyy = zpsyy   -   zfyy(ji,jj)
+            zpsxy = z1malf2 *   zpsxy
+         ELSE
+            zfm (ji,jj) = 0._wp
+            zf0 (ji,jj) = 0._wp
+            zfx (ji,jj) = 0._wp
+            zfxx(ji,jj) = 0._wp
+            zfy (ji,jj) = 0._wp
+            zfyy(ji,jj) = 0._wp
+            zfxy(ji,jj) = 0._wp
+         ENDIF
+         !
+         psm (ji,jj) = zpsm ! optimization
+         ps0 (ji,jj) = zps0
+         psx (ji,jj,jcat) = zpsx
+         psxx(ji,jj,jcat) = zpsxx
+         psy (ji,jj,jcat) = zpsy
+         psyy(ji,jj,jcat) = zpsyy
+         psxy(ji,jj,jcat) = zpsxy
+         !
+      END_2D
 
-            DO ji = Nis0, Nie0
-               !
-               zpsm  = psm (ji,jj,jl) ! optimization
-               zps0  = ps0 (ji,jj,jl)
-               zpsx  = psx (ji,jj,jl)
-               zpsxx = psxx(ji,jj,jl)
-               zpsy  = psy (ji,jj,jl)
-               zpsyy = psyy(ji,jj,jl)
-               zpsxy = psxy(ji,jj,jl)
-               !                                !  Readjust moments remaining in the box.
-               zbt  =       zbet(ji-1,jj)
-               zbt1 = 1.0 - zbet(ji-1,jj)
-               !
-               zpsm  = zbt * zpsm + zbt1 * ( zpsm - zfm(ji-1,jj) )
-               zps0  = zbt * zps0 + zbt1 * ( zps0 - zf0(ji-1,jj) )
-               zpsx  = zalg1q(ji-1,jj) * ( zpsx + 3.0 * zalg(ji-1,jj) * zpsxx )
-               zpsxx = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * zpsxx
-               zpsy  = zbt * zpsy  + zbt1 * ( zpsy  - zfy (ji-1,jj) )
-               zpsyy = zbt * zpsyy + zbt1 * ( zpsyy - zfyy(ji-1,jj) )
-               zpsxy = zalg1q(ji-1,jj) * zpsxy
+      DO_2D( ji0, ji0-1, jj0, jj0 )
+         !                                !  Flux from i+1 to i when u LT 0.
+         IF( put(ji,jj) < 0._wp ) THEN
+            !
+            zalf   = - put(ji,jj) * pdt / psm(ji+1,jj)
+            z1malf =   1._wp - zalf
+            !
+            zalf2  = zalf  * zalf
+            zalf3  = zalf2 * zalf
+            
+            zfm (ji,jj) = zfm (ji,jj) + zalf  *   psm (ji+1,jj)
+            zf0 (ji,jj) = zf0 (ji,jj) + zalf  * ( ps0 (ji+1,jj) &
+               &                                - z1malf * ( psx (ji+1,jj,jcat) - ( z1malf - zalf ) * psxx(ji+1,jj,jcat) ) )
+            zfxx(ji,jj) = zfxx(ji,jj) + zalf3 *              psxx(ji+1,jj,jcat)
+            zfy (ji,jj) = zfy (ji,jj) + zalf  * (            psy (ji+1,jj,jcat) -          z1malf   * psxy(ji+1,jj,jcat) )
+            zfyy(ji,jj) = zfyy(ji,jj) + zalf  *              psyy(ji+1,jj,jcat)
+            zfxy(ji,jj) = zfxy(ji,jj) + zalf2 *              psxy(ji+1,jj,jcat)
+         ENDIF
+         !
+      END_2D
 
-               !   Put the temporary moments into appropriate neighboring boxes.
-               !                                !   Flux from i to i+1 IF u GT 0.
-               zbt   =       zbet(ji-1,jj)
-               zbt1  = 1.0 - zbet(ji-1,jj)
-               zpsm  = zbt * ( zpsm + zfm(ji-1,jj) ) + zbt1 * zpsm
-               zalf  = zbt * zfm(ji-1,jj) / zpsm
-               zalf1 = 1.0 - zalf
-               ztemp = zalf * zps0 - zalf1 * zf0(ji-1,jj)
-               !
-               zps0  =  zbt  * ( zps0 + zf0(ji-1,jj) ) + zbt1 * zps0
-               zpsx  =  zbt  * ( zalf * zfx(ji-1,jj) + zalf1 * zpsx + 3.0 * ztemp ) + zbt1 * zpsx
-               zpsxx =  zbt  * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * zpsxx                            &
-                  &            + 5.0 * ( zalf * zalf1 * ( zpsx  - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp ) ) &
-                  &            + zbt1 * zpsxx
-               zpsxy =  zbt  * ( zalf * zfxy(ji-1,jj) + zalf1 * zpsxy            &
-                  &            + 3.0 * (- zalf1*zfy(ji-1,jj)  + zalf * zpsy ) )  &
-                  &            + zbt1 * zpsxy
-               zpsy  =  zbt  * ( zpsy  + zfy (ji-1,jj) ) + zbt1 * zpsy
-               zpsyy =  zbt  * ( zpsyy + zfyy(ji-1,jj) ) + zbt1 * zpsyy
+      DO_2D( ji0-1, ji0-1, jj0, jj0 )
+         !
+         zpsm  = psm (ji,jj) ! optimization
+         zps0  = ps0 (ji,jj)
+         zpsx  = psx (ji,jj,jcat)
+         zpsxx = psxx(ji,jj,jcat)
+         zpsy  = psy (ji,jj,jcat)
+         zpsyy = psyy(ji,jj,jcat)
+         zpsxy = psxy(ji,jj,jcat)
+         !                                !  Readjust moments remaining in the box.
+         IF( put(ji-1,jj) < 0._wp ) THEN
+            !
+            zalf    = - put(ji-1,jj) * pdt / psm(ji,jj)
+            z1malf  =   1._wp - zalf
+            !
+            z1malf2 = z1malf  * z1malf
+            z1malf3 = z1malf2 * z1malf
+            !
+            zpsm  = zpsm    -   zfm (ji-1,jj)
+            zps0  = zps0    -   zf0 (ji-1,jj)
+            zpsx  = z1malf2 * ( zpsx + 3._wp * zalf * zpsxx )
+            zpsxx = z1malf3 *   zpsxx
+            zpsy  = zpsy    -   zfy (ji-1,jj)
+            zpsyy = zpsyy   -   zfyy(ji-1,jj)
+            zpsxy = z1malf2 *   zpsxy
+         ENDIF
 
-               !                                !  Flux from i+1 to i IF u LT 0.
-               zbt   =       zbet(ji,jj)
-               zbt1  = 1.0 - zbet(ji,jj)
-               zpsm  = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) )
-               zalf  = zbt1 * zfm(ji,jj) / zpsm
-               zalf1 = 1.0 - zalf
-               ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj)
-               !
-               zps0  = zbt * zps0  + zbt1 * ( zps0 + zf0(ji,jj) )
-               zpsx  = zbt * zpsx  + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * zpsx + 3.0 * ztemp )
-               zpsxx = zbt * zpsxx + zbt1 * ( zalf * zalf * zfxx(ji,jj) + zalf1 * zalf1 * zpsxx &
-                  &                         + 5.0 * ( zalf * zalf1 * ( - zpsx + zfx(ji,jj) )    &
-                  &                         + ( zalf1 - zalf ) * ztemp ) )
-               zpsxy = zbt * zpsxy + zbt1 * ( zalf * zfxy(ji,jj) + zalf1 * zpsxy  &
-                  &                         + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * zpsy ) )
-               zpsy  = zbt * zpsy  + zbt1 * ( zpsy  + zfy (ji,jj) )
-               zpsyy = zbt * zpsyy + zbt1 * ( zpsyy + zfyy(ji,jj) )
-               !
-               psm (ji,jj,jl) = zpsm  ! optimization
-               ps0 (ji,jj,jl) = zps0
-               psx (ji,jj,jl) = zpsx
-               psxx(ji,jj,jl) = zpsxx
-               psy (ji,jj,jl) = zpsy
-               psyy(ji,jj,jl) = zpsyy
-               psxy(ji,jj,jl) = zpsxy
-            END DO
+         !   Put the temporary moments into appropriate neighboring boxes.
+         !                                !   Flux from i to i+1 IF u GT 0.
+         IF( put(ji-1,jj) >= 0._wp ) THEN
             !
-         END DO
+            zpsm = zpsm + zfm(ji-1,jj)
+            !
+            zalf    = zfm(ji-1,jj) / zpsm
+            z1malf  = 1._wp - zalf
+            !
+            zalf2   =   zalf *   zalf
+            z1malf2 = z1malf * z1malf
+            !
+            zps0  = zps0 +               zf0 (ji-1,jj)
+            zpsx  = (            zalf  * zfx (ji-1,jj) + z1malf  * zpsx  ) + 3._wp * ( zalf * zps0 - z1malf * zf0(ji-1,jj) )
+            zpsxx = (            zalf2 * zfxx(ji-1,jj) + z1malf2 * zpsxx ) &
+               &  + 5._wp * (    zalf  * z1malf * ( zpsx - zfx(ji-1,jj) ) - (z1malf-zalf) * (zalf * zps0 - z1malf * zf0(ji-1,jj)) )
+            zpsxy =         (    zalf  * zfxy(ji-1,jj) + z1malf * zpsxy )  & ! do not move this line (it depends on zpsy)
+               &  + 3._wp * ( -z1malf  * zfy (ji-1,jj) +   zalf * zpsy  )
+            zpsy  = zpsy  +              zfy (ji-1,jj)
+            zpsyy = zpsyy +              zfyy(ji-1,jj)
+         ENDIF
+         
+         !                                !  Flux from i+1 to i IF u LT 0.
+         IF( put(ji,jj) < 0._wp ) THEN
+            !
+            zpsm = zpsm + zfm(ji,jj)
+            !
+            zalf    = zfm(ji,jj) / zpsm
+            z1malf  = 1._wp - zalf
+            !
+            zalf2   =   zalf *   zalf
+            z1malf2 = z1malf * z1malf
+            !
+            zps0  = zps0 +              zf0 (ji,jj)
+            zpsx  = (           zalf  * zfx (ji,jj) + z1malf  * zpsx ) + 3._wp * ( -zalf * zps0 + z1malf * zf0(ji,jj) )
+            zpsxx = (           zalf2 * zfxx(ji,jj) + z1malf2 * zpsxx ) &
+               &  + 5._wp * (   zalf  * z1malf * ( -zpsx + zfx (ji,jj) ) + (z1malf-zalf) * (-zalf * zps0 + z1malf * zf0(ji,jj)) ) 
+            zpsxy =         (   zalf  * zfxy(ji,jj) + z1malf * zpsxy )  & ! do not move this line (it depends on zpsy)
+               &  + 3._wp * ( z1malf  * zfy (ji,jj) -   zalf * zpsy  ) 
+            zpsy  = zpsy  +             zfy (ji,jj)
+            zpsyy = zpsyy +             zfyy(ji,jj)
+         ENDIF
          !
-      END DO
+         psm (ji,jj) = zpsm  ! optimization
+         ps0 (ji,jj) = zps0
+         psx (ji,jj,jcat) = zpsx
+         psxx(ji,jj,jcat) = zpsxx
+         psy (ji,jj,jcat) = zpsy
+         psyy(ji,jj,jcat) = zpsyy
+         psxy(ji,jj,jcat) = zpsxy
+         !
+      END_2D
       !
    END SUBROUTINE adv_x
 
 
-   SUBROUTINE adv_y( pdt, pvt , pcrh, psm , ps0 ,   &
+   SUBROUTINE adv_y( ihls, jcat, pdt, pvt , pcrh, psm , ps0 ,   &
       &              psx, psxx, psy , psyy, psxy )
       !!---------------------------------------------------------------------
       !!                **  routine adv_y  **
@@ -557,193 +654,224 @@ CONTAINS
       !! ** purpose :   Computes and adds the advection trend to sea-ice
       !!                variable on y axis
       !!---------------------------------------------------------------------
+      INTEGER                   , INTENT(in   ) ::   ihls               ! loop index
+      INTEGER                   , INTENT(in   ) ::   jcat               ! category
       REAL(wp)                  , INTENT(in   ) ::   pdt                ! time step
       REAL(wp)                  , INTENT(in   ) ::   pcrh               ! call adv_x then adv_y (=1) or the opposite (=0)
       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pvt                ! j-direction ice velocity at V-point [m/s]
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psm                ! area
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ps0                ! field to be advected
+      REAL(wp), DIMENSION(:,:)  , INTENT(inout) ::   psm                ! area
+      REAL(wp), DIMENSION(:,:)  , INTENT(inout) ::   ps0                ! field to be advected
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psx , psy          ! 1st moments
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   psxx, psyy, psxy   ! 2nd moments
       !!
-      INTEGER  ::   ji, jj, jl, jcat                     ! dummy loop indices
-      INTEGER  ::   ji0                                  ! dummy loop indices
-      REAL(wp) ::   zs1max, zslpmax, ztemp               ! temporary scalars
-      REAL(wp) ::   zs1new, zalf , zalfq , zbt           !    -         -
-      REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !    -         -
+      INTEGER  ::   ji, jj                               ! dummy loop indices
+      INTEGER  ::   ji0, jj0                             ! dummy loop indices
+      REAL(wp) ::   zs1max, zslpmax                      ! local scalars
+      REAL(wp) ::   zs1new, zalf , zalf2, zalf3          !   -      -
+      REAL(wp) ::   zs2new, z1malf, z1malf2, z1malf3     !   -      -
       REAL(wp) ::   zpsm, zps0
       REAL(wp) ::   zpsx, zpsy, zpsxx, zpsyy, zpsxy
-      REAL(wp), DIMENSION(jpi,jpj) ::   zf0, zfx , zfy , zbet   ! 2D workspace
-      REAL(wp), DIMENSION(jpi,jpj) ::   zfm, zfxx, zfyy, zfxy   !  -      -
-      REAL(wp), DIMENSION(jpi,jpj) ::   zalg, zalg1, zalg1q     !  -      -
+      REAL(wp), DIMENSION(jpi,jpj) ::   zf0 , zfx  , zfy            ! 2D workspace
+      REAL(wp), DIMENSION(jpi,jpj) ::   zfm , zfxx , zfyy  , zfxy   !  -      -
       !---------------------------------------------------------------------
       ! in order to avoid lbc_lnk (communications):
       !    ji loop must be 1:jpi   if adv_y is called first
       !                and 2:jpi-1 if adv_y is called second
-      ji0 = NINT(pcrh)
-      !
-      jcat = SIZE( ps0 , 3 )   ! size of input arrays
+      ji0 = NINT(pcrh) + ihls
+      jj0 = 1 + ihls
       !
-      DO jl = 1, jcat   ! loop on categories
+      ! Limitation of moments.
+      DO_2D( ji0, ji0, jj0, jj0 )
          !
-         ! Limitation of moments.
-         DO_2D( ji0, ji0, 1, 1 )
-            !
-            zpsm  = psm (ji,jj,jl) ! optimization
-            zps0  = ps0 (ji,jj,jl)
-            zpsx  = psx (ji,jj,jl)
-            zpsxx = psxx(ji,jj,jl)
-            zpsy  = psy (ji,jj,jl)
-            zpsyy = psyy(ji,jj,jl)
-            zpsxy = psxy(ji,jj,jl)
+         zpsm  = psm (ji,jj) ! optimization
+         zps0  = ps0 (ji,jj)
+         zpsx  = psx (ji,jj,jcat)
+         zpsxx = psxx(ji,jj,jcat)
+         zpsy  = psy (ji,jj,jcat)
+         zpsyy = psyy(ji,jj,jcat)
+         zpsxy = psxy(ji,jj,jcat)
+         !
+         !  Initialize volumes of boxes (=area if adv_y first called, =psm otherwise)
+         zpsm = MAX( pcrh * e1e2t(ji,jj) + ( 1._wp - pcrh ) * zpsm , epsi20  )
+         !
+         zslpmax = MAX( 0._wp, zps0 )
+         zps0    = zslpmax
+         !
+         IF( zslpmax > 0._wp ) THEN
+            zs1max  = 1.5_wp * zslpmax
+            zs1new  = MIN( zs1max, MAX( -zs1max, zpsy ) )
+            zs2new  = MIN( 2._wp * zslpmax - 0.3334_wp * ABS( zs1new ), MAX( ABS( zs1new ) - zslpmax, zpsyy ) )
             !
-            !  Initialize volumes of boxes (=area if adv_y first called, =psm otherwise)
-            zpsm = MAX(  pcrh * e1e2t(ji,jj) + ( 1.0 - pcrh ) * zpsm , epsi20  )
+            zpsx  = zpsx    * tmask(ji,jj,1)
+            zpsxx = zpsxx   * tmask(ji,jj,1)
+            zpsy  = zs1new  * tmask(ji,jj,1)
+            zpsyy = zs2new  * tmask(ji,jj,1)
+            zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * tmask(ji,jj,1)
+         ELSE
+            zpsx  = 0._wp
+            zpsxx = 0._wp
+            zpsy  = 0._wp
+            zpsyy = 0._wp
+            zpsxy = 0._wp
+         ENDIF
+         !
+         !  Calculate fluxes and moments between boxes j<-->j+1
+         !                                !  Flux from j to j+1 WHEN v GT 0
+         IF( pvt(ji,jj) >= 0._wp ) THEN
             !
-            zslpmax = MAX( 0._wp, zps0 )
-            zs1max  = 1.5 * zslpmax
-            zs1new  = MIN( zs1max, MAX( -zs1max, zpsy ) )
-            zs2new  = MIN( ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ), MAX( ABS( zs1new )-zslpmax, zpsyy ) )
-            rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1)   ! Case of empty boxes & Apply mask
+            zalf    = pvt(ji,jj) * pdt / zpsm
+            z1malf  = 1._wp - zalf
             !
-            zps0  = zslpmax
-            zpsx  = zpsx  * rswitch
-            zpsxx = zpsxx * rswitch
-            zpsy  = zs1new         * rswitch
-            zpsyy = zs2new         * rswitch
-            zpsxy = MIN( zslpmax, MAX( -zslpmax, zpsxy ) ) * rswitch
-
-            !  Calculate fluxes and moments between boxes j<-->j+1
-            !                                !  Flux from j to j+1 WHEN v GT 0
-            zbet(ji,jj)  =  MAX( 0._wp, SIGN( 1._wp, pvt(ji,jj) ) )
-            zalf         =  MAX( 0._wp, pvt(ji,jj) ) * pdt / zpsm
-            zalfq        =  zalf * zalf
-            zalf1        =  1.0 - zalf
-            zalf1q       =  zalf1 * zalf1
+            zalf2   =   zalf  *   zalf
+            zalf3   =   zalf2 *   zalf
+            z1malf2 = z1malf  * z1malf
+            z1malf3 = z1malf2 * z1malf
             !
-            zfm (ji,jj)  =  zalf  * zpsm
-            zf0 (ji,jj)  =  zalf  * ( zps0 + zalf1 * ( zpsy  + (zalf1-zalf) * zpsyy ) )
-            zfy (ji,jj)  =  zalfq *( zpsy + 3.0*zalf1*zpsyy )
-            zfyy(ji,jj)  =  zalf  * zalfq * zpsyy
-            zfx (ji,jj)  =  zalf  * ( zpsx + zalf1 * zpsxy )
-            zfxy(ji,jj)  =  zalfq * zpsxy
-            zfxx(ji,jj)  =  zalf  * zpsxx
+            zfm (ji,jj) =  zalf  *   zpsm
+            zf0 (ji,jj) =  zalf  * ( zps0  +         z1malf * ( zpsy + (z1malf - zalf) * zpsyy ) )
+            zfy (ji,jj) =  zalf2 * ( zpsy  + 3._wp * z1malf *   zpsyy )
+            zfyy(ji,jj) =  zalf3 *   zpsyy 
+            zfx (ji,jj) =  zalf  * ( zpsx  +         z1malf *   zpsxy )
+            zfxx(ji,jj) =  zalf  *   zpsxx
+            zfxy(ji,jj) =  zalf2 *   zpsxy
             !
             !                                !  Readjust moments remaining in the box.
-            zpsm   =  zpsm  - zfm(ji,jj)
-            zps0   =  zps0  - zf0(ji,jj)
-            zpsy   =  zalf1q * ( zpsy -3.0 * zalf * zpsyy )
-            zpsyy  =  zalf1 * zalf1q * zpsyy
-            zpsx   =  zpsx  - zfx(ji,jj)
-            zpsxx  =  zpsxx - zfxx(ji,jj)
-            zpsxy  =  zalf1q * zpsxy
-            !
-            psm (ji,jj,jl) = zpsm ! optimization
-            ps0 (ji,jj,jl) = zps0
-            psx (ji,jj,jl) = zpsx
-            psxx(ji,jj,jl) = zpsxx
-            psy (ji,jj,jl) = zpsy
-            psyy(ji,jj,jl) = zpsyy
-            psxy(ji,jj,jl) = zpsxy
-         END_2D
+            zpsm  = zpsm    -   zfm (ji,jj)
+            zps0  = zps0    -   zf0 (ji,jj)
+            zpsy  = z1malf2 * ( zpsy -3._wp * zalf * zpsyy )
+            zpsyy = z1malf3 *   zpsyy
+            zpsx  = zpsx    -   zfx (ji,jj)
+            zpsxx = zpsxx   -   zfxx(ji,jj)
+            zpsxy = z1malf2 *   zpsxy
+         ELSE
+            zfm (ji,jj) = 0._wp
+            zf0 (ji,jj) = 0._wp
+            zfx (ji,jj) = 0._wp
+            zfxx(ji,jj) = 0._wp
+            zfy (ji,jj) = 0._wp
+            zfyy(ji,jj) = 0._wp
+            zfxy(ji,jj) = 0._wp
+         ENDIF
          !
-         DO_2D( ji0, ji0, 1, 0 )
-            !                                !  Flux from j+1 to j when v LT 0.
-            zalf          = MAX( 0._wp, -pvt(ji,jj) ) * pdt / psm(ji,jj+1,jl)
-            zalg  (ji,jj) = zalf
-            zalfq         = zalf * zalf
-            zalf1         = 1.0 - zalf
-            zalg1 (ji,jj) = zalf1
-            zalf1q        = zalf1 * zalf1
-            zalg1q(ji,jj) = zalf1q
+         psm (ji,jj) = zpsm ! optimization
+         ps0 (ji,jj) = zps0
+         psx (ji,jj,jcat) = zpsx
+         psxx(ji,jj,jcat) = zpsxx
+         psy (ji,jj,jcat) = zpsy
+         psyy(ji,jj,jcat) = zpsyy
+         psxy(ji,jj,jcat) = zpsxy
+         !
+      END_2D
+      !
+      DO_2D( ji0, ji0, jj0, jj0-1 )
+         !                                !  Flux from j+1 to j when v LT 0.
+         IF( pvt(ji,jj) < 0._wp ) THEN
             !
-            zfm   (ji,jj) = zfm (ji,jj) + zalf  *    psm (ji,jj+1,jl)
-            zf0   (ji,jj) = zf0 (ji,jj) + zalf  * (  ps0 (ji,jj+1,jl) &
-               &                                   - zalf1 * (psy(ji,jj+1,jl) - (zalf1 - zalf ) * psyy(ji,jj+1,jl) ) )
-            zfy   (ji,jj) = zfy (ji,jj) + zalfq * (  psy (ji,jj+1,jl) - 3.0 * zalf1 * psyy(ji,jj+1,jl) )
-            zfyy  (ji,jj) = zfyy(ji,jj) + zalf  *    psyy(ji,jj+1,jl) * zalfq
-            zfx   (ji,jj) = zfx (ji,jj) + zalf  * (  psx (ji,jj+1,jl) - zalf1 * psxy(ji,jj+1,jl) )
-            zfxy  (ji,jj) = zfxy(ji,jj) + zalfq *    psxy(ji,jj+1,jl)
-            zfxx  (ji,jj) = zfxx(ji,jj) + zalf  *    psxx(ji,jj+1,jl)
-         END_2D
-
-         DO_2D( ji0, ji0, 0, 0 )
-            !                                !  Readjust moments remaining in the box.
-            zbt  =         zbet(ji,jj-1)
-            zbt1 = ( 1.0 - zbet(ji,jj-1) )
+            zalf   = - pvt(ji,jj) * pdt / psm(ji,jj+1)
+            z1malf =   1._wp - zalf
             !
-            zpsm  = psm (ji,jj,jl) ! optimization
-            zps0  = ps0 (ji,jj,jl)
-            zpsx  = psx (ji,jj,jl)
-            zpsxx = psxx(ji,jj,jl)
-            zpsy  = psy (ji,jj,jl)
-            zpsyy = psyy(ji,jj,jl)
-            zpsxy = psxy(ji,jj,jl)
+            zalf2  = zalf  * zalf
+            zalf3  = zalf2 * zalf
             !
-            zpsm  = zbt * zpsm + zbt1 * ( zpsm - zfm(ji,jj-1) )
-            zps0  = zbt * zps0 + zbt1 * ( zps0 - zf0(ji,jj-1) )
-            zpsy  = zalg1q(ji,jj-1) * ( zpsy + 3.0 * zalg(ji,jj-1) * zpsyy )
-            zpsyy = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * zpsyy
-            zpsx  = zbt * zpsx  + zbt1 * ( zpsx  - zfx (ji,jj-1) )
-            zpsxx = zbt * zpsxx + zbt1 * ( zpsxx - zfxx(ji,jj-1) )
-            zpsxy = zalg1q(ji,jj-1) * zpsxy
+            zfm (ji,jj) = zfm (ji,jj) + zalf  *   psm (ji,jj+1)
+            zf0 (ji,jj) = zf0 (ji,jj) + zalf  * ( ps0 (ji,jj+1) &
+               &                                - z1malf * ( psy (ji,jj+1,jcat) - ( z1malf - zalf ) * psyy(ji,jj+1,jcat) ) )
+            zfy (ji,jj) = zfy (ji,jj) + zalf2 * (            psy (ji,jj+1,jcat) -  3._wp * z1malf   * psyy(ji,jj+1,jcat) )
+            zfyy(ji,jj) = zfyy(ji,jj) + zalf3 *              psyy(ji,jj+1,jcat)
+            zfx (ji,jj) = zfx (ji,jj) + zalf  * (            psx (ji,jj+1,jcat) -          z1malf   * psxy(ji,jj+1,jcat) )
+            zfxx(ji,jj) = zfxx(ji,jj) + zalf  *              psxx(ji,jj+1,jcat)
+            zfxy(ji,jj) = zfxy(ji,jj) + zalf2 *              psxy(ji,jj+1,jcat)
+         ENDIF
+         !
+      END_2D
 
-            !   Put the temporary moments into appropriate neighboring boxes.
-            !                                !   Flux from j to j+1 IF v GT 0.
-            zbt   =       zbet(ji,jj-1)
-            zbt1  = 1.0 - zbet(ji,jj-1)
-            zpsm  = zbt * ( zpsm + zfm(ji,jj-1) ) + zbt1 * zpsm
-            zalf  = zbt * zfm(ji,jj-1) / zpsm
-            zalf1 = 1.0 - zalf
-            ztemp = zalf * zps0 - zalf1 * zf0(ji,jj-1)
+      DO_2D( ji0, ji0, jj0-1, jj0-1 )
+         !
+         zpsm  = psm (ji,jj) ! optimization
+         zps0  = ps0 (ji,jj)
+         zpsx  = psx (ji,jj,jcat)
+         zpsxx = psxx(ji,jj,jcat)
+         zpsy  = psy (ji,jj,jcat)
+         zpsyy = psyy(ji,jj,jcat)
+         zpsxy = psxy(ji,jj,jcat)
+         !                                !  Readjust moments remaining in the box.
+         IF( pvt(ji,jj-1) < 0._wp ) THEN
             !
-            zps0  =   zbt  * ( zps0 + zf0(ji,jj-1) ) + zbt1 * zps0
-            zpsy  =   zbt  * ( zalf * zfy(ji,jj-1) + zalf1 * zpsy + 3.0 * ztemp )  &
-               &             + zbt1 * zpsy
-            zpsyy =   zbt  * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * zpsyy                           &
-               &             + 5.0 * ( zalf * zalf1 * ( zpsy - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) ) &
-               &             + zbt1 * zpsyy
-            zpsxy =   zbt  * ( zalf * zfxy(ji,jj-1) + zalf1 * zpsxy             &
-               &             + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * zpsx ) )  &
-               &             + zbt1 * zpsxy
-            zpsx  =   zbt * ( zpsx  + zfx (ji,jj-1) ) + zbt1 * zpsx
-            zpsxx =   zbt * ( zpsxx + zfxx(ji,jj-1) ) + zbt1 * zpsxx
+            zalf    = - pvt(ji,jj-1) * pdt / psm(ji,jj)
+            z1malf  =   1._wp - zalf
+            !
+            z1malf2 = z1malf  * z1malf
+            z1malf3 = z1malf2 * z1malf
+            !
+            zpsm  = zpsm    -   zfm(ji,jj-1)
+            zps0  = zps0    -   zf0(ji,jj-1)
+            zpsy  = z1malf2 * ( zpsy + 3._wp * zalf * zpsyy )
+            zpsyy = z1malf3 *   zpsyy
+            zpsx  = zpsx    -   zfx (ji,jj-1)
+            zpsxx = zpsxx   -   zfxx(ji,jj-1)
+            zpsxy = z1malf2 *   zpsxy
+         ENDIF
 
-            !                                !  Flux from j+1 to j IF v LT 0.
-            zbt   =       zbet(ji,jj)
-            zbt1  = 1.0 - zbet(ji,jj)
-            zpsm  = zbt * zpsm + zbt1 * ( zpsm + zfm(ji,jj) )
-            zalf  = zbt1 * zfm(ji,jj) / zpsm
-            zalf1 = 1.0 - zalf
-            ztemp = - zalf * zps0 + zalf1 * zf0(ji,jj)
+         !   Put the temporary moments into appropriate neighboring boxes.
+         !                                !   Flux from j to j+1 IF v GT 0.
+         IF( pvt(ji,jj-1) >= 0._wp ) THEN
             !
-            zps0  = zbt * zps0  + zbt1 * (  zps0 + zf0(ji,jj) )
-            zpsy  = zbt * zpsy  + zbt1 * (  zalf * zfy(ji,jj) + zalf1 * zpsy + 3.0 * ztemp )
-            zpsyy = zbt * zpsyy + zbt1 * (  zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * zpsyy &
-               &                         + 5.0 * ( zalf * zalf1 * ( - zpsy + zfy(ji,jj) )     &
-               &                         + ( zalf1 - zalf ) * ztemp ) )
-            zpsxy = zbt * zpsxy + zbt1 * (  zalf * zfxy(ji,jj) + zalf1 * zpsxy  &
-               &                         + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * zpsx ) )
-            zpsx  = zbt * zpsx  + zbt1 * ( zpsx  + zfx (ji,jj) )
-            zpsxx = zbt * zpsxx + zbt1 * ( zpsxx + zfxx(ji,jj) )
+            zpsm = zpsm + zfm(ji,jj-1)
             !
-            psm (ji,jj,jl) = zpsm ! optimization
-            ps0 (ji,jj,jl) = zps0
-            psx (ji,jj,jl) = zpsx
-            psxx(ji,jj,jl) = zpsxx
-            psy (ji,jj,jl) = zpsy
-            psyy(ji,jj,jl) = zpsyy
-            psxy(ji,jj,jl) = zpsxy
-         END_2D
+            zalf   = zfm(ji,jj-1) / zpsm
+            z1malf = 1._wp - zalf
+            !
+            zalf2   =   zalf *   zalf
+            z1malf2 = z1malf * z1malf            
+            !
+            zps0  = zps0 +               zf0 (ji,jj-1)
+            zpsy  = (            zalf  * zfy (ji,jj-1) + z1malf  * zpsy  ) + 3._wp * ( zalf * zps0 - z1malf * zf0(ji,jj-1) )
+            zpsyy = (            zalf2 * zfyy(ji,jj-1) + z1malf2 * zpsyy ) &
+               &  + 5._wp * (    zalf  * z1malf * ( zpsy - zfy(ji,jj-1) ) - (z1malf-zalf) * (zalf * zps0 - z1malf * zf0(ji,jj-1)) )
+            zpsxy =         (    zalf  * zfxy(ji,jj-1) + z1malf * zpsxy ) & ! do not move this line (it depends on zpsx)
+               &  + 3._wp * ( -z1malf  * zfx (ji,jj-1) +   zalf * zpsx  ) 
+            zpsx  = zpsx  +              zfx (ji,jj-1)
+            zpsxx = zpsxx +              zfxx(ji,jj-1)
+         ENDIF
+         
+         !                                !  Flux from j+1 to j IF v LT 0.
+         IF( pvt(ji,jj) < 0._wp ) THEN
+            !
+            zpsm  = zpsm + zfm(ji,jj)
+            !
+            zalf   = zfm(ji,jj) / zpsm
+            z1malf = 1._wp - zalf
+            !
+            zalf2   =   zalf *   zalf
+            z1malf2 = z1malf * z1malf
+            !
+            zps0  = zps0 +              zf0 (ji,jj)
+            zpsy  = (           zalf  * zfy (ji,jj) + z1malf  * zpsy ) + 3._wp * ( -zalf * zps0 + z1malf * zf0(ji,jj) )
+            zpsyy = (           zalf2 * zfyy(ji,jj) + z1malf2 * zpsyy ) &
+               &  + 5._wp * (   zalf  * z1malf * ( - zpsy + zfy(ji,jj) ) + (z1malf-zalf) * (-zalf * zps0 + z1malf * zf0(ji,jj)) )
+            zpsxy =         (  zalf   * zfxy(ji,jj) + z1malf * zpsxy )  & ! do not move this line (it depends on zpsx)
+               &  + 3._wp * ( z1malf  * zfx (ji,jj) - zalf   * zpsx  )
+            zpsx  = zpsx  +             zfx (ji,jj)
+            zpsxx = zpsxx +             zfxx(ji,jj)
+         ENDIF
          !
-      END DO
+         psm (ji,jj) = zpsm ! optimization
+         ps0 (ji,jj) = zps0
+         psx (ji,jj,jcat) = zpsx
+         psxx(ji,jj,jcat) = zpsxx
+         psy (ji,jj,jcat) = zpsy
+         psyy(ji,jj,jcat) = zpsyy
+         psxy(ji,jj,jcat) = zpsxy
+         !
+      END_2D
       !
    END SUBROUTINE adv_y
 
 
-   SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, &
+   SUBROUTINE Hbig_pra( ihls, jcat, pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, &
       &                  pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i )
       !!-------------------------------------------------------------------
-      !!                  ***  ROUTINE Hbig  ***
+      !!                  ***  ROUTINE Hbig_pra  ***
       !!
       !! ** Purpose : Thickness correction in case advection scheme creates
       !!              abnormally tick ice or snow
@@ -755,101 +883,111 @@ CONTAINS
       !!
       !! ** input   : Max thickness of the surrounding 9-points
       !!-------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   ihls                                  ! loop index
+      INTEGER                     , INTENT(in   ) ::   jcat                                  ! category
       REAL(wp)                    , INTENT(in   ) ::   pdt                                   ! tracer time-step
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   phi_max, phs_max, phip_max, psi_max   ! max ice thick from surrounding 9-pts
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pes_max
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pei_max
+      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   phi_max, phs_max, phip_max, psi_max   ! max ice thick from surrounding 9-pts
+      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pes_max
+      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pei_max
       REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i
       !
-      INTEGER  ::   ji, jj, jk, jl         ! dummy loop indices
+      INTEGER  ::   ji, jj, jk         ! dummy loop indices
       REAL(wp) ::   z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra
+      REAL(wp), DIMENSION(jpi,jpj) ::   zwfx_res, zhfx_res, zsfx_res  ! needed since loop is not (0,0,0,0)
       !!-------------------------------------------------------------------
       !
+      DO_2D( ihls, ihls, ihls, ihls )
+         zwfx_res(ji,jj) = 0._wp
+         zhfx_res(ji,jj) = 0._wp
+         zsfx_res(ji,jj) = 0._wp
+      END_2D
+      !
       z1_dt = 1._wp / pdt
       !
-      DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
-               !
-               !                               ! -- check h_ip -- !
-               ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip
-               IF( ln_pnd_LEV .OR. ln_pnd_TOPO .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN
-                  zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) )
-                  IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN
-                     pa_ip(ji,jj,jl) = pv_ip(ji,jj,jl) / phip_max(ji,jj,jl)
-                  ENDIF
-               ENDIF
-               !
-               !                               ! -- check h_i -- !
-               ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i
-               zhi = pv_i(ji,jj,jl) / pa_i(ji,jj,jl)
-               IF( zhi > phi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN
-                  pa_i(ji,jj,jl) = pv_i(ji,jj,jl) / MIN( phi_max(ji,jj,jl), hi_max(jpl) )   !-- bound h_i to hi_max (99 m)
-               ENDIF
-               !
-               !                               ! -- check h_s -- !
-               ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean
-               zhs = pv_s(ji,jj,jl) / pa_i(ji,jj,jl)
-               IF( pv_s(ji,jj,jl) > 0._wp .AND. zhs > phs_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN
-                  zfra = phs_max(ji,jj,jl) / MAX( zhs, epsi20 )
-                  !
-                  wfx_res(ji,jj) = wfx_res(ji,jj) + ( pv_s(ji,jj,jl) - pa_i(ji,jj,jl) * phs_max(ji,jj,jl) ) * rhos * z1_dt
-                  hfx_res(ji,jj) = hfx_res(ji,jj) - SUM( pe_s(ji,jj,1:nlay_s,jl) ) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
-                  !
-                  pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra
-                  pv_s(ji,jj,jl)          = pa_i(ji,jj,jl) * phs_max(ji,jj,jl)
+      DO_2D( ihls, ihls, ihls, ihls )
+         IF ( pv_i(ji,jj,jcat) > 0._wp ) THEN
+            !
+            !                               ! -- check h_ip -- !
+            ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip
+            IF( ln_pnd_LEV .OR. ln_pnd_TOPO .AND. pv_ip(ji,jj,jcat) > 0._wp ) THEN
+               zhip = pv_ip(ji,jj,jcat) / MAX( epsi20, pa_ip(ji,jj,jcat) )
+               IF( zhip > phip_max(ji,jj) .AND. pa_ip(ji,jj,jcat) < 0.15 ) THEN
+                  pa_ip(ji,jj,jcat) = pv_ip(ji,jj,jcat) / phip_max(ji,jj)
                ENDIF
+            ENDIF
+            !
+            !                               ! -- check h_i -- !
+            ! if h_i is larger than the surrounding 9 pts => reduce h_i and increase a_i
+            zhi = pv_i(ji,jj,jcat) / pa_i(ji,jj,jcat)
+            IF( zhi > phi_max(ji,jj) .AND. pa_i(ji,jj,jcat) < 0.15 ) THEN
+               pa_i(ji,jj,jcat) = pv_i(ji,jj,jcat) / MIN( phi_max(ji,jj), hi_max(jpl) )   !-- bound h_i to hi_max (99 m)
+            ENDIF
+            !
+            !                               ! -- check h_s -- !
+            ! if h_s is larger than the surrounding 9 pts => put the snow excess in the ocean
+            zhs = pv_s(ji,jj,jcat) / pa_i(ji,jj,jcat)
+            IF( pv_s(ji,jj,jcat) > 0._wp .AND. zhs > phs_max(ji,jj) .AND. pa_i(ji,jj,jcat) < 0.15 ) THEN
+               zfra = phs_max(ji,jj) / MAX( zhs, epsi20 )
                !
-               !                               ! -- check s_i -- !
-               ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean
-               zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl)
-               IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN
-                  zfra = psi_max(ji,jj,jl) / zsi
-                  sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt
-                  psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra
-               ENDIF
+               zwfx_res(ji,jj) = zwfx_res(ji,jj) + ( pv_s(ji,jj,jcat) - pa_i(ji,jj,jcat) * phs_max(ji,jj) ) * rhos * z1_dt
+               zhfx_res(ji,jj) = zhfx_res(ji,jj) - SUM( pe_s(ji,jj,1:nlay_s,jcat) ) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
                !
+               pe_s(ji,jj,1:nlay_s,jcat) = pe_s(ji,jj,1:nlay_s,jcat) * zfra
+               pv_s(ji,jj,jcat)          = pa_i(ji,jj,jcat) * phs_max(ji,jj)
             ENDIF
-         END_2D
-      END DO
+            !
+            !                               ! -- check s_i -- !
+            ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean
+            zsi = psv_i(ji,jj,jcat) / pv_i(ji,jj,jcat)
+            IF( zsi > psi_max(ji,jj) .AND. pa_i(ji,jj,jcat) < 0.15 ) THEN
+               zfra = psi_max(ji,jj) / zsi
+               zsfx_res(ji,jj) = zsfx_res(ji,jj) + psv_i(ji,jj,jcat) * ( 1._wp - zfra ) * rhoi * z1_dt
+               psv_i(ji,jj,jcat) = psv_i(ji,jj,jcat) * zfra
+            ENDIF
+            !
+         ENDIF
+      END_2D
       !
       !                                           ! -- check e_i/v_i -- !
-      DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
-            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
-               ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean
-               zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl)
-               IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN
-                  zfra = pei_max(ji,jj,jk,jl) / zei
-                  hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
-                  pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra
-               ENDIF
+      DO_3D( ihls, ihls, ihls, ihls, 1, nlay_i )
+         IF ( pv_i(ji,jj,jcat) > 0._wp ) THEN
+            ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean
+            zei = pe_i(ji,jj,jk,jcat) / pv_i(ji,jj,jcat)
+            IF( zei > pei_max(ji,jj,jk) .AND. pa_i(ji,jj,jcat) < 0.15 ) THEN
+               zfra = pei_max(ji,jj,jk) / zei
+               zhfx_res(ji,jj) = zhfx_res(ji,jj) - pe_i(ji,jj,jk,jcat) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
+               pe_i(ji,jj,jk,jcat) = pe_i(ji,jj,jk,jcat) * zfra
             ENDIF
-         END_3D
-      END DO
+         ENDIF
+      END_3D
       !                                           ! -- check e_s/v_s -- !
-      DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_s )
-            IF ( pv_s(ji,jj,jl) > 0._wp ) THEN
-               ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean
-               zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl)
-               IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN
-                  zfra = pes_max(ji,jj,jk,jl) / zes
-                  hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
-                  pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra
-               ENDIF
+      DO_3D( ihls, ihls, ihls, ihls, 1, nlay_s )
+         IF ( pv_s(ji,jj,jcat) > 0._wp ) THEN
+            ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean
+            zes = pe_s(ji,jj,jk,jcat) / pv_s(ji,jj,jcat)
+            IF( zes > pes_max(ji,jj,jk) .AND. pa_i(ji,jj,jcat) < 0.15 ) THEN
+               zfra = pes_max(ji,jj,jk) / zes
+               zhfx_res(ji,jj) = zhfx_res(ji,jj) - pe_s(ji,jj,jk,jcat) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
+               pe_s(ji,jj,jk,jcat) = pe_s(ji,jj,jk,jcat) * zfra
             ENDIF
-         END_3D
-      END DO
+         ENDIF
+      END_3D
       !
-   END SUBROUTINE Hbig
+      ! record residual fluxes
+      DO_2D( 0, 0, 0, 0 )
+         wfx_res(ji,jj) = wfx_res(ji,jj) + zwfx_res(ji,jj)
+         hfx_res(ji,jj) = hfx_res(ji,jj) + zhfx_res(ji,jj)
+         sfx_res(ji,jj) = sfx_res(ji,jj) + zsfx_res(ji,jj)
+      END_2D
+      !
+   END SUBROUTINE Hbig_pra
 
 
-   SUBROUTINE Hsnow( pdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+   SUBROUTINE Hsnow_pra( ihls, jcat, pdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
       !!-------------------------------------------------------------------
-      !!                  ***  ROUTINE Hsnow  ***
+      !!                  ***  ROUTINE Hsnow_pra  ***
       !!
       !! ** Purpose : 1- Check snow load after advection
       !!              2- Correct pond concentration to avoid a_ip > a_i
@@ -862,41 +1000,52 @@ CONTAINS
       !!              make the snow very thick (if concentration decreases drastically)
       !!              This behavior has been seen in Ultimate-Macho and supposedly it can also be true for Prather
       !!-------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   ihls  ! loop index
+      INTEGER                     , INTENT(in   ) ::   jcat  ! category
       REAL(wp)                    , INTENT(in   ) ::   pdt   ! tracer time-step
       REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i, pv_s, pa_i, pa_ip
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s
       !
-      INTEGER  ::   ji, jj, jl   ! dummy loop indices
+      INTEGER  ::   ji, jj ! dummy loop indices
       REAL(wp) ::   z1_dt, zvs_excess, zfra
+      REAL(wp), DIMENSION(jpi,jpj) ::   zwfx_res, zhfx_res  ! needed since loop is not (0,0,0,0)
       !!-------------------------------------------------------------------
       !
+      DO_2D( ihls, ihls, ihls, ihls )
+         zwfx_res(ji,jj) = 0._wp
+         zhfx_res(ji,jj) = 0._wp
+      END_2D
+      !
       z1_dt = 1._wp / pdt
       !
       ! -- check snow load -- !
-      DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
-               !
-               zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rho0-rhoi) * r1_rhos )
-               !
-               IF( zvs_excess > 0._wp ) THEN   ! snow-ice interface deplets below the ocean surface
-                  ! put snow excess in the ocean
-                  zfra = ( pv_s(ji,jj,jl) - zvs_excess ) / MAX( pv_s(ji,jj,jl), epsi20 )
-                  wfx_res(ji,jj) = wfx_res(ji,jj) + zvs_excess * rhos * z1_dt
-                  hfx_res(ji,jj) = hfx_res(ji,jj) - SUM( pe_s(ji,jj,1:nlay_s,jl) ) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
-                  ! correct snow volume and heat content
-                  pe_s(ji,jj,1:nlay_s,jl) = pe_s(ji,jj,1:nlay_s,jl) * zfra
-                  pv_s(ji,jj,jl)          = pv_s(ji,jj,jl) - zvs_excess
-               ENDIF
-               !
+      DO_2D( ihls, ihls, ihls, ihls )
+         IF ( pv_i(ji,jj,jcat) > 0._wp ) THEN
+            !
+            zvs_excess = MAX( 0._wp, pv_s(ji,jj,jcat) - pv_i(ji,jj,jcat) * (rho0-rhoi) * r1_rhos )
+            !
+            IF( zvs_excess > 0._wp ) THEN   ! snow-ice interface deplets below the ocean surface
+               ! put snow excess in the ocean
+               zfra = ( pv_s(ji,jj,jcat) - zvs_excess ) / MAX( pv_s(ji,jj,jcat), epsi20 )
+               zwfx_res(ji,jj) = zwfx_res(ji,jj) + zvs_excess * rhos * z1_dt
+               zhfx_res(ji,jj) = zhfx_res(ji,jj) - SUM( pe_s(ji,jj,1:nlay_s,jcat) ) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0
+               ! correct snow volume and heat content
+               pe_s(ji,jj,1:nlay_s,jcat) = pe_s(ji,jj,1:nlay_s,jcat) * zfra
+               pv_s(ji,jj,jcat)          = pv_s(ji,jj,jcat) - zvs_excess
             ENDIF
-         END_2D
-      END DO
+            !
+         ENDIF
+         !-- correct pond concentration to avoid a_ip > a_i -- !
+         pa_ip(ji,jj,jcat) = MIN( pa_ip(ji,jj,jcat), pa_i(ji,jj,jcat) )
+      END_2D
       !
-      !-- correct pond concentration to avoid a_ip > a_i -- !
-      WHERE( pa_ip(:,:,:) > pa_i(:,:,:) )   pa_ip(:,:,:) = pa_i(:,:,:)
+      ! record residual fluxes
+      DO_2D( 0, 0, 0, 0 )
+         wfx_res(ji,jj) = wfx_res(ji,jj) + zwfx_res(ji,jj)
+         hfx_res(ji,jj) = hfx_res(ji,jj) + zhfx_res(ji,jj)
+      END_2D
       !
-   END SUBROUTINE Hsnow
+   END SUBROUTINE Hsnow_pra
 
 
    SUBROUTINE adv_pra_init
@@ -1028,7 +1177,7 @@ CONTAINS
                   CALL iom_get( numrir, jpdom_auto, 'sxxap', sxxap )
                   CALL iom_get( numrir, jpdom_auto, 'syyap', syyap )
                   CALL iom_get( numrir, jpdom_auto, 'sxyap', sxyap )
-                  !                                                     ! melt pond volume
+                  !                                                                   ! melt pond volume
                   CALL iom_get( numrir, jpdom_auto, 'sxvp' , sxvp , psgn = -1._wp )
                   CALL iom_get( numrir, jpdom_auto, 'syvp' , syvp , psgn = -1._wp )
                   CALL iom_get( numrir, jpdom_auto, 'sxxvp', sxxvp )
@@ -1039,16 +1188,14 @@ CONTAINS
                   sxvp = 0._wp ;   syvp = 0._wp    ;   sxxvp = 0._wp    ;   syyvp = 0._wp    ;   sxyvp = 0._wp   ! melt pond volume
                ENDIF
                   !
-               IF ( ln_pnd_lids ) THEN                               ! melt pond lid volume
-                  IF( iom_varid( numrir, 'sxvl', ldstop = .FALSE. ) > 0 ) THEN
-                     CALL iom_get( numrir, jpdom_auto, 'sxvl' , sxvl , psgn = -1._wp )
-                     CALL iom_get( numrir, jpdom_auto, 'syvl' , syvl , psgn = -1._wp )
-                     CALL iom_get( numrir, jpdom_auto, 'sxxvl', sxxvl )
-                     CALL iom_get( numrir, jpdom_auto, 'syyvl', syyvl )
-                     CALL iom_get( numrir, jpdom_auto, 'sxyvl', sxyvl )
-                  ELSE
-                     sxvl = 0._wp; syvl = 0._wp    ;   sxxvl = 0._wp    ;   syyvl = 0._wp    ;   sxyvl = 0._wp   ! melt pond lid volume
-                  ENDIF
+               IF( iom_varid( numrir, 'sxvl', ldstop = .FALSE. ) > 0 ) THEN           ! melt pond lid volume
+                  CALL iom_get( numrir, jpdom_auto, 'sxvl' , sxvl , psgn = -1._wp )
+                  CALL iom_get( numrir, jpdom_auto, 'syvl' , syvl , psgn = -1._wp )
+                  CALL iom_get( numrir, jpdom_auto, 'sxxvl', sxxvl )
+                  CALL iom_get( numrir, jpdom_auto, 'syyvl', syyvl )
+                  CALL iom_get( numrir, jpdom_auto, 'sxyvl', sxyvl )
+               ELSE
+                  sxvl = 0._wp ;   syvl = 0._wp    ;   sxxvl = 0._wp    ;   syyvl = 0._wp    ;   sxyvl = 0._wp   ! melt pond lid volume
                ENDIF
             ENDIF
             !
@@ -1066,9 +1213,7 @@ CONTAINS
             IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
                sxap = 0._wp ;   syap = 0._wp    ;   sxxap = 0._wp    ;   syyap = 0._wp    ;   sxyap = 0._wp       ! melt pond fraction
                sxvp = 0._wp ;   syvp = 0._wp    ;   sxxvp = 0._wp    ;   syyvp = 0._wp    ;   sxyvp = 0._wp       ! melt pond volume
-               IF ( ln_pnd_lids ) THEN
-                  sxvl = 0._wp; syvl = 0._wp    ;   sxxvl = 0._wp    ;   syyvl = 0._wp    ;   sxyvl = 0._wp       ! melt pond lid volume
-               ENDIF
+               sxvl = 0._wp ;   syvl = 0._wp    ;   sxxvl = 0._wp    ;   syyvl = 0._wp    ;   sxyvl = 0._wp       ! melt pond lid volume
             ENDIF
          ENDIF
          !
@@ -1141,7 +1286,7 @@ CONTAINS
             CALL iom_rstput( iter, nitrst, numriw, znam , z3d )
          END DO
          !
-         IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN                                       ! melt pond fraction
+         IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN                      ! melt pond fraction
             CALL iom_rstput( iter, nitrst, numriw, 'sxap' , sxap  )
             CALL iom_rstput( iter, nitrst, numriw, 'syap' , syap  )
             CALL iom_rstput( iter, nitrst, numriw, 'sxxap', sxxap )
@@ -1167,80 +1312,76 @@ CONTAINS
       !
    END SUBROUTINE adv_pra_rst
 
-   SUBROUTINE icemax3D( pice , pmax )
+   SUBROUTINE icemax2D_pra( ihls, pice , pmax )
       !!---------------------------------------------------------------------
-      !!                   ***  ROUTINE icemax3D ***
+      !!                   ***  ROUTINE icemax2D_pra ***
       !! ** Purpose :  compute the max of the 9 points around
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pmax   ! output
+      INTEGER                 , INTENT(in ) ::   ihls   ! loop index
+      REAL(wp), DIMENSION(:,:), INTENT(in ) ::   pice   ! input
+      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pmax   ! output
       !
-      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2
-      REAL(wp)                       ::   zmax3
-      INTEGER  ::   ji, jj, jl   ! dummy loop indices
+!!$      REAL(wp), DIMENSION(Nis0-ihls:Nie0+ihls) ::   zmax1, zmax2
+      REAL(wp), DIMENSION(1:jpi) ::   zmax1, zmax2
+      REAL(wp)                   ::   zmax3
+      INTEGER  ::   ji, jj   ! dummy loop indices
       !!----------------------------------------------------------------------
       ! basic version: get the max of epsi20 + 9 neighbours
-!!$      DO jl = 1, jpl
-!!$         DO_2D( 0, 0, 0, 0 )
-!!$            pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   &
-!!$               &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   &
-!!$               &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) )
-!!$         END_2D
-!!$      END DO
+!!$      DO_2D( ihls, ihls, ihls, ihls )
+!!$         pmax(ji,jj) = MAX( epsi20, pice(ji-1,jj-1), pice(ji,jj-1), pice(ji+1,jj-1), &
+!!$            &                       pice(ji-1,jj  ), pice(ji,jj  ), pice(ji+1,jj  ), &
+!!$            &                       pice(ji-1,jj+1), pice(ji,jj+1), pice(ji+1,jj+1) )
+!!$      END_2D
       ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours
-      DO jl = 1, jpl
-         DO ji = Nis0, Nie0
-            zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jl), pice(ji-1,Njs0-1,jl), pice(ji+1,Njs0-1,jl) )
-            zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jl), pice(ji-1,Njs0  ,jl), pice(ji+1,Njs0  ,jl) )
-         END DO
-         DO_2D( 0, 0, 0, 0 )
-            zmax3 = MAX( epsi20, pice(ji,jj+1,jl), pice(ji-1,jj+1,jl), pice(ji+1,jj+1,jl) )
-            pmax(ji,jj,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 )
-            zmax1(ji) = zmax2(ji)
-            zmax2(ji) = zmax3
-         END_2D
+      DO ji = Nis0-ihls, Nie0+ihls
+         zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1-ihls), pice(ji-1,Njs0-1-ihls), pice(ji+1,Njs0-1-ihls) )
+         zmax2(ji) = MAX( epsi20, pice(ji,Njs0  -ihls), pice(ji-1,Njs0  -ihls), pice(ji+1,Njs0  -ihls) )
       END DO
-   END SUBROUTINE icemax3D
+      DO_2D( ihls, ihls, ihls, ihls )
+         zmax3 = MAX( epsi20, pice(ji,jj+1), pice(ji-1,jj+1), pice(ji+1,jj+1) )
+         pmax(ji,jj) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 )
+         zmax1(ji) = zmax2(ji)
+         zmax2(ji) = zmax3
+      END_2D
+   END SUBROUTINE icemax2D_pra
 
-   SUBROUTINE icemax4D( pice , pmax )
+   SUBROUTINE icemax3D_pra( ihls, pice , pmax )
       !!---------------------------------------------------------------------
-      !!                   ***  ROUTINE icemax4D ***
+      !!                   ***  ROUTINE icemax3D_pra ***
       !! ** Purpose :  compute the max of the 9 points around
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) ::   pice   ! input
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(out) ::   pmax   ! output
+      INTEGER                   , INTENT(in ) ::   ihls   ! loop index
+      REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input
+      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pmax   ! output
       !
-      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2
-      REAL(wp)                       ::   zmax3
-      INTEGER  ::   jlay, ji, jj, jk, jl   ! dummy loop indices
+!!$      REAL(wp), DIMENSION(Nis0-ihls:Nie0+ihls) ::   zmax1, zmax2
+      REAL(wp), DIMENSION(1:jpi) ::   zmax1, zmax2
+      REAL(wp)                   ::   zmax3
+      INTEGER  ::   jlay, ji, jj, jk   ! dummy loop indices
       !!----------------------------------------------------------------------
       jlay = SIZE( pice , 3 )   ! size of input arrays
       ! basic version: get the max of epsi20 + 9 neighbours
-!!$      DO jl = 1, jpl
-!!$         DO jk = 1, jlay
-!!$            DO_2D( 0, 0, 0, 0 )
-!!$               pmax(ji,jj,jk,jl) = MAX( epsi20, pice(ji-1,jj-1,jk,jl), pice(ji,jj-1,jk,jl), pice(ji+1,jj-1,jk,jl),   &
-!!$                  &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   &
-!!$                  &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) )
-!!$            END_2D
-!!$         END DO
+!!$      DO jk = 1, jlay
+!!$         DO_2D( ihls, ihls, ihls, ihls )
+!!$            pmax(ji,jj,jk) = MAX( epsi20, pice(ji-1,jj-1,jk), pice(ji,jj-1,jk), pice(ji+1,jj-1,jk), &
+!!$               &                          pice(ji-1,jj  ,jk), pice(ji,jj  ,jk), pice(ji+1,jj  ,jk), &
+!!$               &                          pice(ji-1,jj+1,jk), pice(ji,jj+1,jk), pice(ji+1,jj+1,jk) )
+!!$         END_2D
 !!$      END DO
       ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours
-      DO jl = 1, jpl
-         DO jk = 1, jlay
-            DO ji = Nis0, Nie0
-               zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jk,jl), pice(ji-1,Njs0-1,jk,jl), pice(ji+1,Njs0-1,jk,jl) )
-               zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jk,jl), pice(ji-1,Njs0  ,jk,jl), pice(ji+1,Njs0  ,jk,jl) )
-            END DO
-            DO_2D( 0, 0, 0, 0 )
-               zmax3 = MAX( epsi20, pice(ji,jj+1,jk,jl), pice(ji-1,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) )
-               pmax(ji,jj,jk,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 )
-               zmax1(ji) = zmax2(ji)
-               zmax2(ji) = zmax3
-            END_2D
+      DO jk = 1, jlay
+         DO ji = Nis0-ihls, Nie0+ihls
+            zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1-ihls,jk), pice(ji-1,Njs0-1-ihls,jk), pice(ji+1,Njs0-1-ihls,jk) )
+            zmax2(ji) = MAX( epsi20, pice(ji,Njs0  -ihls,jk), pice(ji-1,Njs0  -ihls,jk), pice(ji+1,Njs0  -ihls,jk) )
          END DO
+         DO_2D( ihls, ihls, ihls, ihls )
+            zmax3 = MAX( epsi20, pice(ji,jj+1,jk), pice(ji-1,jj+1,jk), pice(ji+1,jj+1,jk) )
+            pmax(ji,jj,jk) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 )
+            zmax1(ji) = zmax2(ji)
+            zmax2(ji) = zmax3
+         END_2D
       END DO
-   END SUBROUTINE icemax4D
+   END SUBROUTINE icemax3D_pra
 
 #else
    !!----------------------------------------------------------------------
diff --git a/src/ICE/icedyn_adv_umx.F90 b/src/ICE/icedyn_adv_umx.F90
index e5113ac9..00f4d58e 100644
--- a/src/ICE/icedyn_adv_umx.F90
+++ b/src/ICE/icedyn_adv_umx.F90
@@ -32,7 +32,7 @@ MODULE icedyn_adv_umx
 
    PUBLIC   ice_dyn_adv_umx   ! called by icedyn_adv.F90
    !
-   INTEGER, PARAMETER ::   np_advS = 1         ! advection for S and T:    dVS/dt = -div(      uVS     ) => np_advS = 1
+   INTEGER, PARAMETER ::   np_advS = 2         ! advection for S and T:    dVS/dt = -div(      uVS     ) => np_advS = 1
    !                                                                    or dVS/dt = -div( uA * uHS / u ) => np_advS = 2
    !                                                                    or dVS/dt = -div( uV * uS  / u ) => np_advS = 3
    INTEGER, PARAMETER ::   np_limiter = 1      ! limiter: 1 = nonosc
@@ -92,9 +92,10 @@ CONTAINS
       INTEGER  ::   icycle                  ! number of sub-timestep for the advection
       REAL(wp) ::   zamsk                   ! 1 if advection of concentration, 0 if advection of other tracers
       REAL(wp) ::   zdt, z1_dt, zvi_cen
+      REAL(wp) ::   zati2
       REAL(wp), DIMENSION(1)                  ::   zcflprv, zcflnow   ! for global communication
       REAL(wp), DIMENSION(jpi,jpj)            ::   zudy, zvdx, zcu_box, zcv_box
-      REAL(wp), DIMENSION(jpi,jpj)            ::   zati1, zati2
+      REAL(wp), DIMENSION(jpi,jpj)            ::   zati1
       REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zu_cat, zv_cat
       REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zua_ho, zva_ho, zua_ups, zva_ups
       REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   z1_ai , z1_aip, zhvar
@@ -104,7 +105,7 @@ CONTAINS
       !
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zuv_ho, zvv_ho, zuv_ups, zvv_ups, z1_vi, z1_vs
       !! diagnostics
-      REAL(wp), DIMENSION(jpi,jpj)            ::   zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat
+      REAL(wp), DIMENSION(A2D(0))             ::   zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat
       !!----------------------------------------------------------------------
       !
       IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_adv_umx: Ultimate-Macho advection scheme'
@@ -114,10 +115,10 @@ CONTAINS
       WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:)
       ELSEWHERE                      ; zs_i(:,:,:) = 0._wp
       END WHERE
-      CALL icemax3D( ph_i , zhi_max )
-      CALL icemax3D( ph_s , zhs_max )
-      CALL icemax3D( ph_ip, zhip_max)
-      CALL icemax3D( zs_i , zsi_max )
+      CALL icemax3D_umx( ph_i , zhi_max )
+      CALL icemax3D_umx( ph_s , zhs_max )
+      CALL icemax3D_umx( ph_ip, zhip_max)
+      CALL icemax3D_umx( zs_i , zsi_max )
       CALL lbc_lnk( 'icedyn_adv_umx', zhi_max, 'T', 1._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp )
       !
       ! enthalpies
@@ -131,10 +132,9 @@ CONTAINS
          ELSEWHERE                      ; ze_s(:,:,jk,:) = 0._wp
          END WHERE
       END DO
-      CALL icemax4D( ze_i , zei_max )
-      CALL icemax4D( ze_s , zes_max )
-      CALL lbc_lnk( 'icedyn_adv_umx', zei_max, 'T', 1._wp )
-      CALL lbc_lnk( 'icedyn_adv_umx', zes_max, 'T', 1._wp )
+      CALL icemax4D_umx( ze_i , zei_max )
+      CALL icemax4D_umx( ze_s , zes_max )
+      CALL lbc_lnk( 'icedyn_adv_umx', zei_max, 'T', 1._wp, zes_max, 'T', 1._wp )
       !
       !
       ! --- If ice drift is too fast, use  subtime steps for advection (CFL test for stability) --- !
@@ -146,9 +146,13 @@ CONTAINS
       ! non-blocking global communication send zcflnow and receive zcflprv
       CALL mpp_delay_max( 'icedyn_adv_umx', 'cflice', zcflnow(:), zcflprv(:), kt == nitend - nn_fsbc + 1 )
 
-      IF( zcflprv(1) > .5 ) THEN   ;   icycle = 2
-      ELSE                         ;   icycle = 1
+      IF    ( zcflprv(1) > 1.5 ) THEN   ;   icycle = 3
+      ELSEIF( zcflprv(1) >  .5 ) THEN   ;   icycle = 2
+      ELSE                              ;   icycle = 1
       ENDIF
+!!$      !!test clem
+!!$      icycle=3
+!!$      !!test clem
       zdt = rDt_ice / REAL(icycle)
       z1_dt = 1._wp / zdt
 
@@ -181,13 +185,6 @@ CONTAINS
       !---------------!
       DO jt = 1, icycle
 
-         ! diagnostics
-         zdiag_adv_mass(:,:) =   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos &
-            &                  + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow
-         zdiag_adv_salt(:,:) =   SUM( psv_i(:,:,:) , dim=3 ) * rhoi
-         zdiag_adv_heat(:,:) = - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) &
-            &                  - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 )
-
          ! record at_i before advection (for open water)
          zati1(:,:) = SUM( pa_i(:,:,:), dim=3 )
 
@@ -217,6 +214,14 @@ CONTAINS
             END DO
          ENDIF
          !
+         ! diagnostics
+         DO_2D( 0, 0, 0, 0 )
+            zdiag_adv_mass(ji,jj) =   SUM( pv_i (ji,jj,:) ) * rhoi + SUM( pv_s (ji,jj,:) ) * rhos &
+               &                    + SUM( pv_ip(ji,jj,:) ) * rhow + SUM( pv_il(ji,jj,:) ) * rhow
+            zdiag_adv_salt(ji,jj) =   SUM( psv_i(ji,jj,:) ) * rhoi
+            zdiag_adv_heat(ji,jj) = - SUM( SUM( pe_i(ji,jj,1:nlay_i,:), dim=2 ) ) - SUM( SUM( pe_s(ji,jj,1:nlay_s,:), dim=2 ) )            
+         END_2D
+         !
          ! ----------------------- !
          ! ==> start advection <== !
          ! ----------------------- !
@@ -360,49 +365,53 @@ CONTAINS
             ENDIF
          ENDIF
 
-         ! --- Lateral boundary conditions --- !
-         IF    ( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. ln_pnd_lids ) THEN
-            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp &
-               &                          , pa_ip,'T',1._wp, pv_ip,'T',1._wp, pv_il,'T',1._wp )
-         ELSEIF( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. .NOT.ln_pnd_lids ) THEN
-            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp &
-               &                          , pa_ip,'T',1._wp, pv_ip,'T',1._wp )
-         ELSE
-            CALL lbc_lnk( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp )
-         ENDIF
-         CALL lbc_lnk( 'icedyn_adv_umx', pe_i, 'T', 1._wp )
-         CALL lbc_lnk( 'icedyn_adv_umx', pe_s, 'T', 1._wp )
-         !
          !== Open water area ==!
-         zati2(:,:) = SUM( pa_i(:,:,:), dim=3 )
          DO_2D( 0, 0, 0, 0 )
-            pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) &
-               &                          - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt
+            zati2 = SUM( pa_i(ji,jj,:) )
+            pato_i(ji,jj) = pato_i(ji,jj) - ( zati2 - zati1(ji,jj) )            &
+               &                          - (   ( zudy(ji,jj) - zudy(ji-1,jj) ) &   ! ad () for NP repro
+               &                              + ( zvdx(ji,jj) - zvdx(ji,jj-1) )   ) * r1_e1e2t(ji,jj) * zdt
          END_2D
-         CALL lbc_lnk( 'icedyn_adv_umx', pato_i, 'T',  1._wp )
-         !
+
          ! --- diagnostics --- !
-         diag_adv_mass(:,:) = diag_adv_mass(:,:) + (   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos &
-            &                                        + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow &
-            &                                        - zdiag_adv_mass(:,:) ) * z1_dt
-         diag_adv_salt(:,:) = diag_adv_salt(:,:) + (   SUM( psv_i(:,:,:) , dim=3 ) * rhoi &
-            &                                        - zdiag_adv_salt(:,:) ) * z1_dt
-         diag_adv_heat(:,:) = diag_adv_heat(:,:) + ( - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) &
-            &                                        - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) &
-            &                                        - zdiag_adv_heat(:,:) ) * z1_dt
-         !
+         DO_2D( 0, 0, 0, 0 )
+            diag_adv_mass(ji,jj) = diag_adv_mass(ji,jj) + (   SUM( pv_i (ji,jj,:) ) * rhoi + SUM( pv_s (ji,jj,:) ) * rhos &
+               &                                            + SUM( pv_ip(ji,jj,:) ) * rhow + SUM( pv_il(ji,jj,:) ) * rhow &
+               &                                          - zdiag_adv_mass(ji,jj) ) * z1_dt
+            diag_adv_salt(ji,jj) = diag_adv_salt(ji,jj) + (   SUM( psv_i(ji,jj,:) ) * rhoi &
+               &                                          - zdiag_adv_salt(ji,jj) ) * z1_dt
+            diag_adv_heat(ji,jj) = diag_adv_heat(ji,jj) + ( - SUM(SUM( pe_i(ji,jj,1:nlay_i,:) , dim=2 ) ) &
+               &                                            - SUM(SUM( pe_s(ji,jj,1:nlay_s,:) , dim=2 ) ) &
+               &                                          - zdiag_adv_heat(ji,jj) ) * z1_dt
+         END_2D
+
          ! --- Ensure non-negative fields and in-bound thicknesses --- !
          ! Remove negative values (conservation is ensured)
          !    (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20)
-         CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
+         CALL ice_var_zapneg( 0, zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
          !
          ! --- Make sure ice thickness is not too big --- !
          !     (because ice thickness can be too large where ice concentration is very small)
-         CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, &
+         CALL Hbig_umx( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, &
             &            pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i )
          !
          ! --- Ensure snow load is not too big --- !
-         CALL Hsnow( zdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+         CALL Hsnow_umx( zdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+         !
+         ! --- Lateral boundary conditions --- !
+         IF( jt /= icycle ) THEN ! only if we have 2 cycles and we are at the 1st one
+            IF( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
+               CALL lbc_lnk( 'icedyn_adv_umx', pa_i , 'T', 1._wp, pv_i , 'T', 1._wp, pv_s , 'T', 1._wp, &
+                  &                            psv_i, 'T', 1._wp, poa_i, 'T', 1._wp, &
+                  &                            pa_ip, 'T', 1._wp, pv_ip, 'T', 1._wp, pv_il, 'T', 1._wp )
+            ELSE
+               CALL lbc_lnk( 'icedyn_adv_umx', pa_i , 'T', 1._wp, pv_i , 'T', 1._wp, pv_s , 'T', 1._wp, &
+                  &                            psv_i, 'T', 1._wp, poa_i, 'T', 1._wp )
+            ENDIF
+            CALL lbc_lnk( 'icedyn_adv_umx', pe_i, 'T', 1._wp, pe_s, 'T', 1._wp )
+            CALL lbc_lnk( 'icedyn_adv_umx', pato_i, 'T',  1._wp )
+         ENDIF
+         !
          !
       END DO
       !
@@ -518,7 +527,8 @@ CONTAINS
          ! thus we calculate the upstream solution and apply a limiter again
          DO jl = 1, jpl
             DO_2D( 0, 0, 0, 0 )
-               ztra = - ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) + zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) )
+               ztra = - (  ( zfu_ups(ji,jj,jl) - zfu_ups(ji-1,jj,jl) ) &   ! add () for NP repro
+                  &      + ( zfv_ups(ji,jj,jl) - zfv_ups(ji,jj-1,jl) ) )
                !
                zt_ups(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1)
             END_2D
@@ -553,7 +563,8 @@ CONTAINS
       ! ---------------------------------
       DO jl = 1, jpl
          DO_2D( 0, 0, 0, 0 )
-            ztra = - ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) + zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) )
+            ztra = - (  ( zfu_ho(ji,jj,jl) - zfu_ho(ji-1,jj,jl) ) &   ! add () for NP repro
+               &      + ( zfv_ho(ji,jj,jl) - zfv_ho(ji,jj-1,jl) ) )
             !
             ptc(ji,jj,jl) = ( ptc(ji,jj,jl) + ztra * r1_e1e2t(ji,jj) * pdt ) * tmask(ji,jj,1)
          END_2D
@@ -645,10 +656,10 @@ CONTAINS
       !
       DO jl = 1, jpl                    !-- after tracer with upstream scheme
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            ztra = - (   pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj  ,jl)   &
-               &       + pfv_ups(ji,jj,jl) - pfv_ups(ji  ,jj-1,jl) ) &
-               &   + (   pu     (ji,jj   ) - pu     (ji-1,jj     )   &
-               &       + pv     (ji,jj   ) - pv     (ji  ,jj-1   ) ) * pt(ji,jj,jl) * (1.-pamsk)
+            ztra = - (   ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj  ,jl) )   &   ! add () for NP repro
+               &       + ( pfv_ups(ji,jj,jl) - pfv_ups(ji  ,jj-1,jl) ) ) &
+               &   + (   ( pu     (ji,jj   ) - pu     (ji-1,jj     ) )   &
+               &       + ( pv     (ji,jj   ) - pv     (ji  ,jj-1   ) ) ) * pt(ji,jj,jl) * (1.-pamsk)
             !
             pt_ups(ji,jj,jl) = ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1)
          END_2D
@@ -912,7 +923,7 @@ CONTAINS
          !
          DO jl = 1, jpl
             DO_2D( 1, 0, kloop, kloop )
-               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   &
+               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                              ( pt(ji+1,jj,jl) + pt(ji,jj,jl) ) &
                   &                                         - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) )
             END_2D
          END DO
@@ -922,7 +933,7 @@ CONTAINS
          DO jl = 1, jpl
             DO_2D( 1, 0, kloop, kloop )
                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj)
-               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   &
+               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                              ( pt(ji+1,jj,jl) + pt(ji,jj,jl) )  &
                   &                                                            - zcu   * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) )
             END_2D
          END DO
@@ -934,9 +945,9 @@ CONTAINS
                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj)
                zdx2 = e1u(ji,jj) * e1u(ji,jj)
 !!rachid          zdx2 = e1u(ji,jj) * e1t(ji,jj)
-               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                      pt  (ji+1,jj,jl) + pt  (ji,jj,jl)     &
+               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                    ( pt  (ji+1,jj,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcu   * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6 * zdx2 * ( zcu*zcu - 1._wp ) *    (                      ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)     &
+                  &        + r1_6 * zdx2 * ( zcu*zcu - 1._wp ) *    (                    ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) )   &
                   &                                               - SIGN( 1._wp, zcu ) * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -948,9 +959,9 @@ CONTAINS
                zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj)
                zdx2 = e1u(ji,jj) * e1u(ji,jj)
 !!rachid          zdx2 = e1u(ji,jj) * e1t(ji,jj)
-               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                      pt  (ji+1,jj,jl) + pt  (ji,jj,jl)     &
+               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (         (                    ( pt  (ji+1,jj,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcu   * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6 * zdx2 * ( zcu*zcu - 1._wp ) *    (                      ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)     &
+                  &        + r1_6 * zdx2 * ( zcu*zcu - 1._wp ) *    (                    ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) )   &
                   &                                                   - 0.5_wp * zcu   * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -965,11 +976,11 @@ CONTAINS
                zdx2 = e1u(ji,jj) * e1u(ji,jj)
 !!rachid          zdx2 = e1u(ji,jj) * e1t(ji,jj)
                zdx4 = zdx2 * zdx2
-               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (        (                       pt  (ji+1,jj,jl) + pt  (ji,jj,jl)     &
+               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (        (                     ( pt  (ji+1,jj,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcu   * ( pt  (ji+1,jj,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6   * zdx2 * ( zcu*zcu - 1._wp ) * (                       ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl)     &
+                  &        + r1_6   * zdx2 * ( zcu*zcu - 1._wp ) * (                     ( ztu2(ji+1,jj,jl) + ztu2(ji,jj,jl) )   &
                   &                                                   - 0.5_wp * zcu   * ( ztu2(ji+1,jj,jl) - ztu2(ji,jj,jl) ) ) &
-                  &        + r1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ( ztu4(ji+1,jj,jl) + ztu4(ji,jj,jl)     &
+                  &        + r1_120 * zdx4 * ( zcu*zcu - 1._wp ) * ( zcu*zcu - 4._wp ) * ((ztu4(ji+1,jj,jl) + ztu4(ji,jj,jl) )   &
                   &                                               - SIGN( 1._wp, zcu ) * ( ztu4(ji+1,jj,jl) - ztu4(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -983,7 +994,7 @@ CONTAINS
          DO jl = 1, jpl
             DO_2D( 1, 0, kloop, kloop )
                IF( pt_u(ji,jj,jl) < 0._wp .OR. ( imsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN
-                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   &
+                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                              ( pt(ji+1,jj,jl) + pt(ji,jj,jl) ) &
                      &                                         - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) )
                ENDIF
             END_2D
@@ -1050,7 +1061,7 @@ CONTAINS
       CASE( 1 )                                                !==  1st order central TIM  ==! (Eq. 21)
          DO jl = 1, jpl
             DO_2D( kloop, kloop, 1, 0 )
-               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   &
+               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt(ji,jj+1,jl) + pt(ji,jj,jl) ) &
                   &                                         - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) )
             END_2D
          END DO
@@ -1059,7 +1070,7 @@ CONTAINS
          DO jl = 1, jpl
             DO_2D( kloop, kloop, 1, 0 )
                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj)
-               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   &
+               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt(ji,jj+1,jl) + pt(ji,jj,jl) ) &
                   &                                                            - zcv *   ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) )
             END_2D
          END DO
@@ -1070,9 +1081,9 @@ CONTAINS
                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj)
                zdy2 = e2v(ji,jj) * e2v(ji,jj)
 !!rachid          zdy2 = e2v(ji,jj) * e2t(ji,jj)
-               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (      (                         pt  (ji,jj+1,jl) + pt  (ji,jj,jl)     &
+               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (      (                       ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcv   * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                         ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)     &
+                  &        + r1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                       ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) )   &
                   &                                               - SIGN( 1._wp, zcv ) * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -1083,9 +1094,9 @@ CONTAINS
                zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj)
                zdy2 = e2v(ji,jj) * e2v(ji,jj)
 !!rachid          zdy2 = e2v(ji,jj) * e2t(ji,jj)
-               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (      (                         pt  (ji,jj+1,jl) + pt  (ji,jj,jl)     &
+               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (      (                       ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcv   * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                         ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)     &
+                  &        + r1_6 * zdy2 * ( zcv*zcv - 1._wp ) * (                       ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) )   &
                   &                                                   - 0.5_wp * zcv   * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -1100,11 +1111,11 @@ CONTAINS
                zdy2 = e2v(ji,jj) * e2v(ji,jj)
 !!rachid          zdy2 = e2v(ji,jj) * e2t(ji,jj)
                zdy4 = zdy2 * zdy2
-               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl)     &
+               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (        (                     ( pt  (ji,jj+1,jl) + pt  (ji,jj,jl) )   &
                   &                                                            - zcv   * ( pt  (ji,jj+1,jl) - pt  (ji,jj,jl) ) ) &
-                  &        + r1_6   * zdy2 * ( zcv*zcv - 1._wp ) * (                       ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl)     &
+                  &        + r1_6   * zdy2 * ( zcv*zcv - 1._wp ) * (                     ( ztv2(ji,jj+1,jl) + ztv2(ji,jj,jl) )   &
                   &                                                   - 0.5_wp * zcv   * ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) ) &
-                  &        + r1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ( ztv4(ji,jj+1,jl) + ztv4(ji,jj,jl)     &
+                  &        + r1_120 * zdy4 * ( zcv*zcv - 1._wp ) * ( zcv*zcv - 4._wp ) * ((ztv4(ji,jj+1,jl) + ztv4(ji,jj,jl) )   &
                   &                                               - SIGN( 1._wp, zcv ) * ( ztv4(ji,jj+1,jl) - ztv4(ji,jj,jl) ) ) )
             END_2D
          END DO
@@ -1244,10 +1255,10 @@ CONTAINS
             zneg = MAX( 0._wp, pfu_ho(ji  ,jj  ,jl) ) - MIN( 0._wp, pfu_ho(ji-1,jj  ,jl) ) &
                & + MAX( 0._wp, pfv_ho(ji  ,jj  ,jl) ) - MIN( 0._wp, pfv_ho(ji  ,jj-1,jl) )
             !
-            zpos = zpos - (pt(ji,jj,jl) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) &
-               &          ) * ( 1. - pamsk )
-            zneg = zneg + (pt(ji,jj,jl) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) ) + pt(ji,jj,jl) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) &
-               &          ) * ( 1. - pamsk )
+            zpos = zpos - (  pt(ji,jj,jl) * MIN( 0., pu(ji,jj) - pu(ji-1,jj) )   &
+               &           + pt(ji,jj,jl) * MIN( 0., pv(ji,jj) - pv(ji,jj-1) ) ) * ( 1. - pamsk )
+            zneg = zneg + (  pt(ji,jj,jl) * MAX( 0., pu(ji,jj) - pu(ji-1,jj) )   &
+               &           + pt(ji,jj,jl) * MAX( 0., pv(ji,jj) - pv(ji,jj-1) ) ) * ( 1. - pamsk )
             !
             !                                  ! up & down beta terms
             ! clem: zbetup and zbetdo must be 0 for zpos>1.e-10 & zneg>1.e-10 (do not put 0 instead of 1.e-10 !!!)
@@ -1481,10 +1492,10 @@ CONTAINS
    END SUBROUTINE limiter_y
 
 
-   SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, &
+   SUBROUTINE Hbig_umx( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, &
       &                  pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i )
       !!-------------------------------------------------------------------
-      !!                  ***  ROUTINE Hbig  ***
+      !!                  ***  ROUTINE Hbig_umx  ***
       !!
       !! ** Purpose : Thickness correction in case advection scheme creates
       !!              abnormally tick ice or snow
@@ -1511,7 +1522,7 @@ CONTAINS
       z1_dt = 1._wp / pdt
       !
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
                !
                !                               ! -- check h_ip -- !
@@ -1558,7 +1569,7 @@ CONTAINS
       !
       !                                           ! -- check e_i/v_i -- !
       DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
+         DO_3D( 0, 0, 0, 0, 1, nlay_i )
             IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
                ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean
                zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl)
@@ -1572,7 +1583,7 @@ CONTAINS
       END DO
       !                                           ! -- check e_s/v_s -- !
       DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_s )
+         DO_3D( 0, 0, 0, 0, 1, nlay_s )
             IF ( pv_s(ji,jj,jl) > 0._wp ) THEN
                ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean
                zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl)
@@ -1585,12 +1596,12 @@ CONTAINS
          END_3D
       END DO
       !
-   END SUBROUTINE Hbig
+   END SUBROUTINE Hbig_umx
 
 
-   SUBROUTINE Hsnow( pdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
+   SUBROUTINE Hsnow_umx( pdt, pv_i, pv_s, pa_i, pa_ip, pe_s )
       !!-------------------------------------------------------------------
-      !!                  ***  ROUTINE Hsnow  ***
+      !!                  ***  ROUTINE Hsnow_umx  ***
       !!
       !! ** Purpose : 1- Check snow load after advection
       !!              2- Correct pond concentration to avoid a_ip > a_i
@@ -1615,7 +1626,7 @@ CONTAINS
       !
       ! -- check snow load -- !
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF ( pv_i(ji,jj,jl) > 0._wp ) THEN
                !
                zvs_excess = MAX( 0._wp, pv_s(ji,jj,jl) - pv_i(ji,jj,jl) * (rho0-rhoi) * r1_rhos )
@@ -1637,11 +1648,11 @@ CONTAINS
       !-- correct pond concentration to avoid a_ip > a_i -- !
       WHERE( pa_ip(:,:,:) > pa_i(:,:,:) )   pa_ip(:,:,:) = pa_i(:,:,:)
       !
-   END SUBROUTINE Hsnow
+   END SUBROUTINE Hsnow_umx
 
-   SUBROUTINE icemax3D( pice , pmax )
+   SUBROUTINE icemax3D_umx( pice , pmax )
       !!---------------------------------------------------------------------
-      !!                   ***  ROUTINE icemax3D ***
+      !!                   ***  ROUTINE icemax3D_umx ***
       !! ** Purpose :  compute the max of the 9 points around
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input
@@ -1672,11 +1683,11 @@ CONTAINS
             zmax2(ji) = zmax3
          END_2D
       END DO
-   END SUBROUTINE icemax3D
+   END SUBROUTINE icemax3D_umx
 
-   SUBROUTINE icemax4D( pice , pmax )
+   SUBROUTINE icemax4D_umx( pice , pmax )
       !!---------------------------------------------------------------------
-      !!                   ***  ROUTINE icemax4D ***
+      !!                   ***  ROUTINE icemax4D_umx ***
       !! ** Purpose :  compute the max of the 9 points around
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) ::   pice   ! input
@@ -1712,7 +1723,7 @@ CONTAINS
             END_2D
          END DO
       END DO
-   END SUBROUTINE icemax4D
+   END SUBROUTINE icemax4D_umx
 
 #else
    !!----------------------------------------------------------------------
diff --git a/src/ICE/icedyn_rdgrft.F90 b/src/ICE/icedyn_rdgrft.F90
index 661748ea..ad7d1de8 100644
--- a/src/ICE/icedyn_rdgrft.F90
+++ b/src/ICE/icedyn_rdgrft.F90
@@ -56,8 +56,6 @@ MODULE icedyn_rdgrft
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hi_hrdg         ! thickness of ridging ice / mean ridge thickness
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   aridge          ! participating ice ridging
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   araft           ! participating ice rafting
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ze_i_2d
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ze_s_2d
    !
    REAL(wp), PARAMETER ::   hrdg_hi_min = 1.1_wp    ! min ridge thickness multiplier: min(hrdg/hi)
    REAL(wp), PARAMETER ::   hi_hrft     = 0.5_wp    ! rafting multiplier: (hi/hraft)
@@ -103,7 +101,7 @@ CONTAINS
       ALLOCATE( closing_net(jpij) , opning(jpij)    , closing_gross(jpij),                   &
          &      apartf(jpij,0:jpl), hrmin (jpij,jpl), hraft(jpij,jpl)    , aridge(jpij,jpl), &
          &      hrmax (jpij,jpl)  , hrexp (jpij,jpl), hi_hrdg(jpij,jpl)  , araft(jpij,jpl) , &
-         &      ze_i_2d(jpij,nlay_i,jpl), ze_s_2d(jpij,nlay_s,jpl), STAT=ice_dyn_rdgrft_alloc )
+         &      STAT=ice_dyn_rdgrft_alloc )
 
       CALL mpp_sum ( 'icedyn_rdgrft', ice_dyn_rdgrft_alloc )
       IF( ice_dyn_rdgrft_alloc /= 0 )   CALL ctl_stop( 'STOP',  'ice_dyn_rdgrft_alloc: failed to allocate arrays'  )
@@ -170,11 +168,11 @@ CONTAINS
       !--------------------------------
       ! 0) Identify grid cells with ice
       !--------------------------------
-      at_i(:,:) = SUM( a_i, dim=3 )
+      at_i(A2D(0)) = SUM( a_i(A2D(0),:), dim=3 )
       !
       npti = 0   ;   nptidx(:) = 0
       ipti = 0   ;   iptidx(:) = 0
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF ( at_i(ji,jj) > epsi10 ) THEN
             npti           = npti + 1
             nptidx( npti ) = (jj - 1) * jpi + ji
@@ -187,13 +185,13 @@ CONTAINS
       IF( npti > 0 ) THEN
 
          ! just needed here
-         CALL tab_2d_1d( npti, nptidx(1:npti), zdelt   (1:npti)      , delta_i )
-         CALL tab_2d_1d( npti, nptidx(1:npti), zconv   (1:npti)      , rdg_conv )
+         CALL tab_2d_1d( npti, nptidx(1:npti), zdelt   (1:npti)  , delta_i )
+         CALL tab_2d_1d( npti, nptidx(1:npti), zconv   (1:npti)  , rdg_conv )
          ! needed here and in the iteration loop
-         CALL tab_2d_1d( npti, nptidx(1:npti), zdivu   (1:npti)      , divu_i) ! zdivu is used as a work array here (no change in divu_i)
-         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d  (1:npti,1:jpl), a_i   )
-         CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,1:jpl), v_i   )
-         CALL tab_2d_1d( npti, nptidx(1:npti), ato_i_1d(1:npti)      , ato_i )
+         CALL tab_2d_1d( npti, nptidx(1:npti), zdivu   (1:npti)  , divu_i) ! zdivu is used as a work array here (no change in divu_i)
+         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d  (1:npti,:), a_i   )
+         CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,:), v_i   )
+         CALL tab_2d_1d( npti, nptidx(1:npti), ato_i_1d(1:npti)  , ato_i )
 
          DO ji = 1, npti
             ! closing_net = rate at which open water area is removed + ice area removed by ridging
@@ -280,8 +278,10 @@ CONTAINS
          CALL ice_dyn_1d2d( 2 )            ! --- Move to 2D arrays --- !
 
       ENDIF
+      ! clem: those fields must be updated on the halos: ato_i, a_i, v_i, v_s, sv_i, oa_i, a_ip, v_ip, v_il, e_i, e_s
 
-      CALL ice_var_agg( 1 )
+      ! clem: I think we can comment this line but I am not sure it does not change results
+!!$      CALL ice_var_agg( 1 )
 
       ! controls
       IF( sn_cfctl%l_prtctl )   CALL ice_prt3D('icedyn_rdgrft')                                                           ! prints
@@ -302,8 +302,9 @@ CONTAINS
       !! ** Method  :   Compute the thickness distribution of the ice and open water
       !!                participating in ridging and of the resulting ridges.
       !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(:)  , INTENT(in) ::   pato_i, pclosing_net
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pa_i, pv_i
+      REAL(wp), DIMENSION(:,:), INTENT(in)           ::   pa_i, pv_i
+      REAL(wp), DIMENSION(:)  , INTENT(in)           ::   pato_i
+      REAL(wp), DIMENSION(:)  , INTENT(in), OPTIONAL ::   pclosing_net
       !!
       INTEGER  ::   ji, jl                     ! dummy loop indices
       REAL(wp) ::   z1_gstar, z1_astar, zhmean, zfac   ! local scalar
@@ -504,39 +505,43 @@ CONTAINS
          END DO
       END DO
       !
-      ! 3) closing_gross
-      !-----------------
-      ! Based on the ITD of ridging and ridged ice, convert the net closing rate to a gross closing rate.
-      ! NOTE: 0 < aksum <= 1
-      WHERE( zaksum(1:npti) > epsi10 )   ;   closing_gross(1:npti) = pclosing_net(1:npti) / zaksum(1:npti)
-      ELSEWHERE                          ;   closing_gross(1:npti) = 0._wp
-      END WHERE
-
-      ! correction to closing rate if excessive ice removal
-      !----------------------------------------------------
-      ! Reduce the closing rate if more than 100% of any ice category would be removed
-      ! Reduce the opening rate in proportion
-      DO jl = 1, jpl
+      IF( PRESENT( pclosing_net ) ) THEN
+         !
+         ! 3) closing_gross
+         !-----------------
+         ! Based on the ITD of ridging and ridged ice, convert the net closing rate to a gross closing rate.
+         ! NOTE: 0 < aksum <= 1
+         WHERE( zaksum(1:npti) > epsi10 )   ;   closing_gross(1:npti) = pclosing_net(1:npti) / zaksum(1:npti)
+         ELSEWHERE                          ;   closing_gross(1:npti) = 0._wp
+         END WHERE
+         
+         ! correction to closing rate if excessive ice removal
+         !----------------------------------------------------
+         ! Reduce the closing rate if more than 100% of any ice category would be removed
+         ! Reduce the opening rate in proportion
+         DO jl = 1, jpl
+            DO ji = 1, npti
+               zfac = apartf(ji,jl) * closing_gross(ji) * rDt_ice
+               IF( zfac > pa_i(ji,jl) .AND. apartf(ji,jl) /= 0._wp ) THEN
+                  closing_gross(ji) = pa_i(ji,jl) / apartf(ji,jl) * r1_Dt_ice
+               ENDIF
+            END DO
+         END DO
+         
+         ! 4) correction to opening if excessive open water removal
+         !---------------------------------------------------------
+         ! Reduce the closing rate if more than 100% of the open water would be removed
+         ! Reduce the opening rate in proportion
          DO ji = 1, npti
-            zfac = apartf(ji,jl) * closing_gross(ji) * rDt_ice
-            IF( zfac > pa_i(ji,jl) .AND. apartf(ji,jl) /= 0._wp ) THEN
-               closing_gross(ji) = pa_i(ji,jl) / apartf(ji,jl) * r1_Dt_ice
+            zfac = pato_i(ji) + ( opning(ji) - apartf(ji,0) * closing_gross(ji) ) * rDt_ice
+            IF( zfac < 0._wp ) THEN           ! would lead to negative ato_i
+               opning(ji) = apartf(ji,0) * closing_gross(ji) - pato_i(ji) * r1_Dt_ice
+            ELSEIF( zfac > zasum(ji) ) THEN   ! would lead to ato_i > asum
+               opning(ji) = apartf(ji,0) * closing_gross(ji) + ( zasum(ji) - pato_i(ji) ) * r1_Dt_ice
             ENDIF
          END DO
-      END DO
-
-      ! 4) correction to opening if excessive open water removal
-      !---------------------------------------------------------
-      ! Reduce the closing rate if more than 100% of the open water would be removed
-      ! Reduce the opening rate in proportion
-      DO ji = 1, npti
-         zfac = pato_i(ji) + ( opning(ji) - apartf(ji,0) * closing_gross(ji) ) * rDt_ice
-         IF( zfac < 0._wp ) THEN           ! would lead to negative ato_i
-            opning(ji) = apartf(ji,0) * closing_gross(ji) - pato_i(ji) * r1_Dt_ice
-         ELSEIF( zfac > zasum(ji) ) THEN   ! would lead to ato_i > asum
-            opning(ji) = apartf(ji,0) * closing_gross(ji) + ( zasum(ji) - pato_i(ji) ) * r1_Dt_ice
-         ENDIF
-      END DO
+         !
+      ENDIF
       !
    END SUBROUTINE rdgrft_prep
 
@@ -561,9 +566,9 @@ CONTAINS
       REAL(wp), DIMENSION(jpij) ::   airdg2, oirdg2, aprdg2, virdg2, sirdg2, vsrdg, vprdg, vlrdg  ! area etc of new ridges
       REAL(wp), DIMENSION(jpij) ::   airft2, oirft2, aprft2, virft , sirft , vsrft, vprft, vlrft  ! area etc of rafted ice
       !
-      REAL(wp), DIMENSION(jpij) ::   ersw             ! enth of water trapped into ridges
-      REAL(wp), DIMENSION(jpij) ::   zswitch, fvol    ! new ridge volume going to jl2
-      REAL(wp), DIMENSION(jpij) ::   z1_ai            ! 1 / a
+      REAL(wp) ::   ersw             ! enthalpy of water trapped into ridges
+      REAL(wp) ::   zswitch, fvol    ! new ridge volume going to jl2
+      REAL(wp) ::   z1_ai            ! 1 / a
       REAL(wp), DIMENSION(jpij) ::   zvti             ! sum(v_i)
       !
       REAL(wp), DIMENSION(jpij,nlay_s) ::   esrft     ! snow energy of rafting ice
@@ -585,11 +590,11 @@ CONTAINS
 
       ! 2) compute categories in which ice is removed (jl1)
       !----------------------------------------------------
-      DO jl1 = 1, jpl
+      IF( nn_icesal /= 2 )  THEN
+         CALL tab_3d_2d( npti, nptidx(1:npti), s_i_2d(1:npti,:), s_i(:,:,:) )
+      ENDIF
 
-         IF( nn_icesal /= 2 )  THEN
-            CALL tab_2d_1d( npti, nptidx(1:npti), s_i_1d(1:npti), s_i(:,:,jl1) )
-         ENDIF
+      DO jl1 = 1, jpl
 
          DO ji = 1, npti
 
@@ -600,8 +605,8 @@ CONTAINS
             
             IF( ll_shift(ji) ) THEN   ! only if ice is ridging
 
-               IF( a_i_2d(ji,jl1) > epsi10 ) THEN   ;   z1_ai(ji) = 1._wp / a_i_2d(ji,jl1)
-               ELSE                                 ;   z1_ai(ji) = 0._wp
+               IF( a_i_2d(ji,jl1) > epsi10 ) THEN   ;   z1_ai = 1._wp / a_i_2d(ji,jl1)
+               ELSE                                 ;   z1_ai = 0._wp
                ENDIF
 
                ! area of ridging / rafting ice (airdg1) and of new ridge (airdg2)
@@ -612,15 +617,15 @@ CONTAINS
                airft2(ji) = airft1 * hi_hrft
 
                ! ridging /rafting fractions
-               afrdg = airdg1 * z1_ai(ji)
-               afrft = airft1 * z1_ai(ji)
+               afrdg = airdg1 * z1_ai
+               afrft = airft1 * z1_ai
 
                ! volume and enthalpy (J/m2, >0) of seawater trapped into ridges
                IF    ( zvti(ji) <= 10. ) THEN ; vsw = v_i_2d(ji,jl1) * afrdg * rn_porordg                                           ! v <= 10m then porosity = rn_porordg
                ELSEIF( zvti(ji) >= 20. ) THEN ; vsw = 0._wp                                                                         ! v >= 20m then porosity = 0
                ELSE                           ; vsw = v_i_2d(ji,jl1) * afrdg * rn_porordg * MAX( 0._wp, 2._wp - 0.1_wp * zvti(ji) ) ! v > 10m and v < 20m then porosity = linear transition to 0
                ENDIF
-               ersw(ji) = -rhoi * vsw * rcp * sst_1d(ji)   ! clem: if sst>0, then ersw <0 (is that possible?)
+               ersw = -rhoi * vsw * rcp * sst_1d(ji)   ! clem: if sst>0, then ersw <0 (is that possible?)
 
                ! volume etc of ridging / rafting ice and new ridges (vi, vs, sm, oi, es, ei)
                virdg1     = v_i_2d (ji,jl1)   * afrdg
@@ -649,22 +654,35 @@ CONTAINS
                      vlrft (ji) = v_il_2d(ji,jl1) * afrft
                   ENDIF
                ENDIF
+               
+               DO jk = 1, nlay_s
+                  esrdg(ji,jk) = e_s_2d (ji,jk,jl1) * afrdg
+                  esrft(ji,jk) = e_s_2d (ji,jk,jl1) * afrft
+               END DO
+               DO jk = 1, nlay_i
+                  eirdg(ji,jk) = e_i_2d (ji,jk,jl1) * afrdg + ersw * r1_nlay_i
+                  eirft(ji,jk) = e_i_2d (ji,jk,jl1) * afrft
+               END DO
 
                ! Ice-ocean exchanges associated with ice porosity
                wfx_dyn_1d(ji) = wfx_dyn_1d(ji) - vsw * rhoi * r1_Dt_ice   ! increase in ice volume due to seawater frozen in voids
                sfx_dyn_1d(ji) = sfx_dyn_1d(ji) - vsw * sss_1d(ji) * rhoi * r1_Dt_ice
-               hfx_dyn_1d(ji) = hfx_dyn_1d(ji) + ersw(ji) * r1_Dt_ice          ! > 0 [W.m-2]
+               hfx_dyn_1d(ji) = hfx_dyn_1d(ji) + ersw * r1_Dt_ice          ! > 0 [W.m-2]
 
                ! Put the snow lost by ridging into the ocean
                !  Note that esrdg > 0; the ocean must cool to melt snow. If the ocean temp = Tf already, new ice must grow.
                wfx_snw_dyn_1d(ji) = wfx_snw_dyn_1d(ji) + ( rhos * vsrdg(ji) * ( 1._wp - rn_fsnwrdg )   &   ! fresh water source for ocean
                   &                                      + rhos * vsrft(ji) * ( 1._wp - rn_fsnwrft ) ) * r1_Dt_ice
+               DO jk = 1, nlay_s
+                  hfx_dyn_1d(ji) = hfx_dyn_1d(ji) + ( - esrdg(ji,jk) * ( 1._wp - rn_fsnwrdg )   &                 ! heat sink for ocean (<0, W.m-2)
+                     &                                - esrft(ji,jk) * ( 1._wp - rn_fsnwrft ) ) * r1_Dt_ice
+               END DO
 
                ! virtual salt flux to keep salinity constant
                IF( nn_icesal /= 2 )  THEN
-                  sirdg2(ji)     = sirdg2(ji)     - vsw * ( sss_1d(ji) - s_i_1d(ji) )       ! ridge salinity = s_i
-                  sfx_bri_1d(ji) = sfx_bri_1d(ji) + sss_1d(ji) * vsw * rhoi * r1_Dt_ice  &  ! put back sss_m into the ocean
-                     &                            - s_i_1d(ji) * vsw * rhoi * r1_Dt_ice     ! and get  s_i  from the ocean
+                  sirdg2(ji)     = sirdg2(ji)     - ( sss_1d(ji) - s_i_2d(ji,jl1) ) * vsw                      ! ridge salinity = s_i
+                  sfx_bri_1d(ji) = sfx_bri_1d(ji) + ( sss_1d(ji) - s_i_2d(ji,jl1) ) * vsw * rhoi * r1_Dt_ice   ! put back sss_m into the ocean
+                  !                                                                                            ! and get  s_i  from the ocean
                ENDIF
 
                ! Remove area, volume of new ridge to each category jl1
@@ -681,49 +699,18 @@ CONTAINS
                      v_il_2d(ji,jl1) = v_il_2d(ji,jl1) - vlrdg(ji) - vlrft(ji)
                   ENDIF
                ENDIF
+               DO jk = 1, nlay_s
+                  e_s_2d(ji,jk,jl1) = e_s_2d(ji,jk,jl1) * ( 1._wp - afrdg - afrft )
+               END DO
+               DO jk = 1, nlay_i
+                  e_i_2d(ji,jk,jl1) = e_i_2d(ji,jk,jl1) * ( 1._wp - afrdg - afrft )
+               END DO
+               
             ENDIF
-
+            
          END DO ! ji
-
-         ! special loop for e_s because of layers jk
-         DO jk = 1, nlay_s
-            DO ji = 1, npti
-               IF( ll_shift(ji) ) THEN
-                  ! Compute ridging /rafting fractions
-                  afrdg = aridge(ji,jl1) * closing_gross(ji) * rDt_ice * z1_ai(ji)
-                  afrft = araft (ji,jl1) * closing_gross(ji) * rDt_ice * z1_ai(ji)
-                  ! Compute ridging /rafting ice and new ridges for es
-                  esrdg(ji,jk) = ze_s_2d (ji,jk,jl1) * afrdg
-                  esrft(ji,jk) = ze_s_2d (ji,jk,jl1) * afrft
-                  ! Put the snow lost by ridging into the ocean
-                  hfx_dyn_1d(ji) = hfx_dyn_1d(ji) + ( - esrdg(ji,jk) * ( 1._wp - rn_fsnwrdg )   &                 ! heat sink for ocean (<0, W.m-2)
-                     &                                - esrft(ji,jk) * ( 1._wp - rn_fsnwrft ) ) * r1_Dt_ice
-                  !
-                  ! Remove energy of new ridge to each category jl1
-                  !-------------------------------------------------
-                  ze_s_2d(ji,jk,jl1) = ze_s_2d(ji,jk,jl1) * ( 1._wp - afrdg - afrft )
-               ENDIF
-            END DO
-         END DO
-
-         ! special loop for e_i because of layers jk
-         DO jk = 1, nlay_i
-            DO ji = 1, npti
-               IF( ll_shift(ji) ) THEN
-                  ! Compute ridging /rafting fractions
-                  afrdg = aridge(ji,jl1) * closing_gross(ji) * rDt_ice * z1_ai(ji)
-                  afrft = araft (ji,jl1) * closing_gross(ji) * rDt_ice * z1_ai(ji)
-                  ! Compute ridging ice and new ridges for ei
-                  eirdg(ji,jk) = ze_i_2d (ji,jk,jl1) * afrdg + ersw(ji) * r1_nlay_i
-                  eirft(ji,jk) = ze_i_2d (ji,jk,jl1) * afrft
-                  !
-                  ! Remove energy of new ridge to each category jl1
-                  !-------------------------------------------------
-                  ze_i_2d(ji,jk,jl1) = ze_i_2d(ji,jk,jl1) * ( 1._wp - afrdg - afrft )
-               ENDIF
-            END DO
-         END DO
-
+         
+ 
          ! 3) compute categories in which ice is added (jl2)
          !--------------------------------------------------
          itest_rdg(1:npti) = 0
@@ -740,13 +727,13 @@ CONTAINS
                      IF( hrmin(ji,jl1) <= hi_max(jl2) .AND. hrmax(ji,jl1) > hi_max(jl2-1) ) THEN
                         hL = MAX( hrmin(ji,jl1), hi_max(jl2-1) )
                         hR = MIN( hrmax(ji,jl1), hi_max(jl2)   )
-                        farea    = ( hR      - hL      ) / ( hrmax(ji,jl1)                 - hrmin(ji,jl1)                 )
-                        fvol(ji) = ( hR * hR - hL * hL ) / ( hrmax(ji,jl1) * hrmax(ji,jl1) - hrmin(ji,jl1) * hrmin(ji,jl1) )
+                        farea = ( hR      - hL      ) / ( hrmax(ji,jl1)                 - hrmin(ji,jl1)                 )
+                        fvol  = ( hR * hR - hL * hL ) / ( hrmax(ji,jl1) * hrmax(ji,jl1) - hrmin(ji,jl1) * hrmin(ji,jl1) )
                         !
                         itest_rdg(ji) = 1   ! test for conservation
                      ELSE
-                        farea    = 0._wp
-                        fvol(ji) = 0._wp
+                        farea = 0._wp
+                        fvol  = 0._wp
                      ENDIF
                      !
                   ELSEIF( ln_distf_exp ) THEN ! Lipscomb et al. (2007) exponential formulation                      
@@ -754,24 +741,24 @@ CONTAINS
                      IF( jl2 < jpl ) THEN
                         !
                         IF( hrmin(ji,jl1) <= hi_max(jl2) ) THEN
-                           hL       = MAX( hrmin(ji,jl1), hi_max(jl2-1) )
-                           hR       = hi_max(jl2)
-                           expL     = EXP( -( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
-                           expR     = EXP( -( hR - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
-                           farea    = expL - expR
-                           fvol(ji) = ( ( hL + hrexp(ji,jl1) ) * expL  &
-                              - ( hR + hrexp(ji,jl1) ) * expR ) / ( hrmin(ji,jl1) + hrexp(ji,jl1) )
+                           hL    = MAX( hrmin(ji,jl1), hi_max(jl2-1) )
+                           hR    = hi_max(jl2)
+                           expL  = EXP( -( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
+                           expR  = EXP( -( hR - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
+                           farea = expL - expR
+                           fvol  = ( ( hL + hrexp(ji,jl1) ) * expL  &
+                              &    - ( hR + hrexp(ji,jl1) ) * expR ) / ( hrmin(ji,jl1) + hrexp(ji,jl1) )
                         ELSE
-                           farea    = 0._wp
-                           fvol(ji) = 0._wp
+                           farea = 0._wp
+                           fvol  = 0._wp
                         END IF
                         !                 
                      ELSE             ! jl2 = jpl
                         !
-                        hL       = MAX( hrmin(ji,jl1), hi_max(jl2-1) )
-                        expL     = EXP(-( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
-                        farea    = expL
-                        fvol(ji) = ( hL + hrexp(ji,jl1) ) * expL / ( hrmin(ji,jl1) + hrexp(ji,jl1) )
+                        hL    = MAX( hrmin(ji,jl1), hi_max(jl2-1) )
+                        expL  = EXP(-( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) )
+                        farea = expL
+                        fvol  = ( hL + hrexp(ji,jl1) ) * expL / ( hrmin(ji,jl1) + hrexp(ji,jl1) )
                         !
                      END IF            ! jl2 < jpl
                      ! 
@@ -781,59 +768,49 @@ CONTAINS
                      
                   ! Compute the fraction of rafted ice area and volume going to thickness category jl2
                   IF( hraft(ji,jl1) <= hi_max(jl2) .AND. hraft(ji,jl1) >  hi_max(jl2-1) ) THEN
-                     zswitch(ji) = 1._wp
+                     zswitch = 1._wp
                      !
                      itest_rft(ji) = 1   ! test for conservation
                   ELSE
-                     zswitch(ji) = 0._wp
+                     zswitch = 0._wp
                   ENDIF
                   !
                   ! Patch to ensure perfect conservation if ice thickness goes mad
                   ! Sometimes thickness is larger than hi_max(jpl) because of advection scheme (for very small areas)
                   ! Then ice volume is removed from one category but the ridging/rafting scheme
                   ! does not know where to move it, leading to a conservation issue.
-                  IF( itest_rdg(ji) == 0 .AND. jl2 == jpl ) THEN   ;   farea = 1._wp   ;   fvol(ji) = 1._wp   ;   ENDIF
-                  IF( itest_rft(ji) == 0 .AND. jl2 == jpl )      zswitch(ji) = 1._wp
+                  IF( itest_rdg(ji) == 0 .AND. jl2 == jpl ) THEN   ;   farea = 1._wp   ;   fvol = 1._wp   ;   ENDIF
+                  IF( itest_rft(ji) == 0 .AND. jl2 == jpl )      zswitch = 1._wp
                   !
                   ! Add area, volume of new ridge to category jl2
                   !----------------------------------------------
-                  a_i_2d (ji,jl2) = a_i_2d (ji,jl2) + ( airdg2(ji) * farea    + airft2(ji) * zswitch(ji) )
-                  oa_i_2d(ji,jl2) = oa_i_2d(ji,jl2) + ( oirdg2(ji) * farea    + oirft2(ji) * zswitch(ji) )
-                  v_i_2d (ji,jl2) = v_i_2d (ji,jl2) + ( virdg2(ji) * fvol(ji) + virft (ji) * zswitch(ji) )
-                  sv_i_2d(ji,jl2) = sv_i_2d(ji,jl2) + ( sirdg2(ji) * fvol(ji) + sirft (ji) * zswitch(ji) )
-                  v_s_2d (ji,jl2) = v_s_2d (ji,jl2) + ( vsrdg (ji) * rn_fsnwrdg * fvol(ji)  +  &
-                     &                                  vsrft (ji) * rn_fsnwrft * zswitch(ji) )
+                  a_i_2d (ji,jl2) = a_i_2d (ji,jl2) + ( airdg2(ji) * farea + airft2(ji) * zswitch )
+                  oa_i_2d(ji,jl2) = oa_i_2d(ji,jl2) + ( oirdg2(ji) * farea + oirft2(ji) * zswitch )
+                  v_i_2d (ji,jl2) = v_i_2d (ji,jl2) + ( virdg2(ji) * fvol  + virft (ji) * zswitch )
+                  sv_i_2d(ji,jl2) = sv_i_2d(ji,jl2) + ( sirdg2(ji) * fvol  + sirft (ji) * zswitch )
+                  v_s_2d (ji,jl2) = v_s_2d (ji,jl2) + ( vsrdg (ji) * rn_fsnwrdg * fvol +  &
+                     &                                  vsrft (ji) * rn_fsnwrft * zswitch )
                   IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-                     v_ip_2d (ji,jl2) = v_ip_2d(ji,jl2) + (   vprdg (ji) * rn_fpndrdg * fvol   (ji)   &
-                        &                                   + vprft (ji) * rn_fpndrft * zswitch(ji)   )
-                     a_ip_2d (ji,jl2) = a_ip_2d(ji,jl2) + (   aprdg2(ji) * rn_fpndrdg * farea         &
-                        &                                   + aprft2(ji) * rn_fpndrft * zswitch(ji)   )
+                     v_ip_2d (ji,jl2) = v_ip_2d(ji,jl2) + (   vprdg (ji) * rn_fpndrdg * fvol      &
+                        &                                   + vprft (ji) * rn_fpndrft * zswitch   )
+                     a_ip_2d (ji,jl2) = a_ip_2d(ji,jl2) + (   aprdg2(ji) * rn_fpndrdg * farea     &
+                        &                                   + aprft2(ji) * rn_fpndrft * zswitch   )
                      IF ( ln_pnd_lids ) THEN
-                        v_il_2d (ji,jl2) = v_il_2d(ji,jl2) + (   vlrdg(ji) * rn_fpndrdg * fvol   (ji) &
-                           &                                   + vlrft(ji) * rn_fpndrft * zswitch(ji) )
+                        v_il_2d (ji,jl2) = v_il_2d(ji,jl2) + (   vlrdg(ji) * rn_fpndrdg * fvol    &
+                           &                                   + vlrft(ji) * rn_fpndrft * zswitch )
                      ENDIF
                   ENDIF
-
+                  DO jk = 1, nlay_s
+                     e_s_2d(ji,jk,jl2) = e_s_2d(ji,jk,jl2) + ( esrdg(ji,jk) * rn_fsnwrdg * fvol +  &
+                        &                                      esrft(ji,jk) * rn_fsnwrft * zswitch )
+                  END DO
+                  DO jk = 1, nlay_i
+                     e_i_2d(ji,jk,jl2) = e_i_2d(ji,jk,jl2) + eirdg(ji,jk) * fvol + eirft(ji,jk) * zswitch
+                  END DO
+                  
                ENDIF
 
             END DO
-            ! Add snow energy of new ridge to category jl2
-            !---------------------------------------------
-            DO jk = 1, nlay_s
-               DO ji = 1, npti
-                  IF( ll_shift(ji) )   &
-                     &   ze_s_2d(ji,jk,jl2) = ze_s_2d(ji,jk,jl2) + ( esrdg(ji,jk) * rn_fsnwrdg * fvol(ji)  +  &
-                     &                                               esrft(ji,jk) * rn_fsnwrft * zswitch(ji) )
-               END DO
-            END DO
-            ! Add ice energy of new ridge to category jl2
-            !--------------------------------------------
-            DO jk = 1, nlay_i
-               DO ji = 1, npti
-                  IF( ll_shift(ji) )   &
-                     &   ze_i_2d(ji,jk,jl2) = ze_i_2d(ji,jk,jl2) + eirdg(ji,jk) * fvol(ji) + eirft(ji,jk) * zswitch(ji)
-               END DO
-            END DO
             !
          END DO ! jl2
          !
@@ -842,7 +819,7 @@ CONTAINS
       ! roundoff errors
       !----------------
       ! In case ridging/rafting lead to very small negative values (sometimes it happens)
-      CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, ze_s_2d, ze_i_2d )
+      CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, e_s_2d, e_i_2d )
       !
    END SUBROUTINE rdgrft_shift
 
@@ -861,7 +838,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER             ::   ji, jj, jl  ! dummy loop indices
       REAL(wp)            ::   z1_3        ! local scalars
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk, zworka           ! temporary array used here
+      REAL(wp), DIMENSION(A2D(0))  ::   zworka      ! temporary array used here
       !!
       LOGICAL             ::   ln_str_R75
       REAL(wp)            ::   zhi, zcp
@@ -869,11 +846,8 @@ CONTAINS
       REAL(wp), PARAMETER ::   zmax_strength = 200.e3_wp ! Richter-Menge and Elder (1998) estimate maximum in Beaufort Sea in wintertime of the order 150 kN/m
       REAL(wp), DIMENSION(jpij) ::   zstrength, zaksum   ! strength in 1D      
       !!----------------------------------------------------------------------
-      ! prepare the mask
+      ! at_i needed for strength
       at_i(:,:) = SUM( a_i, dim=3 )
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zmsk(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10  ) ) ! 1 if ice    , 0 if no ice
-      END_2D
       !
       SELECT CASE( nice_str )          !--- Set which ice strength is chosen
 
@@ -886,7 +860,7 @@ CONTAINS
          !
          ! Identify grid cells with ice
          npti = 0   ;   nptidx(:) = 0
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF ( at_i(ji,jj) > epsi10 ) THEN
                npti           = npti + 1
                nptidx( npti ) = (jj - 1) * jpi + ji
@@ -894,12 +868,12 @@ CONTAINS
          END_2D
 
          IF( npti > 0 ) THEN
-            CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d  (1:npti,1:jpl), a_i   )
-            CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,1:jpl), v_i   )
-            CALL tab_2d_1d( npti, nptidx(1:npti), ato_i_1d(1:npti)      , ato_i )
-            CALL tab_2d_1d( npti, nptidx(1:npti), zstrength(1:npti)     , strength )
+            CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d  (1:npti,:), a_i   )
+            CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,:), v_i   )
+            CALL tab_2d_1d( npti, nptidx(1:npti), ato_i_1d(1:npti)  , ato_i )
+            CALL tab_2d_1d( npti, nptidx(1:npti), zstrength(1:npti) , strength )
 
-            CALL rdgrft_prep( a_i_2d, v_i_2d, ato_i_1d, closing_net )
+            CALL rdgrft_prep( a_i_2d, v_i_2d, ato_i_1d )
             !
             zaksum(1:npti) = apartf(1:npti,0) !clem: aksum should be defined in the header => local to module
             DO jl = 1, jpl
@@ -956,21 +930,37 @@ CONTAINS
             CALL tab_1d_2d( npti, nptidx(1:npti), zstrength(1:npti), strength )
             !
          ENDIF
+         CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1.0_wp ) ! this call could be removed if calculations were done on the full domain
+         !                                                      ! but we decided it is more efficient this way
          !
       CASE ( np_strh79 )           !== Hibler(1979)'s method ==!
-         strength(:,:) = rn_pstar * SUM( v_i(:,:,:), dim=3 ) * EXP( -rn_crhg * ( 1._wp - at_i(:,:) ) ) * zmsk(:,:)
+         !
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            IF( at_i(ji,jj) > epsi10 ) THEN
+               strength(ji,jj) = rn_pstar * SUM( v_i(ji,jj,:) ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )
+            ELSE
+               strength(ji,jj) = 0._wp
+            ENDIF
+         END_2D
          !
       CASE ( np_strcst )           !== Constant strength ==!
-         strength(:,:) = rn_str * zmsk(:,:)
+         !
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            IF( at_i(ji,jj) > epsi10 ) THEN
+               strength(ji,jj) = rn_str
+            ELSE
+               strength(ji,jj) = 0._wp
+            ENDIF
+         END_2D
          !
       END SELECT
       !
       IF( ln_str_smooth ) THEN         !--- Spatial smoothing
          DO_2D( 0, 0, 0, 0 )
-            IF ( SUM( a_i(ji,jj,:) ) > 0._wp ) THEN
+            IF( at_i(ji,jj) > epsi10 ) THEN
                zworka(ji,jj) = ( 4._wp * strength(ji,jj)              &
-                  &                    + strength(ji-1,jj) * tmask(ji-1,jj,1) + strength(ji+1,jj) * tmask(ji+1,jj,1) &
-                  &                    + strength(ji,jj-1) * tmask(ji,jj-1,1) + strength(ji,jj+1) * tmask(ji,jj+1,1) &
+                  &                    + ( ( strength(ji-1,jj) * tmask(ji-1,jj,1) + strength(ji+1,jj) * tmask(ji+1,jj,1) ) &
+                  &                      + ( strength(ji,jj-1) * tmask(ji,jj-1,1) + strength(ji,jj+1) * tmask(ji,jj+1,1) ) ) &
                   &            ) / ( 4._wp + tmask(ji-1,jj,1) + tmask(ji+1,jj,1) + tmask(ji,jj-1,1) + tmask(ji,jj+1,1) )
             ELSE
                zworka(ji,jj) = 0._wp
@@ -978,7 +968,7 @@ CONTAINS
          END_2D
 
          DO_2D( 0, 0, 0, 0 )
-            strength(ji,jj) = zworka(ji,jj) * zmsk(ji,jj)
+            strength(ji,jj) = zworka(ji,jj)
          END_2D
          CALL lbc_lnk( 'icedyn_rdgrft', strength, 'T', 1.0_wp )
          !
@@ -1007,22 +997,16 @@ CONTAINS
          CALL tab_2d_1d( npti, nptidx(1:npti), sst_1d(1:npti), sst_m(:,:) )
          ! the following fields are modified in this routine
          !!CALL tab_2d_1d( npti, nptidx(1:npti), ato_i_1d(1:npti), ato_i(:,:) )
-         !!CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d(1:npti,1:jpl), a_i(:,:,:) )
-         !!CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,1:jpl), v_i  (:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), v_s_2d (1:npti,1:jpl), v_s (:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i(:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), oa_i_2d(1:npti,1:jpl), oa_i(:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip(:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip(:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il(:,:,:) )
-         DO jl = 1, jpl
-            DO jk = 1, nlay_s
-               CALL tab_2d_1d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) )
-            END DO
-            DO jk = 1, nlay_i
-               CALL tab_2d_1d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-            END DO
-         END DO
+         !!CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d(1:npti,:), a_i(:,:,:) )
+         !!CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d  (1:npti,:), v_i  (:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), v_s_2d (1:npti,:)  , v_s (:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,:)  , sv_i(:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), oa_i_2d(1:npti,:)  , oa_i(:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,:)  , a_ip(:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,:)  , v_ip(:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,:)  , v_il(:,:,:) )
+         CALL tab_4d_3d( npti, nptidx(1:npti), e_s_2d (1:npti,:,:), e_s  )
+         CALL tab_4d_3d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i  )
          CALL tab_2d_1d( npti, nptidx(1:npti), sfx_dyn_1d    (1:npti), sfx_dyn    (:,:) )
          CALL tab_2d_1d( npti, nptidx(1:npti), sfx_bri_1d    (1:npti), sfx_bri    (:,:) )
          CALL tab_2d_1d( npti, nptidx(1:npti), wfx_dyn_1d    (1:npti), wfx_dyn    (:,:) )
@@ -1033,23 +1017,17 @@ CONTAINS
          !                 !---------------------!
       CASE( 2 )            !==  from 1D to 2D  ==!
          !                 !---------------------!
-         CALL tab_1d_2d( npti, nptidx(1:npti), ato_i_1d(1:npti), ato_i(:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i (:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,1:jpl), v_i (:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), v_s_2d (1:npti,1:jpl), v_s (:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i(:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), oa_i_2d(1:npti,1:jpl), oa_i(:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip(:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip(:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il(:,:,:) )
-         DO jl = 1, jpl
-            DO jk = 1, nlay_s
-               CALL tab_1d_2d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) )
-            END DO
-            DO jk = 1, nlay_i
-               CALL tab_1d_2d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-            END DO
-         END DO
+         CALL tab_1d_2d( npti, nptidx(1:npti), ato_i_1d(1:npti)   , ato_i(:,:)  )
+         CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,:)  , a_i (:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,:)  , v_i (:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), v_s_2d (1:npti,:)  , v_s (:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,:)  , sv_i(:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), oa_i_2d(1:npti,:)  , oa_i(:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,:)  , a_ip(:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,:)  , v_ip(:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,:)  , v_il(:,:,:) )
+         CALL tab_3d_4d( npti, nptidx(1:npti), e_s_2d (1:npti,:,:), e_s )
+         CALL tab_3d_4d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i )
          CALL tab_1d_2d( npti, nptidx(1:npti), sfx_dyn_1d    (1:npti), sfx_dyn    (:,:) )
          CALL tab_1d_2d( npti, nptidx(1:npti), sfx_bri_1d    (1:npti), sfx_bri    (:,:) )
          CALL tab_1d_2d( npti, nptidx(1:npti), wfx_dyn_1d    (1:npti), wfx_dyn    (:,:) )
@@ -1129,17 +1107,15 @@ CONTAINS
       IF( ln_str_CST    ) THEN   ;   ioptio = ioptio + 1   ;   nice_str = np_strcst       ;   ENDIF
       IF( ioptio /= 1 )    CALL ctl_stop( 'ice_dyn_rdgrft_init: one and only one ice strength option has to be defined ' )
       !
-      IF ( ( ln_str_H79 .AND. ln_str_R75 ) .OR. ( .NOT.ln_str_H79 .AND. .NOT.ln_str_R75 ) ) THEN
-         CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one ice strength formulation (ln_str_H79 or ln_str_R75)' )
-      ENDIF
-      !
-      IF ( ( ln_distf_lin .AND. ln_distf_exp ) .OR. ( .NOT.ln_distf_lin .AND. .NOT.ln_distf_exp ) ) THEN
-         CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one redistribution function (ln_distf_lin or ln_distf_exp)' )
-      ENDIF
+      ioptio = 0
+      IF( ln_distf_lin ) THEN   ;   ioptio = ioptio + 1   ;   ENDIF
+      IF( ln_distf_exp ) THEN   ;   ioptio = ioptio + 1   ;   ENDIF
+      IF( ioptio /= 1 )   CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one redistribution function (ln_distf_lin or ln_distf_exp)' )
       !
-      IF ( ( ln_partf_lin .AND. ln_partf_exp ) .OR. ( .NOT.ln_partf_lin .AND. .NOT.ln_partf_exp ) ) THEN
-         CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one participation function (ln_partf_lin or ln_partf_exp)' )
-      ENDIF
+      ioptio = 0
+      IF( ln_partf_lin ) THEN   ;   ioptio = ioptio + 1   ;   ENDIF
+      IF( ln_partf_exp ) THEN   ;   ioptio = ioptio + 1   ;   ENDIF
+      IF( ioptio /= 1 )   CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one participation function (ln_partf_lin or ln_partf_exp)' )
       !
       IF( .NOT. ln_icethd ) THEN
          rn_porordg = 0._wp
diff --git a/src/ICE/icedyn_rhg_eap.F90 b/src/ICE/icedyn_rhg_eap.F90
index 2dcfc575..7ab1d2cc 100644
--- a/src/ICE/icedyn_rhg_eap.F90
+++ b/src/ICE/icedyn_rhg_eap.F90
@@ -125,12 +125,12 @@ CONTAINS
       !!              Bouillon et al., Ocean Modelling 2013
       !!              Kimmritz et al., Ocean Modelling 2016 & 2017
       !!-------------------------------------------------------------------
-      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step
-      INTEGER                 , INTENT(in   ) ::   Kmm                                   ! ocean time level index
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
-      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   paniso_11 , paniso_12                 ! structure tensor components
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   prdg_conv                             ! for ridging
+      INTEGER                    , INTENT(in   ) ::   kt                                    ! time step
+      INTEGER                    , INTENT(in   ) ::   Kmm                                   ! ocean time level index
+      REAL(wp), DIMENSION(:,:)   , INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
+      REAL(wp), DIMENSION(:,:)   , INTENT(inout) ::   paniso_11 , paniso_12                 ! structure tensor components
+      REAL(wp), DIMENSION(:,:)   , INTENT(inout) ::   prdg_conv                             ! for ridging
       !!
       INTEGER ::   ji, jj       ! dummy loop indices
       INTEGER ::   jter         ! local integers
@@ -148,15 +148,17 @@ CONTAINS
       !
       REAL(wp) ::   zintb, zintn                                        ! dummy argument
       REAL(wp) ::   zfac_x, zfac_y
-      REAL(wp) ::   zshear, zdum1, zdum2
+      REAL(wp) ::   zdum1, zdum2
       REAL(wp) ::   zstressptmp, zstressmtmp, zstress12tmpF             ! anisotropic stress tensor components
       REAL(wp) ::   zalphar, zalphas                                    ! for mechanical redistribution
       REAL(wp) ::   zmresult11, zmresult12, z1dtevpkth, zp5kth, z1_dtevp_A  ! for structure tensor evolution
       !
+      REAL(wp) ::   zswitch
+      !
       REAL(wp), DIMENSION(jpi,jpj) ::   zstress12tmp                    ! anisotropic stress tensor component for regridding
-      REAL(wp), DIMENSION(jpi,jpj) ::   zyield11, zyield22, zyield12    ! yield surface tensor for history
+      REAL(wp), DIMENSION(A2D(0))  ::   zyield11, zyield22, zyield12    ! yield surface tensor for history
       REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zten_i                          ! tension
+      REAL(wp), DIMENSION(A2D(0))  ::   zten_i, zshear                  ! tension, shear
       REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017
       !
       REAL(wp), DIMENSION(jpi,jpj) ::   zdt_m                           ! (dt / ice-snow_mass) on T points
@@ -178,7 +180,6 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_bi, ztauy_bi              ! ice-OceanBottom stress at U-V points (landfast)
       REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_base, ztauy_base          ! ice-bottom stress at U-V points (landfast)
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00, zmsk15
       REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays
       REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence
 
@@ -186,7 +187,8 @@ CONTAINS
       REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small
       REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small
       !! --- check convergence
-      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice
+      REAL(wp), DIMENSION(A2D(0))  ::   zmsk00, zmsk15
+      REAL(wp), DIMENSION(A2D(0))  ::   zu_ice, zv_ice
       !! --- diags
       REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p
@@ -202,11 +204,11 @@ CONTAINS
       IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_eap: EAP sea-ice rheology'
       !
       ! for diagnostics and convergence tests
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
       END_2D
       IF( nn_rhg_chkcvg > 0 ) THEN
-         DO_2D( 1, 1, 1, 1 )
+         DO_2D( 0, 0, 0, 0 )
             zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
          END_2D
       ENDIF
@@ -283,7 +285,14 @@ CONTAINS
       !    non-embedded sea ice: use ocean surface for slope calculation
       zsshdyn(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b)
 
-      DO_2D( 0, 0, 0, 0 )
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         zm1          = ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) )  ! Ice/snow mass at U-V points
+!!$         zm1          = ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) ) ! clem: this should replace the above
+         zmf  (ji,jj) = zm1 * ff_t(ji,jj)                            ! Coriolis at T points (m*f)
+         zdt_m(ji,jj) = zdtevp / MAX( zm1, zmmin )                   ! dt/m at T points (for alpha and beta coefficients)
+      END_2D
+
+      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
 
          ! ice fraction at U-V points
          zaU(ji,jj) = 0.5_wp * ( at_i(ji,jj) * e1e2t(ji,jj) + at_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
@@ -291,28 +300,29 @@ CONTAINS
 
          ! Ice/snow mass at U-V points
          zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) )
+!!$         zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) + rhow * (vt_ip(ji  ,jj  ) + vt_il(ji  ,jj  )) ) ! clem: this should replace the above
          zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) )
+!!$         zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) + rhow * (vt_ip(ji+1,jj  ) + vt_il(ji+1,jj  )) ) ! clem: this should replace the above
          zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) )
+!!$         zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) + rhow * (vt_ip(ji  ,jj+1) + vt_il(ji  ,jj+1)) ) ! clem: this should replace the above
          zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
          zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
 
-         ! Ocean currents at U-V points
-         v_oceU(ji,jj)   = 0.25_wp * ( v_oce(ji,jj) + v_oce(ji,jj-1) + v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) * umask(ji,jj,1)
-         u_oceV(ji,jj)   = 0.25_wp * ( u_oce(ji,jj) + u_oce(ji-1,jj) + u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) * vmask(ji,jj,1)
-
-         ! Coriolis at T points (m*f)
-         zmf(ji,jj)      = zm1 * ff_t(ji,jj)
-
-         ! dt/m at T points (for alpha and beta coefficients)
-         zdt_m(ji,jj)    = zdtevp / MAX( zm1, zmmin )
+         ! Ocean currents at U-V point, warning: add () for the North Pole reproducibility
+         v_oceU(ji,jj)   = 0.25_wp * ( ( v_oce(ji,jj) + v_oce(ji,jj-1) ) + ( v_oce(ji+1,jj) + v_oce(ji+1,jj-1) ) ) * umask(ji,jj,1)
+         u_oceV(ji,jj)   = 0.25_wp * ( ( u_oce(ji,jj) + u_oce(ji-1,jj) ) + ( u_oce(ji,jj+1) + u_oce(ji-1,jj+1) ) ) * vmask(ji,jj,1)
 
          ! m/dt
          zmU_t(ji,jj)    = zmassU * z1_dtevp
          zmV_t(ji,jj)    = zmassV * z1_dtevp
 
          ! Drag ice-atm.
-         ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj)
-         ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj)
+         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+         !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+         ztaux_ai(ji,jj) = zaU(ji,jj) * 0.5_wp * ( utau_ice(ji,jj) + utau_ice(ji+1,jj) ) * &
+            &                                    ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji+1,jj,1) )
+         ztauy_ai(ji,jj) = zaV(ji,jj) * 0.5_wp * ( vtau_ice(ji,jj) + vtau_ice(ji,jj+1) ) * &
+            &                                    ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji,jj+1,1) )
 
          ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points
          zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj)
@@ -329,12 +339,11 @@ CONTAINS
          ELSE                                                   ;   zmsk01y(ji,jj) = 1._wp   ;   ENDIF
 
       END_2D
-      CALL lbc_lnk( 'icedyn_rhg_eap', zmf, 'T', 1.0_wp, zdt_m, 'T', 1.0_wp )
       !
       !                                  !== Landfast ice parameterization ==!
       !
       IF( ln_landfast_L16 ) THEN         !-- Lemieux 2016
-         DO_2D( 0, 0, 0, 0 )
+         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
             ! ice thickness at U-V points
             zvU = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji+1,jj) * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
             zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
@@ -345,13 +354,12 @@ CONTAINS
             zvCr = zaV(ji,jj) * rn_lf_depfra * hv(ji,jj,Kmm) * ( 1._wp - icb_mask(ji,jj) ) ! if grounded icebergs are read: ocean depth = 0
             ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) )
             ! ice_bottom stress at T points
-            zvCr = at_i(ji,jj) * rn_lf_depfra * ht(ji,jj) * ( 1._wp - icb_mask(ji,jj) )    ! if grounded icebergs are read: ocean depth = 0
+            zvCr = at_i(ji,jj) * rn_lf_depfra * ht(ji,jj,Kmm) * ( 1._wp - icb_mask(ji,jj) )    ! if grounded icebergs are read: ocean depth = 0
             tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )
          END_2D
-         CALL lbc_lnk( 'icedyn_rhg_eap', tau_icebfr(:,:), 'T', 1.0_wp )
          !
       ELSE                               !-- no landfast
-         DO_2D( 0, 0, 0, 0 )
+         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
             ztaux_base(ji,jj) = 0._wp
             ztauy_base(ji,jj) = 0._wp
          END_2D
@@ -364,18 +372,16 @@ CONTAINS
       !                                               ! ==================== !
       DO jter = 1 , nn_nevp                           !    loop over jter    !
          !                                            ! ==================== !
-         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1
-         !
          ! convergence test
          IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step
                zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1)
             END_2D
          ENDIF
 
          ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- !
-         DO_2D( 1, 0, 1, 0 )
+         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
 
             ! shear at F points
             zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)   &
@@ -386,14 +392,14 @@ CONTAINS
 
          DO_2D( 0, 0, 0, 0 )
 
-            ! shear**2 at T points (doc eq. A16)
-            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-               &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+            ! shear**2 at T points (doc eq. A16), warning: add () for the North Pole reproducibility
+            zds2 = ( ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  &
+               &   + ( zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  &
                &   ) * 0.25_wp * r1_e1e2t(ji,jj)
 
-            ! divergence at T points
-            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+            ! divergence at T points, warning: add () for the North Pole reproducibility
+            zdiv  = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &
+               &    + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )   &
                &    ) * r1_e1e2t(ji,jj)
             zdiv2 = zdiv * zdiv
 
@@ -406,24 +412,22 @@ CONTAINS
             ! delta at T points
             zdelta(ji,jj) = SQRT( zdiv2 + ( zdt2 + zds2 ) * z1_ecc2 )
 
-         END_2D
-         CALL lbc_lnk( 'icedyn_rhg_eap', zdelta, 'T', 1.0_wp )
-
-         ! P/delta at T points
-         DO_2D( 1, 1, 1, 1 )
+            ! P/delta at T points
             zp_delt(ji,jj) = strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl )
+            
          END_2D
+         CALL lbc_lnk( 'icedyn_rhg_eap', zdelta, 'T', 1.0_wp, zp_delt, 'T', 1.0_wp )
 
-         DO_2D( 0, 1, 0, 1 )   ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2
+         DO_2D( 0, 0, 0, 0 )
 
-             ! shear at T points
-            zdsT = ( zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-               &   + zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+             ! shear at T points, warning: add () for the North Pole reproducibility
+            zdsT = ( ( zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  &
+               &   + ( zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  &
                &   ) * 0.25_wp * r1_e1e2t(ji,jj)
 
-           ! divergence at T points (duplication to avoid communications)
-            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+           ! divergence at T points (duplication to avoid communications), warning: add () for the North Pole reproducibility
+            zdiv  = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &
+               &    + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )  &
                &    ) * r1_e1e2t(ji,jj)
 
             ! tension at T points (duplication to avoid communications)
@@ -467,16 +471,17 @@ CONTAINS
             zs1(ji,jj) = ( zs1(ji,jj) * zalph1 + zstressptmp ) * z1_alph1
             zs2(ji,jj) = ( zs2(ji,jj) * zalph1 + zstressmtmp ) * z1_alph1
          END_2D
-         CALL lbc_lnk( 'icedyn_rhg_eap', zstress12tmp, 'T', 1.0_wp , paniso_11, 'T', 1.0_wp , paniso_12, 'T', 1.0_wp)
+         CALL lbc_lnk( 'icedyn_rhg_eap', zstress12tmp, 'T', 1.0_wp , paniso_11, 'T', 1.0_wp , paniso_12, 'T', 1.0_wp, &
+            &                            zs1, 'T', 1.0_wp, zs2, 'T', 1.0_wp )
 
         ! Save beta at T-points for further computations
          IF( ln_aEVP ) THEN
-            DO_2D( 1, 1, 1, 1 )
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
                zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) )
             END_2D
          ENDIF
 
-         DO_2D( 1, 0, 1, 0 )
+         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
             ! stress12tmp at F points
             zstress12tmpF = ( zstress12tmp(ji,jj+1) * e1e2t(ji,jj+1) + zstress12tmp(ji+1,jj+1) * e1e2t(ji+1,jj+1)  &
                &            + zstress12tmp(ji,jj  ) * e1e2t(ji,jj  ) + zstress12tmp(ji+1,jj  ) * e1e2t(ji+1,jj  )  &
@@ -495,10 +500,9 @@ CONTAINS
             zs12(ji,jj) = ( zs12(ji,jj) * zalph1 + zstress12tmpF ) * z1_alph1
 
          END_2D
-         CALL lbc_lnk( 'icedyn_rhg_eap', zs1, 'T', 1.0_wp, zs2, 'T', 1.0_wp, zs12, 'F', 1.0_wp )
 
          ! --- Ice internal stresses (Appendix C of Hunke and Dukowicz, 2002) --- !
-         DO_2D( 0, 0, 0, 0 )
+         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
             !                   !--- U points
             zfU(ji,jj) = 0.5_wp * ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                             &
                &                  + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)    &
@@ -526,7 +530,7 @@ CONTAINS
          !  Bouillon et al. 2009 (eq 34-35) => stable
          IF( MOD(jter,2) == 0 ) THEN ! even iterations
             !
-            DO_2D( 0, 0, 0, 0 )
+            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
                !                 !--- tau_io/(v_oce - v_ice)
                zTauO = zaV(ji,jj) * zrhoco * SQRT( ( v_ice (ji,jj) - v_oce (ji,jj) ) * ( v_ice (ji,jj) - v_oce (ji,jj) )  &
                   &                              + ( u_iceV(ji,jj) - u_oceV(ji,jj) ) * ( u_iceV(ji,jj) - u_oceV(ji,jj) ) )
@@ -549,34 +553,28 @@ CONTAINS
                !
                !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
                !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
+               zswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
                !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
                   zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
+                  v_ice(ji,jj) = ( (          zswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
                      &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
+                     &            + ( 1._wp - zswitch ) * (  v_ice_b(ji,jj)                                                   &
                      &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
                      &                                    ) / ( zbetav + 1._wp )                                              &
                      &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &           )   * zmsk00y(ji,jj)
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
+                  v_ice(ji,jj) = ( (         zswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
                      &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
+                     &            + ( 1._wp - zswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
                      &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &            )   * zmsk00y(ji,jj)
                ENDIF
             END_2D
-            CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
-            !
-#if defined key_agrif
-!!          CALL agrif_interp_ice( 'V', jter, nn_nevp )
-            CALL agrif_interp_ice( 'V' )
-#endif
-            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
+            IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
             !
             DO_2D( 0, 0, 0, 0 )
                !                 !--- tau_io/(u_oce - u_ice)
@@ -601,38 +599,34 @@ CONTAINS
                !
                !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
                !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
+               zswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
                !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
                   zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
+                  u_ice(ji,jj) = ( (          zswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
                      &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
+                     &            + ( 1._wp - zswitch ) * (  u_ice_b(ji,jj)                                                   &
                      &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
                      &                                    ) / ( zbetau + 1._wp )                                              &
                      &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &           )   * zmsk00x(ji,jj)
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
+                  u_ice(ji,jj) = ( (         zswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
                      &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
+                     &            + ( 1._wp - zswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
                      &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &            )   * zmsk00x(ji,jj)
                ENDIF
             END_2D
-            CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
-            !
-#if defined key_agrif
-!!          CALL agrif_interp_ice( 'U', jter, nn_nevp )
-            CALL agrif_interp_ice( 'U' )
-#endif
-            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
+            IF( nn_hls == 1 ) THEN   ;   CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
+            ELSE                     ;   CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp, v_ice, 'V', -1.0_wp )
+            ENDIF
             !
          ELSE ! odd iterations
             !
-            DO_2D( 0, 0, 0, 0 )
+            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
                !                 !--- tau_io/(u_oce - u_ice)
                zTauO = zaU(ji,jj) * zrhoco * SQRT( ( u_ice (ji,jj) - u_oce (ji,jj) ) * ( u_ice (ji,jj) - u_oce (ji,jj) )  &
                   &                              + ( v_iceU(ji,jj) - v_oceU(ji,jj) ) * ( v_iceU(ji,jj) - v_oceU(ji,jj) ) )
@@ -655,34 +649,28 @@ CONTAINS
                !
                !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
                !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
+               zswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
                !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
                   zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
+                  u_ice(ji,jj) = ( (          zswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
                      &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
+                     &            + ( 1._wp - zswitch ) * (  u_ice_b(ji,jj)                                                   &
                      &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
                      &                                    ) / ( zbetau + 1._wp )                                              &
                      &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &           )   * zmsk00x(ji,jj)
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  u_ice(ji,jj) = ( (         rswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
+                  u_ice(ji,jj) = ( (         zswitch   * ( zmU_t(ji,jj)  * u_ice(ji,jj)                                       & ! previous velocity
                      &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
+                     &            + ( 1._wp - zswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
                      &              ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &            )   * zmsk00x(ji,jj)
                ENDIF
             END_2D
-            CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
-            !
-#if defined key_agrif
-!!          CALL agrif_interp_ice( 'U', jter, nn_nevp )
-            CALL agrif_interp_ice( 'U' )
-#endif
-            IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
+            IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp )
             !
             DO_2D( 0, 0, 0, 0 )
                !                 !--- tau_io/(v_oce - v_ice)
@@ -707,36 +695,40 @@ CONTAINS
                !
                !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
                !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
+               zswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
                !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
                   zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
+                  v_ice(ji,jj) = ( (          zswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
                      &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
+                     &            + ( 1._wp - zswitch ) * (  v_ice_b(ji,jj)                                                   &
                      &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
                      &                                    ) / ( zbetav + 1._wp )                                              &
                      &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &           )   * zmsk00y(ji,jj)
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  v_ice(ji,jj) = ( (         rswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
+                  v_ice(ji,jj) = ( (         zswitch   * ( zmV_t(ji,jj)  * v_ice(ji,jj)                                       & ! previous velocity
                      &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
                      &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
+                     &            + ( 1._wp - zswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
                      &              ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                  & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
                      &            )   * zmsk00y(ji,jj)
                ENDIF
             END_2D
-            CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
+            IF( nn_hls == 1 ) THEN   ;   CALL lbc_lnk( 'icedyn_rhg_eap', v_ice, 'V', -1.0_wp )
+            ELSE                     ;   CALL lbc_lnk( 'icedyn_rhg_eap', u_ice, 'U', -1.0_wp, v_ice, 'V', -1.0_wp )
+            ENDIF
             !
+         ENDIF
 #if defined key_agrif
-!!          CALL agrif_interp_ice( 'V', jter, nn_nevp )
-            CALL agrif_interp_ice( 'V' )
+!!       CALL agrif_interp_ice( 'U', jter, nn_nevp )
+!!       CALL agrif_interp_ice( 'V', jter, nn_nevp )
+         CALL agrif_interp_ice( 'U' )
+         CALL agrif_interp_ice( 'V' )
 #endif
-            IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
-            !
-         ENDIF
+         IF( ln_bdy )   CALL bdy_ice_dyn( 'U' )
+         IF( ln_bdy )   CALL bdy_ice_dyn( 'V' )
 
          ! convergence test
          IF( nn_rhg_chkcvg == 2 )   CALL rhg_cvg_eap( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice, zmsk15 )
@@ -751,7 +743,7 @@ CONTAINS
       !------------------------------------------------------------------------------!
       ! 4) Recompute delta, shear and div (inputs for mechanical redistribution)
       !------------------------------------------------------------------------------!
-      DO_2D( 1, 0, 1, 0 )
+      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
 
          ! shear at F points
          zds(ji,jj) = ( ( u_ice(ji,jj+1) * r1_e1u(ji,jj+1) - u_ice(ji,jj) * r1_e1u(ji,jj) ) * e1f(ji,jj) * e1f(ji,jj)   &
@@ -770,27 +762,35 @@ CONTAINS
 
          zten_i(ji,jj) = zdt
 
-         ! shear**2 at T points (doc eq. A16)
-         zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-            &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+         ! shear**2 at T points (doc eq. A16), warning: add () for the North Pole reproducibility
+         zds2 = ( ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  &
+            &   + ( zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  &
             &   ) * 0.25_wp * r1_e1e2t(ji,jj)
 
-         ! shear at T points
+         ! maximum shear rate at T points (includes tension, output only)
          pshear_i(ji,jj) = SQRT( zdt2 + zds2 )
 
-         ! divergence at T points
-         pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-            &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+        ! shear at T-points
+         zshear(ji,jj)   = SQRT( zds2 )
+
+         ! divergence at T points, warning: add () for the North Pole reproducibility
+         pdivu_i(ji,jj) = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &
+            &             + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )   &
             &             ) * r1_e1e2t(ji,jj)
 
          ! delta at T points
-         zfac            = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta
-         rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0
-         pdelta_i(ji,jj) = zfac + rn_creepl * rswitch ! delta+creepl
+         zdelta(ji,jj)   = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) ! delta
+
+         ! delta at T points
+         zswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta(ji,jj) ) ) ! 0 if delta=0
+         pdelta_i(ji,jj) = zdelta(ji,jj) + rn_creepl * zswitch  
+                           ! it seems that deformation used for advection and mech redistribution is delta*
+                           ! MV in principle adding creep limit is a regularization for viscosity not for delta
+                           ! delta_star should not (in my view) be used in a replacement for delta
 
       END_2D
       CALL lbc_lnk( 'icedyn_rhg_eap', pshear_i, 'T', 1.0_wp, pdivu_i, 'T', 1.0_wp, pdelta_i, 'T', 1.0_wp, &
-         &                              zten_i, 'T', 1.0_wp, zs1    , 'T', 1.0_wp, zs2     , 'T', 1.0_wp, &
+         &                                 zs1, 'T', 1.0_wp, zs2    , 'T', 1.0_wp, &
          &                                zs12, 'F', 1.0_wp )
 
       ! --- Store the stress tensor for the next time step --- !
@@ -803,45 +803,38 @@ CONTAINS
       ! 5) diagnostics
       !------------------------------------------------------------------------------!
       ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- !
-      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. &
-         & iom_use('utau_bi') .OR. iom_use('vtau_bi') ) THEN
-         !
-         CALL lbc_lnk( 'icedyn_rhg_eap', ztaux_oi, 'U', -1.0_wp, ztauy_oi, 'V', -1.0_wp, ztaux_ai, 'U', -1.0_wp, &
-            &                            ztauy_ai, 'V', -1.0_wp, ztaux_bi, 'U', -1.0_wp, ztauy_bi, 'V', -1.0_wp )
-         !
-         CALL iom_put( 'utau_oi' , ztaux_oi * zmsk00 )
-         CALL iom_put( 'vtau_oi' , ztauy_oi * zmsk00 )
-         CALL iom_put( 'utau_ai' , ztaux_ai * zmsk00 )
-         CALL iom_put( 'vtau_ai' , ztauy_ai * zmsk00 )
-         CALL iom_put( 'utau_bi' , ztaux_bi * zmsk00 )
-         CALL iom_put( 'vtau_bi' , ztauy_bi * zmsk00 )
-      ENDIF
+      IF( iom_use('utau_oi') )   CALL iom_put( 'utau_oi' , ztaux_oi(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_oi') )   CALL iom_put( 'vtau_oi' , ztauy_oi(A2D(0)) * zmsk00 )
+      IF( iom_use('utau_ai') )   CALL iom_put( 'utau_ai' , ztaux_ai(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_ai') )   CALL iom_put( 'vtau_ai' , ztauy_ai(A2D(0)) * zmsk00 )
+      IF( iom_use('utau_bi') )   CALL iom_put( 'utau_bi' , ztaux_bi(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_bi') )   CALL iom_put( 'vtau_bi' , ztauy_bi(A2D(0)) * zmsk00 )
 
       ! --- divergence, shear and strength --- !
-      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence
-      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear
-      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , pdelta_i * zmsk00 )   ! delta
-      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength
+      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i (A2D(0)) * zmsk00 )   ! divergence
+      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i(A2D(0)) * zmsk00 )   ! shear
+      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength(A2D(0)) * zmsk00 )   ! strength
+      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , zdelta  (A2D(0)) * zmsk00 )   ! delta
 
       ! --- Stress tensor invariants (SIMIP diags) --- !
       IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN
          !
-         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
+         ALLOCATE( zsig_I(A2D(0)) , zsig_II(A2D(0)) )
          !
-         DO_2D( 1, 1, 1, 1 )
+         DO_2D( 0, 0, 0, 0 )
 
             ! Ice stresses
             ! sigma1, sigma2, sigma12 are some useful recombination of the stresses (Hunke and Dukowicz MWR 2002, Bouillon et al., OM2013)
             ! These are NOT stress tensor components, neither stress invariants, neither stress principal components
             ! I know, this can be confusing...
-            zfac             =   strength(ji,jj) / ( pdelta_i(ji,jj) + rn_creepl )
-            zsig1            =   zfac * ( pdivu_i(ji,jj) - pdelta_i(ji,jj) )
+            zfac             =   strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl )          ! viscosity
+            zsig1            =   zfac * ( pdivu_i(ji,jj) - zdelta(ji,jj) )
             zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
-            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
+            zsig12           =   zfac * z1_ecc2 * zshear(ji,jj) * 0.5_wp
 
             ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008)
-            zsig_I (ji,jj)   =   zsig1 * 0.5_wp                                      ! 1st stress invariant, aka average normal stress, aka negative pressure
-            zsig_II(ji,jj)   =   SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 * zsig12 )  ! 2nd  ''       ''    , aka maximum shear stress
+            zsig_I (ji,jj)   =   0.5_wp * zsig1 
+            zsig_II(ji,jj)   =   0.5_wp * SQRT ( zsig2 * zsig2 + 4._wp * zsig12 * zsig12 )
 
          END_2D
          !
@@ -859,21 +852,20 @@ CONTAINS
       ! Recommendation 2 : need to use deformations at PREVIOUS iterate for viscosities
       IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN
          !
-         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
+         ALLOCATE( zsig1_p(A2D(0)) , zsig2_p(A2D(0)) , zsig_I(A2D(0)) , zsig_II(A2D(0)) )
          !
-         DO_2D( 1, 1, 1, 1 )
+        DO_2D( 0, 0, 0, 0 )
 
-            ! Ice stresses computed with **viscosities** (delta, p/delta) at **previous** iterates
-            !                        and **deformations** at current iterates
+            ! For EVP solvers, ice stresses at current iterates can be used
             !                        following Lemieux & Dupont (2020)
-            zfac             =   zp_delt(ji,jj)
-            zsig1            =   zfac * ( pdivu_i(ji,jj) - ( zdelta(ji,jj) + rn_creepl ) )
+            zfac             =   strength(ji,jj) / ( zdelta(ji,jj) + rn_creepl )
+            zsig1            =   zfac * ( pdivu_i(ji,jj) - zdelta(ji,jj) )
             zsig2            =   zfac * z1_ecc2 * zten_i(ji,jj)
-            zsig12           =   zfac * z1_ecc2 * pshear_i(ji,jj)
+            zsig12           =   zfac * z1_ecc2 * zshear(ji,jj) * 0.5_wp
 
             ! Stress invariants (sigma_I, sigma_II, Coon 1974, Feltham 2008), T-point
-            zsig_I(ji,jj)    =   zsig1 * 0.5_wp                                      ! 1st stress invariant, aka average normal stress, aka negative pressure
-            zsig_II(ji,jj)   =   SQRT ( zsig2 * zsig2 * 0.25_wp + zsig12 * zsig12 )  ! 2nd  ''       ''    , aka maximum shear stress
+            zsig_I(ji,jj)    =   0.5_wp * zsig1                                         ! normal stress
+            zsig_II(ji,jj)   =   0.5_wp * SQRT ( zsig2 * zsig2 + 4._wp * zsig12 * zsig12 ) ! max shear stress
 
             ! Normalized  principal stresses (used to display the ellipse)
             z1_strength      =   1._wp / MAX( 1._wp, strength(ji,jj) )
@@ -881,8 +873,8 @@ CONTAINS
             zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength
          END_2D
          !
-         CALL iom_put( 'sig1_pnorm' , zsig1_p )
-         CALL iom_put( 'sig2_pnorm' , zsig2_p )
+         CALL iom_put( 'sig1_pnorm' , zsig1_p(:,:) * zmsk00 )
+         CALL iom_put( 'sig2_pnorm' , zsig2_p(:,:) * zmsk00 )
 
          DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II )
 
@@ -890,9 +882,6 @@ CONTAINS
 
       ! --- yieldcurve --- !
       IF( iom_use('yield11') .OR. iom_use('yield12') .OR. iom_use('yield22')) THEN
-
-         CALL lbc_lnk( 'icedyn_rhg_eap', zyield11, 'T', 1.0_wp, zyield22, 'T', 1.0_wp, zyield12, 'T', 1.0_wp )
-
          CALL iom_put( 'yield11', zyield11 * zmsk00 )
          CALL iom_put( 'yield22', zyield22 * zmsk00 )
          CALL iom_put( 'yield12', zyield12 * zmsk00 )
@@ -900,31 +889,22 @@ CONTAINS
 
       ! --- anisotropy tensor --- !
       IF( iom_use('aniso') ) THEN
-         CALL lbc_lnk( 'icedyn_rhg_eap', paniso_11, 'T', 1.0_wp )
          CALL iom_put( 'aniso' , paniso_11 * zmsk00 )
       ENDIF
 
       ! --- SIMIP --- !
-      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. &
-         & iom_use('corstrx') .OR. iom_use('corstry') .OR. iom_use('intstrx') .OR. iom_use('intstry') ) THEN
-         !
-         CALL lbc_lnk( 'icedyn_rhg_eap', zspgU, 'U', -1.0_wp, zspgV, 'V', -1.0_wp, &
-            &                            zCorU, 'U', -1.0_wp, zCorV, 'V', -1.0_wp, &
-            &                              zfU, 'U', -1.0_wp,   zfV, 'V', -1.0_wp )
-
-         CALL iom_put( 'dssh_dx' , zspgU * zmsk00 )   ! Sea-surface tilt term in force balance (x)
-         CALL iom_put( 'dssh_dy' , zspgV * zmsk00 )   ! Sea-surface tilt term in force balance (y)
-         CALL iom_put( 'corstrx' , zCorU * zmsk00 )   ! Coriolis force term in force balance (x)
-         CALL iom_put( 'corstry' , zCorV * zmsk00 )   ! Coriolis force term in force balance (y)
-         CALL iom_put( 'intstrx' , zfU   * zmsk00 )   ! Internal force term in force balance (x)
-         CALL iom_put( 'intstry' , zfV   * zmsk00 )   ! Internal force term in force balance (y)
-      ENDIF
+      IF( iom_use('dssh_dx') )   CALL iom_put( 'dssh_dx' , zspgU(A2D(0)) * zmsk00 )   ! Sea-surface tilt term in force balance (x)
+      IF( iom_use('dssh_dy') )   CALL iom_put( 'dssh_dy' , zspgV(A2D(0)) * zmsk00 )   ! Sea-surface tilt term in force balance (y)
+      IF( iom_use('corstrx') )   CALL iom_put( 'corstrx' , zCorU(A2D(0)) * zmsk00 )   ! Coriolis force term in force balance (x)
+      IF( iom_use('corstry') )   CALL iom_put( 'corstry' , zCorV(A2D(0)) * zmsk00 )   ! Coriolis force term in force balance (y)
+      IF( iom_use('intstrx') )   CALL iom_put( 'intstrx' , zfU  (A2D(0)) * zmsk00 )   ! Internal force term in force balance (x)
+      IF( iom_use('intstry') )   CALL iom_put( 'intstry' , zfV  (A2D(0)) * zmsk00 )   ! Internal force term in force balance (y)
 
       IF(  iom_use('xmtrpice') .OR. iom_use('ymtrpice') .OR. &
          & iom_use('xmtrpsnw') .OR. iom_use('ymtrpsnw') .OR. iom_use('xatrp') .OR. iom_use('yatrp') ) THEN
          !
-         ALLOCATE( zdiag_xmtrp_ice(jpi,jpj) , zdiag_ymtrp_ice(jpi,jpj) , &
-            &      zdiag_xmtrp_snw(jpi,jpj) , zdiag_ymtrp_snw(jpi,jpj) , zdiag_xatrp(jpi,jpj) , zdiag_yatrp(jpi,jpj) )
+         ALLOCATE( zdiag_xmtrp_ice(A2D(0)) , zdiag_ymtrp_ice(A2D(0)) , &
+            &      zdiag_xmtrp_snw(A2D(0)) , zdiag_ymtrp_snw(A2D(0)) , zdiag_xatrp(A2D(0)) , zdiag_yatrp(A2D(0)) )
          !
          DO_2D( 0, 0, 0, 0 )
             ! 2D ice mass, snow mass, area transport arrays (X, Y)
@@ -942,10 +922,6 @@ CONTAINS
 
          END_2D
 
-         CALL lbc_lnk( 'icedyn_rhg_eap', zdiag_xmtrp_ice, 'U', -1.0_wp, zdiag_ymtrp_ice, 'V', -1.0_wp, &
-            &                            zdiag_xmtrp_snw, 'U', -1.0_wp, zdiag_ymtrp_snw, 'V', -1.0_wp, &
-            &                            zdiag_xatrp    , 'U', -1.0_wp, zdiag_yatrp    , 'V', -1.0_wp )
-
          CALL iom_put( 'xmtrpice' , zdiag_xmtrp_ice )   ! X-component of sea-ice mass transport (kg/s)
          CALL iom_put( 'ymtrpice' , zdiag_ymtrp_ice )   ! Y-component of sea-ice mass transport
          CALL iom_put( 'xmtrpsnw' , zdiag_xmtrp_snw )   ! X-component of snow mass transport (kg/s)
@@ -962,11 +938,11 @@ CONTAINS
       IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN
          IF( iom_use('uice_cvg') ) THEN
             IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
-               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , &
-                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) )
+               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(A2D(0)) - zu_ice(:,:) ) * zbeta(A2D(0)) * umask(A2D(0),1) , &
+                  &                           ABS( v_ice(A2D(0)) - zv_ice(:,:) ) * zbeta(A2D(0)) * vmask(A2D(0),1) ) * zmsk15(:,:) )
             ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
-               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , &
-                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) )
+               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(A2D(0)) - zu_ice(:,:) ) * umask(A2D(0),1) , &
+                  &                                             ABS( v_ice(A2D(0)) - zv_ice(:,:) ) * vmask(A2D(0),1) ) * zmsk15(:,:) )
             ENDIF
          ENDIF
       ENDIF
@@ -987,22 +963,27 @@ CONTAINS
       !!
       !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)
       !!----------------------------------------------------------------------
-      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pmsk15
+      INTEGER ,                    INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
+      REAL(wp), DIMENSION(:,:)   , INTENT(in) ::   pu, pv                    ! now velocities
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pub, pvb                  ! before velocities
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pmsk15
       !!
       INTEGER           ::   it, idtime, istatus
       INTEGER           ::   ji, jj          ! dummy loop indices
       REAL(wp)          ::   zresm           ! local real
       CHARACTER(len=20) ::   clname
+      LOGICAL           ::   ll_maxcvg
+      REAL(wp), DIMENSION(A2D(0),2) ::   zres
+      REAL(wp), DIMENSION(2)        ::   ztmp
       !!----------------------------------------------------------------------
-
+      ll_maxcvg = .FALSE.
+      !
       ! create file
       IF( kt == nit000 .AND. kiter == 1 ) THEN
          !
          IF( lwp ) THEN
             WRITE(numout,*)
-            WRITE(numout,*) 'rhg_cvg_eap : ice rheology convergence control'
+            WRITE(numout,*) 'rhg_cvg : ice rheology convergence control'
             WRITE(numout,*) '~~~~~~~'
          ENDIF
          !
@@ -1011,7 +992,7 @@ CONTAINS
             IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname)
             istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid )
             istatus = NF90_DEF_DIM( ncvgid, 'time'  , NF90_UNLIMITED, idtime )
-            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE   , (/ idtime /), nvarid )
+            istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE , (/ idtime /), nvarid )
             istatus = NF90_ENDDEF(ncvgid)
          ENDIF
          !
@@ -1025,11 +1006,21 @@ CONTAINS
          zresm = 0._wp
       ELSE
          zresm = 0._wp
-         DO_2D( 0, 0, 0, 0 )
-            zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
-               &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
-         END_2D
-         CALL mpp_max( 'icedyn_rhg_evp', zresm )   ! max over the global domain
+         IF( ll_maxcvg ) THEN   ! error max over the domain
+            DO_2D( 0, 0, 0, 0 )
+               zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
+                  &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
+            END_2D
+            CALL mpp_max( 'icedyn_rhg_eap', zresm )
+         ELSE                   ! error averaged over the domain
+            DO_2D( 0, 0, 0, 0 )
+               zres(ji,jj,1) = MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
+                  &                 ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj)
+               zres(ji,jj,2) = pmsk15(ji,jj)
+            END_2D
+            ztmp(:) = glob_sum_vec( 'icedyn_rhg_eap', zres )
+            IF( ztmp(2) /= 0._wp )   zresm = ztmp(1) / ztmp(2)
+         ENDIF
       ENDIF
 
       IF( lwm ) THEN
diff --git a/src/ICE/icedyn_rhg_evp.F90 b/src/ICE/icedyn_rhg_evp.F90
index 52f15aae..46898cf6 100644
--- a/src/ICE/icedyn_rhg_evp.F90
+++ b/src/ICE/icedyn_rhg_evp.F90
@@ -114,10 +114,10 @@ CONTAINS
       !!              Bouillon et al., Ocean Modelling 2013
       !!              Kimmritz et al., Ocean Modelling 2016 & 2017
       !!-------------------------------------------------------------------
-      INTEGER                 , INTENT(in   ) ::   kt                                    ! time step
-      INTEGER                 , INTENT(in   ) ::   Kmm                                   ! ocean time level index
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
-      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
+      INTEGER                    , INTENT(in   ) ::   kt                                    ! time step
+      INTEGER                    , INTENT(in   ) ::   Kmm                                   ! ocean time level index
+      REAL(wp), DIMENSION(:,:)   , INTENT(inout) ::   pstress1_i, pstress2_i, pstress12_i   !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(  out) ::   pshear_i  , pdivu_i   , pdelta_i      !
       !!
       INTEGER ::   ji, jj       ! dummy loop indices
       INTEGER ::   jter         ! local integers
@@ -135,38 +135,39 @@ CONTAINS
       !
       REAL(wp) ::   zfac_x, zfac_y
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zdelta, zp_delt                 ! delta and P/delta at T points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zbeta                           ! beta coef from Kimmritz 2017
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zdelta, zp_delt                 ! delta, P/delta at T points
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zbeta                           ! beta coef from Kimmritz 2017
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zdt_m                           ! (dt / ice-snow_mass) on T points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zaU  , zaV                      ! ice fraction on U/V points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmf                             ! coriolis parameter at T points
-      REAL(wp), DIMENSION(jpi,jpj) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zdt_m                           ! (dt / ice-snow_mass) on T points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zaU  , zaV                      ! ice fraction on U/V points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zmU_t, zmV_t                    ! (ice-snow_mass / dt) on U/V points
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zmf                             ! coriolis parameter at T points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   v_oceU, u_oceV, v_iceU, u_iceV  ! ocean/ice u/v component on V/U points
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zds                             ! shear
-      REAL(wp), DIMENSION(jpi,jpj) ::   zten_i, zshear                  ! tension, shear
-      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsshdyn                         ! array used for the calculation of ice surface slope:
-      !                                                                 !    ocean surface (ssh_m) if ice is not embedded
-      !                                                                 !    ice bottom surface if ice is embedded
-      REAL(wp), DIMENSION(jpi,jpj) ::   zfU  , zfV                      ! internal stresses
-      REAL(wp), DIMENSION(jpi,jpj) ::   zspgU, zspgV                    ! surface pressure gradient at U/V points
-      REAL(wp), DIMENSION(jpi,jpj) ::   zCorU, zCorV                    ! Coriolis stress array
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_ai, ztauy_ai              ! ice-atm. stress at U-V points
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_oi, ztauy_oi              ! ice-ocean stress at U-V points
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_bi, ztauy_bi              ! ice-OceanBottom stress at U-V points (landfast)
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztaux_base, ztauy_base          ! ice-bottom stress at U-V points (landfast)
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zds                             ! shear
+      REAL(wp), DIMENSION(A2D(0))        ::   zten_i, zshear                  ! tension, shear
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zs1, zs2, zs12                  ! stress tensor components
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zsshdyn                         ! array used for the calculation of ice surface slope:
+      !                                                                       !    ocean surface (ssh_m) if ice is not embedded
+      !                                                                       !    ice bottom surface if ice is embedded
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zfU  , zfV                      ! internal stresses
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zspgU, zspgV                    ! surface pressure gradient at U/V points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zCorU, zCorV                    ! Coriolis stress array
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztaux_ai, ztauy_ai              ! ice-atm. stress at U-V points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztaux_oi, ztauy_oi              ! ice-ocean stress at U-V points
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztaux_bi, ztauy_bi              ! ice-OceanBottom stress at U-V points (landfast)
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztaux_base, ztauy_base          ! ice-bottom stress at U-V points (landfast)
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk, zmsk00, zmsk15
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk01x, zmsk01y                ! dummy arrays
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmsk00x, zmsk00y                ! mask for ice presence
+      REAL(wp), DIMENSION(jpi,jpj)       ::   zmsk
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zmsk01x, zmsk01y                ! dummy arrays
+      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zmsk00x, zmsk00y                ! mask for ice presence
 
       REAL(wp), PARAMETER          ::   zepsi  = 1.0e-20_wp             ! tolerance parameter
       REAL(wp), PARAMETER          ::   zmmin  = 1._wp                  ! ice mass (kg/m2)  below which ice velocity becomes very small
       REAL(wp), PARAMETER          ::   zamin  = 0.001_wp               ! ice concentration below which ice velocity becomes very small
       !! --- check convergence
-      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice
+      REAL(wp), DIMENSION(A2D(0))  ::   zmsk00, zmsk15
+      REAL(wp), DIMENSION(A2D(0))  ::   zu_ice, zv_ice
       !! --- diags
       REAL(wp) ::   zsig1, zsig2, zsig12, zfac, z1_strength
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zsig_I, zsig_II, zsig1_p, zsig2_p
@@ -186,14 +187,19 @@ CONTAINS
 
       IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_rhg_evp: EVP sea-ice rheology'
       !
-      ! for diagnostics and convergence tests
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
-         zmsk  (ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10  ) ) ! 1 if ice    , 0 if no ice
+         IF( at_i(ji,jj) < epsi10 ) THEN   ;   zmsk(ji,jj) = 0._wp
+         ELSE                              ;   zmsk(ji,jj) = 1._wp   ;   ENDIF
+      END_2D
+      ! for diagnostics and convergence tests
+      DO_2D( 0, 0, 0, 0 )
+         IF( at_i(ji,jj) < epsi06 ) THEN   ;   zmsk00(ji,jj) = 0._wp
+         ELSE                              ;   zmsk00(ji,jj) = 1._wp   ;   ENDIF
       END_2D
       IF( nn_rhg_chkcvg > 0 ) THEN
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
+         DO_2D( 0, 0, 0, 0 )
+            IF( at_i(ji,jj) < 0.15_wp ) THEN   ;   zmsk15(ji,jj) = 0._wp
+            ELSE                               ;   zmsk15(ji,jj) = 1._wp   ;   ENDIF
          END_2D
       ENDIF
       !
@@ -265,6 +271,7 @@ CONTAINS
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          zm1          = ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) )  ! Ice/snow mass at U-V points
+!!$         zm1          = ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) ) ! clem: this should replace the above
          zmf  (ji,jj) = zm1 * ff_t(ji,jj)                            ! Coriolis at T points (m*f)
          zdt_m(ji,jj) = zdtevp / MAX( zm1, zmmin )                   ! dt/m at T points (for alpha and beta coefficients)
       END_2D
@@ -277,13 +284,16 @@ CONTAINS
 
          ! Ice/snow mass at U-V points
          zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) )
+!!$         zm1 = ( rhos * vt_s(ji  ,jj  ) + rhoi * vt_i(ji  ,jj  ) + rhow * (vt_ip(ji  ,jj  ) + vt_il(ji  ,jj  )) ) ! clem: this should replace the above
          zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) )
+!!$         zm2 = ( rhos * vt_s(ji+1,jj  ) + rhoi * vt_i(ji+1,jj  ) + rhow * (vt_ip(ji+1,jj  ) + vt_il(ji+1,jj  )) ) ! clem: this should replace the above
          zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) )
+!!$         zm3 = ( rhos * vt_s(ji  ,jj+1) + rhoi * vt_i(ji  ,jj+1) + rhow * (vt_ip(ji  ,jj+1) + vt_il(ji  ,jj+1)) ) ! clem: this should replace the above
          zmassU = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm2 * e1e2t(ji+1,jj) ) * r1_e1e2u(ji,jj) * umask(ji,jj,1)
          zmassV = 0.5_wp * ( zm1 * e1e2t(ji,jj) + zm3 * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1)
 
          ! Ocean currents at U-V points
-         ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+         ! (brackets added to fix the order of floating point operations for the North Pole reproducibility)
          v_oceU(ji,jj)   = 0.25_wp * ( (v_oce(ji,jj) + v_oce(ji,jj-1)) + (v_oce(ji+1,jj) + v_oce(ji+1,jj-1)) ) * umask(ji,jj,1)
          u_oceV(ji,jj)   = 0.25_wp * ( (u_oce(ji,jj) + u_oce(ji-1,jj)) + (u_oce(ji,jj+1) + u_oce(ji-1,jj+1)) ) * vmask(ji,jj,1)
 
@@ -292,17 +302,23 @@ CONTAINS
          zmV_t(ji,jj)    = zmassV * z1_dtevp
 
          ! Drag ice-atm.
-         ztaux_ai(ji,jj) = zaU(ji,jj) * utau_ice(ji,jj)
-         ztauy_ai(ji,jj) = zaV(ji,jj) * vtau_ice(ji,jj)
+         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+         !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+         ztaux_ai(ji,jj) = zaU(ji,jj) * 0.5_wp * ( utau_ice(ji,jj) + utau_ice(ji+1,jj) ) * &
+            &                                    ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji+1,jj,1) )
+         ztauy_ai(ji,jj) = zaV(ji,jj) * 0.5_wp * ( vtau_ice(ji,jj) + vtau_ice(ji,jj+1) ) * &
+            &                                    ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji,jj+1,1) )
 
          ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points
          zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj)
          zspgV(ji,jj)    = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj)
 
          ! masks
-         zmsk00x(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassU ) )  ! 0 if no ice
-         zmsk00y(ji,jj) = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zmassV ) )  ! 0 if no ice
-
+         IF( zmassU > 0._wp ) THEN   ;   zmsk00x(ji,jj) = 1._wp
+         ELSE                        ;   zmsk00x(ji,jj) = 0._wp   ;   ENDIF
+         IF( zmassV > 0._wp ) THEN   ;   zmsk00y(ji,jj) = 1._wp
+         ELSE                        ;   zmsk00y(ji,jj) = 0._wp   ;   ENDIF
+            
          ! switches
          IF( zmassU <= zmmin .AND. zaU(ji,jj) <= zamin ) THEN   ;   zmsk01x(ji,jj) = 0._wp
          ELSE                                                   ;   zmsk01x(ji,jj) = 1._wp   ;   ENDIF
@@ -324,11 +340,12 @@ CONTAINS
             ! ice-bottom stress at V points
             zvCr = zaV(ji,jj) * rn_lf_depfra * hv(ji,jj,Kmm) * ( 1._wp - icb_mask(ji,jj) ) ! if grounded icebergs are read: ocean depth = 0
             ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) )
+         END_2D
+         DO_2D( 0, 0, 0, 0 )
             ! ice_bottom stress at T points
-            zvCr = at_i(ji,jj) * rn_lf_depfra * ht(ji,jj) * ( 1._wp - icb_mask(ji,jj) )    ! if grounded icebergs are read: ocean depth = 0
+            zvCr = at_i(ji,jj) * rn_lf_depfra * ht(ji,jj,Kmm) * ( 1._wp - icb_mask(ji,jj) )    ! if grounded icebergs are read: ocean depth = 0
             tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )
          END_2D
-         CALL lbc_lnk( 'icedyn_rhg_evp', tau_icebfr(:,:), 'T', 1.0_wp )
          !
       ELSE                               !-- no landfast
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
@@ -344,11 +361,9 @@ CONTAINS
       !                                               ! ==================== !
       DO jter = 1 , nn_nevp                           !    loop over jter    !
          !                                            ! ==================== !
-         l_full_nf_update = jter == nn_nevp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1
-         !
          ! convergence test
          IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2  ) THEN
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step
                zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1)
             END_2D
@@ -367,13 +382,13 @@ CONTAINS
          DO_2D( 0, 0, 0, 0 )
 
             ! shear**2 at T points (doc eq. A16)
-            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-               &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+            zds2 = ( ( zds(ji,jj  )*zds(ji,jj  )*e1e2f(ji,jj  ) + zds(ji-1,jj  )*zds(ji-1,jj  )*e1e2f(ji-1,jj  ) ) & ! add () for
+               &   + ( zds(ji,jj-1)*zds(ji,jj-1)*e1e2f(ji,jj-1) + zds(ji-1,jj-1)*zds(ji-1,jj-1)*e1e2f(ji-1,jj-1) ) & ! NP repro
                &   ) * 0.25_wp * r1_e1e2t(ji,jj)
 
             ! divergence at T points
-            zdiv  = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-               &    + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+            zdiv  = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &   ! add () for
+               &    + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )   &   ! NP repro
                &    ) * r1_e1e2t(ji,jj)
             zdiv2 = zdiv * zdiv
 
@@ -396,9 +411,8 @@ CONTAINS
          DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )   ! loop ends at jpi,jpj so that no lbc_lnk are needed for zs1 and zs2
 
             ! divergence at T points (duplication to avoid communications)
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
-            zdiv  = ( (e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj))   &
-               &    + (e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1))   &
+            zdiv  = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )   &   ! add () for
+               &    + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )   &   ! NP repro
                &    ) * r1_e1e2t(ji,jj)
 
             ! tension at T points (duplication to avoid communications)
@@ -448,8 +462,8 @@ CONTAINS
             ENDIF
 
             ! P/delta at F points
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
-            zp_delf = 0.25_wp * ( (zp_delt(ji,jj) + zp_delt(ji+1,jj)) + (zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1)) )
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility)
+            zp_delf = 0.25_wp * ( ( zp_delt(ji,jj) + zp_delt(ji+1,jj) ) + ( zp_delt(ji,jj+1) + zp_delt(ji+1,jj+1) ) )
 
             ! stress at F points (zkt/=0 if landfast)
             zs12(ji,jj)= ( zs12(ji,jj) * zalph2 + zp_delf * ( zds(ji,jj) * z1_ecc2 * (1._wp + zkt) ) * 0.5_wp ) &
@@ -461,30 +475,39 @@ CONTAINS
          ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
             !                   !--- U points
-            zfU(ji,jj) = 0.5_wp * ( (( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                             &
-               &                  + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)    &
-               &                    ) * r1_e2u(ji,jj))                                                                      &
+            zfU(ji,jj) = 0.5_wp * ( ( ( zs1(ji+1,jj) - zs1(ji,jj) ) * e2u(ji,jj)                                           &
+               &                    + ( zs2(ji+1,jj) * e2t(ji+1,jj) * e2t(ji+1,jj) - zs2(ji,jj) * e2t(ji,jj) * e2t(ji,jj)  &
+               &                      ) * r1_e2u(ji,jj) )                                                                  &
                &                  + ( zs12(ji,jj) * e1f(ji,jj) * e1f(ji,jj) - zs12(ji,jj-1) * e1f(ji,jj-1) * e1f(ji,jj-1)  &
                &                    ) * 2._wp * r1_e1u(ji,jj)                                                              &
                &                  ) * r1_e1e2u(ji,jj)
             !
             !                !--- V points
-            zfV(ji,jj) = 0.5_wp * ( (( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                             &
-               &                  - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)    &
-               &                    ) * r1_e1v(ji,jj))                                                                      &
+            zfV(ji,jj) = 0.5_wp * ( ( ( zs1(ji,jj+1) - zs1(ji,jj) ) * e1v(ji,jj)                                           &
+               &                    - ( zs2(ji,jj+1) * e1t(ji,jj+1) * e1t(ji,jj+1) - zs2(ji,jj) * e1t(ji,jj) * e1t(ji,jj)  &
+               &                      ) * r1_e1v(ji,jj) )                                                                  &
                &                  + ( zs12(ji,jj) * e2f(ji,jj) * e2f(ji,jj) - zs12(ji-1,jj) * e2f(ji-1,jj) * e2f(ji-1,jj)  &
                &                    ) * 2._wp * r1_e2v(ji,jj)                                                              &
                &                  ) * r1_e1e2v(ji,jj)
             !
-            !                !--- ice currents at U-V point
-            v_iceU(ji,jj) = 0.25_wp * ( (v_ice(ji,jj) + v_ice(ji,jj-1)) + (v_ice(ji+1,jj) + v_ice(ji+1,jj-1)) ) * umask(ji,jj,1)
-            u_iceV(ji,jj) = 0.25_wp * ( (u_ice(ji,jj) + u_ice(ji-1,jj)) + (u_ice(ji,jj+1) + u_ice(ji-1,jj+1)) ) * vmask(ji,jj,1)
+            !                !--- ice currents at U-V point, warning: add () for NP repro
+            v_iceU(ji,jj) = 0.25_wp * ( ( v_ice(ji,jj) + v_ice(ji,jj-1) ) + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) ) * umask(ji,jj,1)
+            u_iceV(ji,jj) = 0.25_wp * ( ( u_ice(ji,jj) + u_ice(ji-1,jj) ) + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) ) * vmask(ji,jj,1)
             !
          END_2D
          !
          ! --- Computation of ice velocity --- !
          !  Bouillon et al. 2013 (eq 47-48) => unstable unless alpha, beta vary as in Kimmritz 2016 & 2017
          !  Bouillon et al. 2009 (eq 34-35) => stable
+         !
+         ! aEVP formulation given by eq.6 from Kimmritz et al. 2016, but taken the last term implicitly (as in eq. 8)
+         ! u(p+1) - u(p) = 1/beta * ( dt/m * RHS(p+1) + u(n) - u(p+1) )
+         !    with RHS = tau_ai + tau_oi + tau_bi + Coriolis + Spg
+         !     and tau_oi = ztau0 * ( uoce - u(p+1) )
+         !         tau_bi = ztauB *          u(p+1)
+         ! Hence:
+         ! u(p+1) = 1/(m/dt*(beta+1)+ztauO-ztauB) * (m/dt*(beta*u(p)+u(n))+RHS+ztauO*u(p))
+         !
          IF( MOD(jter,2) == 0 ) THEN ! even iterations
             !
             DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
@@ -508,29 +531,32 @@ CONTAINS
                !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
                zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
                !
-               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
-               !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
-               !
-               IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
+               IF( ln_aEVP ) THEN   !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
+                  !
                   zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
-                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
-                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
-                     &                                    ) / ( zbetav + 1._wp )                                              &
-                     &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00y(ji,jj)
-               ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity
-                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
-                     &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &            )  * zmsk00y(ji,jj)
+                  !
+                  IF( ( zRHS + ztauy_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     v_ice(ji,jj) = ( v_ice_b(ji,jj) + v_ice(ji,jj) * MAX( 0._wp, zbetav - zdtevp*rn_lf_relax ) ) / (zbetav+1._wp)
+                  ELSE
+                     v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) ) + zRHS + zTauO * v_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB )
+                  ENDIF
+                  !
+               ELSE                 !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
+                  !
+                  IF( ( zRHS + ztauy_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     v_ice(ji,jj) = v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )
+                  ELSE
+                     v_ice(ji,jj) = ( zmV_t(ji,jj) * v_ice(ji,jj) + zRHS + zTauO * v_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )
+                  ENDIF
+                  !
                ENDIF
+               ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
+               v_ice(ji,jj) = ( v_ice(ji,jj)*zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * (1._wp - zmsk01y(ji,jj)) ) * zmsk00y(ji,jj)
+               !
             END_2D
+            !
             IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1.0_wp )
             !
             DO_2D( 0, 0, 0, 0 )
@@ -554,29 +580,32 @@ CONTAINS
                !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
                zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
                !
-               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
-               !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
-               !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
+                  !
                   zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
-                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
-                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
-                     &                                    ) / ( zbetau + 1._wp )                                              &
-                     &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00x(ji,jj)
+                  !
+                  IF( ( zRHS + ztaux_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     u_ice(ji,jj) = ( u_ice_b(ji,jj) + u_ice(ji,jj) * MAX( 0._wp, zbetau - zdtevp*rn_lf_relax ) ) / (zbetau+1._wp)
+                  ELSE
+                     u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) ) + zRHS + zTauO * u_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB )
+                  ENDIF
+                  !
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity
-                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
-                     &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00x(ji,jj)
+                  !
+                  IF( ( zRHS + ztaux_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     u_ice(ji,jj) = u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )
+                  ELSE
+                     u_ice(ji,jj) = ( zmU_t(ji,jj) * u_ice(ji,jj) + zRHS + zTauO * u_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )
+                     ENDIF
+                     !
                ENDIF
+               ! u_ice = u_oce/100 if mass < zmmin & conc < zamin
+               u_ice(ji,jj) = ( u_ice(ji,jj)*zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * (1._wp - zmsk01x(ji,jj)) ) * zmsk00x(ji,jj)
+               !
             END_2D
+            !
             IF( nn_hls == 1 ) THEN   ;   CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp )
             ELSE                     ;   CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp, v_ice, 'V', -1.0_wp )
             ENDIF
@@ -604,29 +633,32 @@ CONTAINS
                !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
                zRHS = zfU(ji,jj) + ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj)
                !
-               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
-               !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztaux_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
-               !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
+                  !
                   zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) )
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) )         & ! previous velocity
-                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  u_ice_b(ji,jj)                                                   &
-                     &                                     + u_ice  (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
-                     &                                    ) / ( zbetau + 1._wp )                                              &
-                     &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00x(ji,jj)
+                  !
+                  IF( ( zRHS + ztaux_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     u_ice(ji,jj) = ( u_ice_b(ji,jj) + u_ice(ji,jj) * MAX( 0._wp, zbetau - zdtevp*rn_lf_relax ) ) / (zbetau+1._wp)
+                  ELSE
+                     u_ice(ji,jj) = ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) ) + zRHS + zTauO * u_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB )
+                  ENDIF
+                  !
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  u_ice(ji,jj) = ( (          rswitch   * ( zmU_t(ji,jj) * u_ice(ji,jj)                                       & ! previous velocity
-                     &                                    + zRHS + zTauO * u_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
-                     &             ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00x(ji,jj)
+                  !
+                  IF( ( zRHS + ztaux_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     u_ice(ji,jj) = u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )
+                  ELSE
+                     u_ice(ji,jj) = ( zmU_t(ji,jj) * u_ice(ji,jj) + zRHS + zTauO * u_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )
+                  ENDIF
+                  !
                ENDIF
+               ! u_ice = u_oce/100 if mass < zmmin & conc < zamin
+               u_ice(ji,jj) = ( u_ice(ji,jj)*zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * (1._wp - zmsk01x(ji,jj)) ) * zmsk00x(ji,jj)
+               !
             END_2D
+            !
             IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp )
             !
             DO_2D( 0, 0, 0, 0 )
@@ -650,29 +682,32 @@ CONTAINS
                !                 !--- Sum of external forces (explicit solution) = F + tau_ia + Coriolis + spg + tau_io
                zRHS = zfV(ji,jj) + ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj)
                !
-               !                 !--- landfast switch => 0 = static  friction : TauB > RHS & sign(TauB) /= sign(RHS)
-               !                                         1 = sliding friction : TauB < RHS
-               rswitch = 1._wp - MIN( 1._wp, ABS( SIGN( 1._wp, zRHS + ztauy_base(ji,jj) ) - SIGN( 1._wp, zRHS ) ) )
-               !
                IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017)
+                  !
                   zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) )
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) )         & ! previous velocity
-                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) * (  v_ice_b(ji,jj)                                                   &
-                     &                                     + v_ice  (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax )     & ! static friction => slow decrease to v=0
-                     &                                    ) / ( zbetav + 1._wp )                                              &
-                     &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00y(ji,jj)
+                  !
+                  IF( ( zRHS + ztauy_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     v_ice(ji,jj) = ( v_ice_b(ji,jj) + v_ice(ji,jj) * MAX( 0._wp, zbetav - zdtevp*rn_lf_relax ) ) / (zbetav+1._wp)
+                  ELSE
+                     v_ice(ji,jj) = ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) ) + zRHS + zTauO * v_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB )
+                  ENDIF
+                  !
                ELSE               !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009)
-                  v_ice(ji,jj) = ( (          rswitch   * ( zmV_t(ji,jj) * v_ice(ji,jj)                                       & ! previous velocity
-                     &                                    + zRHS + zTauO * v_ice(ji,jj)                                       & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)
-                     &                                    ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )                      & ! m/dt + tau_io(only ice part) + landfast
-                     &            + ( 1._wp - rswitch ) *   v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )         & ! static friction => slow decrease to v=0
-                     &             ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )                   & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
-                     &           )   * zmsk00y(ji,jj)
+                  !
+                  IF( ( zRHS + ztauy_base(ji,jj) ) < 0._wp .AND. zRHS >= 0._wp ) THEN ! static friction => slow decrease to v=0
+                     v_ice(ji,jj) = v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax )
+                  ELSE
+                     v_ice(ji,jj) = ( zmV_t(ji,jj) * v_ice(ji,jj) + zRHS + zTauO * v_ice(ji,jj) ) &
+                        &           / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )
+                  ENDIF
+                  !
                ENDIF
+               ! v_ice = v_oce/100 if mass < zmmin & conc < zamin
+               v_ice(ji,jj) = ( v_ice(ji,jj)*zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * (1._wp - zmsk01y(ji,jj)) ) * zmsk00y(ji,jj)
+               !
             END_2D
+            !
             IF( nn_hls == 1 ) THEN   ;   CALL lbc_lnk( 'icedyn_rhg_evp', v_ice, 'V', -1.0_wp )
             ELSE                     ;   CALL lbc_lnk( 'icedyn_rhg_evp', u_ice, 'U', -1.0_wp, v_ice, 'V', -1.0_wp )
             ENDIF
@@ -745,8 +780,8 @@ CONTAINS
          zten_i(ji,jj) = zdt
 
          ! shear**2 at T points (doc eq. A16)
-         zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-            &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+         zds2 = ( ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  & ! add () 
+            &   + ( zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  & ! NP rep
             &   ) * 0.25_wp * r1_e1e2t(ji,jj)
 
          ! maximum shear rate at T points (includes tension, output only)
@@ -756,24 +791,23 @@ CONTAINS
          zshear(ji,jj)   = SQRT( zds2 ) * zmsk(ji,jj)
 
          ! divergence at T points
-         pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-            &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+         pdivu_i(ji,jj) = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )  & ! add () for NP repro
+            &             + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )  &
             &             ) * r1_e1e2t(ji,jj) * zmsk(ji,jj)
 
          ! delta at T points
          zdelta(ji,jj)   = SQRT( pdivu_i(ji,jj) * pdivu_i(ji,jj) + ( zdt2 + zds2 ) * z1_ecc2 ) * zmsk(ji,jj) ! delta
 
          ! delta* at T points (pdelta_i)
-         rswitch         = 1._wp - MAX( 0._wp, SIGN( 1._wp, -zdelta(ji,jj) ) ) ! 0 if delta=0
-         pdelta_i(ji,jj) = zdelta(ji,jj) + rn_creepl * rswitch  
+         IF( zdelta(ji,jj) > 0._wp ) THEN   ;   pdelta_i(ji,jj) = zdelta(ji,jj) + rn_creepl
+         ELSE                               ;   pdelta_i(ji,jj) = 0._wp
+         ENDIF
                            ! it seems that deformation used for advection and mech redistribution is delta*
                            ! MV in principle adding creep limit is a regularization for viscosity not for delta
                            ! delta_star should not (in my view) be used in a replacement for delta
-
       END_2D
 
-      CALL lbc_lnk( 'icedyn_rhg_evp', pshear_i, 'T', 1._wp, pdivu_i, 'T', 1._wp, pdelta_i, 'T', 1._wp, zten_i, 'T', 1._wp, &
-         &                            zshear  , 'T', 1._wp, zdelta , 'T', 1._wp, zs1     , 'T', 1._wp, zs2   , 'T', 1._wp, zs12, 'F', 1._wp )
+      CALL lbc_lnk( 'icedyn_rhg_evp', zs1   , 'T', 1._wp, zs2   , 'T', 1._wp, zs12  , 'F', 1._wp )
 
       ! --- Store the stress tensor for the next time step --- !
       pstress1_i (:,:) = zs1 (:,:)
@@ -783,34 +817,25 @@ CONTAINS
       ! 5) diagnostics
       !------------------------------------------------------------------------------!
       ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- !
-      IF(  iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. &
-         & iom_use('utau_bi') .OR. iom_use('vtau_bi') ) THEN
-         !
-         CALL lbc_lnk( 'icedyn_rhg_evp', ztaux_oi, 'U', -1.0_wp, ztauy_oi, 'V', -1.0_wp, &
-            &                            ztaux_ai, 'U', -1.0_wp, ztauy_ai, 'V', -1.0_wp, &
-            &                            ztaux_bi, 'U', -1.0_wp, ztauy_bi, 'V', -1.0_wp )
-         !
-         CALL iom_put( 'utau_oi' , ztaux_oi * zmsk00 )
-         CALL iom_put( 'vtau_oi' , ztauy_oi * zmsk00 )
-         CALL iom_put( 'utau_ai' , ztaux_ai * zmsk00 )
-         CALL iom_put( 'vtau_ai' , ztauy_ai * zmsk00 )
-         CALL iom_put( 'utau_bi' , ztaux_bi * zmsk00 )
-         CALL iom_put( 'vtau_bi' , ztauy_bi * zmsk00 )
-      ENDIF
+      IF( iom_use('utau_oi') )   CALL iom_put( 'utau_oi' , ztaux_oi(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_oi') )   CALL iom_put( 'vtau_oi' , ztauy_oi(A2D(0)) * zmsk00 )
+      IF( iom_use('utau_ai') )   CALL iom_put( 'utau_ai' , ztaux_ai(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_ai') )   CALL iom_put( 'vtau_ai' , ztauy_ai(A2D(0)) * zmsk00 )
+      IF( iom_use('utau_bi') )   CALL iom_put( 'utau_bi' , ztaux_bi(A2D(0)) * zmsk00 )
+      IF( iom_use('vtau_bi') )   CALL iom_put( 'vtau_bi' , ztauy_bi(A2D(0)) * zmsk00 )
 
       ! --- divergence, shear and strength --- !
-      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i  * zmsk00 )   ! divergence
-      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i * zmsk00 )   ! shear
-      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength * zmsk00 )   ! strength
-      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , zdelta   * zmsk00 )   ! delta
+      IF( iom_use('icediv') )   CALL iom_put( 'icediv' , pdivu_i (A2D(0)) * zmsk00 )   ! divergence
+      IF( iom_use('iceshe') )   CALL iom_put( 'iceshe' , pshear_i(A2D(0)) * zmsk00 )   ! shear
+      IF( iom_use('icestr') )   CALL iom_put( 'icestr' , strength(A2D(0)) * zmsk00 )   ! strength
+      IF( iom_use('icedlt') )   CALL iom_put( 'icedlt' , zdelta  (A2D(0)) * zmsk00 )   ! delta
 
       ! --- Stress tensor invariants (SIMIP diags) --- !
       IF( iom_use('normstr') .OR. iom_use('sheastr') ) THEN
          !
-         ALLOCATE( zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
+         ALLOCATE( zsig_I(A2D(0)) , zsig_II(A2D(0)) )
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-
+         DO_2D( 0, 0, 0, 0 )
             ! Ice stresses
             ! sigma1, sigma2, sigma12 are some recombination of the stresses (HD MWR002, Bouillon et al., OM2013)
             ! not to be confused with stress tensor components, stress invariants, or stress principal components
@@ -825,8 +850,8 @@ CONTAINS
 
          END_2D
          !
-         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00(:,:) ) ! Normal stress
-         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress
+         IF( iom_use('normstr') )   CALL iom_put( 'normstr', zsig_I (:,:) * zmsk00 ) ! Normal stress
+         IF( iom_use('sheastr') )   CALL iom_put( 'sheastr', zsig_II(:,:) * zmsk00 ) ! Maximum shear stress
 
          DEALLOCATE ( zsig_I, zsig_II )
 
@@ -838,9 +863,9 @@ CONTAINS
       ! Recommendation 2 : for EVP, no need to use viscosities at last iteration (stress is properly iterated)
       IF( iom_use('sig1_pnorm') .OR. iom_use('sig2_pnorm') ) THEN
          !
-         ALLOCATE( zsig1_p(jpi,jpj) , zsig2_p(jpi,jpj) , zsig_I(jpi,jpj) , zsig_II(jpi,jpj) )
+         ALLOCATE( zsig1_p(A2D(0)) , zsig2_p(A2D(0)) , zsig_I(A2D(0)) , zsig_II(A2D(0)) )
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
 
             ! For EVP solvers, ice stresses at current iterates can be used
             !                        following Lemieux & Dupont (2020)
@@ -859,33 +884,26 @@ CONTAINS
             zsig2_p(ji,jj)   =   ( zsig_I(ji,jj) - zsig_II(ji,jj) ) * z1_strength
          END_2D
          !
-         CALL iom_put( 'sig1_pnorm' , zsig1_p * zmsk00 )
-         CALL iom_put( 'sig2_pnorm' , zsig2_p * zmsk00 )
+         CALL iom_put( 'sig1_pnorm' , zsig1_p(:,:) * zmsk00 )
+         CALL iom_put( 'sig2_pnorm' , zsig2_p(:,:) * zmsk00 )
 
          DEALLOCATE( zsig1_p , zsig2_p , zsig_I, zsig_II )
 
       ENDIF
 
       ! --- SIMIP --- !
-      IF(  iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. &
-         & iom_use('corstrx') .OR. iom_use('corstry') .OR. iom_use('intstrx') .OR. iom_use('intstry') ) THEN
-         !
-         CALL lbc_lnk( 'icedyn_rhg_evp', zspgU, 'U', -1.0_wp, zspgV, 'V', -1.0_wp, &
-            &                            zCorU, 'U', -1.0_wp, zCorV, 'V', -1.0_wp, zfU, 'U', -1.0_wp, zfV, 'V', -1.0_wp )
-
-         CALL iom_put( 'dssh_dx' , zspgU * zmsk00 )   ! Sea-surface tilt term in force balance (x)
-         CALL iom_put( 'dssh_dy' , zspgV * zmsk00 )   ! Sea-surface tilt term in force balance (y)
-         CALL iom_put( 'corstrx' , zCorU * zmsk00 )   ! Coriolis force term in force balance (x)
-         CALL iom_put( 'corstry' , zCorV * zmsk00 )   ! Coriolis force term in force balance (y)
-         CALL iom_put( 'intstrx' , zfU   * zmsk00 )   ! Internal force term in force balance (x)
-         CALL iom_put( 'intstry' , zfV   * zmsk00 )   ! Internal force term in force balance (y)
-      ENDIF
+      IF( iom_use('dssh_dx') )   CALL iom_put( 'dssh_dx' , zspgU(A2D(0)) * zmsk00 )   ! Sea-surface tilt term in force balance (x)
+      IF( iom_use('dssh_dy') )   CALL iom_put( 'dssh_dy' , zspgV(A2D(0)) * zmsk00 )   ! Sea-surface tilt term in force balance (y)
+      IF( iom_use('corstrx') )   CALL iom_put( 'corstrx' , zCorU(A2D(0)) * zmsk00 )   ! Coriolis force term in force balance (x)
+      IF( iom_use('corstry') )   CALL iom_put( 'corstry' , zCorV(A2D(0)) * zmsk00 )   ! Coriolis force term in force balance (y)
+      IF( iom_use('intstrx') )   CALL iom_put( 'intstrx' , zfU  (A2D(0)) * zmsk00 )   ! Internal force term in force balance (x)
+      IF( iom_use('intstry') )   CALL iom_put( 'intstry' , zfV  (A2D(0)) * zmsk00 )   ! Internal force term in force balance (y)
 
       IF(  iom_use('xmtrpice') .OR. iom_use('ymtrpice') .OR. &
          & iom_use('xmtrpsnw') .OR. iom_use('ymtrpsnw') .OR. iom_use('xatrp') .OR. iom_use('yatrp') ) THEN
          !
-         ALLOCATE( zdiag_xmtrp_ice(jpi,jpj) , zdiag_ymtrp_ice(jpi,jpj) , &
-            &      zdiag_xmtrp_snw(jpi,jpj) , zdiag_ymtrp_snw(jpi,jpj) , zdiag_xatrp(jpi,jpj) , zdiag_yatrp(jpi,jpj) )
+         ALLOCATE( zdiag_xmtrp_ice(A2D(0)) , zdiag_ymtrp_ice(A2D(0)) , &
+            &      zdiag_xmtrp_snw(A2D(0)) , zdiag_ymtrp_snw(A2D(0)) , zdiag_xatrp(A2D(0)) , zdiag_yatrp(A2D(0)) )
          !
          DO_2D( 0, 0, 0, 0 )
             ! 2D ice mass, snow mass, area transport arrays (X, Y)
@@ -903,10 +921,6 @@ CONTAINS
 
          END_2D
 
-         CALL lbc_lnk( 'icedyn_rhg_evp', zdiag_xmtrp_ice, 'U', -1.0_wp, zdiag_ymtrp_ice, 'V', -1.0_wp, &
-            &                            zdiag_xmtrp_snw, 'U', -1.0_wp, zdiag_ymtrp_snw, 'V', -1.0_wp, &
-            &                            zdiag_xatrp    , 'U', -1.0_wp, zdiag_yatrp    , 'V', -1.0_wp )
-
          CALL iom_put( 'xmtrpice' , zdiag_xmtrp_ice )   ! X-component of sea-ice mass transport (kg/s)
          CALL iom_put( 'ymtrpice' , zdiag_ymtrp_ice )   ! Y-component of sea-ice mass transport
          CALL iom_put( 'xmtrpsnw' , zdiag_xmtrp_snw )   ! X-component of snow mass transport (kg/s)
@@ -923,11 +937,11 @@ CONTAINS
       IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN
          IF( iom_use('uice_cvg') ) THEN
             IF( ln_aEVP ) THEN   ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
-               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , &
-                  &                           ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) )
+               CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(A2D(0)) - zu_ice(:,:) ) * zbeta(A2D(0)) * umask(A2D(0),1) , &
+                  &                           ABS( v_ice(A2D(0)) - zv_ice(:,:) ) * zbeta(A2D(0)) * vmask(A2D(0),1) ) * zmsk15(:,:) )
             ELSE                 ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) )
-               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , &
-                  &                                             ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) )
+               CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(A2D(0)) - zu_ice(:,:) ) * umask(A2D(0),1) , &
+                  &                                             ABS( v_ice(A2D(0)) - zv_ice(:,:) ) * vmask(A2D(0),1) ) * zmsk15(:,:) )
             ENDIF
          ENDIF
       ENDIF
@@ -948,17 +962,18 @@ CONTAINS
       !!
       !! ** Note    :   for the first sub-iteration, uice_cvg is set to 0 (too large otherwise)
       !!----------------------------------------------------------------------
-      INTEGER ,                 INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pu, pv, pub, pvb          ! now and before velocities
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pmsk15
+      INTEGER ,                    INTENT(in) ::   kt, kiter, kitermax       ! ocean time-step index
+      REAL(wp), DIMENSION(:,:)   , INTENT(in) ::   pu, pv                    ! now velocities
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pub, pvb                  ! before velocities
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pmsk15
       !!
       INTEGER           ::   it, idtime, istatus
       INTEGER           ::   ji, jj          ! dummy loop indices
       REAL(wp)          ::   zresm           ! local real
       CHARACTER(len=20) ::   clname
       LOGICAL           ::   ll_maxcvg
-      REAL(wp), DIMENSION(jpi,jpj,2) ::   zres
-      REAL(wp), DIMENSION(2)         ::   ztmp
+      REAL(wp), DIMENSION(A2D(0),2) ::   zres
+      REAL(wp), DIMENSION(2)        ::   ztmp
       !!----------------------------------------------------------------------
       ll_maxcvg = .FALSE.
       !
@@ -1137,7 +1152,8 @@ CONTAINS
          ENDIF
          !
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            ztra         = - ( zfu_ups(ji,jj) - zfu_ups(ji-1,jj) + zfv_ups(ji,jj) - zfv_ups(ji,jj-1) )
+            ztra         = - (  ( zfu_ups(ji,jj) - zfu_ups(ji-1,jj) )   & ! add () for NP repro
+               &              + ( zfv_ups(ji,jj) - zfv_ups(ji,jj-1) )  )
             pt(ji,jj,jl) =   ( pt(ji,jj,jl) + ztra * pdt * r1_e1e2t(ji,jj) ) * tmask(ji,jj,1)
          END_2D
       END DO
diff --git a/src/ICE/icedyn_rhg_vp.F90 b/src/ICE/icedyn_rhg_vp.F90
index c087f97a..53073a42 100644
--- a/src/ICE/icedyn_rhg_vp.F90
+++ b/src/ICE/icedyn_rhg_vp.F90
@@ -142,6 +142,7 @@ CONTAINS
       INTEGER ::   nn_zebra_vp         ! number of zebra steps
 
       !
+      REAL(wp) ::   zswitch
       REAL(wp) ::   zrhoco                                              ! rho0 * rn_cio
       REAL(wp) ::   ecc2, z1_ecc2                                       ! square of yield ellipse eccenticity
       REAL(wp) ::   zglob_area                                          ! global ice area for diagnostics
@@ -328,11 +329,14 @@ CONTAINS
          zmU_t(ji,jj)    = zmassU_t(ji,jj) * u_ice(ji,jj)
          
          ! Ocean currents at U-V points
-         ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+         ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
          v_oceU(ji,jj)   = 0.25_wp * ( (v_oce(ji,jj) + v_oce(ji,jj-1)) + (v_oce(ji+1,jj) + v_oce(ji+1,jj-1)) ) * umask(ji,jj,1)
          
          ! Wind stress
-         ztaux_ai(ji,jj) = za_iU(ji,jj) * utau_ice(ji,jj)
+         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+         !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+         ztaux_ai(ji,jj) = za_iU(ji,jj) * 0.5_wp * ( utau_ice(ji,jj) + utau_ice(ji+1,jj) ) * &
+            &                                      ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji+1,jj,1) )
          
          ! Force due to sea surface tilt(- m*g*GRAD(ssh))
          zspgU(ji,jj)    = - zmassU * grav * ( zsshdyn(ji+1,jj) - zsshdyn(ji,jj) ) * r1_e1u(ji,jj)
@@ -365,11 +369,14 @@ CONTAINS
          zmV_t(ji,jj)    = zmassV_t(ji,jj) * v_ice(ji,jj)
          
          ! Ocean currents at U-V points
-         ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+         ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
          u_oceV(ji,jj)   = 0.25_wp * ( (u_oce(ji,jj) + u_oce(ji-1,jj)) + (u_oce(ji,jj+1) + u_oce(ji-1,jj+1)) ) * vmask(ji,jj,1)
          
          ! Wind stress
-         ztauy_ai(ji,jj) = za_iV(ji,jj) * vtau_ice(ji,jj)
+         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+         !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+         ztauy_ai(ji,jj) = za_iV(ji,jj) * 0.5_wp * ( vtau_ice(ji,jj) + vtau_ice(ji,jj+1) ) * &
+            &                                      ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji,jj+1,1) )
          
          ! Force due to sea surface tilt(- m*g*GRAD(ssh))
          zspgV(ji,jj)    = - zmassV * grav * ( zsshdyn(ji,jj+1) - zsshdyn(ji,jj) ) * r1_e2v(ji,jj)
@@ -430,14 +437,15 @@ CONTAINS
             ! loop to jpi,jpj to avoid making a communication for zs1,zs2,zs12
 
             ! shear**2 at T points (doc eq. A16)
-            zds2  = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-               &    + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zds2  = ( ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  &
+               &    + ( zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  &
                &    ) * 0.25_wp * r1_e1e2t(ji,jj)
               
             ! divergence at T points
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
-            zdiv  = ( (e2u(ji,jj) * zu_c(ji,jj) - e2u(ji-1,jj) * zu_c(ji-1,jj))   &
-               &    + (e1v(ji,jj) * zv_c(ji,jj) - e1v(ji,jj-1) * zv_c(ji,jj-1))   &
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zdiv  = ( ( e2u(ji,jj) * zu_c(ji,jj) - e2u(ji-1,jj) * zu_c(ji-1,jj) )   &
+               &    + ( e1v(ji,jj) * zv_c(ji,jj) - e1v(ji,jj-1) * zv_c(ji,jj-1) )   &
                &    ) * r1_e1e2t(ji,jj)
             zdiv2 = zdiv * zdiv
                
@@ -468,7 +476,7 @@ CONTAINS
          DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )! 1-> jpj-1; 1->jpi-1
          
             ! P/delta* at F points
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
             zvisc_f = 0.25_wp * ( (zvisc_t(ji,jj) + zvisc_t(ji+1,jj)) + (zvisc_t(ji,jj+1) + zvisc_t(ji+1,jj+1)) )
             
             ! Temporary zef factor at F-point
@@ -483,7 +491,7 @@ CONTAINS
          DO_2D( nn_hls, nn_hls-1, nn_hls-1, nn_hls )
          
             !--- ice u-velocity @V points, v-velocity @U points (for non-linear drag computation)
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
             zv_cU            = 0.25_wp * ( (zv_c(ji,jj) + zv_c(ji,jj-1)) + (zv_c(ji+1,jj) + zv_c(ji+1,jj-1)) ) * umask(ji,jj,1)
                 
             !--- non-linear drag coefficients (need to be updated at each outer loop, see Lemieux and Tremblay JGR09, p.3, beginning of Section 3)
@@ -503,7 +511,7 @@ CONTAINS
          DO_2D( nn_hls-1, nn_hls, nn_hls, nn_hls-1 )
          
             !--- ice u-velocity @V points, v-velocity @U points (for non-linear drag computation)
-            ! (brackets added to fix the order of floating point operations for halo 1 - halo 2 compatibility)
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
             zu_cV            = 0.25_wp * ( (zu_c(ji,jj) + zu_c(ji-1,jj)) + (zu_c(ji,jj+1) + zu_c(ji-1,jj+1)) ) * vmask(ji,jj,1)
                 
             !--- non-linear drag coefficients (need to be updated at each outer loop, see Lemieux and Tremblay JGR09, p.3, beginning of Section 3)
@@ -727,7 +735,6 @@ CONTAINS
             !--- mitgcm computes initial value of residual here...
 
             i_inn_tot  = i_inn_tot + 1
-            ! l_full_nf_update = i_inn_tot == nn_nvp   ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1
 
             zu_b(:,:)       = u_ice(:,:) ! velocity at previous inner-iterate
             zv_b(:,:)       = v_ice(:,:)
@@ -1061,8 +1068,9 @@ CONTAINS
       DO_2D( 0, 0, 0, 0 ) ! 2->jpj-1; 2->jpi-1
             
             ! shear**2 at T points (doc eq. A16)
-            zds2 = ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  )  &
-               &   + zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1)  &
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zds2 = ( ( zds(ji,jj  ) * zds(ji,jj  ) * e1e2f(ji,jj  ) + zds(ji-1,jj  ) * zds(ji-1,jj  ) * e1e2f(ji-1,jj  ) )  &
+               &   + ( zds(ji,jj-1) * zds(ji,jj-1) * e1e2f(ji,jj-1) + zds(ji-1,jj-1) * zds(ji-1,jj-1) * e1e2f(ji-1,jj-1) )  &
                &   ) * 0.25_wp * r1_e1e2t(ji,jj)
             
             ! tension**2 at T points
@@ -1080,8 +1088,9 @@ CONTAINS
             zshear(ji,jj)   = SQRT( zds2 ) * zmsk(ji,jj)
 
             ! divergence at T points
-            pdivu_i(ji,jj) = ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj)   &
-               &             + e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1)   &
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            pdivu_i(ji,jj) = ( ( e2u(ji,jj) * u_ice(ji,jj) - e2u(ji-1,jj) * u_ice(ji-1,jj) )  &
+               &             + ( e1v(ji,jj) * v_ice(ji,jj) - e1v(ji,jj-1) * v_ice(ji,jj-1) )  &
                &             ) * r1_e1e2t(ji,jj) * zmsk(ji,jj)
             
             ! delta at T points
@@ -1089,8 +1098,8 @@ CONTAINS
             zdelta(ji,jj)      = zfac
             
             ! delta* at T points
-            rswitch            =   1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0
-            pdelta_i(ji,jj)    = zfac + rn_creepl ! * rswitch
+            zswitch            =   1._wp - MAX( 0._wp, SIGN( 1._wp, -zfac ) ) ! 0 if delta=0
+            pdelta_i(ji,jj)    = zfac + rn_creepl ! * zswitch
            
       END_2D
 
@@ -1152,22 +1161,22 @@ CONTAINS
          !--- Recalculate oceanic stress at last inner iteration
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! 2->jpj-1; 2->jpi-1
 
-                !--- ice u-velocity @V points, v-velocity @U points (for non-linear drag computation)
-                zu_cV            = 0.25_wp * ( u_ice(ji,jj) + u_ice(ji-1,jj) + u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) * vmask(ji,jj,1)
-                zv_cU            = 0.25_wp * ( v_ice(ji,jj) + v_ice(ji,jj-1) + v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) * umask(ji,jj,1)
-                
-                !--- non-linear drag coefficients (need to be updated at each outer loop, see Lemieux and Tremblay JGR09, p.3, beginning of Section 3)
-                zCwU(ji,jj)          = za_iU(ji,jj) * zrhoco * SQRT( ( u_ice(ji,jj) - u_oce (ji,jj) ) * ( u_ice(ji,jj) - u_oce (ji,jj) )  &
-                  &                                                + ( zv_cU - v_oceU(ji,jj) ) * ( zv_cU - v_oceU(ji,jj) ) )
-                zCwV(ji,jj)          = za_iV(ji,jj) * zrhoco * SQRT( ( v_ice(ji,jj) - v_oce (ji,jj) ) * ( v_ice(ji,jj) - v_oce (ji,jj) )  &
-                  &                                                + ( zu_cV - u_oceV(ji,jj) ) * ( zu_cV - u_oceV(ji,jj) ) )
-                 
-                !--- Ocean-ice stress
-                ztaux_oi(ji,jj) = zCwU(ji,jj) * ( u_oce(ji,jj) - u_ice(ji,jj) )
-                ztauy_oi(ji,jj) = zCwV(ji,jj) * ( v_oce(ji,jj) - v_ice(ji,jj) )
-                
+            !--- ice u-velocity @V points, v-velocity @U points (for non-linear drag computation)
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zu_cV = 0.25_wp * ( ( u_ice(ji,jj) + u_ice(ji-1,jj) ) + ( u_ice(ji,jj+1) + u_ice(ji-1,jj+1) ) ) * vmask(ji,jj,1)
+            zv_cU = 0.25_wp * ( ( v_ice(ji,jj) + v_ice(ji,jj-1) ) + ( v_ice(ji+1,jj) + v_ice(ji+1,jj-1) ) ) * umask(ji,jj,1)
+            
+            !--- non-linear drag coefficients (need to be updated at each outer loop, see Lemieux and Tremblay JGR09, p.3, beginning of Section 3)
+            zCwU(ji,jj) = za_iU(ji,jj) * zrhoco * SQRT( ( u_ice(ji,jj) - u_oce (ji,jj) ) * ( u_ice(ji,jj) - u_oce (ji,jj) )  &
+               &                                             + ( zv_cU - v_oceU(ji,jj) ) * ( zv_cU - v_oceU(ji,jj) ) )
+            zCwV(ji,jj) = za_iV(ji,jj) * zrhoco * SQRT( ( v_ice(ji,jj) - v_oce (ji,jj) ) * ( v_ice(ji,jj) - v_oce (ji,jj) )  &
+               &                                             + ( zu_cV - u_oceV(ji,jj) ) * ( zu_cV - u_oceV(ji,jj) ) )
+            
+            !--- Ocean-ice stress
+            ztaux_oi(ji,jj) = zCwU(ji,jj) * ( u_oce(ji,jj) - u_ice(ji,jj) )
+            ztauy_oi(ji,jj) = zCwV(ji,jj) * ( v_oce(ji,jj) - v_ice(ji,jj) )
+            
          END_2D
-         
          !
          CALL lbc_lnk( 'icedyn_rhg_vp', ztaux_oi, 'U', -1., ztauy_oi, 'V', -1., ztaux_ai, 'U', -1., ztauy_ai, 'V', -1. ) !, &
 !            &                          ztaux_bi, 'U', -1., ztauy_bi, 'V', -1. )
@@ -1562,17 +1571,18 @@ CONTAINS
          
          DO_2D( 0, 0, 0, 0 ) !clem check bounds
 
-               zu_res(ji,jj)  = ( prhsu(ji,jj) + pDU(ji,jj) * pu(ji,jj-1) + pEU(ji,jj) * pu(ji,jj+1)               &
-                  &             - pAU(ji,jj) * pu(ji-1,jj) - pBU(ji,jj) * pu(ji,jj) - pCU(ji,jj) * pu(ji+1,jj) )
-               zv_res(ji,jj)  = ( prhsv(ji,jj) + pDV(ji,jj) * pv(ji-1,jj) + pEV(ji,jj) * pv(ji+1,jj)               &
-                  &             - pAV(ji,jj) * pv(ji,jj-1) - pBV(ji,jj) * pv(ji,jj) - pCV(ji,jj) * pv(ji,jj+1) )
-
-!              zu_res(ji,jj)  = pFU(ji,jj) - pAU(ji,jj) * pu(ji-1,jj) - pBU(ji,jj) * pu(ji,jj) - pCU(ji,jj) * pu(ji+1,jj)
-!              zv_res(ji,jj)  = pFV(ji,jj) - pAV(ji,jj) * pv(ji,jj-1) - pBV(ji,jj) * pv(ji,jj) - pCV(ji,jj) * pv(ji,jj+1)
-   
-               zu_res(ji,jj)  = SQRT( zu_res(ji,jj) * zu_res(ji,jj) ) * umask(ji,jj,1) * pat_iu(ji,jj) * e1e2u(ji,jj) * z1_pglob_area
-               zv_res(ji,jj)  = SQRT( zv_res(ji,jj) * zv_res(ji,jj) ) * vmask(ji,jj,1) * pat_iv(ji,jj) * e1e2v(ji,jj) * z1_pglob_area
-   
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zu_res(ji,jj)  = prhsu(ji,jj)             + ( pDU(ji,jj) * pu(ji  ,jj-1) + pEU(ji,jj) * pu(ji  ,jj+1) )   &
+               &             - pBU(ji,jj) * pu(ji,jj) - ( pAU(ji,jj) * pu(ji-1,jj  ) + pCU(ji,jj) * pu(ji+1,jj  ) )
+            zv_res(ji,jj)  = prhsv(ji,jj)             + ( pDV(ji,jj) * pv(ji-1,jj  ) + pEV(ji,jj) * pv(ji+1,jj  ) )   &
+               &             - pBV(ji,jj) * pv(ji,jj) - ( pAV(ji,jj) * pv(ji  ,jj-1) + pCV(ji,jj) * pv(ji  ,jj+1) )
+            
+            ! zu_res(ji,jj)  = pFU(ji,jj) - pAU(ji,jj) * pu(ji-1,jj) - pBU(ji,jj) * pu(ji,jj) - pCU(ji,jj) * pu(ji+1,jj)
+            ! zv_res(ji,jj)  = pFV(ji,jj) - pAV(ji,jj) * pv(ji,jj-1) - pBV(ji,jj) * pv(ji,jj) - pCV(ji,jj) * pv(ji,jj+1)
+            
+            zu_res(ji,jj)  = SQRT( zu_res(ji,jj) * zu_res(ji,jj) ) * umask(ji,jj,1) * pat_iu(ji,jj) * e1e2u(ji,jj) * z1_pglob_area
+            zv_res(ji,jj)  = SQRT( zv_res(ji,jj) * zv_res(ji,jj) ) * vmask(ji,jj,1) * pat_iv(ji,jj) * e1e2v(ji,jj) * z1_pglob_area
+            
          END_2D
          
          ! Global ice-concentration, grid-cell-area weighted mean   
@@ -1602,21 +1612,22 @@ CONTAINS
 
          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
 
-               zu_res(ji,jj)  = ( prhsu(ji,jj) + pDU(ji,jj) * pu(ji,jj-1) + pEU(ji,jj) * pu(ji,jj+1)               &
-                  &             - pAU(ji,jj) * pu(ji-1,jj) - pBU(ji,jj) * pu(ji,jj) - pCU(ji,jj) * pu(ji+1,jj) )
-               zv_res(ji,jj)  = ( prhsv(ji,jj) + pDV(ji,jj) * pv(ji-1,jj) + pEV(ji,jj) * pv(ji+1,jj)               &
-                  &             - pAV(ji,jj) * pv(ji,jj-1) - pBV(ji,jj) * pv(ji,jj) - pCV(ji,jj) * pv(ji,jj+1) )
-
-               zu_res(ji,jj)  = SQRT( zu_res(ji,jj) * zu_res(ji,jj) ) * umask(ji,jj,1) 
-               zv_res(ji,jj)  = SQRT( zv_res(ji,jj) * zv_res(ji,jj) ) * vmask(ji,jj,1) 
-
+            ! (brackets added to fix the order of floating point operations for the North Pole reproducibility
+            zu_res(ji,jj)  = prhsu(ji,jj)             + ( pDU(ji,jj) * pu(ji  ,jj-1) + pEU(ji,jj) * pu(ji  ,jj+1) )   &
+               &             - pBU(ji,jj) * pu(ji,jj) - ( pAU(ji,jj) * pu(ji-1,jj  ) + pCU(ji,jj) * pu(ji+1,jj  ) )
+            zv_res(ji,jj)  = prhsv(ji,jj)             + ( pDV(ji,jj) * pv(ji-1,jj  ) + pEV(ji,jj) * pv(ji+1,jj  ) )   &
+               &             - pBV(ji,jj) * pv(ji,jj) - ( pAV(ji,jj) * pv(ji  ,jj-1) + pCV(ji,jj) * pv(ji  ,jj+1) )
+            
+            zu_res(ji,jj)  = SQRT( zu_res(ji,jj) * zu_res(ji,jj) ) * umask(ji,jj,1) 
+            zv_res(ji,jj)  = SQRT( zv_res(ji,jj) * zv_res(ji,jj) ) * vmask(ji,jj,1) 
+            
          END_2D
          
          IF( nn_hls == 1 )   CALL lbc_lnk( 'icedyn_rhg_cvg_vp', zu_res,  'U',  1., zv_res , 'V',  1. )
 
          DO_2D( 0, 0, 0, 0 ) !clem check bounds
         
-               pvel_res(ji,jj) = 0.25_wp * ( zu_res(ji-1,jj) + zu_res(ji,jj) + zv_res(ji,jj-1) + zv_res(ji,jj) )
+               pvel_res(ji,jj) = 0.25_wp * ( ( zu_res(ji-1,jj) + zu_res(ji,jj) ) + ( zv_res(ji,jj-1) + zv_res(ji,jj) ) )
          
          END_2D
          CALL lbc_lnk( 'icedyn_rhg_cvg_vp', pvel_res, 'T', 1. )
diff --git a/src/ICE/iceistate.F90 b/src/ICE/iceistate.F90
index 97c78314..dfba3873 100644
--- a/src/ICE/iceistate.F90
+++ b/src/ICE/iceistate.F90
@@ -22,10 +22,6 @@ MODULE iceistate
    USE eosbn2         ! equation of state
 # if defined key_qco
    USE domqco         ! Quasi-Eulerian coord.
-# elif defined key_linssh
-   !                  ! Fix in time coord.
-# else
-   USE domvvl         ! Variable volume
 # endif
    USE ice            ! sea-ice: variables
    USE ice1D          ! sea-ice: thermodynamics variables
@@ -37,6 +33,7 @@ MODULE iceistate
    USE lib_mpp        ! MPP library
    USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
    USE fldread        ! read input fields
+   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
 
 # if defined key_agrif
    USE agrif_oce
@@ -113,11 +110,11 @@ CONTAINS
       INTEGER  ::   ji, jj, jk, jl         ! dummy loop indices
       REAL(wp) ::   ztmelts, zsshadj, area
       INTEGER , DIMENSION(4)           ::   itest
-      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d
       REAL(wp), DIMENSION(jpi,jpj)     ::   zswitch    ! ice indicator
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zht_i_ini, zat_i_ini, ztm_s_ini            !data from namelist or nc file
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zt_su_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zapnd_ini, zhpnd_ini, zhlid_ini            !data from namelist or nc file
+      REAL(wp), DIMENSION(A2D(0))      ::   zmsk       ! ice indicator
+      REAL(wp), DIMENSION(A2D(0))      ::   zht_i_ini, zat_i_ini, ztm_s_ini            !data from namelist or nc file
+      REAL(wp), DIMENSION(A2D(0))      ::   zt_su_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file
+      REAL(wp), DIMENSION(A2D(0))      ::   zapnd_ini, zhpnd_ini, zhlid_ini            !data from namelist or nc file
       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zti_3d , zts_3d                            !temporary arrays
       !!
       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zhi_2d, zhs_2d, zai_2d, zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d, zhil_2d
@@ -132,56 +129,62 @@ CONTAINS
       !---------------------------
       !
       ! basal temperature (considered at freezing point)   [Kelvin]
-      CALL eos_fzp( sss_m(:,:), t_bo(:,:) )
-      t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1) 
+      CALL eos_fzp( sss_m(:,:), t_bo(:,:), kbnd=0 )
+      t_bo(:,:) = ( t_bo(:,:) + rt0 ) * smask0(:,:) 
       !
-      ! surface temperature and conductivity
       DO jl = 1, jpl
-         t_su   (:,:,jl) = rt0 * tmask(:,:,1)  ! temp at the surface
-         cnd_ice(:,:,jl) = 0._wp               ! initialisation of the effective conductivity at the top of ice/snow (ln_cndflx=T)
-      END DO
-      !
-      ! ice and snw temperatures
-      DO jl = 1, jpl
-         DO jk = 1, nlay_i
-            t_i(:,:,jk,jl) = rt0 * tmask(:,:,1)
-         END DO
-         DO jk = 1, nlay_s
-            t_s(:,:,jk,jl) = rt0 * tmask(:,:,1)
-         END DO
-      END DO
-      !
-      ! specific temperatures for coupled runs
-      tn_ice (:,:,:) = t_i (:,:,1,:)
-      t1_ice (:,:,:) = t_i (:,:,1,:)
-
-      ! heat contents
-      e_i (:,:,:,:) = 0._wp
-      e_s (:,:,:,:) = 0._wp
-      
-      ! general fields
-      a_i (:,:,:) = 0._wp
-      v_i (:,:,:) = 0._wp
-      v_s (:,:,:) = 0._wp
-      sv_i(:,:,:) = 0._wp
-      oa_i(:,:,:) = 0._wp
-      !
-      h_i (:,:,:) = 0._wp
-      h_s (:,:,:) = 0._wp
-      s_i (:,:,:) = 0._wp
-      o_i (:,:,:) = 0._wp
-      !
-      ! melt ponds
-      a_ip     (:,:,:) = 0._wp
-      v_ip     (:,:,:) = 0._wp
-      v_il     (:,:,:) = 0._wp
-      a_ip_eff (:,:,:) = 0._wp
-      h_ip     (:,:,:) = 0._wp
-      h_il     (:,:,:) = 0._wp
+         ! == reduced arrays == !
+         DO_2D( 0, 0, 0, 0 )
+            !
+            cnd_ice(ji,jj,jl) = 0._wp                  ! conductivity at the ice top
+            !
+            tn_ice(ji,jj,jl) = t_i (ji,jj,1,jl)        ! temp for coupled runs
+            t1_ice(ji,jj,jl) = t_i (ji,jj,1,jl)        ! temp for coupled runs
+            !
+            a_ip_eff(ji,jj,jl) = 0._wp   ! melt pond effective fraction
+         END_2D
+         !
+         ! == full arrays == !
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            !
+            ! heat contents
+            DO jk = 1, nlay_i
+               e_i(ji,jj,jk,jl) = 0._wp
+               t_i(ji,jj,jk,jl) = rt0 * tmask(ji,jj,1) ! ice temp
+            ENDDO
+            DO jk = 1, nlay_s
+               e_s(ji,jj,jk,jl) = 0._wp
+               t_s(ji,jj,jk,jl) = rt0 * tmask(ji,jj,1) ! snw temp
+           ENDDO
+            !
+            ! general fields
+            a_i (ji,jj,jl) = 0._wp
+            v_i (ji,jj,jl) = 0._wp
+            v_s (ji,jj,jl) = 0._wp
+            sv_i(ji,jj,jl) = 0._wp
+            oa_i(ji,jj,jl) = 0._wp
+            h_i (ji,jj,jl) = 0._wp
+            h_s (ji,jj,jl) = 0._wp
+            s_i (ji,jj,jl) = 0._wp
+            o_i (ji,jj,jl) = 0._wp
+            t_su(ji,jj,jl) = rt0 * tmask(ji,jj,1)
+            !
+            ! melt ponds
+            a_ip(ji,jj,jl) = 0._wp
+            v_ip(ji,jj,jl) = 0._wp
+            v_il(ji,jj,jl) = 0._wp
+            h_ip(ji,jj,jl) = 0._wp
+            h_il(ji,jj,jl) = 0._wp
+            !
+         END_2D
+         !
+      ENDDO
       !
       ! ice velocities
-      u_ice (:,:) = 0._wp
-      v_ice (:,:) = 0._wp
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         u_ice(ji,jj) = 0._wp
+         v_ice(ji,jj) = 0._wp
+      END_2D
       !
       !------------------------------------------------------------------------
       ! 2) overwrite some of the fields with namelist parameters or netcdf file
@@ -194,30 +197,30 @@ CONTAINS
             !                             !---------------!
             IF( nn_iceini_file == 1 )THEN ! Read a file   !
                !                          !---------------!
-               WHERE( ff_t(:,:) >= 0._wp )   ;   zswitch(:,:) = 1._wp
-               ELSEWHERE                     ;   zswitch(:,:) = 0._wp
+               WHERE( ff_t(A2D(0)) >= 0._wp )   ;   zmsk(:,:) = 1._wp
+               ELSEWHERE                        ;   zmsk(:,:) = 0._wp
                END WHERE
                !
                CALL fld_read( kt, 1, si ) ! input fields provided at the current time-step
                !
                ! -- mandatory fields -- !
-               zht_i_ini(:,:) = si(jp_hti)%fnow(:,:,1) * tmask(:,:,1)
-               zht_s_ini(:,:) = si(jp_hts)%fnow(:,:,1) * tmask(:,:,1)
-               zat_i_ini(:,:) = si(jp_ati)%fnow(:,:,1) * tmask(:,:,1)
+               zht_i_ini(:,:) = si(jp_hti)%fnow(:,:,1) * smask0(:,:)
+               zht_s_ini(:,:) = si(jp_hts)%fnow(:,:,1) * smask0(:,:)
+               zat_i_ini(:,:) = si(jp_ati)%fnow(:,:,1) * smask0(:,:)
 
                ! -- optional fields -- !
                !    if fields do not exist then set them to the values present in the namelist (except for temperatures)
                !
                ! ice salinity
                IF( TRIM(si(jp_smi)%clrootname) == 'NOT USED' ) &
-                  &     si(jp_smi)%fnow(:,:,1) = ( rn_smi_ini_n * zswitch + rn_smi_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
+                  &     si(jp_smi)%fnow(:,:,1) = ( rn_smi_ini_n * zmsk + rn_smi_ini_s * (1._wp - zmsk) ) * smask0(:,:)
                !
                ! temperatures
                IF    ( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tsu)%clrootname) == 'NOT USED' .AND. &
                   &    TRIM(si(jp_tms)%clrootname) == 'NOT USED' ) THEN
-                  si(jp_tmi)%fnow(:,:,1) = ( rn_tmi_ini_n * zswitch + rn_tmi_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
-                  si(jp_tsu)%fnow(:,:,1) = ( rn_tsu_ini_n * zswitch + rn_tsu_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
-                  si(jp_tms)%fnow(:,:,1) = ( rn_tms_ini_n * zswitch + rn_tms_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
+                  si(jp_tmi)%fnow(:,:,1) = ( rn_tmi_ini_n * zmsk + rn_tmi_ini_s * (1._wp - zmsk) ) * smask0(:,:)
+                  si(jp_tsu)%fnow(:,:,1) = ( rn_tsu_ini_n * zmsk + rn_tsu_ini_s * (1._wp - zmsk) ) * smask0(:,:)
+                  si(jp_tms)%fnow(:,:,1) = ( rn_tms_ini_n * zmsk + rn_tms_ini_s * (1._wp - zmsk) ) * smask0(:,:)
                ENDIF
                IF( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tms)%clrootname) /= 'NOT USED' ) & ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2
                   &     si(jp_tmi)%fnow(:,:,1) = 0.5_wp * ( si(jp_tms)%fnow(:,:,1) + 271.15 )
@@ -234,67 +237,60 @@ CONTAINS
                !
                ! pond concentration
                IF( TRIM(si(jp_apd)%clrootname) == 'NOT USED' ) &
-                  &     si(jp_apd)%fnow(:,:,1) = ( rn_apd_ini_n * zswitch + rn_apd_ini_s * (1._wp - zswitch) ) * tmask(:,:,1) & ! rn_apd = pond fraction => rn_apnd * a_i = pond conc.
+                  &     si(jp_apd)%fnow(:,:,1) = ( rn_apd_ini_n * zmsk + rn_apd_ini_s * (1._wp - zmsk) ) * smask0(:,:) & ! rn_apd = pond fraction => rn_apnd * a_i = pond conc.
                   &                              * si(jp_ati)%fnow(:,:,1) 
                !
                ! pond depth
                IF( TRIM(si(jp_hpd)%clrootname) == 'NOT USED' ) &
-                  &     si(jp_hpd)%fnow(:,:,1) = ( rn_hpd_ini_n * zswitch + rn_hpd_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
+                  &     si(jp_hpd)%fnow(:,:,1) = ( rn_hpd_ini_n * zmsk + rn_hpd_ini_s * (1._wp - zmsk) ) * smask0(:,:)
                !
                ! pond lid depth
                IF( TRIM(si(jp_hld)%clrootname) == 'NOT USED' ) &
-                  &     si(jp_hld)%fnow(:,:,1) = ( rn_hld_ini_n * zswitch + rn_hld_ini_s * (1._wp - zswitch) ) * tmask(:,:,1)
+                  &     si(jp_hld)%fnow(:,:,1) = ( rn_hld_ini_n * zmsk + rn_hld_ini_s * (1._wp - zmsk) ) * smask0(:,:)
                !
-               zsm_i_ini(:,:) = si(jp_smi)%fnow(:,:,1) * tmask(:,:,1)
-               ztm_i_ini(:,:) = si(jp_tmi)%fnow(:,:,1) * tmask(:,:,1)
-               zt_su_ini(:,:) = si(jp_tsu)%fnow(:,:,1) * tmask(:,:,1)
-               ztm_s_ini(:,:) = si(jp_tms)%fnow(:,:,1) * tmask(:,:,1)
-               zapnd_ini(:,:) = si(jp_apd)%fnow(:,:,1) * tmask(:,:,1)
-               zhpnd_ini(:,:) = si(jp_hpd)%fnow(:,:,1) * tmask(:,:,1)
-               zhlid_ini(:,:) = si(jp_hld)%fnow(:,:,1) * tmask(:,:,1)
+               zsm_i_ini(:,:) = si(jp_smi)%fnow(:,:,1) * smask0(:,:)
+               ztm_i_ini(:,:) = si(jp_tmi)%fnow(:,:,1) * smask0(:,:)
+               zt_su_ini(:,:) = si(jp_tsu)%fnow(:,:,1) * smask0(:,:)
+               ztm_s_ini(:,:) = si(jp_tms)%fnow(:,:,1) * smask0(:,:)
+               zapnd_ini(:,:) = si(jp_apd)%fnow(:,:,1) * smask0(:,:)
+               zhpnd_ini(:,:) = si(jp_hpd)%fnow(:,:,1) * smask0(:,:)
+               zhlid_ini(:,:) = si(jp_hld)%fnow(:,:,1) * smask0(:,:)
                !
-               ! change the switch for the following
-               WHERE( zat_i_ini(:,:) > 0._wp )   ;   zswitch(:,:) = tmask(:,:,1) 
-               ELSEWHERE                         ;   zswitch(:,:) = 0._wp
-               END WHERE
-
                !                          !---------------!
             ELSE                          ! Read namelist !
                !                          !---------------!
                ! no ice if (sst - Tfreez) >= thresold
-               WHERE( ( sst_m(:,:) - (t_bo(:,:) - rt0) ) * tmask(:,:,1) >= rn_thres_sst )   ;   zswitch(:,:) = 0._wp 
-               ELSEWHERE                                                                    ;   zswitch(:,:) = tmask(:,:,1)
+               WHERE( ( sst_m(A2D(0)) - (t_bo(:,:) - rt0) ) * smask0(:,:) >= rn_thres_sst )   ;   zmsk(:,:) = 0._wp 
+               ELSEWHERE                                                                      ;   zmsk(:,:) = smask0(:,:)
                END WHERE
                !
                ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array
-               WHERE( ff_t(:,:) >= 0._wp )
-                  zht_i_ini(:,:) = rn_hti_ini_n * zswitch(:,:)
-                  zht_s_ini(:,:) = rn_hts_ini_n * zswitch(:,:)
-                  zat_i_ini(:,:) = rn_ati_ini_n * zswitch(:,:)
-                  zsm_i_ini(:,:) = rn_smi_ini_n * zswitch(:,:)
-                  ztm_i_ini(:,:) = rn_tmi_ini_n * zswitch(:,:)
-                  zt_su_ini(:,:) = rn_tsu_ini_n * zswitch(:,:)
-                  ztm_s_ini(:,:) = rn_tms_ini_n * zswitch(:,:)
-                  zapnd_ini(:,:) = rn_apd_ini_n * zswitch(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc. 
-                  zhpnd_ini(:,:) = rn_hpd_ini_n * zswitch(:,:)
-                  zhlid_ini(:,:) = rn_hld_ini_n * zswitch(:,:)
+               WHERE( ff_t(A2D(0)) >= 0._wp )
+                  zht_i_ini(:,:) = rn_hti_ini_n * zmsk(:,:)
+                  zht_s_ini(:,:) = rn_hts_ini_n * zmsk(:,:)
+                  zat_i_ini(:,:) = rn_ati_ini_n * zmsk(:,:)
+                  zsm_i_ini(:,:) = rn_smi_ini_n * zmsk(:,:)
+                  ztm_i_ini(:,:) = rn_tmi_ini_n * zmsk(:,:)
+                  zt_su_ini(:,:) = rn_tsu_ini_n * zmsk(:,:)
+                  ztm_s_ini(:,:) = rn_tms_ini_n * zmsk(:,:)
+                  zapnd_ini(:,:) = rn_apd_ini_n * zmsk(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc. 
+                  zhpnd_ini(:,:) = rn_hpd_ini_n * zmsk(:,:)
+                  zhlid_ini(:,:) = rn_hld_ini_n * zmsk(:,:)
                ELSEWHERE
-                  zht_i_ini(:,:) = rn_hti_ini_s * zswitch(:,:)
-                  zht_s_ini(:,:) = rn_hts_ini_s * zswitch(:,:)
-                  zat_i_ini(:,:) = rn_ati_ini_s * zswitch(:,:)
-                  zsm_i_ini(:,:) = rn_smi_ini_s * zswitch(:,:)
-                  ztm_i_ini(:,:) = rn_tmi_ini_s * zswitch(:,:)
-                  zt_su_ini(:,:) = rn_tsu_ini_s * zswitch(:,:)
-                  ztm_s_ini(:,:) = rn_tms_ini_s * zswitch(:,:)
-                  zapnd_ini(:,:) = rn_apd_ini_s * zswitch(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc.
-                  zhpnd_ini(:,:) = rn_hpd_ini_s * zswitch(:,:)
-                  zhlid_ini(:,:) = rn_hld_ini_s * zswitch(:,:)
+                  zht_i_ini(:,:) = rn_hti_ini_s * zmsk(:,:)
+                  zht_s_ini(:,:) = rn_hts_ini_s * zmsk(:,:)
+                  zat_i_ini(:,:) = rn_ati_ini_s * zmsk(:,:)
+                  zsm_i_ini(:,:) = rn_smi_ini_s * zmsk(:,:)
+                  ztm_i_ini(:,:) = rn_tmi_ini_s * zmsk(:,:)
+                  zt_su_ini(:,:) = rn_tsu_ini_s * zmsk(:,:)
+                  ztm_s_ini(:,:) = rn_tms_ini_s * zmsk(:,:)
+                  zapnd_ini(:,:) = rn_apd_ini_s * zmsk(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc.
+                  zhpnd_ini(:,:) = rn_hpd_ini_s * zmsk(:,:)
+                  zhlid_ini(:,:) = rn_hld_ini_s * zmsk(:,:)
                END WHERE
                !
             ENDIF
 
-
-
             ! make sure ponds = 0 if no ponds scheme
             IF ( .NOT.ln_pnd ) THEN
                zapnd_ini(:,:) = 0._wp
@@ -311,7 +307,7 @@ CONTAINS
             !----------------!
             ! select ice covered grid points
             npti = 0 ; nptidx(:) = 0
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                IF ( zht_i_ini(ji,jj) > 0._wp ) THEN
                   npti         = npti  + 1
                   nptidx(npti) = (jj - 1) * jpi + ji
@@ -363,6 +359,16 @@ CONTAINS
             DEALLOCATE( zhi_2d, zhs_2d, zai_2d , &
                &        zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d, zhil_2d )
 
+            ! this call is needed because of the calculations above that are done only in the interior
+            CALL lbc_lnk( 'iceistate', a_i   , 'T', 1._wp, h_i   , 'T', 1._wp, h_s , 'T', 1._wp, &
+               &                       zti_3d, 'T', 1._wp, zts_3d, 'T', 1._wp, t_su, 'T', 1._wp, &
+               &                       s_i   , 'T', 1._wp, a_ip  , 'T', 1._wp, h_ip, 'T', 1._wp, h_il, 'T', 1._wp )
+
+            ! switch for the following
+            WHERE( SUM(a_i(:,:,:),dim=3) > 0._wp )   ;   zswitch(:,:) = tmask(:,:,1) 
+            ELSEWHERE                                ;   zswitch(:,:) = 0._wp
+            END WHERE
+            
             ! calculate extensive and intensive variables
             CALL ice_var_salprof ! for sz_i
             DO jl = 1, jpl
@@ -398,15 +404,17 @@ CONTAINS
          ENDIF
 #endif
          ! Melt ponds
-         WHERE( a_i > epsi10 )   ;   a_ip_eff(:,:,:) = a_ip(:,:,:) / a_i(:,:,:)
-         ELSEWHERE               ;   a_ip_eff(:,:,:) = 0._wp
+         WHERE( a_i(A2D(0),:) > epsi10 )   ;   a_ip_eff(:,:,:) = a_ip(A2D(0),:) / a_i(A2D(0),:)
+         ELSEWHERE                         ;   a_ip_eff(:,:,:) = 0._wp
          END WHERE
          v_ip(:,:,:) = h_ip(:,:,:) * a_ip(:,:,:)
          v_il(:,:,:) = h_il(:,:,:) * a_ip(:,:,:)
          
          ! specific temperatures for coupled runs
-         tn_ice(:,:,:) = t_su(:,:,:)
-         t1_ice(:,:,:) = t_i (:,:,1,:)
+         DO_2D( 0, 0, 0, 0 )
+            tn_ice(ji,jj,:) = t_su(ji,jj,:)
+            t1_ice(ji,jj,:) = t_i (ji,jj,1,:)
+         END_2D
          !
          ! ice concentration should not exceed amax
          at_i(:,:) = SUM( a_i, dim=3 )
@@ -456,17 +464,6 @@ CONTAINS
          CALL dom_qco_zgr( Kbb, Kmm )        ! upadte of r3=ssh/h0 ratios
 #elif defined key_linssh
          !                                   ! Fix in time : key_linssh case, set through domzgr_substitute.h90
-#else
-         DO jk = 1, jpk
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls)
-!               IF( snwice_mass(ji,jj) /= 0._wp ) THEN
-                  e3t(ji,jj,jk,Kmm) = e3t_0(ji,jj,jk) * ( 1._wp + ssh(ji,jj,Kmm) * r1_ht_0(ji,jj) * tmask(ji,jj,jk) )
-                  e3t(ji,jj,jk,Kbb) = e3t_0(ji,jj,jk) * ( 1._wp + ssh(ji,jj,Kbb) * r1_ht_0(ji,jj) * tmask(ji,jj,jk) )
-!               ENDIF
-            END_2D
-         END DO
-         !
-         CALL dom_vvl_zgr( Kbb, Kmm, Kaa )   ! interpolation of scale factor, depth and water column
 #endif
       ENDIF
       !
@@ -546,8 +543,8 @@ CONTAINS
          ENDIF
          !
          DO ifpr = 1, jpfldi
-            ALLOCATE( si(ifpr)%fnow(jpi,jpj,1) )
-            IF( slf_i(ifpr)%ln_tint )  ALLOCATE( si(ifpr)%fdta(jpi,jpj,1,2) )
+            ALLOCATE( si(ifpr)%fnow(A2D(0),1) )
+            IF( slf_i(ifpr)%ln_tint )  ALLOCATE( si(ifpr)%fdta(A2D(0),1,2) )
          END DO
          !
          ! fill si with slf_i and control print
diff --git a/src/ICE/iceitd.F90 b/src/ICE/iceitd.F90
index f3e66274..796c0bf0 100644
--- a/src/ICE/iceitd.F90
+++ b/src/ICE/iceitd.F90
@@ -97,10 +97,10 @@ CONTAINS
       !-----------------------------------------------------------------------------------------------
       !  1) Identify grid cells with ice
       !-----------------------------------------------------------------------------------------------
-      at_i(:,:) = SUM( a_i, dim=3 )
+      at_i(A2D(0)) = SUM( a_i(A2D(0),:), dim=3 )
       !
       npti = 0   ;   nptidx(:) = 0
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF ( at_i(ji,jj) > epsi10 ) THEN
             npti = npti + 1
             nptidx( npti ) = (jj - 1) * jpi + ji
@@ -115,10 +115,10 @@ CONTAINS
          zdhice(:,:) = 0._wp
          zhbnew(:,:) = 0._wp
          !
-         CALL tab_3d_2d( npti, nptidx(1:npti), h_i_2d (1:npti,1:jpl), h_i   )
-         CALL tab_3d_2d( npti, nptidx(1:npti), h_ib_2d(1:npti,1:jpl), h_i_b )
-         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i   )
-         CALL tab_3d_2d( npti, nptidx(1:npti), a_ib_2d(1:npti,1:jpl), a_i_b )
+         CALL tab_3d_2d( npti, nptidx(1:npti), h_i_2d (1:npti,:), h_i   )
+         CALL tab_3d_2d( npti, nptidx(1:npti), h_ib_2d(1:npti,:), h_i_b )
+         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,:), a_i   )
+         CALL tab_3d_2d( npti, nptidx(1:npti), a_ib_2d(1:npti,:), a_i_b )
          !
          DO jl = 1, jpl
             ! Compute thickness change in each ice category
@@ -305,28 +305,12 @@ CONTAINS
          ! 6) Shift ice between categories
          !----------------------------------------------------------------------------------------------
          CALL itd_shiftice ( jdonor(1:npti,:), zdaice(1:npti,:), zdvice(1:npti,:) )
-
-         !----------------------------------------------------------------------------------------------
-         ! 7) Make sure h_i >= minimum ice thickness hi_min
-         !----------------------------------------------------------------------------------------------
-         CALL tab_2d_1d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i (:,:,1) )
-         CALL tab_2d_1d( npti, nptidx(1:npti), a_i_1d (1:npti), a_i (:,:,1) )
-         CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_1d(1:npti), a_ip(:,:,1) )
-         !
-         DO ji = 1, npti
-            IF ( a_i_1d(ji) > epsi10 .AND. h_i_1d(ji) < rn_himin ) THEN
-               a_i_1d(ji) = a_i_1d(ji) * h_i_1d(ji) / rn_himin
-               IF( ln_pnd_LEV .OR. ln_pnd_TOPO )   a_ip_1d(ji) = a_ip_1d(ji) * h_i_1d(ji) / rn_himin
-               h_i_1d(ji) = rn_himin
-            ENDIF
-         END DO
-         !
-         CALL tab_1d_2d( npti, nptidx(1:npti), h_i_1d (1:npti), h_i (:,:,1) )
-         CALL tab_1d_2d( npti, nptidx(1:npti), a_i_1d (1:npti), a_i (:,:,1) )
-         CALL tab_1d_2d( npti, nptidx(1:npti), a_ip_1d(1:npti), a_ip(:,:,1) )
          !
       ENDIF
       !
+      ! the following fields need to be updated in the halos (done afterwards):
+      ! a_i, v_i, v_s, sv_i, oa_i, h_i, a_ip, v_ip, v_il, t_su, e_i, e_s
+      !
       IF( ln_icediachk )   CALL ice_cons_hsm(1, 'iceitd_rem', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft)
       IF( ln_icediachk )   CALL ice_cons2D  (1, 'iceitd_rem',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft)
       IF( ln_timing    )   CALL timing_stop ('iceitd_rem')
@@ -411,31 +395,23 @@ CONTAINS
       !
       INTEGER  ::   ji, jl, jk         ! dummy loop indices
       INTEGER  ::   jl2, jl1           ! local integers
-      REAL(wp) ::   ztrans             ! ice/snow transferred
-      REAL(wp), DIMENSION(jpij)            ::   zworka, zworkv   ! workspace
+      REAL(wp) ::   zworka, zworkv, ztrans ! ice/snow transferred
+      REAL(wp), DIMENSION(jpij)            ::   ztmp             ! workspace
       REAL(wp), DIMENSION(jpij,jpl)        ::   zaTsfn           !  -    -
-      REAL(wp), DIMENSION(jpij,nlay_i,jpl) ::   ze_i_2d
-      REAL(wp), DIMENSION(jpij,nlay_s,jpl) ::   ze_s_2d
       !!------------------------------------------------------------------
 
-      CALL tab_3d_2d( npti, nptidx(1:npti), h_i_2d (1:npti,1:jpl), h_i  )
-      CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i  )
-      CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d (1:npti,1:jpl), v_i  )
-      CALL tab_3d_2d( npti, nptidx(1:npti), v_s_2d (1:npti,1:jpl), v_s  )
-      CALL tab_3d_2d( npti, nptidx(1:npti), oa_i_2d(1:npti,1:jpl), oa_i )
-      CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i )
-      CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip )
-      CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip )
-      CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il )
-      CALL tab_3d_2d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su )
-      DO jl = 1, jpl
-         DO jk = 1, nlay_s
-            CALL tab_2d_1d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) )
-         END DO
-         DO jk = 1, nlay_i
-            CALL tab_2d_1d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-         END DO
-      END DO
+      CALL tab_3d_2d( npti, nptidx(1:npti), h_i_2d (1:npti,:)  , h_i  )
+      CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,:)  , a_i  )
+      CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d (1:npti,:)  , v_i  )
+      CALL tab_3d_2d( npti, nptidx(1:npti), v_s_2d (1:npti,:)  , v_s  )
+      CALL tab_3d_2d( npti, nptidx(1:npti), oa_i_2d(1:npti,:)  , oa_i )
+      CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,:)  , sv_i )
+      CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,:)  , a_ip )
+      CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,:)  , v_ip )
+      CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,:)  , v_il )
+      CALL tab_3d_2d( npti, nptidx(1:npti), t_su_2d(1:npti,:)  , t_su )
+      CALL tab_4d_3d( npti, nptidx(1:npti), e_s_2d (1:npti,:,:), e_s  )
+      CALL tab_4d_3d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i  )
       ! to correct roundoff errors on a_i
       CALL tab_2d_1d( npti, nptidx(1:npti), rn_amax_1d(1:npti), rn_amax_2d )
 
@@ -462,11 +438,11 @@ CONTAINS
                ELSE                     ;   jl2 = jl
                ENDIF
                !
-               IF( v_i_2d(ji,jl1) >= epsi10 ) THEN   ;   zworkv(ji) = pdvice(ji,jl) / v_i_2d(ji,jl1)
-               ELSE                                  ;   zworkv(ji) = 0._wp
+               IF( v_i_2d(ji,jl1) >= epsi10 ) THEN   ;   zworkv = pdvice(ji,jl) / v_i_2d(ji,jl1)
+               ELSE                                  ;   zworkv = 0._wp
                ENDIF
-               IF( a_i_2d(ji,jl1) >= epsi10 ) THEN   ;   zworka(ji) = pdaice(ji,jl) / a_i_2d(ji,jl1)
-               ELSE                                  ;   zworka(ji) = 0._wp
+               IF( a_i_2d(ji,jl1) >= epsi10 ) THEN   ;   zworka = pdaice(ji,jl) / a_i_2d(ji,jl1)
+               ELSE                                  ;   zworka = 0._wp
                ENDIF
                !
                a_i_2d(ji,jl1) = a_i_2d(ji,jl1) - pdaice(ji,jl)       ! Ice areas
@@ -475,71 +451,50 @@ CONTAINS
                v_i_2d(ji,jl1) = v_i_2d(ji,jl1) - pdvice(ji,jl)       ! Ice volumes
                v_i_2d(ji,jl2) = v_i_2d(ji,jl2) + pdvice(ji,jl)
                !
-               ztrans         = v_s_2d(ji,jl1) * zworkv(ji)          ! Snow volumes
+               ztrans         = v_s_2d(ji,jl1) * zworkv              ! Snow volumes
                v_s_2d(ji,jl1) = v_s_2d(ji,jl1) - ztrans
                v_s_2d(ji,jl2) = v_s_2d(ji,jl2) + ztrans
                !
-               ztrans          = oa_i_2d(ji,jl1) * zworka(ji)        ! Ice age
+               ztrans          = oa_i_2d(ji,jl1) * zworka            ! Ice age
                oa_i_2d(ji,jl1) = oa_i_2d(ji,jl1) - ztrans
                oa_i_2d(ji,jl2) = oa_i_2d(ji,jl2) + ztrans
                !
-               ztrans          = sv_i_2d(ji,jl1) * zworkv(ji)        ! Ice salinity
+               ztrans          = sv_i_2d(ji,jl1) * zworkv            ! Ice salinity
                sv_i_2d(ji,jl1) = sv_i_2d(ji,jl1) - ztrans
                sv_i_2d(ji,jl2) = sv_i_2d(ji,jl2) + ztrans
                !
-               ztrans          = zaTsfn(ji,jl1) * zworka(ji)         ! Surface temperature
+               ztrans          = zaTsfn(ji,jl1) * zworka             ! Surface temperature
                zaTsfn(ji,jl1)  = zaTsfn(ji,jl1) - ztrans
                zaTsfn(ji,jl2)  = zaTsfn(ji,jl2) + ztrans
                !
                IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN
-                  ztrans          = a_ip_2d(ji,jl1) * zworka(ji)     ! Pond fraction
+                  ztrans          = a_ip_2d(ji,jl1) * zworka         ! Pond fraction
                   a_ip_2d(ji,jl1) = a_ip_2d(ji,jl1) - ztrans
                   a_ip_2d(ji,jl2) = a_ip_2d(ji,jl2) + ztrans
                   !
-                  ztrans          = v_ip_2d(ji,jl1) * zworkv(ji)     ! Pond volume
+                  ztrans          = v_ip_2d(ji,jl1) * zworkv         ! Pond volume
                   v_ip_2d(ji,jl1) = v_ip_2d(ji,jl1) - ztrans
                   v_ip_2d(ji,jl2) = v_ip_2d(ji,jl2) + ztrans
                   !
                   IF ( ln_pnd_lids ) THEN                            ! Pond lid volume
-                     ztrans          = v_il_2d(ji,jl1) * zworkv(ji)
+                     ztrans          = v_il_2d(ji,jl1) * zworkv
                      v_il_2d(ji,jl1) = v_il_2d(ji,jl1) - ztrans
                      v_il_2d(ji,jl2) = v_il_2d(ji,jl2) + ztrans
                   ENDIF
                ENDIF
                !
-            ENDIF   ! jl1 >0
-         END DO
-         !
-         DO jk = 1, nlay_s         !--- Snow heat content
-            DO ji = 1, npti
-               !
-               jl1 = kdonor(ji,jl)
+               DO jk = 1, nlay_s                                     ! Snow heat content
+                  ztrans            = e_s_2d(ji,jk,jl1) * zworkv
+                  e_s_2d(ji,jk,jl1) = e_s_2d(ji,jk,jl1) - ztrans
+                  e_s_2d(ji,jk,jl2) = e_s_2d(ji,jk,jl2) + ztrans
+               ENDDO
+               DO jk = 1, nlay_i                                     ! Ice heat content
+                  ztrans            = e_i_2d(ji,jk,jl1) * zworkv
+                  e_i_2d(ji,jk,jl1) = e_i_2d(ji,jk,jl1) - ztrans
+                  e_i_2d(ji,jk,jl2) = e_i_2d(ji,jk,jl2) + ztrans
+               ENDDO
                !
-               IF( jl1 > 0 ) THEN
-                  IF(jl1 == jl) THEN  ;  jl2 = jl+1
-                  ELSE                ;  jl2 = jl
-                  ENDIF
-                  ztrans             = ze_s_2d(ji,jk,jl1) * zworkv(ji)
-                  ze_s_2d(ji,jk,jl1) = ze_s_2d(ji,jk,jl1) - ztrans
-                  ze_s_2d(ji,jk,jl2) = ze_s_2d(ji,jk,jl2) + ztrans
-               ENDIF
-            END DO
-         END DO
-         !
-         DO jk = 1, nlay_i         !--- Ice heat content
-            DO ji = 1, npti
-               !
-               jl1 = kdonor(ji,jl)
-               !
-               IF( jl1 > 0 ) THEN
-                  IF(jl1 == jl) THEN  ;  jl2 = jl+1
-                  ELSE                ;  jl2 = jl
-                  ENDIF
-                  ztrans             = ze_i_2d(ji,jk,jl1) * zworkv(ji)
-                  ze_i_2d(ji,jk,jl1) = ze_i_2d(ji,jk,jl1) - ztrans
-                  ze_i_2d(ji,jk,jl2) = ze_i_2d(ji,jk,jl2) + ztrans
-               ENDIF
-            END DO
+            ENDIF   ! jl1 >0
          END DO
          !
       END DO                   ! boundaries, 1 to jpl-1
@@ -549,13 +504,13 @@ CONTAINS
       !-------------------
       ! clem: The transfer between one category to another can lead to very small negative values (-1.e-20)
       !       because of truncation error ( i.e. 1. - 1. /= 0 )
-      CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, ze_s_2d, ze_i_2d )
+      CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, e_s_2d, e_i_2d )
 
       ! at_i must be <= rn_amax
-      zworka(1:npti) = SUM( a_i_2d(1:npti,:), dim=2 )
+      ztmp(1:npti) = SUM( a_i_2d(1:npti,:), dim=2 )
       DO jl  = 1, jpl
-         WHERE( zworka(1:npti) > rn_amax_1d(1:npti) )   &
-            &   a_i_2d(1:npti,jl) = a_i_2d(1:npti,jl) * rn_amax_1d(1:npti) / zworka(1:npti)
+         WHERE( ztmp(1:npti) > rn_amax_1d(1:npti) )   &
+            &   a_i_2d(1:npti,jl) = a_i_2d(1:npti,jl) * rn_amax_1d(1:npti) / ztmp(1:npti)
       END DO
 
       !-------------------------------------------------------------------------------
@@ -573,24 +528,18 @@ CONTAINS
          t_su_2d(1:npti,:)  = rt0
       END WHERE
       !
-      CALL tab_2d_3d( npti, nptidx(1:npti), h_i_2d (1:npti,1:jpl), h_i  )
-      CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i  )
-      CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,1:jpl), v_i  )
-      CALL tab_2d_3d( npti, nptidx(1:npti), v_s_2d (1:npti,1:jpl), v_s  )
-      CALL tab_2d_3d( npti, nptidx(1:npti), oa_i_2d(1:npti,1:jpl), oa_i )
-      CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i )
-      CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip )
-      CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip )
-      CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il )
-      CALL tab_2d_3d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su )
-      DO jl = 1, jpl
-         DO jk = 1, nlay_s
-            CALL tab_1d_2d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) )
-         END DO
-         DO jk = 1, nlay_i
-            CALL tab_1d_2d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-         END DO
-      END DO
+      CALL tab_2d_3d( npti, nptidx(1:npti), h_i_2d (1:npti,:)  , h_i  )
+      CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,:)  , a_i  )
+      CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,:)  , v_i  )
+      CALL tab_2d_3d( npti, nptidx(1:npti), v_s_2d (1:npti,:)  , v_s  )
+      CALL tab_2d_3d( npti, nptidx(1:npti), oa_i_2d(1:npti,:)  , oa_i )
+      CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,:)  , sv_i )
+      CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,:)  , a_ip )
+      CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,:)  , v_ip )
+      CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,:)  , v_il )
+      CALL tab_2d_3d( npti, nptidx(1:npti), t_su_2d(1:npti,:)  , t_su )
+      CALL tab_3d_4d( npti, nptidx(1:npti), e_s_2d (1:npti,:,:), e_s  )
+      CALL tab_3d_4d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i  )
       !
    END SUBROUTINE itd_shiftice
 
@@ -626,7 +575,7 @@ CONTAINS
       DO jl = 1, jpl-1        ! identify thicknesses that are too big
          !                    !---------------------------------------
          npti = 0   ;   nptidx(:) = 0
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( a_i(ji,jj,jl) > 0._wp .AND. v_i(ji,jj,jl) > (a_i(ji,jj,jl) * hi_max(jl)) ) THEN
                npti = npti + 1
                nptidx( npti ) = (jj - 1) * jpi + ji
@@ -662,7 +611,7 @@ CONTAINS
       DO jl = jpl-1, 1, -1    ! Identify thicknesses that are too small
          !                    !-----------------------------------------
          npti = 0 ; nptidx(:) = 0
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( a_i(ji,jj,jl+1) > 0._wp .AND. v_i(ji,jj,jl+1) <= (a_i(ji,jj,jl+1) * hi_max(jl)) ) THEN
                npti = npti + 1
                nptidx( npti ) = (jj - 1) * jpi + ji
@@ -687,6 +636,10 @@ CONTAINS
          !
       END DO
       !
+      ! clem: those fields must be updated on the halos: a_i, v_i, v_s, sv_i, oa_i, h_i, t_su, a_ip, v_ip, v_il, e_i, e_s
+      !       note: ice_itd_reb is called in icedyn
+      !             and in icethd (but once the arrays are already updated on the boundaries)
+      !
       IF( ln_icediachk )   CALL ice_cons_hsm(1, 'iceitd_reb', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft)
       IF( ln_icediachk )   CALL ice_cons2D  (1, 'iceitd_reb',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft)
       IF( ln_timing    )   CALL timing_stop ('iceitd_reb')
diff --git a/src/ICE/icerst.F90 b/src/ICE/icerst.F90
index 291ff09c..5fb37070 100644
--- a/src/ICE/icerst.F90
+++ b/src/ICE/icerst.F90
@@ -328,7 +328,7 @@ CONTAINS
          IF( nn_components == jp_iam_sas ) THEN   ! SAS case: ss[st]_m were not initialized by sbc_ssm_init
             !
             IF(lwp) WRITE(numout,*) '  SAS: default initialisation of ss[st]_m arrays used in ice_istate'
-            IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem, Kmm), ts(:,:,1,jp_sal, Kmm) )
+            IF( l_useCT )  THEN    ;   CALL eos_pt_from_ct( ts(:,:,1,jp_tem, Kmm), ts(:,:,1,jp_sal, Kmm), sst_m(:,:) )
             ELSE                   ;   sst_m(:,:) = ts(:,:,1,jp_tem, Kmm)
             ENDIF
             sss_m(:,:) = ts(:,:,1,jp_sal, Kmm)
diff --git a/src/ICE/icesbc.F90 b/src/ICE/icesbc.F90
index 81915405..2e8baf6b 100644
--- a/src/ICE/icesbc.F90
+++ b/src/ICE/icesbc.F90
@@ -58,7 +58,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   utau_ice, vtau_ice   ! air-ice stress   [N/m2]
       !!
       INTEGER  ::   ji, jj                 ! dummy loop index
-      REAL(wp), DIMENSION(jpi,jpj) ::   zutau_ice, zvtau_ice
+      REAL(wp), DIMENSION(A2D(0)) ::   zutau_ice, zvtau_ice
       !!-------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('icesbc')
@@ -70,25 +70,38 @@ CONTAINS
       ENDIF
       !
       SELECT CASE( ksbc )
-         CASE( jp_usr     )   ;    CALL usrdef_sbc_ice_tau( kt )                 ! user defined formulation
-      CASE( jp_blk     )
-         CALL blk_ice_1( sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1),   &
-            &                                      theta_air_zt(:,:), q_air_zt(:,:),   &   ! #LB: known from "sbc_oce" module...
-            &                                      sf(jp_slp )%fnow(:,:,1), u_ice, v_ice, tm_su    ,   &   ! inputs
-            &                                      putaui = utau_ice, pvtaui = vtau_ice            )       ! outputs
- !        CASE( jp_abl     )    utau_ice & vtau_ice are computed in ablmod
-         CASE( jp_purecpl )   ;    CALL sbc_cpl_ice_tau( utau_ice , vtau_ice )   ! Coupled      formulation
+         !
+      CASE( jp_usr     )                 !--- User defined formulation
+         !
+         CALL usrdef_sbc_ice_tau( kt )
+         !
+      CASE( jp_blk     )                 !--- Forced formulation
+         !
+         CALL blk_ice_1( sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1), theta_air_zt(:,:), q_air_zt(:,:), & ! <<== in
+            &            sf(jp_slp )%fnow(:,:,1), tm_su(:,:),                                                & ! <<== in
+            &            putaui=utau_ice(A2D(0)), pvtaui=vtau_ice(A2D(0)) )                                    ! ==>> out
+         !
+         !CASE( jp_abl    )              !--- ABL formulation (utau_ice & vtau_ice are computed in ablmod)
+         !
+      CASE( jp_purecpl )                 !--- Coupled formulation
+         !
+         CALL sbc_cpl_ice_tau( utau_ice(A2D(0)) , vtau_ice(A2D(0)) )
+         !
       END SELECT
       !
-      IF( ln_mixcpl) THEN                                                        ! Case of a mixed Bulk/Coupled formulation
-                                   CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice )
+      IF( ln_mixcpl) THEN                !--- Case of a mixed Bulk/Coupled formulation
+         !
+         CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice )
+         !
          DO_2D( 0, 0, 0, 0 )
             utau_ice(ji,jj) = utau_ice(ji,jj) * xcplmask(ji,jj,0) + zutau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) )
             vtau_ice(ji,jj) = vtau_ice(ji,jj) * xcplmask(ji,jj,0) + zvtau_ice(ji,jj) * ( 1. - xcplmask(ji,jj,0) )
          END_2D
-         CALL lbc_lnk( 'icesbc', utau_ice, 'U', -1.0_wp, vtau_ice, 'V', -1.0_wp )
+         !
       ENDIF
       !
+      CALL lbc_lnk( 'icesbc', utau_ice, 'T', -1.0_wp, vtau_ice, 'T', -1.0_wp )
+      !
       IF( ln_timing )   CALL timing_stop('icesbc')
       !
    END SUBROUTINE ice_sbc_tau
@@ -129,26 +142,49 @@ CONTAINS
          WRITE(numout,*)'~~~~~~~~~~~~~~~'
       ENDIF
       !                     !== ice albedo ==!
-      CALL ice_alb( t_su, h_i, h_s, ln_pnd_alb, a_ip_eff, h_ip, cloud_fra, alb_ice )
+      CALL ice_alb( ln_pnd_alb, t_su(A2D(0),:), h_i(A2D(0),:), h_s(A2D(0),:), a_ip_eff(:,:,:), h_ip(A2D(0),:), cloud_fra(:,:), & ! <<== in
+         &                                                                                                      alb_ice(:,:,:) ) ! ==>> out
       !
       SELECT CASE( ksbc )   !== fluxes over sea ice ==!
       !
       CASE( jp_usr )              !--- user defined formulation
+         !
                                   CALL usrdef_sbc_ice_flx( kt, h_s, h_i )
+         !
       CASE( jp_blk, jp_abl )      !--- bulk formulation & ABL formulation
-                                  CALL blk_ice_2    ( t_su, h_s, h_i, alb_ice, &
-            &                                         theta_air_zt(:,:), q_air_zt(:,:),    &   ! #LB: known from "sbc_oce" module...
-            &                                         sf(jp_slp)%fnow(:,:,1), sf(jp_qlw)%fnow(:,:,1), &
-            &                                         sf(jp_prec)%fnow(:,:,1), sf(jp_snow)%fnow(:,:,1) )
-         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
-         IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
+         !
+                                  CALL blk_ice_2( t_su(A2D(0),:), h_s(A2D(0),:), h_i(A2D(0),:),       &   ! <<== in 
+                                     &            alb_ice(:,:,:), theta_air_zt(:,:), q_air_zt(:,:),   &   ! <<== in
+                                     &            sf(jp_slp)%fnow(:,:,1), sf(jp_qlw)%fnow(:,:,1),     &   ! <<== in
+                                     &            sf(jp_prec)%fnow(:,:,1), sf(jp_snow)%fnow(:,:,1) )      ! <<== in
+                                  !
+         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( kt, picefr=at_i_b(:,:), palbi=alb_ice(:,:,:), &
+                                     &                      psst=sst_m(A2D(0)), pist=t_su(A2D(0),:),  &
+                                     &                      phs=h_s(A2D(0),:), phi=h_i(A2D(0),:) )
+         !
+         IF( nn_flxdist /= -1 )   CALL ice_flx_dist( nn_flxdist, at_i(A2D(0)), a_i(A2D(0),:), t_su(A2D(0),:), alb_ice(:,:,:), &   ! <<== in
+            &                                                    qns_ice(:,:,:), qsr_ice(:,:,:), dqns_ice(:,:,:),             &   ! ==>> inout
+            &                                                    evap_ice(:,:,:), devap_ice(:,:,:) )                              ! ==>> inout
+         !
          !                        !    compute conduction flux and surface temperature (as in Jules surface module)
-         IF( ln_cndflx .AND. .NOT.ln_cndemulate ) &
-            &                     CALL blk_ice_qcn    ( ln_virtual_itd, t_su, t_bo, h_s, h_i )
+         IF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN
+                                  CALL blk_ice_qcn( ln_virtual_itd, t_bo(:,:), h_s(A2D(0),:), h_i(A2D(0),:), &   ! <<== in
+                                     &                              qcn_ice(:,:,:), qml_ice(:,:,:),          &   ! ==>> out
+                                     &                              qns_ice(:,:,:), t_su(A2D(0),:) )             ! ==>> inout
+         ENDIF
+         !
       CASE ( jp_purecpl )         !--- coupled formulation
-                                  CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
-         IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
+         !
+                                  CALL sbc_cpl_ice_flx( kt, picefr=at_i_b(:,:), palbi=alb_ice(:,:,:), psst=sst_m(A2D(0)), &
+                                     &                      pist=t_su(A2D(0),:), phs=h_s(A2D(0),:), phi=h_i(A2D(0),:) )
+                                  !
+         IF( nn_flxdist /= -1 )   CALL ice_flx_dist( nn_flxdist, at_i(A2D(0)), a_i(A2D(0),:), t_su(A2D(0),:), alb_ice(:,:,:), &   ! <<== in
+            &                                                    qns_ice(:,:,:), qsr_ice(:,:,:), dqns_ice(:,:,:),             &   ! ==>> inout
+            &                                                    evap_ice(:,:,:), devap_ice(:,:,:) )                              ! ==>> inout
+         !
       END SELECT
+!!$      CALL lbc_lnk( 'icesbc', t_su, 'T', 1.0_wp ) ! clem: t_su is needed for Met-Office only => necessary?
+      !
       !                     !== some fluxes at the ice-ocean interface and in the leads
       CALL ice_flx_other
       !
@@ -157,7 +193,8 @@ CONTAINS
    END SUBROUTINE ice_sbc_flx
 
 
-   SUBROUTINE ice_flx_dist( ptn_ice, palb_ice, pqns_ice, pqsr_ice, pdqn_ice, pevap_ice, pdevap_ice, k_flxdist )
+   SUBROUTINE ice_flx_dist( k_flxdist, pat_i, pa_i, ptn_ice, palb_ice, &
+      &                                pqns_ice, pqsr_ice, pdqn_ice, pevap_ice, pdevap_ice )
       !!-------------------------------------------------------------------
       !!                  ***  ROUTINE ice_flx_dist  ***
       !!
@@ -173,18 +210,20 @@ CONTAINS
       !!                                                 using T-ice and albedo sensitivity
       !!                =  2  Redistribute a single flux over categories
       !!-------------------------------------------------------------------
-      INTEGER                   , INTENT(in   ) ::   k_flxdist  ! redistributor
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ptn_ice    ! ice surface temperature
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb_ice   ! ice albedo
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqns_ice   ! non solar flux
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqsr_ice   ! net solar flux
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdqn_ice   ! non solar flux sensitivity
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pevap_ice  ! sublimation
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdevap_ice ! sublimation sensitivity
+      INTEGER                        , INTENT(in   ) ::   k_flxdist  ! redistributor
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in   ) ::   pat_i      ! ice concentration
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   pa_i       ! ice concentration
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   ptn_ice    ! ice surface temperature
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   palb_ice   ! ice albedo
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pqns_ice   ! non solar flux
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pqsr_ice   ! net solar flux
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pdqn_ice   ! non solar flux sensitivity
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pevap_ice  ! sublimation
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pdevap_ice ! sublimation sensitivity
       !
       INTEGER  ::   jl      ! dummy loop index
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   z1_at_i   ! inverse of concentration
+      REAL(wp), DIMENSION(A2D(0)) ::   z1_at_i   ! inverse of concentration
       !
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   z_qsr_m   ! Mean solar heat flux over all categories
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   z_qns_m   ! Mean non solar heat flux over all categories
@@ -195,7 +234,7 @@ CONTAINS
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   ztem_m    ! Mean temperature over all categories
       !!----------------------------------------------------------------------
       !
-      WHERE ( at_i (:,:) > 0._wp )   ; z1_at_i(:,:) = 1._wp / at_i (:,:)
+      WHERE ( pat_i(:,:) > 0._wp )   ; z1_at_i(:,:) = 1._wp / pat_i(:,:)
       ELSEWHERE                      ; z1_at_i(:,:) = 0._wp
       END WHERE
 
@@ -203,13 +242,13 @@ CONTAINS
       !
       CASE( 0 , 1 )
          !
-         ALLOCATE( z_qns_m(jpi,jpj), z_qsr_m(jpi,jpj), z_dqn_m(jpi,jpj), z_evap_m(jpi,jpj), z_devap_m(jpi,jpj) )
+         ALLOCATE( z_qns_m(A2D(0)), z_qsr_m(A2D(0)), z_dqn_m(A2D(0)), z_evap_m(A2D(0)), z_devap_m(A2D(0)) )
          !
-         z_qns_m  (:,:) = SUM( a_i(:,:,:) * pqns_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
-         z_qsr_m  (:,:) = SUM( a_i(:,:,:) * pqsr_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
-         z_dqn_m  (:,:) = SUM( a_i(:,:,:) * pdqn_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
-         z_evap_m (:,:) = SUM( a_i(:,:,:) * pevap_ice (:,:,:) , dim=3 ) * z1_at_i(:,:)
-         z_devap_m(:,:) = SUM( a_i(:,:,:) * pdevap_ice(:,:,:) , dim=3 ) * z1_at_i(:,:)
+         z_qns_m  (:,:) = SUM( pa_i(:,:,:) * pqns_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
+         z_qsr_m  (:,:) = SUM( pa_i(:,:,:) * pqsr_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
+         z_dqn_m  (:,:) = SUM( pa_i(:,:,:) * pdqn_ice  (:,:,:) , dim=3 ) * z1_at_i(:,:)
+         z_evap_m (:,:) = SUM( pa_i(:,:,:) * pevap_ice (:,:,:) , dim=3 ) * z1_at_i(:,:)
+         z_devap_m(:,:) = SUM( pa_i(:,:,:) * pdevap_ice(:,:,:) , dim=3 ) * z1_at_i(:,:)
          DO jl = 1, jpl
             pqns_ice  (:,:,jl) = z_qns_m (:,:)
             pqsr_ice  (:,:,jl) = z_qsr_m (:,:)
@@ -226,10 +265,10 @@ CONTAINS
       !
       CASE( 1 , 2 )
          !
-         ALLOCATE( zalb_m(jpi,jpj), ztem_m(jpi,jpj) )
+         ALLOCATE( zalb_m(A2D(0)), ztem_m(A2D(0)) )
          !
-         zalb_m(:,:) = SUM( a_i(:,:,:) * palb_ice(:,:,:) , dim=3 ) * z1_at_i(:,:)
-         ztem_m(:,:) = SUM( a_i(:,:,:) * ptn_ice (:,:,:) , dim=3 ) * z1_at_i(:,:)
+         zalb_m(:,:) = SUM( pa_i(:,:,:) * palb_ice(:,:,:) , dim=3 ) * z1_at_i(:,:)
+         ztem_m(:,:) = SUM( pa_i(:,:,:) * ptn_ice (:,:,:) , dim=3 ) * z1_at_i(:,:)
          DO jl = 1, jpl
             pqns_ice (:,:,jl) = pqns_ice (:,:,jl) + pdqn_ice  (:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) )
             pevap_ice(:,:,jl) = pevap_ice(:,:,jl) + pdevap_ice(:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) )
@@ -255,9 +294,10 @@ CONTAINS
       !!-----------------------------------------------------------------------
       INTEGER  ::   ji, jj             ! dummy loop indices
       REAL(wp) ::   zfric_u, zqld, zqfr, zqfr_neg, zqfr_pos, zu_io, zv_io, zu_iom1, zv_iom1
+      REAL(wp) ::   zswitch
       REAL(wp), PARAMETER ::   zfric_umin = 0._wp       ! lower bound for the friction velocity (cice value=5.e-04)
       REAL(wp), PARAMETER ::   zch        = 0.0057_wp   ! heat transfer coefficient
-      REAL(wp), DIMENSION(jpi,jpj) ::  zfric, zvel      ! ice-ocean velocity (m/s) and frictional velocity (m2/s2)
+      REAL(wp), DIMENSION(A2D(0)) ::  zfric, zvel       ! ice-ocean velocity (m/s) and frictional velocity (m2/s2)
       !!-----------------------------------------------------------------------
       !
       ! computation of friction velocity at T points
@@ -268,47 +308,47 @@ CONTAINS
             zv_io   = v_ice(ji  ,jj  ) - ssv_m(ji  ,jj  )
             zv_iom1 = v_ice(ji  ,jj-1) - ssv_m(ji  ,jj-1)
             !
-            zfric(ji,jj) = rn_cio * ( 0.5_wp * ( zu_io*zu_io + zu_iom1*zu_iom1 + zv_io*zv_io + zv_iom1*zv_iom1 ) ) * tmask(ji,jj,1)
+            zfric(ji,jj) = rn_cio * ( 0.5_wp * (  ( zu_io*zu_io + zu_iom1*zu_iom1 )   &   ! add () for NP repro
+               &                                + ( zv_io*zv_io + zv_iom1*zv_iom1 ) ) ) * smask0(ji,jj)
             zvel (ji,jj) = 0.5_wp * SQRT( ( u_ice(ji-1,jj  ) + u_ice(ji,jj) ) * ( u_ice(ji-1,jj  ) + u_ice(ji,jj) ) + &
                &                          ( v_ice(ji  ,jj-1) + v_ice(ji,jj) ) * ( v_ice(ji  ,jj-1) + v_ice(ji,jj) ) )
          END_2D
       ELSE      !  if no ice dynamics => transfer directly the atmospheric stress to the ocean
          DO_2D( 0, 0, 0, 0 )
-            zfric(ji,jj) = r1_rho0 * SQRT( 0.5_wp *  &
-               &                         (  utau(ji,jj) * utau(ji,jj) + utau(ji-1,jj) * utau(ji-1,jj)   &
-               &                          + vtau(ji,jj) * vtau(ji,jj) + vtau(ji,jj-1) * vtau(ji,jj-1) ) ) * tmask(ji,jj,1)
-            zvel(ji,jj) = 0._wp
+            zfric(ji,jj) = r1_rho0 * SQRT( utau(ji,jj)*utau(ji,jj) + vtau(ji,jj)*vtau(ji,jj) ) * smask0(ji,jj)
+            zvel (ji,jj) = 0._wp
          END_2D
       ENDIF
-      CALL lbc_lnk( 'icesbc', zfric, 'T',  1.0_wp, zvel, 'T', 1.0_wp )
       !
       !--------------------------------------------------------------------!
       ! Partial computation of forcing for the thermodynamic sea ice model
       !--------------------------------------------------------------------!
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! needed for qlead
-         rswitch  = tmask(ji,jj,1) * MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) ) ! 0 if no ice
+      DO_2D( 0, 0, 0, 0 )   ! needed for qlead
+         IF( at_i(ji,jj) >= epsi10 ) THEN ; zswitch = smask0(ji,jj)
+         ELSE                             ; zswitch = 0._wp
+         ENDIF
          !
          ! --- Energy received in the lead from atm-oce exchanges, zqld is defined everywhere (J.m-2) --- !
-         zqld =  tmask(ji,jj,1) * rDt_ice *  &
+         zqld =  smask0(ji,jj) * rDt_ice *  &
             &    ( ( 1._wp - at_i_b(ji,jj) ) * qsr_oce(ji,jj) * frq_m(ji,jj) +  &
             &      ( 1._wp - at_i_b(ji,jj) ) * qns_oce(ji,jj) + qemp_oce(ji,jj) )
 
          ! --- Energy needed to bring ocean surface layer until its freezing, zqfr is defined everywhere (J.m-2) --- !
          !     (mostly<0 but >0 if supercooling)
-         zqfr     = rho0 * rcp * e3t_m(ji,jj) * ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) * tmask(ji,jj,1)  ! both < 0 (t_bo < sst) and > 0 (t_bo > sst)
-         zqfr_neg = MIN( zqfr , 0._wp )                                                                    ! only < 0
-         zqfr_pos = MAX( zqfr , 0._wp )                                                                    ! only > 0
+         zqfr     = rho0 * rcp * e3t_m(ji,jj) * ( t_bo(ji,jj) - ( sst_m(ji,jj) + rt0 ) ) * smask0(ji,jj)  ! both < 0 (t_bo < sst) and > 0 (t_bo > sst)
+         zqfr_neg = MIN( zqfr , 0._wp )                                                                   ! only < 0
+         zqfr_pos = MAX( zqfr , 0._wp )                                                                   ! only > 0
 
          ! --- Sensible ocean-to-ice heat flux (W/m2) --- !
          !     (mostly>0 but <0 if supercooling)
          zfric_u            = MAX( SQRT( zfric(ji,jj) ), zfric_umin )
-         qsb_ice_bot(ji,jj) = rswitch * rho0 * rcp * zch * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) )
+         qsb_ice_bot(ji,jj) = zswitch * rho0 * rcp * zch * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) )
 
          ! upper bound for qsb_ice_bot: the heat retrieved from the ocean must be smaller than the heat necessary to reach
          !                              the freezing point, so that we do not have SST < T_freeze
          !                              This implies: qsb_ice_bot(ji,jj) * at_i(ji,jj) * rtdice <= - zqfr_neg
          !                              The following formulation is ok for both normal conditions and supercooling
-         qsb_ice_bot(ji,jj) = rswitch * MIN( qsb_ice_bot(ji,jj), - zqfr_neg * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) )
+         qsb_ice_bot(ji,jj) = zswitch * MIN( qsb_ice_bot(ji,jj), - zqfr_neg * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) )
 
          ! If conditions are always supercooled (such as at the mouth of ice-shelves), then ice grows continuously
          ! ==> stop ice formation by artificially setting up the turbulent fluxes to 0 when volume > 20m (arbitrary)
@@ -327,7 +367,7 @@ CONTAINS
             !                        but we have to make sure that this heat will not make the sst drop below the freezing point
             !                        so the max heat that can be pulled out of the ocean is zqld - qsb - zqfr_pos
             !                        The following formulation is ok for both normal conditions and supercooling
-            fhld (ji,jj) = rswitch * MAX( 0._wp, ( zqld - zqfr_pos ) * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) &  ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90
+            fhld (ji,jj) = zswitch * MAX( 0._wp, ( zqld - zqfr_pos ) * r1_Dt_ice / MAX( at_i(ji,jj), epsi10 ) &  ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90
                &                                 - qsb_ice_bot(ji,jj) )
             qlead(ji,jj) = 0._wp
          ELSE
diff --git a/src/ICE/icestp.F90 b/src/ICE/icestp.F90
index 070052db..5b407417 100644
--- a/src/ICE/icestp.F90
+++ b/src/ICE/icestp.F90
@@ -109,7 +109,7 @@ CONTAINS
       !!              - save the outputs
       !!              - save the outputs for restart when necessary
       !!
-      !! ** Action  : - time evolution of the LIM sea-ice model
+      !! ** Action  : - time evolution of the SI3 sea-ice model
       !!              - update all sbc variables below sea-ice:
       !!                utau, vtau, taum, wndm, qns , qsr, emp , sfx
       !!---------------------------------------------------------------------
@@ -117,25 +117,27 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kbb, Kmm ! ocean time level indices
       INTEGER, INTENT(in) ::   ksbc     ! flux formulation (user defined, bulk, or Pure Coupled)
       !
-      INTEGER ::   jl   ! dummy loop index
+      INTEGER ::   ji, jj, jl   ! dummy loop index
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('icestp')
       !
-      !                                      !-----------------------!
-      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN   ! --- Ice time step --- !
-         !                                   !-----------------------!
+      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN   ! Ice time step
          !
-         kt_ice = kt                              ! -- Ice model time step
+         kt_ice = kt                                                  ! Ice model time step
          !
-         u_oce(:,:) = ssu_m(:,:)                  ! -- mean surface ocean current
-         v_oce(:,:) = ssv_m(:,:)
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                      ! mean surface ocean current
+            u_oce(ji,jj) = ssu_m(ji,jj)
+            v_oce(ji,jj) = ssv_m(ji,jj)
+         END_2D
          !
-         CALL eos_fzp( sss_m(:,:) , t_bo(:,:) )   ! -- freezing temperature [Kelvin] (set to rt0 over land)
-         t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) )
+         CALL eos_fzp( sss_m(:,:), t_bo(:,:), kbnd=0 )                    ! freezing temperature [Kelvin] (set to rt0 over land)
+         t_bo(:,:) = ( t_bo(:,:) + rt0 ) * smask0(:,:) + rt0 * ( 1._wp - smask0(:,:) )
          !
-         !                          !==  AGRIF Parent to Child  ==!
 #if defined key_agrif
+         !-------------------------------!
+         ! --- AGRIF Parent to Child --- !
+         !-------------------------------!
          !                              ! nbstep_ice ranges from 1 to the nb of child ocean steps inside one parent ice step
          IF( .NOT. Agrif_Root() )       nbstep_ice = MOD( nbstep_ice, Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) + 1
          !                              ! these calls must remain here for restartability purposes
@@ -148,54 +150,66 @@ CONTAINS
          !------------------------------------------------!
          ! --- Dynamical coupling with the atmosphere --- !
          !------------------------------------------------!
-         ! It provides the following fields used in sea ice model:
-         !    utau_ice, vtau_ice = surface ice stress [N/m2]
-         !------------------------------------------------!
+                                        ! surface ice stress (utau_ice, vtau_ice) [N/m2]
                                         CALL ice_sbc_tau( kt, ksbc, utau_ice, vtau_ice )
+         !
          !-------------------------------------!
-         ! --- ice dynamics and advection  --- !
+         ! --- Ice dynamics and advection  --- !
          !-------------------------------------!
                                         CALL diag_set0                ! set diag of mass, heat and salt fluxes to 0
                                         CALL ice_rst_opn( kt )        ! Open Ice restart file (if necessary)
          !
          IF( ln_icedyn .AND. .NOT.ln_c1d )   &
             &                           CALL ice_dyn( kt, Kmm )       ! -- Ice dynamics
-         !
+         ! ==> clem: here, all the global variables are correctly defined in the halos
+         !         
                                         CALL diag_trends( 1 )         ! record dyn trends
          !
-         !                          !==  lateral boundary conditions  ==!
+         !-----------------------------!
+         ! --- Thermodynamics BDY  --- !
+         !-----------------------------!
          IF( ln_icethd .AND. ln_bdy )   CALL bdy_ice( kt )            ! -- bdy ice thermo
+         ! ==> clem: here, all the global variables are correctly defined in the halos
          !
-         !                          !==  previous lead fraction and ice volume for flux calculations
-                                        CALL ice_var_glo2eqv          ! h_i and h_s for ice albedo calculation
+         !-------------------------------------------------!
+         ! --- Change from global to equivalent arrays --- !
+         !-------------------------------------------------!
+                                        CALL ice_var_glo2eqv(2)       ! h_i and h_s for ice albedo calculation
                                         CALL ice_var_agg(1)           ! at_i for coupling
                                         CALL store_fields             ! Store now ice values
          !
          !------------------------------------------------------!
          ! --- Thermodynamical coupling with the atmosphere --- !
          !------------------------------------------------------!
-         ! It provides the following fields used in sea ice model:
-         !    emp_oce , emp_ice    = E-P over ocean and sea ice                    [Kg/m2/s]
-         !    sprecip              = solid precipitation                           [Kg/m2/s]
-         !    evap_ice             = sublimation                                   [Kg/m2/s]
-         !    qsr_tot , qns_tot    = solar & non solar heat flux (total)           [W/m2]
-         !    qsr_ice , qns_ice    = solar & non solar heat flux over ice          [W/m2]
-         !    dqns_ice             = non solar  heat sensistivity                  [W/m2]
-         !    qemp_oce, qemp_ice,  = sensible heat (associated with evap & precip) [W/m2]
-         !    qprec_ice, qevap_ice
-         !------------------------------------------------------!
+                                        ! It provides the following fields used in sea ice model:
+                                        !    emp_oce , emp_ice    = E-P over ocean and sea ice                    [Kg/m2/s]
+                                        !    sprecip , tprecip    = solid and total precipitation                 [Kg/m2/s]
+                                        !    evap_ice, devap_ice  = sublimation and sensitivity                   [Kg/m2/s ; Kg/m2/s/K]
+                                        !    qsr_tot , qns_tot    = solar & non solar heat flux (total)           [W/m2]
+                                        !    qsr_ice , qns_ice    = solar & non solar heat flux over ice          [W/m2]
+                                        !    dqns_ice             = non solar heat sensistivity                   [W/m2/K]
+                                        !    qemp_oce, qemp_ice,
+                                        !    qprec_ice, qevap_ice = sensible heat associated with mass exchange   [W/m2]
+                                        !    qla_ice, dqla_ice    = latent heat and sensitivity                   [W/m2 ; W/m2/K]
+                                        !    qtr_ice_top          = solar heat transmitted thru the ice/snow ssl  [W/m2]
+                                        !------------------------------------------------------!
                                         CALL ice_sbc_flx( kt, ksbc )
+         !
          !----------------------------!
          ! --- ice thermodynamics --- !
          !----------------------------!
          IF( ln_icethd )                CALL ice_thd( kt )            ! -- Ice thermodynamics
+         ! ==> clem: here, all the global variables are correctly defined in the halos
          !
-                                        CALL diag_trends( 2 )         ! record thermo trends
-                                        CALL ice_var_glo2eqv          ! necessary calls (at least for coupling)
-                                        CALL ice_var_agg( 2 )         ! necessary calls (at least for coupling)
+                                        CALL diag_trends(2)           ! record thermo trends
+                                        CALL ice_var_glo2eqv(2)
+                                        CALL ice_var_agg(2)
          !
                                         CALL ice_update_flx( kt )     ! -- Update ocean surface mass, heat and salt fluxes
          !
+         !------------------------!
+         ! --- Diag and write --- !
+         !------------------------!
          IF( ln_icediahsb )             CALL ice_dia( kt )            ! -- Diagnostics outputs
          !
          IF( ln_icediachk )             CALL ice_drift_wri( kt )      ! -- Diagnostics outputs for conservation
@@ -274,7 +288,7 @@ CONTAINS
       ELSE
          CALL ice_istate( nit000, Kbb, Kmm, Kaa )   ! start from rest or read a file
       ENDIF
-      CALL ice_var_glo2eqv
+      CALL ice_var_glo2eqv(1)
       CALL ice_var_agg(1)
       !
       CALL ice_dyn_init                ! set ice dynamics parameters
@@ -288,7 +302,7 @@ CONTAINS
       CALL ice_drift_init              ! initialization for diags of conservation
       !
       fr_i  (:,:)   = at_i(:,:)        ! initialisation of sea-ice fraction
-      tn_ice(:,:,:) = t_su(:,:,:)      ! initialisation of surface temp for coupled simu
+      tn_ice(:,:,:) = t_su(A2D(0),:)   ! initialisation of surface temp for coupled simu
       !
       IF( ln_rstart )  THEN
          CALL iom_close( numrir )  ! close input ice restart file
@@ -369,26 +383,33 @@ CONTAINS
       INTEGER  ::   ji, jj, jl      ! dummy loop index
       !!----------------------------------------------------------------------
       !
-      a_i_b (:,:,:)   = a_i (:,:,:)     ! ice area
-      v_i_b (:,:,:)   = v_i (:,:,:)     ! ice volume
-      v_s_b (:,:,:)   = v_s (:,:,:)     ! snow volume
-      v_ip_b(:,:,:)   = v_ip(:,:,:)     ! pond volume
-      v_il_b(:,:,:)   = v_il(:,:,:)     ! pond lid volume
-      sv_i_b(:,:,:)   = sv_i(:,:,:)     ! salt content
-      e_s_b (:,:,:,:) = e_s (:,:,:,:)   ! snow thermal energy
-      e_i_b (:,:,:,:) = e_i (:,:,:,:)   ! ice thermal energy
-      WHERE( a_i_b(:,:,:) >= epsi20 )
-         h_i_b(:,:,:) = v_i_b(:,:,:) / a_i_b(:,:,:)   ! ice thickness
-         h_s_b(:,:,:) = v_s_b(:,:,:) / a_i_b(:,:,:)   ! snw thickness
-      ELSEWHERE
-         h_i_b(:,:,:) = 0._wp
-         h_s_b(:,:,:) = 0._wp
-      END WHERE
-      !
-      ! ice velocities & total concentration
+      DO jl = 1, jpl
+         DO_2D( 0, 0, 0, 0 )
+            a_i_b (ji,jj,jl)   = a_i (ji,jj,jl)     ! ice area
+            v_i_b (ji,jj,jl)   = v_i (ji,jj,jl)     ! ice volume
+            v_s_b (ji,jj,jl)   = v_s (ji,jj,jl)     ! snow volume
+            v_ip_b(ji,jj,jl)   = v_ip(ji,jj,jl)     ! pond volume
+            v_il_b(ji,jj,jl)   = v_il(ji,jj,jl)     ! pond lid volume
+            sv_i_b(ji,jj,jl)   = sv_i(ji,jj,jl)     ! salt content
+            IF( a_i_b(ji,jj,jl) >= epsi20 ) THEN
+               h_i_b(ji,jj,jl) = v_i_b(ji,jj,jl) / a_i_b(ji,jj,jl)   ! ice thickness
+               h_s_b(ji,jj,jl) = v_s_b(ji,jj,jl) / a_i_b(ji,jj,jl)   ! snw thickness
+            ELSE
+               h_i_b(ji,jj,jl) = 0._wp
+               h_s_b(ji,jj,jl) = 0._wp
+            ENDIF
+            e_s_b (ji,jj,:,jl) = e_s (ji,jj,:,jl)   ! snow thermal energy
+            e_i_b (ji,jj,:,jl) = e_i (ji,jj,:,jl)   ! ice thermal energy
+         END_2D
+      ENDDO
+      ! total concentration
       at_i_b(:,:)  = SUM( a_i_b(:,:,:), dim=3 )
-      u_ice_b(:,:) = u_ice(:,:)
-      v_ice_b(:,:) = v_ice(:,:)
+
+      ! ice velocity
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls  )
+         u_ice_b(ji,jj) = u_ice(ji,jj)
+         v_ice_b(ji,jj) = v_ice(ji,jj)
+      END_2D
       !
    END SUBROUTINE store_fields
 
@@ -402,20 +423,19 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER  ::   ji, jj, jl      ! dummy loop index
       !!----------------------------------------------------------------------
-
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! needed for (at least) diag_adv_mass -> to be removed 
+      DO_2D( 0, 0, 0, 0 )
          sfx    (ji,jj) = 0._wp   ;
          sfx_bri(ji,jj) = 0._wp   ;   sfx_lam(ji,jj) = 0._wp
          sfx_sni(ji,jj) = 0._wp   ;   sfx_opw(ji,jj) = 0._wp
          sfx_bog(ji,jj) = 0._wp   ;   sfx_dyn(ji,jj) = 0._wp
          sfx_bom(ji,jj) = 0._wp   ;   sfx_sum(ji,jj) = 0._wp
-         sfx_res(ji,jj) = 0._wp   ;   sfx_sub(ji,jj) = 0._wp
+         sfx_sub(ji,jj) = 0._wp   ;   sfx_res(ji,jj) = 0._wp
          !
          wfx_snw(ji,jj) = 0._wp   ;   wfx_ice(ji,jj) = 0._wp
          wfx_sni(ji,jj) = 0._wp   ;   wfx_opw(ji,jj) = 0._wp
          wfx_bog(ji,jj) = 0._wp   ;   wfx_dyn(ji,jj) = 0._wp
          wfx_bom(ji,jj) = 0._wp   ;   wfx_sum(ji,jj) = 0._wp
-         wfx_res(ji,jj) = 0._wp   ;   wfx_sub(ji,jj) = 0._wp
+         wfx_sub(ji,jj) = 0._wp   ;   wfx_res(ji,jj) = 0._wp
          wfx_spr(ji,jj) = 0._wp   ;   wfx_lam(ji,jj) = 0._wp
          wfx_snw_dyn(ji,jj) = 0._wp ; wfx_snw_sum(ji,jj) = 0._wp
          wfx_snw_sub(ji,jj) = 0._wp ; wfx_ice_sub(ji,jj) = 0._wp
@@ -426,7 +446,7 @@ CONTAINS
          hfx_snw(ji,jj) = 0._wp   ;   hfx_opw(ji,jj) = 0._wp
          hfx_bog(ji,jj) = 0._wp   ;   hfx_dyn(ji,jj) = 0._wp
          hfx_bom(ji,jj) = 0._wp   ;   hfx_sum(ji,jj) = 0._wp
-         hfx_res(ji,jj) = 0._wp   ;   hfx_sub(ji,jj) = 0._wp
+         hfx_sub(ji,jj) = 0._wp   ;   hfx_res(ji,jj) = 0._wp
          hfx_spr(ji,jj) = 0._wp   ;   hfx_dif(ji,jj) = 0._wp
          hfx_err_dif(ji,jj) = 0._wp
          wfx_err_sub(ji,jj) = 0._wp
@@ -451,7 +471,7 @@ CONTAINS
       END_2D
 
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             ! SIMIP diagnostics
             t_si       (ji,jj,jl) = rt0     ! temp at the ice-snow interface
             qcn_ice_bot(ji,jj,jl) = 0._wp
@@ -477,22 +497,25 @@ CONTAINS
       !!              and outputs
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kn    ! 1 = after dyn ; 2 = after thermo
-      !!----------------------------------------------------------------------
+      INTEGER  ::   ji, jj, jl      ! dummy loop index
+     !!----------------------------------------------------------------------
       !
       ! --- trends of heat, salt, mass (used for conservation controls)
       IF( ln_icediachk .OR. iom_use('hfxdhc') ) THEN
          !
-         diag_heat(:,:) = diag_heat(:,:) &
-            &             - SUM(SUM( e_i (:,:,1:nlay_i,:) - e_i_b (:,:,1:nlay_i,:), dim=4 ), dim=3 ) * r1_Dt_ice &
-            &             - SUM(SUM( e_s (:,:,1:nlay_s,:) - e_s_b (:,:,1:nlay_s,:), dim=4 ), dim=3 ) * r1_Dt_ice
-         diag_sice(:,:) = diag_sice(:,:) &
-            &             + SUM(     sv_i(:,:,:)          - sv_i_b(:,:,:)                  , dim=3 ) * r1_Dt_ice * rhoi
-         diag_vice(:,:) = diag_vice(:,:) &
-            &             + SUM(     v_i (:,:,:)          - v_i_b (:,:,:)                  , dim=3 ) * r1_Dt_ice * rhoi
-         diag_vsnw(:,:) = diag_vsnw(:,:) &
-            &             + SUM(     v_s (:,:,:)          - v_s_b (:,:,:)                  , dim=3 ) * r1_Dt_ice * rhos
-         diag_vpnd(:,:) = diag_vpnd(:,:) &
-            &             + SUM(     v_ip + v_il          - v_ip_b - v_il_b                , dim=3 ) * r1_Dt_ice * rhow
+         DO_2D( 0, 0, 0, 0 )
+            diag_heat(ji,jj) = diag_heat(ji,jj) &
+               &             - SUM(SUM( e_i (ji,jj,1:nlay_i,:) - e_i_b (ji,jj,1:nlay_i,:), dim=2 ) ) * r1_Dt_ice &
+               &             - SUM(SUM( e_s (ji,jj,1:nlay_s,:) - e_s_b (ji,jj,1:nlay_s,:), dim=2 ) ) * r1_Dt_ice
+            diag_sice(ji,jj) = diag_sice(ji,jj) &
+               &             + SUM(     sv_i(ji,jj,:)          - sv_i_b(ji,jj,:)                   ) * r1_Dt_ice * rhoi
+            diag_vice(ji,jj) = diag_vice(ji,jj) &
+               &             + SUM(     v_i (ji,jj,:)          - v_i_b (ji,jj,:)                   ) * r1_Dt_ice * rhoi
+            diag_vsnw(ji,jj) = diag_vsnw(ji,jj) &
+               &             + SUM(     v_s (ji,jj,:)          - v_s_b (ji,jj,:)                   ) * r1_Dt_ice * rhos
+            diag_vpnd(ji,jj) = diag_vpnd(ji,jj) &
+               &             + SUM( v_ip(ji,jj,:)+v_il(ji,jj,:) - v_ip_b(ji,jj,:)-v_il_b(ji,jj,:)  ) * r1_Dt_ice * rhow
+         END_2D
          !
          IF( kn == 2 )    CALL iom_put ( 'hfxdhc' , diag_heat )   ! output of heat trend
          !
@@ -501,11 +524,13 @@ CONTAINS
       ! --- trends of concentration (used for simip outputs)
       IF( iom_use('afxdyn') .OR. iom_use('afxthd') .OR. iom_use('afxtot') ) THEN
          !
-         diag_aice(:,:) = diag_aice(:,:) + SUM( a_i(:,:,:) - a_i_b(:,:,:), dim=3 ) * r1_Dt_ice
+         DO_2D( 0, 0, 0, 0 )
+            diag_aice(ji,jj) = diag_aice(ji,jj) + SUM( a_i(ji,jj,:) - a_i_b(ji,jj,:) ) * r1_Dt_ice
+         END_2D
          !
-         IF( kn == 1 )   CALL iom_put( 'afxdyn' , diag_aice )                                           ! dyn trend
-         IF( kn == 2 )   CALL iom_put( 'afxthd' , SUM( a_i(:,:,:) - a_i_b(:,:,:), dim=3 ) * r1_Dt_ice ) ! thermo trend
-         IF( kn == 2 )   CALL iom_put( 'afxtot' , diag_aice )                                           ! total trend
+         IF( kn == 1 )   CALL iom_put( 'afxdyn' , diag_aice )                                              ! dyn trend
+         IF( kn == 2 )   CALL iom_put( 'afxthd' , SUM( a_i(A2D(0),:) - a_i_b(:,:,:), dim=3 ) * r1_Dt_ice ) ! thermo trend
+         IF( kn == 2 )   CALL iom_put( 'afxtot' , diag_aice )                                              ! total trend
          !
       ENDIF
       !
diff --git a/src/ICE/icetab.F90 b/src/ICE/icetab.F90
index 2b1b880f..db9575fc 100644
--- a/src/ICE/icetab.F90
+++ b/src/ICE/icetab.F90
@@ -20,8 +20,10 @@ MODULE icetab
    IMPLICIT NONE
    PRIVATE
 
+   PUBLIC   tab_4d_3d
    PUBLIC   tab_3d_2d
    PUBLIC   tab_2d_1d
+   PUBLIC   tab_3d_4d
    PUBLIC   tab_2d_3d
    PUBLIC   tab_1d_2d
 
@@ -32,21 +34,63 @@ MODULE icetab
    !!----------------------------------------------------------------------
 CONTAINS
 
+   SUBROUTINE tab_4d_3d( ndim1d, tab_ind, tab1d, tab2d )
+      !!----------------------------------------------------------------------
+      !!                  ***  ROUTINE tab_2d_1d  ***
+      !!----------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   ndim1d   ! 1d size
+      INTEGER , DIMENSION(ndim1d) , INTENT(in   ) ::   tab_ind  ! input index
+      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   tab2d    ! input 2D field
+      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   tab1d    ! output 1D field
+      !
+      INTEGER ::   ipi, ipj, ipk, ji0, jj0, jk, jl, jn, jid, jjd
+      !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      ipk = SIZE(tab2d,3)   ! 3d  dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
+      DO jl = 1, jpl
+         DO jk = 1, ipk
+            DO jn = 1, ndim1d
+               jid          = MOD( tab_ind(jn) - 1 , jpi ) + 1 - ji0
+               jjd          =    ( tab_ind(jn) - 1 ) / jpi + 1 - jj0
+               tab1d(jn,jk,jl) = tab2d(jid,jjd,jk,jl)
+            END DO
+         END DO
+      END DO
+      !
+   END SUBROUTINE tab_4d_3d
+
    SUBROUTINE tab_3d_2d( ndim1d, tab_ind, tab1d, tab2d )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE tab_2d_1d  ***
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   ndim1d   ! 1d size
       INTEGER , DIMENSION(ndim1d)     , INTENT(in   ) ::   tab_ind  ! input index
-      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(in   ) ::   tab2d    ! input 2D field
+      REAL(wp), DIMENSION(:,:,:)      , INTENT(in   ) ::   tab2d    ! input 2D field
       REAL(wp), DIMENSION(ndim1d,jpl) , INTENT(inout) ::   tab1d    ! output 1D field
       !
-      INTEGER ::   jl, jn, jid, jjd
+      INTEGER ::   ipi, ipj, ji0, jj0, jl, jn, jid, jjd
       !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
       DO jl = 1, jpl
          DO jn = 1, ndim1d
-            jid          = MOD( tab_ind(jn) - 1 , jpi ) + 1
-            jjd          =    ( tab_ind(jn) - 1 ) / jpi + 1
+            jid          = MOD( tab_ind(jn) - 1 , jpi ) + 1 - ji0
+            jjd          =    ( tab_ind(jn) - 1 ) / jpi + 1 - jj0
             tab1d(jn,jl) = tab2d(jid,jjd,jl)
          END DO
       END DO
@@ -59,18 +103,59 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                     , INTENT(in   ) ::   ndim1d   ! 1d size
       INTEGER , DIMENSION(ndim1d) , INTENT(in   ) ::   tab_ind  ! input index
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   tab2d    ! input 2D field
+      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   tab2d    ! input 2D field
       REAL(wp), DIMENSION(ndim1d) , INTENT(inout) ::   tab1d    ! output 1D field
       !
-      INTEGER ::   jn , jid, jjd
+      INTEGER ::   ipi, ipj, ji0, jj0, jn, jid, jjd
       !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
       DO jn = 1, ndim1d
-         jid        = MOD( tab_ind(jn) - 1 , jpi ) + 1
-         jjd        =    ( tab_ind(jn) - 1 ) / jpi + 1
+         jid        = MOD( tab_ind(jn) - 1 , jpi ) + 1 - ji0
+         jjd        =    ( tab_ind(jn) - 1 ) / jpi + 1 - jj0
          tab1d( jn) = tab2d( jid, jjd)
       END DO
    END SUBROUTINE tab_2d_1d
 
+   SUBROUTINE tab_3d_4d( ndim1d, tab_ind, tab1d, tab2d )
+      !!----------------------------------------------------------------------
+      !!                  ***  ROUTINE tab_2d_1d  ***
+      !!----------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   ndim1d    ! 1D size
+      INTEGER , DIMENSION(ndim1d) , INTENT(in   ) ::   tab_ind   ! input index
+      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   tab1d     ! input 1D field
+      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   tab2d     ! output 2D field
+      !
+      INTEGER ::   ipi, ipj, ipk, ji0, jj0, jk, jl, jn, jid, jjd
+      !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      ipk = SIZE(tab2d,3)   ! 3d  dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
+      DO jl = 1, jpl
+         DO jk = 1, ipk
+            DO jn = 1, ndim1d
+               jid               = MOD( tab_ind(jn) - 1 ,  jpi ) + 1 - ji0
+               jjd               =    ( tab_ind(jn) - 1 ) / jpi  + 1 - jj0
+               tab2d(jid,jjd,jk,jl) = tab1d(jn,jk,jl)
+            END DO
+         END DO
+      END DO
+      !
+   END SUBROUTINE tab_3d_4d
 
    SUBROUTINE tab_2d_3d( ndim1d, tab_ind, tab1d, tab2d )
       !!----------------------------------------------------------------------
@@ -79,14 +164,23 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   ndim1d    ! 1D size
       INTEGER , DIMENSION(ndim1d)     , INTENT(in   ) ::   tab_ind   ! input index
       REAL(wp), DIMENSION(ndim1d,jpl) , INTENT(in   ) ::   tab1d     ! input 1D field
-      REAL(wp), DIMENSION(jpi,jpj,jpl), INTENT(inout) ::   tab2d     ! output 2D field
+      REAL(wp), DIMENSION(:,:,:)      , INTENT(inout) ::   tab2d     ! output 2D field
       !
-      INTEGER ::   jl, jn, jid, jjd
+      INTEGER ::   ipi, ipj, ji0, jj0, jl, jn, jid, jjd
       !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
       DO jl = 1, jpl
          DO jn = 1, ndim1d
-            jid               = MOD( tab_ind(jn) - 1 ,  jpi ) + 1
-            jjd               =    ( tab_ind(jn) - 1 ) / jpi  + 1
+            jid               = MOD( tab_ind(jn) - 1 ,  jpi ) + 1 - ji0
+            jjd               =    ( tab_ind(jn) - 1 ) / jpi  + 1 - jj0
             tab2d(jid,jjd,jl) = tab1d(jn,jl)
          END DO
       END DO
@@ -100,13 +194,22 @@ CONTAINS
       INTEGER                     , INTENT(in   ) ::   ndim1d    ! 1D size
       INTEGER , DIMENSION(ndim1d) , INTENT(in   ) ::   tab_ind   ! input index
       REAL(wp), DIMENSION(ndim1d) , INTENT(in   ) ::   tab1d     ! input 1D field
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   tab2d     ! output 2D field
+      REAL(wp), DIMENSION(:,:)    , INTENT(inout) ::   tab2d     ! output 2D field
       !
-      INTEGER ::   jn , jid, jjd
+      INTEGER ::   ipi, ipj, ji0, jj0, jn, jid, jjd
       !!----------------------------------------------------------------------
+      ipi = SIZE(tab2d,1)   ! 1st dimension
+      ipj = SIZE(tab2d,2)   ! 2nd dimension
+      !
+      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! full arrays then no need to change index jid and jjd
+         ji0 = 0 ; jj0 = 0
+      ELSE                                     ! reduced arrays then need to shift index by nn_hls
+         ji0 = nn_hls ; jj0 = nn_hls           !         since tab2d is shifted by nn_hls
+      ENDIF                                    !           (i.e. from hls+1:jpi-hls  to  1:jpi-2*hls)
+      !
       DO jn = 1, ndim1d
-         jid             = MOD( tab_ind(jn) - 1 ,  jpi ) + 1
-         jjd             =    ( tab_ind(jn) - 1 ) / jpi  + 1
+         jid             = MOD( tab_ind(jn) - 1 ,  jpi ) + 1 - ji0
+         jjd             =    ( tab_ind(jn) - 1 ) / jpi  + 1 - jj0
          tab2d(jid, jjd) = tab1d( jn)
       END DO
    END SUBROUTINE tab_1d_2d
diff --git a/src/ICE/icethd.F90 b/src/ICE/icethd.F90
index 3971c441..ddc4ddf2 100644
--- a/src/ICE/icethd.F90
+++ b/src/ICE/icethd.F90
@@ -25,7 +25,6 @@ MODULE icethd
    USE icethd_dh      ! sea-ice: ice-snow growth and melt
    USE icethd_da      ! sea-ice: lateral melting
    USE icethd_sal     ! sea-ice: salinity
-   USE icethd_ent     ! sea-ice: enthalpy redistribution
    USE icethd_do      ! sea-ice: growth in open water
    USE icethd_pnd     ! sea-ice: melt ponds
    USE iceitd         ! sea-ice: remapping thickness distribution
@@ -72,7 +71,6 @@ CONTAINS
       !!                - call ice_thd_zdf  for vertical heat diffusion
       !!                - call ice_thd_dh   for vertical ice growth and melt
       !!                - call ice_thd_pnd  for melt ponds
-      !!                - call ice_thd_ent  for enthalpy remapping
       !!                - call ice_thd_sal  for ice desalination
       !!                - call ice_thd_temp to  retrieve temperature from ice enthalpy
       !!                - call ice_thd_mono for extra lateral ice melt if active virtual thickness distribution
@@ -85,6 +83,7 @@ CONTAINS
       !
       INTEGER  :: ji, jj, jk, jl   ! dummy loop indices
       !!-------------------------------------------------------------------
+
       ! controls
       IF( ln_timing    )   CALL timing_start('icethd')                                                             ! timing
       IF( ln_icediachk )   CALL ice_cons_hsm(0, 'icethd', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) ! conservation
@@ -98,7 +97,7 @@ CONTAINS
 
       ! convergence tests
       IF( ln_zdf_chkcvg ) THEN
-         ALLOCATE( ztice_cvgerr(jpi,jpj,jpl) , ztice_cvgstp(jpi,jpj,jpl) )
+         ALLOCATE( ztice_cvgerr(A2D(0),jpl) , ztice_cvgstp(A2D(0),jpl) )
          ztice_cvgerr = 0._wp ; ztice_cvgstp = 0._wp
       ENDIF
       !
@@ -111,7 +110,7 @@ CONTAINS
 
          ! select ice covered grid points
          npti = 0 ; nptidx(:) = 0
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF ( a_i(ji,jj,jl) > epsi10 ) THEN
                npti         = npti  + 1
                nptidx(npti) = (jj - 1) * jpi + ji
@@ -131,8 +130,7 @@ CONTAINS
                               CALL ice_thd_zdf                      ! --- Ice-Snow temperature --- !
             !
             IF( ln_icedH ) THEN                                     ! --- Growing/Melting --- !
-                              CALL ice_thd_dh                           ! Ice-Snow thickness
-                              CALL ice_thd_ent( e_i_1d(1:npti,:) )      ! Ice enthalpy remapping
+                              CALL ice_thd_dh
             ENDIF
                               CALL ice_thd_sal( ln_icedS )          ! --- Ice salinity --- !
             !
@@ -161,8 +159,14 @@ CONTAINS
       !
                               CALL ice_cor( kt , 2 )                ! --- Corrections --- !
       !
-      oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * rDt_ice              ! --- Ice natural aging incrementation
+      oa_i(A2D(0),:) = oa_i(A2D(0),:) + a_i(A2D(0),:) * rDt_ice     ! --- Ice natural aging incrementation
+      !
+      !                                                             ! --- LBC for the halos --- !
+      CALL lbc_lnk( 'icethd', a_i , 'T', 1._wp, v_i , 'T', 1._wp, v_s , 'T', 1._wp, sv_i, 'T', 1._wp, oa_i, 'T', 1._wp, &
+         &                    t_su, 'T', 1._wp, a_ip, 'T', 1._wp, v_ip, 'T', 1._wp, v_il, 'T', 1._wp )
+      CALL lbc_lnk( 'icethd', e_i , 'T', 1._wp, e_s , 'T', 1._wp )
       !
+      at_i(:,:) = SUM( a_i, dim=3 )
       DO_2D( 0, 0, 0, 0 )                                           ! --- Ice velocity corrections
          IF( at_i(ji,jj) == 0._wp ) THEN   ! if ice has melted
             IF( at_i(ji+1,jj) == 0._wp )   u_ice(ji  ,jj) = 0._wp   ! right side
@@ -202,15 +206,15 @@ CONTAINS
       ! Recover ice temperature
       DO jk = 1, nlay_i
          DO ji = 1, npti
-            ztmelts       = -rTmlt * sz_i_1d(ji,jk)
-            ! Conversion q(S,T) -> T (second order equation)
-            zbbb          = ( rcp - rcpi ) * ztmelts + e_i_1d(ji,jk) * r1_rhoi - rLfus
-            zccc          = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts, 0._wp ) )
-            t_i_1d(ji,jk) = rt0 - ( zbbb + zccc ) * 0.5_wp * r1_rcpi
-
-            ! mask temperature
-            rswitch       = 1._wp - MAX( 0._wp , SIGN( 1._wp , - h_i_1d(ji) ) )
-            t_i_1d(ji,jk) = rswitch * t_i_1d(ji,jk) + ( 1._wp - rswitch ) * rt0
+            IF( h_i_1d(ji) > 0._wp ) THEN
+               ztmelts       = -rTmlt * sz_i_1d(ji,jk)
+               ! Conversion q(S,T) -> T (second order equation)
+               zbbb          = ( rcp - rcpi ) * ztmelts + e_i_1d(ji,jk) * r1_rhoi - rLfus
+               zccc          = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts, 0._wp ) )
+               t_i_1d(ji,jk) = rt0 - ( zbbb + zccc ) * 0.5_wp * r1_rcpi
+            ELSE
+               t_i_1d(ji,jk) = rt0
+            ENDIF
          END DO
       END DO
       !
@@ -237,8 +241,7 @@ CONTAINS
             zvs          = a_i_1d(ji) * h_s_1d(ji)
             ! lateral melting = concentration change
             zhi_bef     = h_i_1d(ji) - zdh_mel
-            rswitch     = MAX( 0._wp , SIGN( 1._wp , zhi_bef - epsi20 ) )
-            zda_mel     = rswitch * a_i_1d(ji) * zdh_mel / ( 2._wp * MAX( zhi_bef, epsi20 ) )
+            zda_mel     = MAX( -a_i_1d(ji) , a_i_1d(ji) * zdh_mel / ( 2._wp * MAX( zhi_bef, epsi20 ) ) )
             a_i_1d(ji)  = MAX( epsi20, a_i_1d(ji) + zda_mel )
             ! adjust thickness
             h_i_1d(ji) = zvi / a_i_1d(ji)
diff --git a/src/ICE/icethd_dh.F90 b/src/ICE/icethd_dh.F90
index 90a5b591..5264b756 100644
--- a/src/ICE/icethd_dh.F90
+++ b/src/ICE/icethd_dh.F90
@@ -68,9 +68,6 @@ CONTAINS
       REAL(wp) ::   ztmelts      ! local scalar
       REAL(wp) ::   zdum
       REAL(wp) ::   zfracs       ! fractionation coefficient for bottom salt entrapment
-      REAL(wp) ::   zswi1        ! switch for computation of bottom salinity
-      REAL(wp) ::   zswi12       ! switch for computation of bottom salinity
-      REAL(wp) ::   zswi2        ! switch for computation of bottom salinity
       REAL(wp) ::   zgrr         ! bottom growth rate
       REAL(wp) ::   zt_i_new     ! bottom formation temperature
       REAL(wp) ::   z1_rho       ! 1/(rhos+rho0-rhoi)
@@ -85,14 +82,16 @@ CONTAINS
       REAL(wp), DIMENSION(jpij) ::   zq_bot      ! heat for bottom ablation                    (J.m-2)
       REAL(wp), DIMENSION(jpij) ::   zq_rema     ! remaining heat at the end of the routine    (J.m-2)
       REAL(wp), DIMENSION(jpij) ::   zf_tt       ! Heat budget to determine melting or freezing(W.m-2)
-      REAL(wp), DIMENSION(jpij) ::   zevap_rema  ! remaining mass flux from sublimation        (kg.m-2)
-      REAL(wp), DIMENSION(jpij) ::   zdeltah
+      REAL(wp) ::   zevap_rema  ! remaining mass flux from sublimation        (kg.m-2)
+      REAL(wp) ::   zdeltah
       REAL(wp), DIMENSION(jpij) ::   zsnw        ! distribution of snow after wind blowing
 
-      INTEGER , DIMENSION(jpij,nlay_i)     ::   icount    ! number of layers vanishing by melting
-      REAL(wp), DIMENSION(jpij,0:nlay_i+1) ::   zh_i      ! ice layer thickness (m)
-      REAL(wp), DIMENSION(jpij,0:nlay_s  ) ::   zh_s      ! snw layer thickness (m)
-      REAL(wp), DIMENSION(jpij,0:nlay_s  ) ::   ze_s      ! snw layer enthalpy (J.m-3)
+      INTEGER , DIMENSION(nlay_i)     ::   icount    ! number of layers vanishing by melting
+      REAL(wp), DIMENSION(0:nlay_i+1) ::   zh_i      ! ice layer thickness (m)
+      REAL(wp), DIMENSION(0:nlay_s  ) ::   zh_s      ! snw layer thickness (m)
+      REAL(wp), DIMENSION(0:nlay_s  ) ::   ze_s      ! snw layer enthalpy (J.m-3)
+      REAL(wp), DIMENSION(0:nlay_i+1) ::   zh_i_old  ! old thickness
+      REAL(wp), DIMENSION(0:nlay_i+1) ::   ze_i_old  ! old enthalpy
 
       REAL(wp) ::   zswitch_sal
 
@@ -104,155 +103,150 @@ CONTAINS
          CASE( 1 , 3 )   ;   zswitch_sal = 0._wp   ! prescribed salinity profile
          CASE( 2 )       ;   zswitch_sal = 1._wp   ! varying salinity profile
       END SELECT
-
-      ! initialize ice layer thicknesses and enthalpies
-      eh_i_old(1:npti,0:nlay_i+1) = 0._wp
-      h_i_old (1:npti,0:nlay_i+1) = 0._wp
-      zh_i    (1:npti,0:nlay_i+1) = 0._wp
-      DO jk = 1, nlay_i
-         DO ji = 1, npti
-            eh_i_old(ji,jk) = h_i_1d(ji) * r1_nlay_i * e_i_1d(ji,jk)
-            h_i_old (ji,jk) = h_i_1d(ji) * r1_nlay_i
-            zh_i    (ji,jk) = h_i_1d(ji) * r1_nlay_i
-         END DO
-      END DO
-      !
-      ! initialize snw layer thicknesses and enthalpies
-      zh_s(1:npti,0) = 0._wp
-      ze_s(1:npti,0) = 0._wp
-      DO jk = 1, nlay_s
-         DO ji = 1, npti
-            zh_s(ji,jk) = h_s_1d(ji) * r1_nlay_s
-            ze_s(ji,jk) = e_s_1d(ji,jk)
-         END DO
-      END DO
       !
       !                       ! ============================================== !
       !                       ! Available heat for surface and bottom ablation !
       !                       ! ============================================== !
-      !
       IF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN
-         !
          DO ji = 1, npti
-            zq_top(ji)     = MAX( 0._wp, qml_ice_1d(ji) * rDt_ice )
+            zq_top(ji) = MAX( 0._wp, qml_ice_1d(ji) * rDt_ice )
          END DO
-         !
       ELSE
-         !
          DO ji = 1, npti
-            zdum           = qns_ice_1d(ji) + qsr_ice_1d(ji) - qtr_ice_top_1d(ji) - qcn_ice_top_1d(ji)
-            qml_ice_1d(ji) = zdum * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - rt0 ) )
-            zq_top(ji)     = MAX( 0._wp, qml_ice_1d(ji) * rDt_ice )
+            IF( t_su_1d(ji) >= rt0 ) THEN
+               qml_ice_1d(ji) = qns_ice_1d(ji) + qsr_ice_1d(ji) - qtr_ice_top_1d(ji) - qcn_ice_top_1d(ji)
+            ELSE
+               qml_ice_1d(ji) = 0._wp
+            ENDIF
+            zq_top(ji) = MAX( 0._wp, qml_ice_1d(ji) * rDt_ice )
          END DO
-         !
       ENDIF
       !
       DO ji = 1, npti
-         zf_tt(ji)         = qcn_ice_bot_1d(ji) + qsb_ice_bot_1d(ji) + fhld_1d(ji) + qtr_ice_bot_1d(ji) * frq_m_1d(ji)
-         zq_bot(ji)        = MAX( 0._wp, zf_tt(ji) * rDt_ice )
-      END DO
-
-      !                       ! ============ !
-      !                       !     Snow     !
-      !                       ! ============ !
+         zf_tt(ji)  = qcn_ice_bot_1d(ji) + qsb_ice_bot_1d(ji) + fhld_1d(ji) + qtr_ice_bot_1d(ji) * frq_m_1d(ji)
+         zq_bot(ji) = MAX( 0._wp, zf_tt(ji) * rDt_ice )
+      END DO      
+      !                       ! ========== !
+      !                       ! Other init !
+      !                       ! ========== !
       !
-      ! Internal melting
-      ! ----------------
-      ! IF snow temperature is above freezing point, THEN snow melts (should not happen but sometimes it does)
-      DO jk = 1, nlay_s
-         DO ji = 1, npti
+      ! snow distribution over ice after wind blowing
+      CALL ice_var_snwblow( 1._wp - at_i_1d(1:npti), zsnw(1:npti) )
+      !
+      ! for snw-ice formation
+      z1_rho = 1._wp / ( rhos+rho0-rhoi )
+      !
+      ! number of iterations for new sea ice
+      IF( nn_icesal == 2 ) THEN   ;   num_iter_max = 5  ! salinity varying in time
+      ELSE                        ;   num_iter_max = 1
+      ENDIF
+      !                       ! ==================== !
+      !                       ! Start main loop here !
+      !                       ! ==================== !
+      DO ji = 1, npti
+         
+         ! initialize ice layer thicknesses and enthalpies
+         ze_i_old(0:nlay_i+1) = 0._wp
+         zh_i_old(0:nlay_i+1) = 0._wp
+         zh_i    (0:nlay_i+1) = 0._wp
+         DO jk = 1, nlay_i
+            ze_i_old(jk) = h_i_1d(ji) * r1_nlay_i * e_i_1d(ji,jk)
+            zh_i_old(jk) = h_i_1d(ji) * r1_nlay_i
+            zh_i    (jk) = h_i_1d(ji) * r1_nlay_i
+         END DO
+         !
+         ! initialize snw layer thicknesses and enthalpies
+         zh_s(0) = 0._wp
+         ze_s(0) = 0._wp
+         DO jk = 1, nlay_s
+            zh_s(jk) = h_s_1d(ji) * r1_nlay_s
+            ze_s(jk) = e_s_1d(ji,jk)
+         END DO
+         !
+         !                       ! ============ !
+         !                       !     Snow     !
+         !                       ! ============ !
+         !
+         ! Internal melting
+         ! ----------------
+         ! IF snow temperature is above freezing point, THEN snow melts (should not happen but sometimes it does)
+         DO jk = 1, nlay_s
             IF( t_s_1d(ji,jk) > rt0 ) THEN
-               hfx_res_1d    (ji) = hfx_res_1d    (ji) - ze_s(ji,jk) * zh_s(ji,jk) * a_i_1d(ji) * r1_Dt_ice   ! heat flux to the ocean [W.m-2], < 0
-               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + rhos        * zh_s(ji,jk) * a_i_1d(ji) * r1_Dt_ice   ! mass flux
+               hfx_res_1d    (ji) = hfx_res_1d    (ji) - ze_s(jk) * zh_s(jk) * a_i_1d(ji) * r1_Dt_ice   ! heat flux to the ocean [W.m-2], < 0
+               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + rhos     * zh_s(jk) * a_i_1d(ji) * r1_Dt_ice   ! mass flux
                ! updates
-               dh_s_mlt(ji)    =             dh_s_mlt(ji) - zh_s(ji,jk)
-               h_s_1d  (ji)    = MAX( 0._wp, h_s_1d  (ji) - zh_s(ji,jk) )
-               zh_s    (ji,jk) = 0._wp
-               ze_s    (ji,jk) = 0._wp
+               dh_s_mlt(ji) =             dh_s_mlt(ji) - zh_s(jk)
+               h_s_1d  (ji) = MAX( 0._wp, h_s_1d  (ji) - zh_s(jk) )
+               zh_s    (jk) = 0._wp
+               ze_s    (jk) = 0._wp
             END IF
          END DO
-      END DO
 
-      ! Snow precipitation
-      !-------------------
-      CALL ice_var_snwblow( 1._wp - at_i_1d(1:npti), zsnw(1:npti) )   ! snow distribution over ice after wind blowing
-
-      DO ji = 1, npti
+         ! Snow precipitation
+         !-------------------
          IF( sprecip_1d(ji) > 0._wp ) THEN
-            zh_s(ji,0) = zsnw(ji) * sprecip_1d(ji) * rDt_ice * r1_rhos / at_i_1d(ji)   ! thickness of precip
-            ze_s(ji,0) = MAX( 0._wp, - qprec_ice_1d(ji) )                              ! enthalpy of the precip (>0, J.m-3)
+            zh_s(0) = zsnw(ji) * sprecip_1d(ji) * rDt_ice * r1_rhos / at_i_1d(ji)   ! thickness of precip
+            ze_s(0) = MAX( 0._wp, - qprec_ice_1d(ji) )                              ! enthalpy of the precip (>0, J.m-3)
             !
-            hfx_spr_1d(ji) = hfx_spr_1d(ji) + ze_s(ji,0) * zh_s(ji,0) * a_i_1d(ji) * r1_Dt_ice   ! heat flux from snow precip (>0, W.m-2)
-            wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhos       * zh_s(ji,0) * a_i_1d(ji) * r1_Dt_ice   ! mass flux, <0
+            hfx_spr_1d(ji) = hfx_spr_1d(ji) + ze_s(0) * zh_s(0) * a_i_1d(ji) * r1_Dt_ice   ! heat flux from snow precip (>0, W.m-2)
+            wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhos    * zh_s(0) * a_i_1d(ji) * r1_Dt_ice   ! mass flux, <0
             !
             ! update thickness
-            h_s_1d(ji) = h_s_1d(ji) + zh_s(ji,0)
+            h_s_1d(ji) = h_s_1d(ji) + zh_s(0)
          ENDIF
-      END DO
 
-      ! Snow melting
-      ! ------------
-      ! If heat still available (zq_top > 0)
-      ! then all snw precip has been melted and we need to melt more snow
-      DO jk = 0, nlay_s
-         DO ji = 1, npti
-            IF( zh_s(ji,jk) > 0._wp .AND. zq_top(ji) > 0._wp ) THEN
+         ! Snow melting
+         ! ------------
+         ! If heat still available (zq_top > 0)
+         ! then all snw precip has been melted and we need to melt more snow
+         DO jk = 0, nlay_s
+            IF( zh_s(jk) > 0._wp .AND. zq_top(ji) > 0._wp ) THEN
                !
-               rswitch = MAX( 0._wp , SIGN( 1._wp , ze_s(ji,jk) - epsi20 ) )
-               zdum    = - rswitch * zq_top(ji) / MAX( ze_s(ji,jk), epsi20 )   ! thickness change
-               zdum    = MAX( zdum , - zh_s(ji,jk) )                           ! bound melting
-
-               hfx_snw_1d    (ji) = hfx_snw_1d    (ji) - ze_s(ji,jk) * zdum * a_i_1d(ji) * r1_Dt_ice   ! heat used to melt snow(W.m-2, >0)
-               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhos        * zdum * a_i_1d(ji) * r1_Dt_ice   ! snow melting only = water into the ocean
-
+               zdum = - zq_top(ji) / MAX( ze_s(jk), epsi20 )   ! thickness change
+               zdum = MAX( zdum , - zh_s(jk) )                 ! bound melting
+               
+               hfx_snw_1d    (ji) = hfx_snw_1d    (ji) - ze_s(jk) * zdum * a_i_1d(ji) * r1_Dt_ice   ! heat used to melt snow(W.m-2, >0)
+               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhos     * zdum * a_i_1d(ji) * r1_Dt_ice   ! snow melting only = water into the ocean
+               
                ! updates available heat + thickness
-               dh_s_mlt(ji)    =              dh_s_mlt(ji)    + zdum
-               zq_top  (ji)    = MAX( 0._wp , zq_top  (ji)    + zdum * ze_s(ji,jk) )
-               h_s_1d  (ji)    = MAX( 0._wp , h_s_1d  (ji)    + zdum )
-               zh_s    (ji,jk) = MAX( 0._wp , zh_s    (ji,jk) + zdum )
-!!$               IF( zh_s(ji,jk) == 0._wp )   ze_s(ji,jk) = 0._wp
+               dh_s_mlt(ji) =              dh_s_mlt(ji) + zdum
+               zq_top  (ji) = MAX( 0._wp , zq_top  (ji) + zdum * ze_s(jk) )
+               h_s_1d  (ji) = MAX( 0._wp , h_s_1d  (ji) + zdum )
+               zh_s    (jk) = MAX( 0._wp , zh_s    (jk) + zdum )
+!!$               IF( zh_s(jk) == 0._wp )   ze_s(jk) = 0._wp
                !
             ENDIF
          END DO
-      END DO
 
-      ! Snow sublimation
-      !-----------------
-      ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates
-      !    comment: not counted in mass/heat exchange in iceupdate.F90 since this is an exchange with atm. (not ocean)
-      zdeltah   (1:npti) = 0._wp ! total snow thickness that sublimates, < 0
-      zevap_rema(1:npti) = 0._wp
-      DO ji = 1, npti
-         zdeltah   (ji) = MAX( - evap_ice_1d(ji) * r1_rhos * rDt_ice, - h_s_1d(ji) )   ! amount of snw that sublimates, < 0
-         zevap_rema(ji) = evap_ice_1d(ji) * rDt_ice + zdeltah(ji) * rhos               ! remaining evap in kg.m-2 (used for ice sublimation later on)
-      END DO
-
-      DO jk = 0, nlay_s
-         DO ji = 1, npti
-            zdum = MAX( -zh_s(ji,jk), zdeltah(ji) ) ! snow layer thickness that sublimates, < 0
+         ! Snow sublimation
+         !-----------------
+         ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates
+         !    comment: not counted in mass/heat exchange in iceupdate.F90 since this is an exchange with atm. (not ocean)
+         zdeltah    = MAX( - evap_ice_1d(ji) * r1_rhos * rDt_ice, - h_s_1d(ji) )   ! amount of snw that sublimates, < 0
+         zevap_rema =        evap_ice_1d(ji)           * rDt_ice + zdeltah * rhos  ! remaining evap in kg.m-2 (used for ice sublimation later on)
+         DO jk = 0, nlay_s
+            zdum = MAX( -zh_s(jk), zdeltah ) ! snow layer thickness that sublimates, < 0
             !
-            hfx_sub_1d    (ji) = hfx_sub_1d    (ji) + ze_s(ji,jk) * zdum * a_i_1d(ji) * r1_Dt_ice  ! Heat flux of snw that sublimates [W.m-2], < 0
-            wfx_snw_sub_1d(ji) = wfx_snw_sub_1d(ji) - rhos        * zdum * a_i_1d(ji) * r1_Dt_ice  ! Mass flux by sublimation
+            hfx_sub_1d    (ji) = hfx_sub_1d    (ji) + ze_s(jk) * zdum * a_i_1d(ji) * r1_Dt_ice  ! Heat flux of snw that sublimates [W.m-2], < 0
+            wfx_snw_sub_1d(ji) = wfx_snw_sub_1d(ji) - rhos     * zdum * a_i_1d(ji) * r1_Dt_ice  ! Mass flux by sublimation
 
             ! update thickness
-            h_s_1d(ji)    = MAX( 0._wp , h_s_1d(ji)    + zdum )
-            zh_s  (ji,jk) = MAX( 0._wp , zh_s  (ji,jk) + zdum )
-!!$            IF( zh_s(ji,jk) == 0._wp )   ze_s(ji,jk) = 0._wp
+            h_s_1d(ji) = MAX( 0._wp , h_s_1d(ji) + zdum )
+            zh_s  (jk) = MAX( 0._wp , zh_s  (jk) + zdum )
+!!$            IF( zh_s(jk) == 0._wp )   ze_s(jk) = 0._wp
 
             ! update sublimation left
-            zdeltah(ji) = MIN( zdeltah(ji) - zdum, 0._wp )
+            zdeltah = MIN( zdeltah - zdum, 0._wp )
          END DO
-      END DO
 
-      !
-      !                       ! ============ !
-      !                       !     Ice      !
-      !                       ! ============ !
+         !
+         !                       ! ============ !
+         !                       !     Ice      !
+         !                       ! ============ !
 
-      ! Surface ice melting
-      !--------------------
-      DO jk = 1, nlay_i
-         DO ji = 1, npti
+         ! Surface ice melting
+         !--------------------
+         DO jk = 1, nlay_i
             ztmelts = - rTmlt * sz_i_1d(ji,jk)   ! Melting point of layer k [C]
 
             IF( t_i_1d(ji,jk) >= (ztmelts+rt0) ) THEN   !-- Internal melting
@@ -260,7 +254,7 @@ CONTAINS
                zEi            = - e_i_1d(ji,jk) * r1_rhoi             ! Specific enthalpy of layer k [J/kg, <0]
                zdE            =   0._wp                               ! Specific enthalpy difference (J/kg, <0)
                !                                                          set up at 0 since no energy is needed to melt water...(it is already melted)
-               zdum           = MIN( 0._wp , - zh_i(ji,jk) )          ! internal melting occurs when the internal temperature is above freezing
+               zdum           = MIN( 0._wp , - zh_i(jk) )             ! internal melting occurs when the internal temperature is above freezing
                !                                                          this should normally not happen, but sometimes, heat diffusion leads to this
                zfmdt          = - zdum * rhoi                         ! Recompute mass flux [kg/m2, >0]
                !
@@ -281,7 +275,7 @@ CONTAINS
 
                zdum           = - zfmdt * r1_rhoi                     ! Melt of layer jk [m, <0]
 
-               zdum           = MIN( 0._wp , MAX( zdum , - zh_i(ji,jk) ) )    ! Melt of layer jk cannot exceed the layer thickness [m, <0]
+               zdum           = MIN( 0._wp , MAX( zdum , - zh_i(jk) ) )    ! Melt of layer jk cannot exceed the layer thickness [m, <0]
 
                zq_top(ji)     = MAX( 0._wp , zq_top(ji) - zdum * rhoi * zdE ) ! update available heat
 
@@ -298,17 +292,17 @@ CONTAINS
                !                                                                                          using s_i_1d and not sz_i_1d(jk) is ok)
             END IF
             ! update thickness
-            zh_i(ji,jk) = MAX( 0._wp, zh_i(ji,jk) + zdum )
-            h_i_1d(ji)  = MAX( 0._wp, h_i_1d(ji)  + zdum )
+            zh_i  (jk) = MAX( 0._wp, zh_i  (jk) + zdum )
+            h_i_1d(ji) = MAX( 0._wp, h_i_1d(ji) + zdum )
             !
             ! update heat content (J.m-2) and layer thickness
-            eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdum * e_i_1d(ji,jk)
-            h_i_old (ji,jk) = h_i_old (ji,jk) + zdum
+            ze_i_old(jk) = ze_i_old(jk) + zdum * e_i_1d(ji,jk)
+            zh_i_old(jk) = zh_i_old(jk) + zdum
             !
             !
             ! Ice sublimation
             ! ---------------
-            zdum               = MAX( - zh_i(ji,jk) , - zevap_rema(ji) * r1_rhoi )
+            zdum               = MAX( - zh_i(jk) , - zevap_rema * r1_rhoi )
             !
             hfx_sub_1d(ji)     = hfx_sub_1d(ji)     + e_i_1d(ji,jk) * zdum              * a_i_1d(ji) * r1_Dt_ice ! Heat flux [W.m-2], < 0
             wfx_ice_sub_1d(ji) = wfx_ice_sub_1d(ji) - rhoi          * zdum              * a_i_1d(ji) * r1_Dt_ice ! Mass flux > 0
@@ -317,60 +311,50 @@ CONTAINS
             !                                                                                                            but salt should remain in the ice except
             !                                                                                                            if all ice is melted. => must be corrected
             ! update remaining mass flux and thickness
-            zevap_rema(ji) = zevap_rema(ji) + zdum * rhoi
-            zh_i(ji,jk)    = MAX( 0._wp, zh_i(ji,jk) + zdum )
-            h_i_1d(ji)     = MAX( 0._wp, h_i_1d(ji)  + zdum )
-            dh_i_sub(ji)   = dh_i_sub(ji) + zdum
+            zevap_rema   = zevap_rema + zdum * rhoi
+            zh_i  (jk)   = MAX( 0._wp, zh_i  (jk) + zdum )
+            h_i_1d(ji)   = MAX( 0._wp, h_i_1d(ji) + zdum )
+            dh_i_sub(ji) = dh_i_sub(ji) + zdum
 
             ! update heat content (J.m-2) and layer thickness
-            eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdum * e_i_1d(ji,jk)
-            h_i_old (ji,jk) = h_i_old (ji,jk) + zdum
+            ze_i_old(jk) = ze_i_old(jk) + zdum * e_i_1d(ji,jk)
+            zh_i_old(jk) = zh_i_old(jk) + zdum
 
             ! record which layers have disappeared (for bottom melting)
             !    => icount=0 : no layer has vanished
             !    => icount=5 : 5 layers have vanished
-            rswitch       = MAX( 0._wp , SIGN( 1._wp , - zh_i(ji,jk) ) )
-            icount(ji,jk) = NINT( rswitch )
+            IF( zh_i(jk) > 0._wp ) THEN ; icount(jk) = 0
+            ELSE                        ; icount(jk) = 1 ; ENDIF
 
          END DO
-      END DO
 
-      ! remaining "potential" evap is sent to ocean
-      DO ji = 1, npti
-         wfx_err_sub_1d(ji) = wfx_err_sub_1d(ji) - zevap_rema(ji) * a_i_1d(ji) * r1_Dt_ice  ! <=0 (net evap for the ocean in kg.m-2.s-1)
-      END DO
+         ! remaining "potential" evap is sent to ocean
+         wfx_err_sub_1d(ji) = wfx_err_sub_1d(ji) - zevap_rema * a_i_1d(ji) * r1_Dt_ice  ! <=0 (net evap for the ocean in kg.m-2.s-1)
 
 
-      ! Ice Basal growth
-      !------------------
-      ! Basal growth is driven by heat imbalance at the ice-ocean interface,
-      ! between the inner conductive flux  (qcn_ice_bot), from the open water heat flux
-      ! (fhld) and the sensible ice-ocean flux (qsb_ice_bot).
-      ! qcn_ice_bot is positive downwards. qsb_ice_bot and fhld are positive to the ice
+         ! Ice Basal growth
+         !------------------
+         ! Basal growth is driven by heat imbalance at the ice-ocean interface,
+         ! between the inner conductive flux  (qcn_ice_bot), from the open water heat flux
+         ! (fhld) and the sensible ice-ocean flux (qsb_ice_bot).
+         ! qcn_ice_bot is positive downwards. qsb_ice_bot and fhld are positive to the ice
 
-      ! If salinity varies in time, an iterative procedure is required, because
-      ! the involved quantities are inter-dependent.
-      ! Basal growth (dh_i_bog) depends upon new ice specific enthalpy (zEi),
-      ! which depends on forming ice salinity (s_i_new), which depends on dh/dt (dh_i_bog)
-      ! -> need for an iterative procedure, which converges quickly
+         ! If salinity varies in time, an iterative procedure is required, because
+         ! the involved quantities are inter-dependent.
+         ! Basal growth (dh_i_bog) depends upon new ice specific enthalpy (zEi),
+         ! which depends on forming ice salinity (s_i_new), which depends on dh/dt (dh_i_bog)
+         ! -> need for an iterative procedure, which converges quickly
 
-      num_iter_max = 1
-      IF( nn_icesal == 2 )   num_iter_max = 5  ! salinity varying in time
-
-      DO ji = 1, npti
          IF(  zf_tt(ji) < 0._wp  ) THEN
             DO iter = 1, num_iter_max   ! iterations
 
                ! New bottom ice salinity (Cox & Weeks, JGR88 )
-               !--- zswi1  if dh/dt < 2.0e-8
-               !--- zswi12 if 2.0e-8 < dh/dt < 3.6e-7
-               !--- zswi2  if dh/dt > 3.6e-7
-               zgrr     = MIN( 1.0e-3, MAX ( dh_i_bog(ji) * r1_Dt_ice , epsi10 ) )
-               zswi2    = MAX( 0._wp , SIGN( 1._wp , zgrr - 3.6e-7 ) )
-               zswi12   = MAX( 0._wp , SIGN( 1._wp , zgrr - 2.0e-8 ) ) * ( 1.0 - zswi2 )
-               zswi1    = 1. - zswi2 * zswi12
-               zfracs   = MIN( zswi1  * 0.12 + zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) )   &
-                  &          + zswi2  * 0.26 / ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) )  , 0.5 )
+               zgrr     = MIN( 1.0e-3_wp, MAX ( dh_i_bog(ji) * r1_Dt_ice , epsi10 ) )
+               !
+               IF    ( zgrr <  2.0e-8_wp ) THEN ; zfracs = 0.12_wp
+               ELSEIF( zgrr >= 3.6e-7_wp ) THEN ; zfracs = MIN( 0.26_wp / ( 0.26_wp + 0.74_wp * EXP(-724300._wp*zgrr) ) , 0.5_wp )
+               ELSE                             ; zfracs = MIN( 0.8925_wp + 0.0568_wp * LOG(100._wp*zgrr), 0.5_wp )
+               ENDIF
 
                s_i_new(ji)    = zswitch_sal * zfracs * sss_1d(ji) + ( 1. - zswitch_sal ) * s_i_1d(ji)  ! New ice salinity
 
@@ -397,22 +381,19 @@ CONTAINS
             sfx_bog_1d(ji) = sfx_bog_1d(ji) - rhoi * dh_i_bog(ji) * s_i_new(ji) * a_i_1d(ji) * r1_Dt_ice   ! Salt flux, <0
 
             ! update thickness
-            zh_i(ji,nlay_i+1) = zh_i(ji,nlay_i+1) + dh_i_bog(ji)
-            h_i_1d(ji)        = h_i_1d(ji)        + dh_i_bog(ji)
+            zh_i(nlay_i+1) = zh_i(nlay_i+1) + dh_i_bog(ji)
+            h_i_1d(ji)     = h_i_1d(ji)     + dh_i_bog(ji)
 
             ! update heat content (J.m-2) and layer thickness
-            eh_i_old(ji,nlay_i+1) = eh_i_old(ji,nlay_i+1) + dh_i_bog(ji) * (-zEi * rhoi)
-            h_i_old (ji,nlay_i+1) = h_i_old (ji,nlay_i+1) + dh_i_bog(ji)
+            ze_i_old(nlay_i+1) = ze_i_old(nlay_i+1) + dh_i_bog(ji) * (-zEi * rhoi)
+            zh_i_old(nlay_i+1) = zh_i_old(nlay_i+1) + dh_i_bog(ji)
 
          ENDIF
 
-      END DO
-
-      ! Ice Basal melt
-      !---------------
-      DO jk = nlay_i, 1, -1
-         DO ji = 1, npti
-            IF(  zf_tt(ji)  >  0._wp  .AND. jk > icount(ji,jk) ) THEN   ! do not calculate where layer has already disappeared by surface melting
+         ! Ice Basal melt
+         !---------------
+         DO jk = nlay_i, 1, -1
+            IF(  zf_tt(ji)  >  0._wp  .AND. jk > icount(jk) ) THEN   ! do not calculate where layer has already disappeared by surface melting
 
                ztmelts = - rTmlt * sz_i_1d(ji,jk)  ! Melting point of layer jk (C)
 
@@ -421,7 +402,7 @@ CONTAINS
                   zEi            = - e_i_1d(ji,jk) * r1_rhoi     ! Specific enthalpy of melting ice (J/kg, <0)
                   zdE            = 0._wp                         ! Specific enthalpy difference   (J/kg, <0)
                   !                                                  set up at 0 since no energy is needed to melt water...(it is already melted)
-                  zdum           = MIN( 0._wp , - zh_i(ji,jk) )  ! internal melting occurs when the internal temperature is above freezing
+                  zdum           = MIN( 0._wp , - zh_i(jk) )  ! internal melting occurs when the internal temperature is above freezing
                   !                                                  this should normally not happen, but sometimes, heat diffusion leads to this
                   dh_i_itm (ji)  = dh_i_itm(ji) + zdum
                   !
@@ -442,7 +423,7 @@ CONTAINS
 
                   zdum           = - zfmdt * r1_rhoi                               ! Gross thickness change
 
-                  zdum           = MIN( 0._wp , MAX( zdum, - zh_i(ji,jk) ) )       ! bound thickness change
+                  zdum           = MIN( 0._wp , MAX( zdum, - zh_i(jk) ) )       ! bound thickness change
 
                   zq_bot(ji)     = MAX( 0._wp , zq_bot(ji) - zdum * rhoi * zdE )   ! update available heat. MAX is necessary for roundup errors
 
@@ -459,63 +440,55 @@ CONTAINS
                   !                                                                                         using s_i_1d and not sz_i_1d(jk) is ok
                ENDIF
                ! update thickness
-               zh_i(ji,jk) = MAX( 0._wp, zh_i(ji,jk) + zdum )
-               h_i_1d(ji)  = MAX( 0._wp, h_i_1d(ji)  + zdum )
+               zh_i  (jk) = MAX( 0._wp, zh_i  (jk) + zdum )
+               h_i_1d(ji) = MAX( 0._wp, h_i_1d(ji) + zdum )
                !
                ! update heat content (J.m-2) and layer thickness
-               eh_i_old(ji,jk) = eh_i_old(ji,jk) + zdum * e_i_1d(ji,jk)
-               h_i_old (ji,jk) = h_i_old (ji,jk) + zdum
+               ze_i_old(jk) = ze_i_old(jk) + zdum * e_i_1d(ji,jk)
+               zh_i_old(jk) = zh_i_old(jk) + zdum
             ENDIF
          END DO
-      END DO
 
-      ! Remove snow if ice has melted entirely
-      ! --------------------------------------
-      DO jk = 0, nlay_s
-         DO ji = 1,npti
-            IF( h_i_1d(ji) == 0._wp ) THEN
+         ! Remove snow if ice has melted entirely
+         ! --------------------------------------
+         IF( h_i_1d(ji) == 0._wp ) THEN
+            DO jk = 0, nlay_s
                ! mass & energy loss to the ocean
-               hfx_res_1d(ji) = hfx_res_1d(ji) - ze_s(ji,jk) * zh_s(ji,jk) * a_i_1d(ji) * r1_Dt_ice  ! heat flux to the ocean [W.m-2], < 0
-               wfx_res_1d(ji) = wfx_res_1d(ji) + rhos        * zh_s(ji,jk) * a_i_1d(ji) * r1_Dt_ice  ! mass flux
+               hfx_res_1d(ji) = hfx_res_1d(ji) - ze_s(jk) * zh_s(jk) * a_i_1d(ji) * r1_Dt_ice  ! heat flux to the ocean [W.m-2], < 0
+               wfx_res_1d(ji) = wfx_res_1d(ji) + rhos     * zh_s(jk) * a_i_1d(ji) * r1_Dt_ice  ! mass flux
 
                ! update thickness and energy
-               h_s_1d(ji)    = 0._wp
-               ze_s  (ji,jk) = 0._wp
-               zh_s  (ji,jk) = 0._wp
-            ENDIF
-         END DO
-      END DO
+               h_s_1d(ji) = 0._wp
+               ze_s  (jk) = 0._wp
+               zh_s  (jk) = 0._wp
+            END DO
+         ENDIF
 
-      ! Snow load on ice
-      ! -----------------
-      ! When snow load exceeds Archimede's limit and sst is positive,
-      ! snow-ice formation (next bloc) can lead to negative ice enthalpy.
-      ! Therefore we consider here that this excess of snow falls into the ocean
-      zdeltah(1:npti) = h_s_1d(1:npti) + h_i_1d(1:npti) * (rhoi-rho0) * r1_rhos
-      DO jk = 0, nlay_s
-         DO ji = 1, npti
-            IF( zdeltah(ji) > 0._wp .AND. sst_1d(ji) > 0._wp ) THEN
+         ! Snow load on ice
+         ! -----------------
+         ! When snow load exceeds Archimede's limit and sst is positive,
+         ! snow-ice formation (next bloc) can lead to negative ice enthalpy.
+         ! Therefore we consider here that this excess of snow falls into the ocean
+         zdeltah = h_s_1d(ji) + h_i_1d(ji) * (rhoi-rho0) * r1_rhos
+         DO jk = 0, nlay_s
+            IF( zdeltah > 0._wp .AND. sst_1d(ji) > 0._wp ) THEN
                ! snow layer thickness that falls into the ocean
-               zdum = MIN( zdeltah(ji) , zh_s(ji,jk) )
+               zdum = MIN( zdeltah , zh_s(jk) )
                ! mass & energy loss to the ocean
-               hfx_res_1d(ji) = hfx_res_1d(ji) - ze_s(ji,jk) * zdum * a_i_1d(ji) * r1_Dt_ice  ! heat flux to the ocean [W.m-2], < 0
-               wfx_res_1d(ji) = wfx_res_1d(ji) + rhos        * zdum * a_i_1d(ji) * r1_Dt_ice  ! mass flux
+               hfx_res_1d(ji) = hfx_res_1d(ji) - ze_s(jk) * zdum * a_i_1d(ji) * r1_Dt_ice  ! heat flux to the ocean [W.m-2], < 0
+               wfx_res_1d(ji) = wfx_res_1d(ji) + rhos     * zdum * a_i_1d(ji) * r1_Dt_ice  ! mass flux
                ! update thickness and energy
-               h_s_1d(ji)    = MAX( 0._wp, h_s_1d(ji)  - zdum )
-               zh_s  (ji,jk) = MAX( 0._wp, zh_s(ji,jk) - zdum )
+               h_s_1d(ji) = MAX( 0._wp, h_s_1d(ji) - zdum )
+               zh_s  (jk) = MAX( 0._wp, zh_s  (jk) - zdum )
                ! update snow thickness that still has to fall
-               zdeltah(ji)   = MAX( 0._wp, zdeltah(ji) - zdum )
+               zdeltah   = MAX( 0._wp, zdeltah - zdum )
             ENDIF
          END DO
-      END DO
 
-      ! Snow-Ice formation
-      ! ------------------
-      ! When snow load exceeds Archimede's limit, snow-ice interface goes down under sea-level,
-      ! flooding of seawater transforms snow into ice. Thickness that is transformed is dh_snowice (positive for the ice)
-      z1_rho = 1._wp / ( rhos+rho0-rhoi )
-      zdeltah(1:npti) = 0._wp
-      DO ji = 1, npti
+         ! Snow-Ice formation
+         ! ------------------
+         ! When snow load exceeds Archimede's limit, snow-ice interface goes down under sea-level,
+         ! flooding of seawater transforms snow into ice. Thickness that is transformed is dh_snowice (positive for the ice)
          !
          dh_snowice(ji) = MAX( 0._wp , ( rhos * h_s_1d(ji) + (rhoi-rho0) * h_i_1d(ji) ) * z1_rho )
 
@@ -541,50 +514,53 @@ CONTAINS
          wfx_snw_sni_1d(ji) = wfx_snw_sni_1d(ji) + dh_snowice(ji) * rhos * a_i_1d(ji) * r1_Dt_ice
 
          ! update thickness
-         zh_i(ji,0)  = zh_i(ji,0) + dh_snowice(ji)
-         zdeltah(ji) =              dh_snowice(ji)
+         zh_i(0) = zh_i(0) + dh_snowice(ji)
+         zdeltah =           dh_snowice(ji)
 
          ! update heat content (J.m-2) and layer thickness
-         h_i_old (ji,0) = h_i_old (ji,0) + dh_snowice(ji)
-         eh_i_old(ji,0) = eh_i_old(ji,0) + zfmdt * zEw           ! 1st part (sea water enthalpy)
+         zh_i_old(0) = zh_i_old(0) + dh_snowice(ji)
+         ze_i_old(0) = ze_i_old(0) + zfmdt * zEw           ! 1st part (sea water enthalpy)
 
-      END DO
-      !
-      DO jk = nlay_s, 0, -1   ! flooding of snow starts from the base
-         DO ji = 1, npti
-            zdum           = MIN( zdeltah(ji), zh_s(ji,jk) )     ! amount of snw that floods, > 0
-            zh_s(ji,jk)    = MAX( 0._wp, zh_s(ji,jk) - zdum )    ! remove some snow thickness
-            eh_i_old(ji,0) = eh_i_old(ji,0) + zdum * ze_s(ji,jk) ! 2nd part (snow enthalpy)
+         !
+         DO jk = nlay_s, 0, -1   ! flooding of snow starts from the base
+            zdum        = MIN( zdeltah, zh_s(jk) )         ! amount of snw that floods, > 0
+            zh_s(jk)    = MAX( 0._wp, zh_s(jk) - zdum )    ! remove some snow thickness
+            ze_i_old(0) = ze_i_old(0) + zdum * ze_s(jk)    ! 2nd part (snow enthalpy)
             ! update dh_snowice
-            zdeltah(ji)    = MAX( 0._wp, zdeltah(ji) - zdum )
+            zdeltah     = MAX( 0._wp, zdeltah - zdum )
          END DO
-      END DO
-      !
-      !
+         !
+         !
 !!$      ! --- Update snow diags --- !
 !!$      !!clem: this is wrong. dh_s_tot is not used anyway
 !!$      DO ji = 1, npti
-!!$         dh_s_tot(ji) = dh_s_tot(ji) + dh_s_mlt(ji) + zdeltah(ji) + zdh_s_sub(ji) - dh_snowice(ji)
+!!$         dh_s_tot(ji) = dh_s_tot(ji) + dh_s_mlt(ji) + zdeltah + zdh_s_sub(ji) - dh_snowice(ji)
 !!$      END DO
-      !
-      !
-      ! Remapping of snw enthalpy on a regular grid
-      !--------------------------------------------
-      CALL snw_ent( zh_s, ze_s, e_s_1d )
-
-      ! recalculate t_s_1d from e_s_1d
-      DO jk = 1, nlay_s
-         DO ji = 1,npti
-            IF( h_s_1d(ji) > 0._wp ) THEN
+         !
+         ! Remapping of snw enthalpy on a regular grid
+         !--------------------------------------------
+         e_s_1d(ji,:) = snw_ent( zh_s(:), ze_s(:) )
+   
+         ! recalculate t_s_1d from e_s_1d
+         IF( h_s_1d(ji) > 0._wp ) THEN
+            DO jk = 1, nlay_s
                t_s_1d(ji,jk) = rt0 + ( - e_s_1d(ji,jk) * r1_rhos * r1_rcpi + rLfus * r1_rcpi )
-            ELSE
+            END DO
+         ELSE
+            DO jk = 1, nlay_s
                t_s_1d(ji,jk) = rt0
-            ENDIF
-         END DO
-      END DO
+            END DO
+         ENDIF
 
-      ! Note: remapping of ice enthalpy is done in icethd.F90
+         ! Remapping of ice enthalpy on a regular grid
+         !--------------------------------------------
+         e_i_1d(ji,:) = ice_ent1( zh_i_old(:), ze_i_old(:) )
 
+      END DO ! npti
+      !                       ! ================== !
+      !                       ! End main loop here !
+      !                       ! ================== !
+ 
       ! --- ensure that a_i = 0 & h_s = 0 where h_i = 0 ---
       WHERE( h_i_1d(1:npti) == 0._wp )
          a_i_1d (1:npti) = 0._wp
@@ -594,7 +570,7 @@ CONTAINS
 
    END SUBROUTINE ice_thd_dh
 
-   SUBROUTINE snw_ent( ph_old, pe_old, pe_new )
+   FUNCTION snw_ent( ph_old, pe_old )
       !!-------------------------------------------------------------------
       !!               ***   ROUTINE snw_ent  ***
       !!
@@ -619,73 +595,148 @@ CONTAINS
       !!
       !! References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
       !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpij,0:nlay_s), INTENT(in   ) ::   ph_old             ! old thicknesses (m)
-      REAL(wp), DIMENSION(jpij,0:nlay_s), INTENT(in   ) ::   pe_old             ! old enthlapies (J.m-3)
-      REAL(wp), DIMENSION(jpij,1:nlay_s), INTENT(inout) ::   pe_new             ! new enthlapies (J.m-3, remapped)
+      REAL(wp), DIMENSION(0:nlay_s), INTENT(in) ::   ph_old             ! old thicknesses (m)
+      REAL(wp), DIMENSION(0:nlay_s), INTENT(in) ::   pe_old             ! old enthlapies (J.m-3)
+      REAL(wp), DIMENSION(1:nlay_s)             ::   snw_ent            ! new enthlapies (J.m-3, remapped)
       !
       INTEGER  :: ji         !  dummy loop indices
       INTEGER  :: jk0, jk1   !  old/new layer indices
       !
-      REAL(wp), DIMENSION(jpij,0:nlay_s+1) ::   zeh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces
-      REAL(wp), DIMENSION(jpij,0:nlay_s)   ::   zeh_cum1, zh_cum1   ! new cumulative enthlapies and layers interfaces
-      REAL(wp), DIMENSION(jpij)            ::   zhnew               ! new layers thicknesses
+      REAL(wp), DIMENSION(0:nlay_s+1) ::   zeh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces
+      REAL(wp), DIMENSION(0:nlay_s)   ::   zeh_cum1, zh_cum1   ! new cumulative enthlapies and layers interfaces
+      REAL(wp)                        ::   zhnew               ! new layers thicknesses
       !!-------------------------------------------------------------------
 
       !--------------------------------------------------------------------------
       !  1) Cumulative integral of old enthalpy * thickness and layers interfaces
       !--------------------------------------------------------------------------
-      zeh_cum0(1:npti,0) = 0._wp
-      zh_cum0 (1:npti,0) = 0._wp
+      zeh_cum0(0) = 0._wp
+      zh_cum0 (0) = 0._wp
       DO jk0 = 1, nlay_s+1
-         DO ji = 1, npti
-            zeh_cum0(ji,jk0) = zeh_cum0(ji,jk0-1) + pe_old(ji,jk0-1) * ph_old(ji,jk0-1)
-            zh_cum0 (ji,jk0) = zh_cum0 (ji,jk0-1) + ph_old(ji,jk0-1)
-         END DO
+         zeh_cum0(jk0) = zeh_cum0(jk0-1) + pe_old(jk0-1) * ph_old(jk0-1)
+         zh_cum0 (jk0) = zh_cum0 (jk0-1) + ph_old(jk0-1)
       END DO
 
       !------------------------------------
       !  2) Interpolation on the new layers
       !------------------------------------
       ! new layer thickesses
-      DO ji = 1, npti
-         zhnew(ji) = SUM( ph_old(ji,0:nlay_s) ) * r1_nlay_s
-      END DO
+      zhnew = SUM( ph_old(0:nlay_s) ) * r1_nlay_s
 
       ! new layers interfaces
-      zh_cum1(1:npti,0) = 0._wp
+      zh_cum1(0) = 0._wp
       DO jk1 = 1, nlay_s
-         DO ji = 1, npti
-            zh_cum1(ji,jk1) = zh_cum1(ji,jk1-1) + zhnew(ji)
-         END DO
+         zh_cum1(jk1) = zh_cum1(jk1-1) + zhnew
       END DO
 
-      zeh_cum1(1:npti,0:nlay_s) = 0._wp
+      zeh_cum1(0:nlay_s) = 0._wp
       ! new cumulative q*h => linear interpolation
       DO jk0 = 1, nlay_s+1
          DO jk1 = 1, nlay_s-1
-            DO ji = 1, npti
-               IF( zh_cum1(ji,jk1) <= zh_cum0(ji,jk0) .AND. zh_cum1(ji,jk1) > zh_cum0(ji,jk0-1) ) THEN
-                  zeh_cum1(ji,jk1) = ( zeh_cum0(ji,jk0-1) * ( zh_cum0(ji,jk0) - zh_cum1(ji,jk1  ) ) +  &
-                     &                 zeh_cum0(ji,jk0  ) * ( zh_cum1(ji,jk1) - zh_cum0(ji,jk0-1) ) )  &
-                     &             / ( zh_cum0(ji,jk0) - zh_cum0(ji,jk0-1) )
-               ENDIF
-            END DO
+            IF( zh_cum1(jk1) <= zh_cum0(jk0) .AND. zh_cum1(jk1) > zh_cum0(jk0-1) )   THEN
+               zeh_cum1(jk1) = ( zeh_cum0(jk0-1) * ( zh_cum0(jk0) - zh_cum1(jk1  ) ) +  &
+                  &              zeh_cum0(jk0  ) * ( zh_cum1(jk1) - zh_cum0(jk0-1) ) )  &
+                  &            / ( zh_cum0(jk0) - zh_cum0(jk0-1) )
+            ENDIF
          END DO
       END DO
       ! to ensure that total heat content is strictly conserved, set:
-      zeh_cum1(1:npti,nlay_s) = zeh_cum0(1:npti,nlay_s+1)
+      zeh_cum1(nlay_s) = zeh_cum0(nlay_s+1)
 
       ! new enthalpies
       DO jk1 = 1, nlay_s
-         DO ji = 1, npti
-            rswitch      = MAX( 0._wp , SIGN( 1._wp , zhnew(ji) - epsi20 ) )
-            pe_new(ji,jk1) = rswitch * ( zeh_cum1(ji,jk1) - zeh_cum1(ji,jk1-1) ) / MAX( zhnew(ji), epsi20 )
+         snw_ent(jk1) = MAX( 0._wp, zeh_cum1(jk1) - zeh_cum1(jk1-1) ) / MAX( zhnew, epsi20 ) ! max for roundoff error
+      END DO
+
+
+   END FUNCTION snw_ent
+
+   FUNCTION ice_ent1( ph_old, pe_old )
+      !!-------------------------------------------------------------------
+      !!               ***   ROUTINE ice_ent1  ***
+      !!
+      !! ** Purpose :
+      !!           This routine computes new vertical grids in the ice, 
+      !!           and consistently redistributes temperatures. 
+      !!           Redistribution is made so as to ensure to energy conservation
+      !!
+      !!
+      !! ** Method  : linear conservative remapping
+      !!           
+      !! ** Steps : 1) cumulative integrals of old enthalpies/thicknesses
+      !!            2) linear remapping on the new layers
+      !!
+      !! ------------ cum0(0)                        ------------- cum1(0)
+      !!                                    NEW      -------------
+      !! ------------ cum0(1)               ==>      -------------
+      !!     ...                                     -------------
+      !! ------------                                -------------
+      !! ------------ cum0(nlay_i+2)                 ------------- cum1(nlay_i)
+      !!
+      !!
+      !! References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
+      !!-------------------------------------------------------------------
+      REAL(wp), DIMENSION(0:nlay_i+1), INTENT(in) ::   ph_old, pe_old  ! old tickness and enthlapy
+      REAL(wp), DIMENSION(1:nlay_i)               ::   ice_ent1        ! new enthlapies (J.m-3, remapped)
+      !
+      INTEGER  :: ji         !  dummy loop indices
+      INTEGER  :: jk0, jk1   !  old/new layer indices
+      !
+      REAL(wp), DIMENSION(0:nlay_i+2) ::   zeh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces
+      REAL(wp), DIMENSION(0:nlay_i)   ::   zeh_cum1, zh_cum1   ! new cumulative enthlapies and layers interfaces
+      REAL(wp)                        ::   zhnew               ! new layers thicknesses
+      !!-------------------------------------------------------------------
+
+      !--------------------------------------------------------------------------
+      !  1) Cumulative integral of old enthalpy * thickness and layers interfaces
+      !--------------------------------------------------------------------------
+      zeh_cum0(0) = 0._wp 
+      zh_cum0 (0) = 0._wp
+      DO jk0 = 1, nlay_i+2
+         zeh_cum0(jk0) = zeh_cum0(jk0-1) + pe_old(jk0-1)
+         zh_cum0 (jk0) = zh_cum0 (jk0-1) + ph_old(jk0-1)
+      END DO
+
+      !------------------------------------
+      !  2) Interpolation on the new layers
+      !------------------------------------
+      ! new layer thickesses
+      zhnew = SUM( ph_old(0:nlay_i+1) ) * r1_nlay_i  
+
+      ! new layers interfaces
+      zh_cum1(0) = 0._wp
+      DO jk1 = 1, nlay_i
+         zh_cum1(jk1) = zh_cum1(jk1-1) + zhnew
+      END DO
+
+      zeh_cum1(0:nlay_i) = 0._wp 
+      ! new cumulative q*h => linear interpolation
+      DO jk0 = 1, nlay_i+2
+         DO jk1 = 1, nlay_i-1
+            IF( zh_cum1(jk1) <= zh_cum0(jk0) .AND. zh_cum1(jk1) > zh_cum0(jk0-1) )   THEN
+               zeh_cum1(jk1) = ( zeh_cum0(jk0-1) * ( zh_cum0(jk0) - zh_cum1(jk1  ) ) +  &
+                  &              zeh_cum0(jk0  ) * ( zh_cum1(jk1) - zh_cum0(jk0-1) ) )  &
+                  &            / ( zh_cum0(jk0) - zh_cum0(jk0-1) )
+            ENDIF
          END DO
       END DO
+      ! to ensure that total heat content is strictly conserved, set:
+      zeh_cum1(nlay_i) = zeh_cum0(nlay_i+2) 
 
-   END SUBROUTINE snw_ent
+      ! new enthalpies
+      DO jk1 = 1, nlay_i
+         ice_ent1(jk1) = MAX( 0._wp, zeh_cum1(jk1) - zeh_cum1(jk1-1) ) / MAX( zhnew, epsi20 ) ! max for roundoff error
+      END DO
 
+      ! --- diag error on heat remapping --- !
+      ! comment: if input h_old and eh_old are already multiplied by a_i (as in icethd_do), 
+      ! then we should not (* a_i) again but not important since this is just to check that remap error is ~0
+      !   hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_Dt_ice *  &
+      !      &               ( SUM( pe_new(ji,1:nlay_i) ) * zhnew(ji) - SUM( eh_old(ji,0:nlay_i+1) ) ) 
 
+      
+   END FUNCTION ice_ent1
+   
 #else
    !!----------------------------------------------------------------------
    !!   Default option                                NO SI3 sea-ice model
diff --git a/src/ICE/icethd_do.F90 b/src/ICE/icethd_do.F90
index 3cd1bcd7..90e0cee2 100644
--- a/src/ICE/icethd_do.F90
+++ b/src/ICE/icethd_do.F90
@@ -21,14 +21,12 @@ MODULE icethd_do
    USE ice            ! sea-ice: variables
    USE icetab         ! sea-ice: 2D <==> 1D
    USE icectl         ! sea-ice: conservation
-   USE icethd_ent     ! sea-ice: thermodynamics, enthalpy
    USE icevar         ! sea-ice: operations
    USE icethd_sal     ! sea-ice: salinity profiles
    !
    USE in_out_manager ! I/O manager
    USE lib_mpp        ! MPP library
    USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
-   USE lbclnk         ! lateral boundary conditions (or mpp links)
 
    IMPLICIT NONE
    PRIVATE
@@ -79,41 +77,39 @@ CONTAINS
       REAL(wp) ::   zEw          ! seawater specific enthalpy (J/kg)
       REAL(wp) ::   zfmdt        ! mass flux x time step (kg/m2, >0 towards ocean)
       !
+      INTEGER  ::   jcat        ! indexes of categories where new ice grows
+      !
       REAL(wp) ::   zv_newfra
+      REAL(wp) ::   zv_newice   ! volume of accreted ice
+      REAL(wp) ::   za_newice   ! fractional area of accreted ice
+      REAL(wp) ::   ze_newice   ! heat content of accreted ice
+      REAL(wp) ::   zo_newice   ! age of accreted ice
+      REAL(wp) ::   zdv_res     ! residual volume in case of excessive heat budget
+      REAL(wp) ::   zda_res     ! residual area in case of excessive heat budget
+      REAL(wp) ::   zv_frazb    ! accretion of frazil ice at the ice bottom
       !
-      INTEGER , DIMENSION(jpij) ::   jcat        ! indexes of categories where new ice grows
-      REAL(wp), DIMENSION(jpij) ::   zswinew     ! switch for new ice or not
+      REAL(wp), DIMENSION(jpl) ::   zv_b    ! old volume of ice in category jl
+      REAL(wp), DIMENSION(jpl) ::   za_b    ! old area of ice in category jl
       !
-      REAL(wp), DIMENSION(jpij) ::   zv_newice   ! volume of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   za_newice   ! fractional area of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   zh_newice   ! thickness of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   ze_newice   ! heat content of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   zs_newice   ! salinity of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   zo_newice   ! age of accreted ice
-      REAL(wp), DIMENSION(jpij) ::   zdv_res     ! residual volume in case of excessive heat budget
-      REAL(wp), DIMENSION(jpij) ::   zda_res     ! residual area in case of excessive heat budget
-      REAL(wp), DIMENSION(jpij) ::   zv_frazb    ! accretion of frazil ice at the ice bottom
+      REAL(wp), DIMENSION(jpij) ::   zs_newice     ! salinity of accreted ice
+      REAL(wp), DIMENSION(jpij) ::   zh_newice     ! thickness of accreted ice
       REAL(wp), DIMENSION(jpij) ::   zfraz_frac_1d ! relative ice / frazil velocity (1D vector)
       !
-      REAL(wp), DIMENSION(jpij,jpl) ::   zv_b    ! old volume of ice in category jl
-      REAL(wp), DIMENSION(jpij,jpl) ::   za_b    ! old area of ice in category jl
-      !
-      REAL(wp), DIMENSION(jpij,nlay_i,jpl) ::   ze_i_2d !: 1-D version of e_i
-      !
+      REAL(wp), DIMENSION(0:nlay_i+1) ::   zh_i_old, ze_i_old
       !!-----------------------------------------------------------------------!
 
       IF( ln_icediachk )   CALL ice_cons_hsm( 0, 'icethd_do', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft )
       IF( ln_icediachk )   CALL ice_cons2D  ( 0, 'icethd_do',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft )
 
-      at_i(:,:) = SUM( a_i, dim=3 )
       !------------------------------------------------------------------------------!
       ! 1) Compute thickness, salinity, enthalpy, age, area and volume of new ice
       !------------------------------------------------------------------------------!
       ! it occurs if cooling
+      at_i(A2D(0)) = SUM( a_i(A2D(0),:), dim=3 )
 
       ! Identify grid points where new ice forms
       npti = 0   ;   nptidx(:) = 0
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF ( qlead(ji,jj)  <  0._wp ) THEN
             npti = npti + 1
             nptidx( npti ) = (jj - 1) * jpi + ji
@@ -123,42 +119,34 @@ CONTAINS
       ! Move from 2-D to 1-D vectors
       IF ( npti > 0 ) THEN
 
-         CALL tab_2d_1d( npti, nptidx(1:npti), at_i_1d(1:npti)      , at_i        )
-         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i (:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d (1:npti,1:jpl), v_i (:,:,:) )
-         CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i(:,:,:) )
-         DO jl = 1, jpl
-            DO jk = 1, nlay_i
-               CALL tab_2d_1d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-            END DO
-         END DO
-         CALL tab_2d_1d( npti, nptidx(1:npti), qlead_1d     (1:npti) , qlead      )
-         CALL tab_2d_1d( npti, nptidx(1:npti), t_bo_1d      (1:npti) , t_bo       )
-         CALL tab_2d_1d( npti, nptidx(1:npti), sfx_opw_1d   (1:npti) , sfx_opw    )
-         CALL tab_2d_1d( npti, nptidx(1:npti), wfx_opw_1d   (1:npti) , wfx_opw    )
-         CALL tab_2d_1d( npti, nptidx(1:npti), zh_newice    (1:npti) , ht_i_new   )
-         CALL tab_2d_1d( npti, nptidx(1:npti), zfraz_frac_1d(1:npti) , fraz_frac  )
-
-         CALL tab_2d_1d( npti, nptidx(1:npti), hfx_thd_1d(1:npti) , hfx_thd    )
-         CALL tab_2d_1d( npti, nptidx(1:npti), hfx_opw_1d(1:npti) , hfx_opw    )
-         CALL tab_2d_1d( npti, nptidx(1:npti), rn_amax_1d(1:npti) , rn_amax_2d )
-         CALL tab_2d_1d( npti, nptidx(1:npti), sss_1d    (1:npti) , sss_m      )
+         CALL tab_2d_1d( npti, nptidx(1:npti), at_i_1d(1:npti)  , at_i        )
+         CALL tab_3d_2d( npti, nptidx(1:npti), a_i_2d (1:npti,:), a_i (:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), v_i_2d (1:npti,:), v_i (:,:,:) )
+         CALL tab_3d_2d( npti, nptidx(1:npti), sv_i_2d(1:npti,:), sv_i(:,:,:) )
+         CALL tab_4d_3d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i  )
+         CALL tab_2d_1d( npti, nptidx(1:npti), qlead_1d     (1:npti), qlead      )
+         CALL tab_2d_1d( npti, nptidx(1:npti), t_bo_1d      (1:npti), t_bo       )
+         CALL tab_2d_1d( npti, nptidx(1:npti), sfx_opw_1d   (1:npti), sfx_opw    )
+         CALL tab_2d_1d( npti, nptidx(1:npti), wfx_opw_1d   (1:npti), wfx_opw    )
+         CALL tab_2d_1d( npti, nptidx(1:npti), zh_newice    (1:npti), ht_i_new   )
+         CALL tab_2d_1d( npti, nptidx(1:npti), zfraz_frac_1d(1:npti), fraz_frac  )
+
+         CALL tab_2d_1d( npti, nptidx(1:npti), hfx_thd_1d(1:npti), hfx_thd    )
+         CALL tab_2d_1d( npti, nptidx(1:npti), hfx_opw_1d(1:npti), hfx_opw    )
+         CALL tab_2d_1d( npti, nptidx(1:npti), rn_amax_1d(1:npti), rn_amax_2d )
+         CALL tab_2d_1d( npti, nptidx(1:npti), sss_1d    (1:npti), sss_m      )
 
          ! Convert units for ice internal energy
          DO jl = 1, jpl
             DO jk = 1, nlay_i               
                WHERE( v_i_2d(1:npti,jl) > 0._wp )
-                  ze_i_2d(1:npti,jk,jl) = ze_i_2d(1:npti,jk,jl) / v_i_2d(1:npti,jl) * REAL( nlay_i )
+                  e_i_2d(1:npti,jk,jl) = e_i_2d(1:npti,jk,jl) / v_i_2d(1:npti,jl) * REAL( nlay_i )
                ELSEWHERE
-                  ze_i_2d(1:npti,jk,jl) = 0._wp
+                  e_i_2d(1:npti,jk,jl) = 0._wp
                END WHERE
             END DO
          END DO
 
-         ! Keep old ice areas and volume in memory
-         zv_b(1:npti,:) = v_i_2d(1:npti,:) 
-         za_b(1:npti,:) = a_i_2d(1:npti,:)
-
          ! --- Salinity of new ice --- ! 
          SELECT CASE ( nn_icesal )
          CASE ( 1 )                    ! Sice = constant 
@@ -170,23 +158,30 @@ CONTAINS
          CASE ( 3 )                    ! Sice = F(z) [multiyear ice]
             zs_newice(1:npti) =   2.3
          END SELECT
-
-         ! --- Heat content of new ice --- !
-         ! We assume that new ice is formed at the seawater freezing point
-         DO ji = 1, npti
-            ztmelts       = - rTmlt * zs_newice(ji)                  ! Melting point (C)
-            ze_newice(ji) =   rhoi * (  rcpi  * ( ztmelts - ( t_bo_1d(ji) - rt0 ) )                     &
-               &                      + rLfus * ( 1.0 - ztmelts / MIN( t_bo_1d(ji) - rt0, -epsi10 ) )   &
-               &                      - rcp   *         ztmelts )
-         END DO
-
-         ! --- Age of new ice --- !
-         zo_newice(1:npti) = 0._wp
-
-         ! --- Volume of new ice --- !
+         !
+         !                       ! ==================== !
+         !                       ! Start main loop here !
+         !                       ! ==================== !
          DO ji = 1, npti
-
-            zEi           = - ze_newice(ji) * r1_rhoi              ! specific enthalpy of forming ice [J/kg]
+            
+            ! Keep old ice areas and volume in memory
+            DO jl = 1, jpl
+               zv_b(jl) = v_i_2d(ji,jl) 
+               za_b(jl) = a_i_2d(ji,jl)
+            ENDDO
+            
+            ! --- Heat content of new ice --- !
+            ! We assume that new ice is formed at the seawater freezing point
+            ztmelts   = - rTmlt * zs_newice(ji)                  ! Melting point (C)
+            ze_newice =   rhoi * (  rcpi  * ( ztmelts - ( t_bo_1d(ji) - rt0 ) )                     &
+               &                  + rLfus * ( 1.0 - ztmelts / MIN( t_bo_1d(ji) - rt0, -epsi10 ) )   &
+               &                  - rcp   *         ztmelts )
+            
+            ! --- Age of new ice --- !
+            zo_newice = 0._wp
+
+            ! --- Volume of new ice --- !
+            zEi           = - ze_newice * r1_rhoi                  ! specific enthalpy of forming ice [J/kg]
 
             zEw           = rcp * ( t_bo_1d(ji) - rt0 )            ! specific enthalpy of seawater at t_bo_1d [J/kg]
                                                                    ! clem: we suppose we are already at the freezing point (condition qlead<0 is satisfyied) 
@@ -195,7 +190,7 @@ CONTAINS
                                               
             zfmdt         = - qlead_1d(ji) / zdE                   ! Fm.dt [kg/m2] (<0) 
                                                                    ! clem: we use qlead instead of zqld (icethd) because we suppose we are at the freezing point   
-            zv_newice(ji) = - zfmdt * r1_rhoi
+            zv_newice     = - zfmdt * r1_rhoi
 
             zQm           = zfmdt * zEw                            ! heat to the ocean >0 associated with mass flux  
 
@@ -204,120 +199,102 @@ CONTAINS
             ! Total heat flux used in this process [W.m-2]  
             hfx_opw_1d(ji) = hfx_opw_1d(ji) - zfmdt * zdE * r1_Dt_ice
             ! mass flux
-            wfx_opw_1d(ji) = wfx_opw_1d(ji) - zv_newice(ji) * rhoi * r1_Dt_ice
+            wfx_opw_1d(ji) = wfx_opw_1d(ji) - zv_newice * rhoi * r1_Dt_ice
             ! salt flux
-            sfx_opw_1d(ji) = sfx_opw_1d(ji) - zv_newice(ji) * rhoi * zs_newice(ji) * r1_Dt_ice
-         END DO
+            sfx_opw_1d(ji) = sfx_opw_1d(ji) - zv_newice * rhoi * zs_newice(ji) * r1_Dt_ice
          
-         ! A fraction fraz_frac of frazil ice is accreted at the ice bottom
-         DO ji = 1, npti
-            rswitch       = 1._wp - MAX( 0._wp, SIGN( 1._wp , - at_i_1d(ji) ) )
-            zv_frazb(ji)  =           zfraz_frac_1d(ji) * rswitch   * zv_newice(ji)
-            zv_newice(ji) = ( 1._wp - zfraz_frac_1d(ji) * rswitch ) * zv_newice(ji)
-         END DO
-         
-         ! --- Area of new ice --- !
-         DO ji = 1, npti
-            za_newice(ji) = zv_newice(ji) / zh_newice(ji)
-         END DO
+            ! A fraction fraz_frac of frazil ice is accreted at the ice bottom
+            IF( at_i_1d(ji) > 0._wp ) THEN
+               zv_frazb  =           zfraz_frac_1d(ji)   * zv_newice
+               zv_newice = ( 1._wp - zfraz_frac_1d(ji) ) * zv_newice
+            ELSE
+               zv_frazb  = 0._wp
+            ENDIF
+            ! --- Area of new ice --- !
+            za_newice = zv_newice / zh_newice(ji)
 
-         !------------------------------------------------------------------------------!
-         ! 2) Redistribute new ice area and volume into ice categories                  !
-         !------------------------------------------------------------------------------!
 
-         ! --- lateral ice growth --- !
-         ! If lateral ice growth gives an ice concentration > amax, then
-         ! we keep the excessive volume in memory and attribute it later to bottom accretion
-         DO ji = 1, npti
-            IF ( za_newice(ji) >  MAX( 0._wp, rn_amax_1d(ji) - at_i_1d(ji) ) ) THEN ! max is for roundoff error
-               zda_res(ji)   = za_newice(ji) - MAX( 0._wp, rn_amax_1d(ji) - at_i_1d(ji) )
-               zdv_res(ji)   = zda_res  (ji) * zh_newice(ji) 
-               za_newice(ji) = MAX( 0._wp, za_newice(ji) - zda_res  (ji) )
-               zv_newice(ji) = MAX( 0._wp, zv_newice(ji) - zdv_res  (ji) )
+            ! --- Redistribute new ice area and volume into ice categories --- !
+
+            ! --- lateral ice growth --- !
+            ! If lateral ice growth gives an ice concentration > amax, then
+            ! we keep the excessive volume in memory and attribute it later to bottom accretion
+            IF ( za_newice >  MAX( 0._wp, rn_amax_1d(ji) - at_i_1d(ji) ) ) THEN ! max is for roundoff error
+               zda_res   = za_newice - MAX( 0._wp, rn_amax_1d(ji) - at_i_1d(ji) )
+               zdv_res   = zda_res * zh_newice(ji) 
+               za_newice = MAX( 0._wp, za_newice - zda_res )
+               zv_newice = MAX( 0._wp, zv_newice - zdv_res )
             ELSE
-               zda_res(ji) = 0._wp
-               zdv_res(ji) = 0._wp
+               zda_res = 0._wp
+               zdv_res = 0._wp
             ENDIF
-         END DO
 
-         ! find which category to fill
-         DO jl = 1, jpl
-            DO ji = 1, npti
+            ! find which category to fill
+            at_i_1d(ji) = 0._wp
+            DO jl = 1, jpl
                IF( zh_newice(ji) > hi_max(jl-1) .AND. zh_newice(ji) <= hi_max(jl) ) THEN
-                  a_i_2d(ji,jl) = a_i_2d(ji,jl) + za_newice(ji)
-                  v_i_2d(ji,jl) = v_i_2d(ji,jl) + zv_newice(ji)
-                  jcat(ji) = jl
+                  a_i_2d(ji,jl) = a_i_2d(ji,jl) + za_newice
+                  v_i_2d(ji,jl) = v_i_2d(ji,jl) + zv_newice
+                  jcat = jl
                ENDIF
+               at_i_1d(ji) = at_i_1d(ji) + a_i_2d(ji,jl)
             END DO
-         END DO
-         at_i_1d(1:npti) = SUM( a_i_2d(1:npti,:), dim=2 )
-
-         ! Heat content
-         DO ji = 1, npti
-            jl = jcat(ji)                                                    ! categroy in which new ice is put
-            zswinew  (ji) = MAX( 0._wp , SIGN( 1._wp , - za_b(ji,jl) ) )   ! 0 if old ice
-         END DO
-
-         DO jk = 1, nlay_i
-            DO ji = 1, npti
-               jl = jcat(ji)
-               rswitch = MAX( 0._wp, SIGN( 1._wp , v_i_2d(ji,jl) - epsi20 ) )
-               ze_i_2d(ji,jk,jl) = zswinew(ji)   *   ze_newice(ji) +                                                    &
-                  &        ( 1.0 - zswinew(ji) ) * ( ze_newice(ji) * zv_newice(ji) + ze_i_2d(ji,jk,jl) * zv_b(ji,jl) )  &
-                  &        * rswitch / MAX( v_i_2d(ji,jl), epsi20 )
-            END DO
-         END DO
 
-         ! --- bottom ice growth + ice enthalpy remapping --- !
-         DO jl = 1, jpl
-
-            ! for remapping
-            h_i_old (1:npti,0:nlay_i+1) = 0._wp
-            eh_i_old(1:npti,0:nlay_i+1) = 0._wp
-            DO jk = 1, nlay_i
-               DO ji = 1, npti
-                  h_i_old (ji,jk) = v_i_2d(ji,jl) * r1_nlay_i
-                  eh_i_old(ji,jk) = ze_i_2d(ji,jk,jl) * h_i_old(ji,jk)
+            ! Heat content
+            jl = jcat                                             ! categroy in which new ice is put
+            IF( za_b(jl) > 0._wp ) THEN   
+               e_i_2d(ji,:,jl) = ( ze_newice * zv_newice + e_i_2d(ji,:,jl) * zv_b(jl) ) / MAX( v_i_2d(ji,jl), epsi20 )
+            ELSE
+               e_i_2d(ji,:,jl) = ze_newice   
+            ENDIF
+         
+            ! --- bottom ice growth + ice enthalpy remapping --- !
+            DO jl = 1, jpl
+               
+               ! for remapping
+               zh_i_old(0:nlay_i+1) = 0._wp
+               ze_i_old(0:nlay_i+1) = 0._wp
+               DO jk = 1, nlay_i
+                  zh_i_old(jk) = v_i_2d(ji,jl) * r1_nlay_i
+                  ze_i_old(jk) = e_i_2d(ji,jk,jl) * v_i_2d(ji,jl) * r1_nlay_i
                END DO
-            END DO
 
-            ! new volumes including lateral/bottom accretion + residual
-            DO ji = 1, npti
-               rswitch        = MAX( 0._wp, SIGN( 1._wp , at_i_1d(ji) - epsi20 ) )
-               zv_newfra     = rswitch * ( zdv_res(ji) + zv_frazb(ji) ) * a_i_2d(ji,jl) / MAX( at_i_1d(ji) , epsi20 )
-               a_i_2d(ji,jl) = rswitch * a_i_2d(ji,jl)               
+               ! new volumes including lateral/bottom accretion + residual
+               IF( at_i_1d(ji) >= epsi20 ) THEN
+                  zv_newfra     = ( zdv_res + zv_frazb ) * a_i_2d(ji,jl) / MAX( at_i_1d(ji) , epsi20 )
+               ELSE                  
+                  zv_newfra     = 0._wp
+                  a_i_2d(ji,jl) = 0._wp
+               ENDIF
                v_i_2d(ji,jl) = v_i_2d(ji,jl) + zv_newfra
                ! for remapping
-               h_i_old (ji,nlay_i+1) = zv_newfra
-               eh_i_old(ji,nlay_i+1) = ze_newice(ji) * zv_newfra
-            END DO
-            ! --- Ice enthalpy remapping --- !
-            CALL ice_thd_ent( ze_i_2d(1:npti,:,jl) ) 
-         END DO
-
-         ! --- Update salinity --- !
-         DO jl = 1, jpl
-            DO ji = 1, npti
-               sv_i_2d(ji,jl) = sv_i_2d(ji,jl) + zs_newice(ji) * ( v_i_2d(ji,jl) - zv_b(ji,jl) )
+               zh_i_old(nlay_i+1) = zv_newfra
+               ze_i_old(nlay_i+1) = ze_newice * zv_newfra
+           
+               ! --- Update salinity --- !
+               sv_i_2d(ji,jl) = sv_i_2d(ji,jl) + zs_newice(ji) * ( v_i_2d(ji,jl) - zv_b(jl) )
+               
+               ! --- Ice enthalpy remapping --- !
+               e_i_2d(ji,:,jl) = ice_ent2( zh_i_old(:), ze_i_old(:) ) 
             END DO
-         END DO
-
+            
+         END DO ! npti
+         !                       ! ================== !
+         !                       ! End main loop here !
+         !                       ! ================== !
+         !
          ! Change units for e_i
          DO jl = 1, jpl
             DO jk = 1, nlay_i
-               ze_i_2d(1:npti,jk,jl) = ze_i_2d(1:npti,jk,jl) * v_i_2d(1:npti,jl) * r1_nlay_i 
+               e_i_2d(1:npti,jk,jl) = e_i_2d(1:npti,jk,jl) * v_i_2d(1:npti,jl) * r1_nlay_i 
             END DO
          END DO
 
          ! Move 2D vectors to 1D vectors 
-         CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,1:jpl), a_i (:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,1:jpl), v_i (:,:,:) )
-         CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,1:jpl), sv_i(:,:,:) )
-          DO jl = 1, jpl
-            DO jk = 1, nlay_i
-               CALL tab_1d_2d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) )
-            END DO
-         END DO
+         CALL tab_2d_3d( npti, nptidx(1:npti), a_i_2d (1:npti,:), a_i (:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), v_i_2d (1:npti,:), v_i (:,:,:) )
+         CALL tab_2d_3d( npti, nptidx(1:npti), sv_i_2d(1:npti,:), sv_i(:,:,:) )
+         CALL tab_3d_4d( npti, nptidx(1:npti), e_i_2d (1:npti,:,:), e_i  )
          CALL tab_1d_2d( npti, nptidx(1:npti), sfx_opw_1d(1:npti), sfx_opw )
          CALL tab_1d_2d( npti, nptidx(1:npti), wfx_opw_1d(1:npti), wfx_opw )
          CALL tab_1d_2d( npti, nptidx(1:npti), hfx_thd_1d(1:npti), hfx_thd )
@@ -325,6 +302,8 @@ CONTAINS
          !
       ENDIF ! npti > 0
       !
+      ! the following fields need to be updated on the halos (done in icethd): a_i, v_i, sv_i, e_i 
+      !
       IF( ln_icediachk )   CALL ice_cons_hsm(1, 'icethd_do', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft)
       IF( ln_icediachk )   CALL ice_cons2D  (1, 'icethd_do',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft)
       !
@@ -372,26 +351,31 @@ CONTAINS
          DO_2D( 0, 0, 0, 0 )
             IF ( qlead(ji,jj) < 0._wp ) THEN ! cooling
                ! -- Wind stress -- !
-               ztaux = ( utau_ice(ji-1,jj  ) * umask(ji-1,jj  ,1) + utau_ice(ji,jj) * umask(ji,jj,1) ) * 0.5_wp
-               ztauy = ( vtau_ice(ji  ,jj-1) * vmask(ji  ,jj-1,1) + vtau_ice(ji,jj) * vmask(ji,jj,1) ) * 0.5_wp
+               ztaux = utau_ice(ji,jj) * smask0(ji,jj)
+               ztauy = vtau_ice(ji,jj) * smask0(ji,jj)
                ! Square root of wind stress
                ztenagm = SQRT( SQRT( ztaux * ztaux + ztauy * ztauy ) )
 
                ! -- Frazil ice velocity -- !
-               rswitch = MAX( 0._wp, SIGN( 1._wp , ztenagm - epsi10 ) )
-               zvfrx   = rswitch * zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 )
-               zvfry   = rswitch * zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 )
-
+               IF( ztenagm >= epsi10 ) THEN
+                  zvfrx = zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 )
+                  zvfry = zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 )
+               ELSE
+                  zvfrx = 0._wp
+                  zvfry = 0._wp
+               ENDIF
                ! -- Pack ice velocity -- !
-               zvgx    = ( u_ice(ji-1,jj  ) * umask(ji-1,jj  ,1)  + u_ice(ji,jj) * umask(ji,jj,1) ) * 0.5_wp
-               zvgy    = ( v_ice(ji  ,jj-1) * vmask(ji  ,jj-1,1)  + v_ice(ji,jj) * vmask(ji,jj,1) ) * 0.5_wp
-
-               ! -- Relative frazil/pack ice velocity -- !
-               rswitch = MAX( 0._wp, SIGN( 1._wp , at_i(ji,jj) - epsi10 ) )
-               zvrel2  = MAX( (zvfrx - zvgx)*(zvfrx - zvgx) + (zvfry - zvgy)*(zvfry - zvgy), 0.15_wp*0.15_wp ) * rswitch
-
-               ! -- fraction of frazil ice -- !
-               fraz_frac(ji,jj) = rswitch * ( TANH( rn_Cfraz * ( SQRT(zvrel2) - rn_vfraz ) ) + 1._wp ) * 0.5_wp * rn_maxfraz
+               zvgx = ( u_ice(ji-1,jj  ) * umask(ji-1,jj  ,1)  + u_ice(ji,jj) * umask(ji,jj,1) ) * 0.5_wp
+               zvgy = ( v_ice(ji  ,jj-1) * vmask(ji  ,jj-1,1)  + v_ice(ji,jj) * vmask(ji,jj,1) ) * 0.5_wp
+
+               ! -- Relative frazil/pack ice velocity & fraction of frazil ice-- !
+               IF( at_i(ji,jj) >= epsi10 ) THEN
+                  zvrel2 = MAX( (zvfrx - zvgx)*(zvfrx - zvgx) + (zvfry - zvgy)*(zvfry - zvgy), 0.15_wp*0.15_wp )
+                  fraz_frac(ji,jj) = ( TANH( rn_Cfraz * ( SQRT(zvrel2) - rn_vfraz ) ) + 1._wp ) * 0.5_wp * rn_maxfraz
+               ELSE
+                  zvrel2 = 0._wp
+                  fraz_frac(ji,jj) = 0._wp
+               ENDIF
                
                ! -- new ice thickness (iterative loop) -- !
                ht_i_new(ji,jj) = zhicrit +   ( zhicrit + 0.1_wp )    &
@@ -415,11 +399,95 @@ CONTAINS
             !
          END_2D
          ! 
-         CALL lbc_lnk( 'icethd_frazil', fraz_frac, 'T', 1.0_wp, ht_i_new, 'T', 1.0_wp  )
-
       ENDIF
    END SUBROUTINE ice_thd_frazil
 
+   FUNCTION ice_ent2( ph_old, pe_old )
+      !!-------------------------------------------------------------------
+      !!               ***   ROUTINE ice_ent2  ***
+      !!
+      !! ** Purpose :
+      !!           This routine computes new vertical grids in the ice, 
+      !!           and consistently redistributes temperatures. 
+      !!           Redistribution is made so as to ensure to energy conservation
+      !!
+      !!
+      !! ** Method  : linear conservative remapping
+      !!           
+      !! ** Steps : 1) cumulative integrals of old enthalpies/thicknesses
+      !!            2) linear remapping on the new layers
+      !!
+      !! ------------ cum0(0)                        ------------- cum1(0)
+      !!                                    NEW      -------------
+      !! ------------ cum0(1)               ==>      -------------
+      !!     ...                                     -------------
+      !! ------------                                -------------
+      !! ------------ cum0(nlay_i+2)                 ------------- cum1(nlay_i)
+      !!
+      !!
+      !! References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
+      !!-------------------------------------------------------------------
+      REAL(wp), DIMENSION(0:nlay_i+1), INTENT(in) ::   ph_old, pe_old  ! old tickness and enthlapy
+      REAL(wp), DIMENSION(1:nlay_i)               ::   ice_ent2        ! new enthlapies (J.m-3, remapped)
+      !
+      INTEGER  :: ji         !  dummy loop indices
+      INTEGER  :: jk0, jk1   !  old/new layer indices
+      !
+      REAL(wp), DIMENSION(0:nlay_i+2) ::   zeh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces
+      REAL(wp), DIMENSION(0:nlay_i)   ::   zeh_cum1, zh_cum1   ! new cumulative enthlapies and layers interfaces
+      REAL(wp)                        ::   zhnew               ! new layers thicknesses
+      !!-------------------------------------------------------------------
+
+      !--------------------------------------------------------------------------
+      !  1) Cumulative integral of old enthalpy * thickness and layers interfaces
+      !--------------------------------------------------------------------------
+      zeh_cum0(0) = 0._wp 
+      zh_cum0 (0) = 0._wp
+      DO jk0 = 1, nlay_i+2
+         zeh_cum0(jk0) = zeh_cum0(jk0-1) + pe_old(jk0-1)
+         zh_cum0 (jk0) = zh_cum0 (jk0-1) + ph_old(jk0-1)
+      END DO
+
+      !------------------------------------
+      !  2) Interpolation on the new layers
+      !------------------------------------
+      ! new layer thickesses
+      zhnew = SUM( ph_old(0:nlay_i+1) ) * r1_nlay_i  
+
+      ! new layers interfaces
+      zh_cum1(0) = 0._wp
+      DO jk1 = 1, nlay_i
+         zh_cum1(jk1) = zh_cum1(jk1-1) + zhnew
+      END DO
+
+      zeh_cum1(0:nlay_i) = 0._wp 
+      ! new cumulative q*h => linear interpolation
+      DO jk0 = 1, nlay_i+2
+         DO jk1 = 1, nlay_i-1
+            IF( zh_cum1(jk1) <= zh_cum0(jk0) .AND. zh_cum1(jk1) > zh_cum0(jk0-1) )   THEN
+               zeh_cum1(jk1) = ( zeh_cum0(jk0-1) * ( zh_cum0(jk0) - zh_cum1(jk1  ) ) +  &
+                  &              zeh_cum0(jk0  ) * ( zh_cum1(jk1) - zh_cum0(jk0-1) ) )  &
+                  &            / ( zh_cum0(jk0) - zh_cum0(jk0-1) )
+            ENDIF
+         END DO
+      END DO
+      ! to ensure that total heat content is strictly conserved, set:
+      zeh_cum1(nlay_i) = zeh_cum0(nlay_i+2) 
+
+      ! new enthalpies
+      DO jk1 = 1, nlay_i
+         ice_ent2(jk1) = MAX( 0._wp, zeh_cum1(jk1) - zeh_cum1(jk1-1) ) / MAX( zhnew, epsi20 ) ! max for roundoff error
+      END DO
+
+      ! --- diag error on heat remapping --- !
+      ! comment: if input h_old and eh_old are already multiplied by a_i (as in icethd_do), 
+      ! then we should not (* a_i) again but not important since this is just to check that remap error is ~0
+      !   hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_Dt_ice *  &
+      !      &               ( SUM( pe_new(ji,1:nlay_i) ) * zhnew(ji) - SUM( eh_old(ji,0:nlay_i+1) ) ) 
+
+      
+   END FUNCTION ice_ent2
+
    
    SUBROUTINE ice_thd_do_init
       !!-----------------------------------------------------------------------
diff --git a/src/ICE/icethd_ent.F90 b/src/ICE/icethd_ent.F90
deleted file mode 100644
index 286e570e..00000000
--- a/src/ICE/icethd_ent.F90
+++ /dev/null
@@ -1,144 +0,0 @@
-MODULE icethd_ent
-   !!======================================================================
-   !!                       ***  MODULE icethd_ent   ***
-   !!   sea-ice: redistribution of enthalpy in the ice on the new vertical grid
-   !!                       after vertical growth/melt
-   !!======================================================================
-   !! History :       !  2003-05  (M. Vancoppenolle) Original code in 1D
-   !!                 !  2005-07  (M. Vancoppenolle) 3D version 
-   !!            3.6  !  2014-05  (C. Rousset)       New version
-   !!            4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
-   !!----------------------------------------------------------------------
-#if defined key_si3
-   !!----------------------------------------------------------------------
-   !!   'key_si3'                                       SI3 sea-ice model
-   !!----------------------------------------------------------------------
-   !!   ice_thd_ent   : ice redistribution of enthalpy
-   !!----------------------------------------------------------------------
-   USE dom_oce        ! domain variables
-   USE domain         !
-   USE phycst         ! physical constants
-   USE ice            ! sea-ice: variables
-   USE ice1D          ! sea-ice: thermodynamics variables
-   !
-   USE in_out_manager ! I/O manager
-   USE lib_mpp        ! MPP library
-   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)  
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   ice_thd_ent         ! called by icethd and icethd_do
-
-   !!----------------------------------------------------------------------
-   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
-   !! $Id: icethd_ent.F90 14778 2021-05-03 08:58:22Z clem $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
- 
-   SUBROUTINE ice_thd_ent( qnew )
-      !!-------------------------------------------------------------------
-      !!               ***   ROUTINE ice_thd_ent  ***
-      !!
-      !! ** Purpose :
-      !!           This routine computes new vertical grids in the ice, 
-      !!           and consistently redistributes temperatures. 
-      !!           Redistribution is made so as to ensure to energy conservation
-      !!
-      !!
-      !! ** Method  : linear conservative remapping
-      !!           
-      !! ** Steps : 1) cumulative integrals of old enthalpies/thicknesses
-      !!            2) linear remapping on the new layers
-      !!
-      !! ------------ cum0(0)                        ------------- cum1(0)
-      !!                                    NEW      -------------
-      !! ------------ cum0(1)               ==>      -------------
-      !!     ...                                     -------------
-      !! ------------                                -------------
-      !! ------------ cum0(nlay_i+2)                 ------------- cum1(nlay_i)
-      !!
-      !!
-      !! References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005
-      !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   qnew             ! new enthlapies (J.m-3, remapped)
-      !
-      INTEGER  :: ji         !  dummy loop indices
-      INTEGER  :: jk0, jk1   !  old/new layer indices
-      !
-      REAL(wp), DIMENSION(jpij,0:nlay_i+2) ::   zeh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces
-      REAL(wp), DIMENSION(jpij,0:nlay_i)   ::   zeh_cum1, zh_cum1   ! new cumulative enthlapies and layers interfaces
-      REAL(wp), DIMENSION(jpij)            ::   zhnew               ! new layers thicknesses
-      !!-------------------------------------------------------------------
-
-      !--------------------------------------------------------------------------
-      !  1) Cumulative integral of old enthalpy * thickness and layers interfaces
-      !--------------------------------------------------------------------------
-      zeh_cum0(1:npti,0) = 0._wp 
-      zh_cum0 (1:npti,0) = 0._wp
-      DO jk0 = 1, nlay_i+2
-         DO ji = 1, npti
-            zeh_cum0(ji,jk0) = zeh_cum0(ji,jk0-1) + eh_i_old(ji,jk0-1)
-            zh_cum0 (ji,jk0) = zh_cum0 (ji,jk0-1) + h_i_old (ji,jk0-1)
-         END DO
-      END DO
-
-      !------------------------------------
-      !  2) Interpolation on the new layers
-      !------------------------------------
-      ! new layer thickesses
-      DO ji = 1, npti
-         zhnew(ji) = SUM( h_i_old(ji,0:nlay_i+1) ) * r1_nlay_i  
-      END DO
-
-      ! new layers interfaces
-      zh_cum1(1:npti,0) = 0._wp
-      DO jk1 = 1, nlay_i
-         DO ji = 1, npti
-            zh_cum1(ji,jk1) = zh_cum1(ji,jk1-1) + zhnew(ji)
-         END DO
-      END DO
-
-      zeh_cum1(1:npti,0:nlay_i) = 0._wp 
-      ! new cumulative q*h => linear interpolation
-      DO jk0 = 1, nlay_i+2
-         DO jk1 = 1, nlay_i-1
-            DO ji = 1, npti
-               IF( zh_cum1(ji,jk1) <= zh_cum0(ji,jk0) .AND. zh_cum1(ji,jk1) > zh_cum0(ji,jk0-1) ) THEN
-                  zeh_cum1(ji,jk1) = ( zeh_cum0(ji,jk0-1) * ( zh_cum0(ji,jk0) - zh_cum1(ji,jk1  ) ) +  &
-                     &                 zeh_cum0(ji,jk0  ) * ( zh_cum1(ji,jk1) - zh_cum0(ji,jk0-1) ) )  &
-                     &             / ( zh_cum0(ji,jk0) - zh_cum0(ji,jk0-1) )
-               ENDIF
-            END DO
-         END DO
-      END DO
-      ! to ensure that total heat content is strictly conserved, set:
-      zeh_cum1(1:npti,nlay_i) = zeh_cum0(1:npti,nlay_i+2) 
-
-      ! new enthalpies
-      DO jk1 = 1, nlay_i
-         DO ji = 1, npti
-            rswitch      = MAX( 0._wp , SIGN( 1._wp , zhnew(ji) - epsi20 ) ) 
-            qnew(ji,jk1) = rswitch * MAX( 0._wp, zeh_cum1(ji,jk1) - zeh_cum1(ji,jk1-1) ) / MAX( zhnew(ji), epsi20 ) ! max for roundoff error
-         END DO
-      END DO
-
-      ! --- diag error on heat remapping --- !
-      ! comment: if input h_i_old and eh_i_old are already multiplied by a_i (as in icethd_do), 
-      ! then we should not (* a_i) again but not important since this is just to check that remap error is ~0
-      !DO ji = 1, npti
-      !   hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_Dt_ice *  &
-      !      &               ( SUM( qnew(ji,1:nlay_i) ) * zhnew(ji) - SUM( eh_i_old(ji,0:nlay_i+1) ) ) 
-      !END DO
-      
-   END SUBROUTINE ice_thd_ent
-
-#else
-   !!----------------------------------------------------------------------
-   !!   Default option                                NO SI3 sea-ice model
-   !!----------------------------------------------------------------------
-#endif
-
-   !!======================================================================
-END MODULE icethd_ent
diff --git a/src/ICE/icethd_pnd.F90 b/src/ICE/icethd_pnd.F90
index f0949d8f..8f5b63df 100644
--- a/src/ICE/icethd_pnd.F90
+++ b/src/ICE/icethd_pnd.F90
@@ -84,7 +84,7 @@ CONTAINS
       INTEGER ::   ji, jj, jl        ! loop indices
       !!-------------------------------------------------------------------
 
-      ALLOCATE( diag_dvpn_mlt(jpi,jpj), diag_dvpn_lid(jpi,jpj), diag_dvpn_drn(jpi,jpj), diag_dvpn_rnf(jpi,jpj) )
+      ALLOCATE( diag_dvpn_mlt(A2D(0)) , diag_dvpn_lid(A2D(0)) , diag_dvpn_drn(A2D(0)) , diag_dvpn_rnf(A2D(0))  )
       ALLOCATE( diag_dvpn_mlt_1d(jpij), diag_dvpn_lid_1d(jpij), diag_dvpn_drn_1d(jpij), diag_dvpn_rnf_1d(jpij) )
       !
       diag_dvpn_mlt (:,:) = 0._wp   ;   diag_dvpn_drn (:,:) = 0._wp
@@ -98,7 +98,7 @@ CONTAINS
       at_i(:,:) = SUM( a_i, dim=3 )
       !
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( v_i(ji,jj,jl) < epsi10 .OR. at_i(ji,jj) < epsi10 ) THEN
                wfx_pnd  (ji,jj)    = wfx_pnd(ji,jj) + ( v_ip(ji,jj,jl) + v_il(ji,jj,jl) ) * rhow * r1_Dt_ice
                a_ip     (ji,jj,jl) = 0._wp
@@ -115,7 +115,7 @@ CONTAINS
       !  Identify grid cells with ice
       !------------------------------
       npti = 0   ;   nptidx(:) = 0
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( at_i(ji,jj) >= epsi10 ) THEN
             npti = npti + 1
             nptidx( npti ) = (jj - 1) * jpi + ji
@@ -137,6 +137,8 @@ CONTAINS
          END SELECT
       ENDIF
 
+      ! the following fields need to be updated in the halos (done in icethd): a_ip, v_ip, v_il, h_ip, h_il
+
       !------------------------------------
       !  Diagnostics
       !------------------------------------
@@ -529,7 +531,7 @@ CONTAINS
          zv_pnd  , &     ! volume of meltwater contributing to ponds
          zv_mlt          ! total amount of meltwater produced
 
-      REAL(wp), DIMENSION(jpi,jpj) ::   zvolp_ini , &   !! total melt pond water available before redistribution and drainage
+      REAL(wp), DIMENSION(A2D(0)) ::   zvolp_ini , &   !! total melt pond water available before redistribution and drainage
                                         zvolp     , &   !! total melt pond water volume
                                         zvolp_res       !! remaining melt pond water available after drainage
 
@@ -589,7 +591,7 @@ CONTAINS
       zvolp(:,:) = 0._wp
 
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
 
                IF ( a_i(ji,jj,jl) > epsi10 ) THEN
 
@@ -637,7 +639,7 @@ CONTAINS
 
       IF( ln_pnd_lids ) THEN
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
 
             IF ( at_i(ji,jj) > 0.01 .AND. hm_i(ji,jj) > rn_himin .AND. zvolp_ini(ji,jj) > zvp_min * at_i(ji,jj) ) THEN
 
@@ -764,7 +766,7 @@ CONTAINS
 
       DO jl = 1, jpl
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
 
 !              ! zap lids on small ponds
 !              IF ( a_i(ji,jj,jl) > epsi10 .AND. v_ip(ji,jj,jl) < epsi10 &
@@ -826,7 +828,7 @@ CONTAINS
        !!
        !!------------------------------------------------------------------
 
-       REAL (wp), DIMENSION(jpi,jpj), INTENT(INOUT) :: &
+       REAL (wp), DIMENSION(A2D(0)), INTENT(INOUT) :: &
           zvolp,                                       &  ! total available pond water
           zdvolp                                          ! remaining meltwater after redistribution
 
@@ -865,10 +867,10 @@ CONTAINS
 
       INTEGER  ::   ji, jj, jk, jl                    ! loop indices
 
-       a_ip(:,:,:) = 0._wp
-       h_ip(:,:,:) = 0._wp
+       a_ip(A2D(0),:) = 0._wp
+       h_ip(A2D(0),:) = 0._wp
 
-       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+       DO_2D( 0, 0, 0, 0 )
 
              IF ( at_i(ji,jj) > 0.01 .AND. hm_i(ji,jj) > rn_himin .AND. zvolp(ji,jj) > zvp_min * at_i(ji,jj) ) THEN
 
diff --git a/src/ICE/icethd_zdf_bl99.F90 b/src/ICE/icethd_zdf_bl99.F90
index 493435f3..c6866259 100644
--- a/src/ICE/icethd_zdf_bl99.F90
+++ b/src/ICE/icethd_zdf_bl99.F90
@@ -76,12 +76,9 @@ CONTAINS
       !
       INTEGER ::   ji, jk         ! spatial loop index
       INTEGER ::   jm             ! current reference number of equation
-      INTEGER ::   jm_mint, jm_maxt
       INTEGER ::   iconv          ! number of iterations in iterative procedure
       INTEGER ::   iconv_max = 50 ! max number of iterations in iterative procedure
       !
-      INTEGER, DIMENSION(jpij) ::   jm_min    ! reference number of top equation
-      INTEGER, DIMENSION(jpij) ::   jm_max    ! reference number of bottom equation
 
       LOGICAL, DIMENSION(jpij) ::   l_T_converged   ! true when T converges (per grid point)
       !
@@ -105,22 +102,17 @@ CONTAINS
       REAL(wp), DIMENSION(jpij) ::   zh_i, z1_h_i ! ice layer thickness
       REAL(wp), DIMENSION(jpij) ::   zh_s, z1_h_s ! snow layer thickness
       REAL(wp), DIMENSION(jpij) ::   zqns_ice_b   ! solar radiation absorbed at the surface
-      REAL(wp), DIMENSION(jpij) ::   zfnet        ! surface flux function
       REAL(wp), DIMENSION(jpij) ::   zdqns_ice_b  ! derivative of the surface flux function
-      !
-      REAL(wp), DIMENSION(jpij       )   ::   ztsuold     ! Old surface temperature in the ice
-      REAL(wp), DIMENSION(jpij,nlay_i)   ::   ztiold      ! Old temperature in the ice
-      REAL(wp), DIMENSION(jpij,nlay_s)   ::   ztsold      ! Old temperature in the snow
-      REAL(wp), DIMENSION(jpij,nlay_i)   ::   ztib        ! Temporary temperature in the ice to check the convergence
-      REAL(wp), DIMENSION(jpij,nlay_s)   ::   ztsb        ! Temporary temperature in the snow to check the convergence
-      REAL(wp), DIMENSION(jpij,0:nlay_i) ::   ztcond_i    ! Ice thermal conductivity
-      REAL(wp), DIMENSION(jpij,0:nlay_i) ::   ztcond_i_cp ! copy
+      REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zradtr_s    ! Radiation transmited through the snow
+      REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zradab_s    ! Radiation absorbed in the snow
       REAL(wp), DIMENSION(jpij,0:nlay_i) ::   zradtr_i    ! Radiation transmitted through the ice
       REAL(wp), DIMENSION(jpij,0:nlay_i) ::   zradab_i    ! Radiation absorbed in the ice
+      REAL(wp), DIMENSION(jpij,0:nlay_i) ::   ztcond_i    ! Ice thermal conductivity
+      REAL(wp), DIMENSION(jpij,0:nlay_i) ::   ztcond_i_cp ! copy
+      REAL(wp), DIMENSION(jpij,nlay_i)   ::   ztiold      ! Old temperature in the ice
+      REAL(wp), DIMENSION(jpij,nlay_s)   ::   ztsold      ! Old temperature in the snow
       REAL(wp), DIMENSION(jpij,0:nlay_i) ::   zkappa_i    ! Kappa factor in the ice
       REAL(wp), DIMENSION(jpij,0:nlay_i) ::   zeta_i      ! Eta factor in the ice
-      REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zradtr_s    ! Radiation transmited through the snow
-      REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zradab_s    ! Radiation absorbed in the snow
       REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zkappa_s    ! Kappa factor in the snow
       REAL(wp), DIMENSION(jpij,0:nlay_s) ::   zeta_s      ! Eta factor in the snow
       REAL(wp), DIMENSION(jpij)          ::   zkappa_comb ! Combined snow and ice surface conductivity
@@ -129,10 +121,16 @@ CONTAINS
       REAL(wp), DIMENSION(jpij)          ::   za_s_fra    ! ice fraction covered by snow
       REAL(wp), DIMENSION(jpij)          ::   isnow       ! snow presence (1) or not (0)
       REAL(wp), DIMENSION(jpij)          ::   isnow_comb  ! snow presence for met-office
-      REAL(wp), DIMENSION(jpij,nlay_i+nlay_s+1)   ::   zindterm    ! 'Ind'ependent term
-      REAL(wp), DIMENSION(jpij,nlay_i+nlay_s+1)   ::   zindtbis    ! Temporary 'ind'ependent term
-      REAL(wp), DIMENSION(jpij,nlay_i+nlay_s+1)   ::   zdiagbis    ! Temporary 'dia'gonal term
-      REAL(wp), DIMENSION(jpij,nlay_i+nlay_s+1,3) ::   ztrid       ! Tridiagonal system terms
+      !
+      INTEGER  ::   jm_min    ! reference number of top equation
+      INTEGER  ::   jm_max    ! reference number of bottom equation
+      REAL(wp) ::   zfnet     ! surface flux function
+      REAL(wp), DIMENSION(nlay_i)   ::   ztib        ! Temporary temperature in the ice to check the convergence
+      REAL(wp), DIMENSION(nlay_s)   ::   ztsb        ! Temporary temperature in the snow to check the convergence
+      REAL(wp), DIMENSION(nlay_i+nlay_s+1)   ::   zindterm    ! 'Ind'ependent term
+      REAL(wp), DIMENSION(nlay_i+nlay_s+1)   ::   zindtbis    ! Temporary 'ind'ependent term
+      REAL(wp), DIMENSION(nlay_i+nlay_s+1)   ::   zdiagbis    ! Temporary 'dia'gonal term
+      REAL(wp), DIMENSION(nlay_i+nlay_s+1,3) ::   ztrid       ! Tridiagonal system terms
       !
       ! Mono-category
       REAL(wp) ::   zepsilon   ! determines thres. above which computation of G(h) is done
@@ -195,7 +193,6 @@ CONTAINS
       ! Store initial temperatures and non solar heat fluxes
       IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
          ztsub      (1:npti) = t_su_1d(1:npti)                          ! surface temperature at iteration n-1
-         ztsuold    (1:npti) = t_su_1d(1:npti)                          ! surface temperature initial value
          t_su_1d    (1:npti) = MIN( t_su_1d(1:npti), rt0 - ztsu_err )   ! required to leave the choice between melting or not
          zdqns_ice_b(1:npti) = dqns_ice_1d(1:npti)                      ! derivative of incoming nonsolar flux
          zqns_ice_b (1:npti) = qns_ice_1d(1:npti)                       ! store previous qns_ice_1d value
@@ -230,9 +227,12 @@ CONTAINS
             !                             ! radiation absorbed by the layer-th ice layer
             zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk)
          END DO
+      END DO
+         !
+      DO ji = 1, npti
+         qtr_ice_bot_1d(ji) = zradtr_i(ji,nlay_i)   ! record radiation transmitted below the ice
       END DO
       !
-      qtr_ice_bot_1d(1:npti) = zradtr_i(1:npti,nlay_i)   ! record radiation transmitted below the ice
       !
       iconv = 0          ! number of iterations
       !
@@ -246,9 +246,6 @@ CONTAINS
          !                                                                         !============================!
          iconv = iconv + 1
          !
-         ztib(1:npti,:) = t_i_1d(1:npti,:)
-         ztsb(1:npti,:) = t_s_1d(1:npti,:)
-         !
          !--------------------------------
          ! 3) Sea ice thermal conductivity
          !--------------------------------
@@ -311,306 +308,278 @@ CONTAINS
          !-----------------
          ! 4) kappa factors
          !-----------------
-         !--- Snow
-         ! Variable used after iterations
-         ! Value must be frozen after convergence for MPP independance reason
-         DO jk = 0, nlay_s-1
-            DO ji = 1, npti
-               IF ( .NOT. l_T_converged(ji) ) &
+         DO ji = 1, npti
+            !
+            IF ( .NOT. l_T_converged(ji) ) THEN
+               !
+               !--- Snow
+               ! Variable used after iterations
+               ! Value must be frozen after convergence for MPP independance reason
+               DO jk = 0, nlay_s-1
                   zkappa_s(ji,jk) = zghe(ji) * rn_cnd_s * z1_h_s(ji)
-            END DO
-         END DO
-         DO ji = 1, npti   ! Snow-ice interface
-            IF ( .NOT. l_T_converged(ji) ) &
-               zkappa_s(ji,nlay_s) = isnow(ji) * zghe(ji) * rn_cnd_s * ztcond_i(ji,0) &
+               END DO
+               zkappa_s(ji,nlay_s) = isnow(ji) * zghe(ji) * rn_cnd_s * ztcond_i(ji,0) &   ! Snow-ice interface
                   &                            / ( 0.5_wp * ( ztcond_i(ji,0) * zh_s(ji) + rn_cnd_s * zh_i(ji) ) )
-         END DO
-
-         !--- Ice
-         ! Variable used after iterations
-         ! Value must be frozen after convergence for MPP independance reason
-         DO jk = 0, nlay_i
-            DO ji = 1, npti
-               IF ( .NOT. l_T_converged(ji) ) &
+               !
+               !--- Ice
+               ! Variable used after iterations
+               ! Value must be frozen after convergence for MPP independance reason
+               DO jk = 0, nlay_i
                   zkappa_i(ji,jk) = zghe(ji) * ztcond_i(ji,jk) * z1_h_i(ji)
-            END DO
-         END DO
-         DO ji = 1, npti   ! Snow-ice interface
-            IF ( .NOT. l_T_converged(ji) ) THEN
+               END DO
                ! Calculate combined surface snow and ice conductivity to pass through the coupler (met-office)
                zkappa_comb(ji) = isnow_comb(ji) * zkappa_s(ji,0) + ( 1._wp - isnow_comb(ji) ) * zkappa_i(ji,0)
                ! If there is snow then use the same snow-ice interface conductivity for the top layer of ice
-               IF( h_s_1d(ji) > 0._wp )   zkappa_i(ji,0) = zkappa_s(ji,nlay_s)
-           ENDIF
+               IF( h_s_1d(ji) > 0._wp )   zkappa_i(ji,0) = zkappa_s(ji,nlay_s)   ! Snow-ice interface
+               !
+            ENDIF
+            !
          END DO
-         !
+         
          !--------------------------------------
          ! 5) Sea ice specific heat, eta factors
          !--------------------------------------
          DO jk = 1, nlay_i
             DO ji = 1, npti
-               zcpi = rcpi + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
-               zeta_i(ji,jk) = rDt_ice * r1_rhoi * z1_h_i(ji) / zcpi
+               IF ( .NOT. l_T_converged(ji) ) THEN
+                  zcpi = rcpi + zgamma * sz_i_1d(ji,jk) / MAX( ( t_i_1d(ji,jk) - rt0 ) * ( ztiold(ji,jk) - rt0 ), epsi10 )
+                  zeta_i(ji,jk) = rDt_ice * r1_rhoi * z1_h_i(ji) / zcpi
+               ENDIF
             END DO
          END DO
-
+         !
          DO jk = 1, nlay_s
             DO ji = 1, npti
-               zeta_s(ji,jk) = rDt_ice * r1_rhos * r1_rcpi * z1_h_s(ji)
+               IF ( .NOT. l_T_converged(ji) ) &
+                  & zeta_s(ji,jk) = rDt_ice * r1_rhos * r1_rcpi * z1_h_s(ji)
             END DO
          END DO
          !
-         !----------------------------------------!
-         !                                        !
-         !   Conduction flux is off or emulated   !
-         !                                        !
-         !----------------------------------------!
          !
          IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
+            !----------------------------------------!
+            !                                        !
+            !   Conduction flux is off or emulated   !
+            !                                        !
+            !----------------------------------------!
             !
             ! ==> The original BL99 temperature computation is used
             !       (with qsr_ice, qns_ice and dqns_ice as inputs)
             !
-            !----------------------------
-            ! 6) surface flux computation
-            !----------------------------
-            ! update of the non solar flux according to the update in T_su
             DO ji = 1, npti
+               !
+               !----------------------------
+               ! 6) surface flux computation
+               !----------------------------
+               ! update of the non solar flux according to the update in T_su
                ! Variable used after iterations
                ! Value must be frozen after convergence for MPP independance reason
-               IF ( .NOT. l_T_converged(ji) ) &
+               IF ( .NOT. l_T_converged(ji) ) THEN
+                  !
                   qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) )
-            END DO
-
-            DO ji = 1, npti
-               zfnet(ji) = qsr_ice_1d(ji) - qtr_ice_top_1d(ji) + qns_ice_1d(ji) ! net heat flux = net - transmitted solar + non solar
-            END DO
-            !
-            !----------------------------
-            ! 7) tridiagonal system terms
-            !----------------------------
-            ! layer denotes the number of the layer in the snow or in the ice
-            ! jm denotes the reference number of the equation in the tridiagonal
-            ! system, terms of tridiagonal system are indexed as following :
-            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
-
-            ! ice interior terms (top equation has the same form as the others)
-            ztrid   (1:npti,:,:) = 0._wp
-            zindterm(1:npti,:)   = 0._wp
-            zindtbis(1:npti,:)   = 0._wp
-            zdiagbis(1:npti,:)   = 0._wp
-
-            DO jm = nlay_s + 2, nlay_s + nlay_i
-               DO ji = 1, npti
-                  jk = jm - nlay_s - 1
-                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
-                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
-                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
-                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
-               END DO
-            END DO
-
-            jm =  nlay_s + nlay_i + 1
-            DO ji = 1, npti
-               ! ice bottom term
-               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)
-               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
-               ztrid   (ji,jm,3) = 0._wp
-               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
-                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) )
-            END DO
-
-            DO ji = 1, npti
-               !                               !---------------------!
-               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
-                  !                            !---------------------!
-                  ! snow interior terms (bottom equation has the same form as the others)
-                  DO jm = 3, nlay_s + 1
-                     jk = jm - 1
-                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
-                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
-                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
-                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
-                  END DO
-
-                  ! case of only one layer in the ice (ice equation is altered)
-                  IF( nlay_i == 1 ) THEN
-                     ztrid   (ji,nlay_s+2,3) = 0._wp
-                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji)
-                  ENDIF
-
-                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
-
-                     jm_min(ji) = 1
-                     jm_max(ji) = nlay_i + nlay_s + 1
-
-                     ! surface equation
-                     ztrid   (ji,1,1) = 0._wp
-                     ztrid   (ji,1,2) = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
-                     ztrid   (ji,1,3) =                   zg1s * zkappa_s(ji,0)
-                     zindterm(ji,1)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
-
-                     ! first layer of snow equation
-                     ztrid   (ji,2,1) =       - zeta_s(ji,1) *                    zkappa_s(ji,0) * zg1s
-                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
-                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
-                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
-
-                  ELSE                            !--  case 2 : surface is melting
-                     !
-                     jm_min(ji) = 2
-                     jm_max(ji) = nlay_i + nlay_s + 1
-
-                     ! first layer of snow equation
-                     ztrid   (ji,2,1) = 0._wp
-                     ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
-                     ztrid   (ji,2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
-                     zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) )
-                  ENDIF
-                  !                            !---------------------!
-               ELSE                            ! cells without snow  !
-                  !                            !---------------------!
                   !
-                  IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
-                     !
-                     jm_min(ji) = nlay_s + 1
-                     jm_max(ji) = nlay_i + nlay_s + 1
-
-                     ! surface equation
-                     ztrid   (ji,jm_min(ji),1) = 0._wp
-                     ztrid   (ji,jm_min(ji),2) = zdqns_ice_b(ji) - zkappa_i(ji,0) * zg1
-                     ztrid   (ji,jm_min(ji),3) =                   zkappa_i(ji,0) * zg1
-                     zindterm(ji,jm_min(ji))   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet(ji)
+                  zfnet = qsr_ice_1d(ji) - qtr_ice_top_1d(ji) + qns_ice_1d(ji) ! net heat flux = net - transmitted solar + non solar
+                  !
+                  ! before temperatures
+                  ztib(:) = t_i_1d(ji,:)
+                  ztsb(:) = t_s_1d(ji,:)
+                  !
+                  !----------------------------
+                  ! 7) tridiagonal system terms
+                  !----------------------------
+                  ! layer denotes the number of the layer in the snow or in the ice
+                  ! jm denotes the reference number of the equation in the tridiagonal
+                  ! system, terms of tridiagonal system are indexed as following :
+                  ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
+                  
+                  ! ice interior terms (top equation has the same form as the others)
+                  ztrid   (:,:) = 0._wp
+                  zindterm(:)   = 0._wp
+                  zindtbis(:)   = 0._wp
+                  zdiagbis(:)   = 0._wp
+
+                  DO jm = nlay_s + 2, nlay_s + nlay_i
+                     jk = jm - nlay_s - 1
+                     ztrid   (jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
+                     ztrid   (jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
+                     ztrid   (jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
+                     zindterm(jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
+                  END DO
 
-                     ! first layer of ice equation
-                     ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *                    zkappa_i(ji,0) * zg1
-                     ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
-                     ztrid   (ji,jm_min(ji)+1,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
-                     zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1)
+                  jm =  nlay_s + nlay_i + 1
+                  ! ice bottom term
+                  ztrid   (jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)
+                  ztrid   (jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
+                  ztrid   (jm,3) = 0._wp
+                  zindterm(jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
+                     &         ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) )
+
+                  !                               !---------------------!
+                  IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
+                     !                            !---------------------!
+                     ! snow interior terms (bottom equation has the same form as the others)
+                     DO jm = 3, nlay_s + 1
+                        jk = jm - 1
+                        ztrid   (jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
+                        ztrid   (jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
+                        ztrid   (jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
+                        zindterm(jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
+                     END DO
 
-                     ! case of only one layer in the ice (surface & ice equations are altered)
+                     ! case of only one layer in the ice (ice equation is altered)
                      IF( nlay_i == 1 ) THEN
-                        ztrid   (ji,jm_min(ji),1)   = 0._wp
-                        ztrid   (ji,jm_min(ji),2)   = zdqns_ice_b(ji)      -   zkappa_i(ji,0) * 2._wp
-                        ztrid   (ji,jm_min(ji),3)   =                          zkappa_i(ji,0) * 2._wp
-                        ztrid   (ji,jm_min(ji)+1,1) =       - zeta_i(ji,1) *   zkappa_i(ji,0) * 2._wp
-                        ztrid   (ji,jm_min(ji)+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
-                        ztrid   (ji,jm_min(ji)+1,3) = 0._wp
-                        zindterm(ji,jm_min(ji)+1)   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji))
+                        ztrid   (nlay_s+2,3) = 0._wp
+                        zindterm(nlay_s+2)   = zindterm(nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji)
                      ENDIF
 
-                  ELSE                            !--  case 2 : surface is melting
-
-                     jm_min(ji) = nlay_s + 2
-                     jm_max(ji) = nlay_i + nlay_s + 1
-
-                     ! first layer of ice equation
-                     ztrid   (ji,jm_min(ji),1) = 0._wp
-                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
-                     ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
-                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji))
-
-                     ! case of only one layer in the ice (surface & ice equations are altered)
-                     IF( nlay_i == 1 ) THEN
-                        ztrid   (ji,jm_min(ji),1) = 0._wp
-                        ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
-                        ztrid   (ji,jm_min(ji),3) = 0._wp
-                        zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) &
-                           &                      + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2._wp
+                     IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
+
+                        jm_min = 1
+                        jm_max = nlay_i + nlay_s + 1
+
+                        ! surface equation
+                        ztrid   (1,1) = 0._wp
+                        ztrid   (1,2) = zdqns_ice_b(ji) - zg1s * zkappa_s(ji,0)
+                        ztrid   (1,3) =                   zg1s * zkappa_s(ji,0)
+                        zindterm(1)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet
+
+                        ! first layer of snow equation
+                        ztrid   (2,1) =       - zeta_s(ji,1) *                    zkappa_s(ji,0) * zg1s
+                        ztrid   (2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
+                        ztrid   (2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
+                        zindterm(2)   = ztsold(ji,1) + zeta_s(ji,1) * zradab_s(ji,1)
+
+                     ELSE                            !--  case 2 : surface is melting
+                        !
+                        jm_min = 2
+                        jm_max = nlay_i + nlay_s + 1
+
+                        ! first layer of snow equation
+                        ztrid   (2,1) = 0._wp
+                        ztrid   (2,2) = 1._wp + zeta_s(ji,1) * ( zkappa_s(ji,1) + zkappa_s(ji,0) * zg1s )
+                        ztrid   (2,3) =       - zeta_s(ji,1) *   zkappa_s(ji,1)
+                        zindterm(2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + zkappa_s(ji,0) * zg1s * t_su_1d(ji) )
                      ENDIF
+                     !                            !---------------------!
+                  ELSE                            ! cells without snow  !
+                     !                            !---------------------!
+                     !
+                     IF( t_su_1d(ji) < rt0 ) THEN   !--  case 1 : no surface melting
+                        !
+                        jm_min = nlay_s + 1
+                        jm_max = nlay_i + nlay_s + 1
+
+                        ! surface equation
+                        ztrid   (jm_min,1) = 0._wp
+                        ztrid   (jm_min,2) = zdqns_ice_b(ji) - zkappa_i(ji,0) * zg1
+                        ztrid   (jm_min,3) =                   zkappa_i(ji,0) * zg1
+                        zindterm(jm_min)   = zdqns_ice_b(ji) * t_su_1d(ji) - zfnet
+
+                        ! first layer of ice equation
+                        ztrid   (jm_min+1,1) =       - zeta_i(ji,1) *                    zkappa_i(ji,0) * zg1
+                        ztrid   (jm_min+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
+                        ztrid   (jm_min+1,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
+                        zindterm(jm_min+1)   = ztiold(ji,1) + zeta_i(ji,1) * zradab_i(ji,1)
+
+                        ! case of only one layer in the ice (surface & ice equations are altered)
+                        IF( nlay_i == 1 ) THEN
+                           ztrid   (jm_min,1)   = 0._wp
+                           ztrid   (jm_min,2)   = zdqns_ice_b(ji)      -   zkappa_i(ji,0) * 2._wp
+                           ztrid   (jm_min,3)   =                          zkappa_i(ji,0) * 2._wp
+                           ztrid   (jm_min+1,1) =       - zeta_i(ji,1) *   zkappa_i(ji,0) * 2._wp
+                           ztrid   (jm_min+1,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
+                           ztrid   (jm_min+1,3) = 0._wp
+                           zindterm(jm_min+1)   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji))
+                        ENDIF
+
+                     ELSE                            !--  case 2 : surface is melting
+
+                        jm_min = nlay_s + 2
+                        jm_max = nlay_i + nlay_s + 1
+
+                        ! first layer of ice equation
+                        ztrid   (jm_min,1) = 0._wp
+                        ztrid   (jm_min,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,1) + zkappa_i(ji,0) * zg1 )
+                        ztrid   (jm_min,3) =       - zeta_i(ji,1) *   zkappa_i(ji,1)
+                        zindterm(jm_min)   = ztiold(ji,1) + zeta_i(ji,1) * (zradab_i(ji,1) + zkappa_i(ji,0) * zg1 * t_su_1d(ji))
+
+                        ! case of only one layer in the ice (surface & ice equations are altered)
+                        IF( nlay_i == 1 ) THEN
+                           ztrid   (jm_min,1) = 0._wp
+                           ztrid   (jm_min,2) = 1._wp + zeta_i(ji,1) * ( zkappa_i(ji,0) * 2._wp + zkappa_i(ji,1) )
+                           ztrid   (jm_min,3) = 0._wp
+                           zindterm(jm_min)   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) ) &
+                              &                    + t_su_1d(ji) * zeta_i(ji,1) * zkappa_i(ji,0) * 2._wp
+                        ENDIF
 
+                     ENDIF
                   ENDIF
-               ENDIF
-               !
-               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
-               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
-               !
-            END DO
-            !
-            !------------------------------
-            ! 8) tridiagonal system solving
-            !------------------------------
-            ! Solve the tridiagonal system with Gauss elimination method.
-            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
+                  !
+                  zindtbis(jm_min) = zindterm(jm_min)
+                  zdiagbis(jm_min) = ztrid   (jm_min,2)
+                  !
+                  !
+                  !------------------------------
+                  ! 8) tridiagonal system solving
+                  !------------------------------
+                  ! Solve the tridiagonal system with Gauss elimination method.
+                  ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
 !!$            jm_maxt = 0
 !!$            jm_mint = nlay_i+5
 !!$            DO ji = 1, npti
-!!$               jm_mint = MIN(jm_min(ji),jm_mint)
-!!$               jm_maxt = MAX(jm_max(ji),jm_maxt)
+!!$               jm_mint = MIN(jm_min,jm_mint)
+!!$               jm_maxt = MAX(jm_max,jm_maxt)
 !!$            END DO
 !!$            !!clem SNWLAY => check why LIM1D does not get this loop. Is nlay_i+5 correct?
 !!$
 !!$            DO jk = jm_mint+1, jm_maxt
 !!$               DO ji = 1, npti
-!!$                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
+!!$                  jm = MIN(MAX(jm_min+1,jk),jm_max)
 !!$                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
 !!$                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
 !!$               END DO
 !!$            END DO
-            ! clem: maybe one should find a way to reverse this loop for mpi performance
-            DO ji = 1, npti
-               jm_mint = jm_min(ji)
-               jm_maxt = jm_max(ji)
-               DO jm = jm_mint+1, jm_maxt
-                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
-                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
-               END DO
-            END DO
 
-            ! ice temperatures
-            DO ji = 1, npti
-               ! Variable used after iterations
-               ! Value must be frozen after convergence for MPP independance reason
-               IF ( .NOT. l_T_converged(ji) ) &
-                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
-            END DO
-
-            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
-               DO ji = 1, npti
-                  jk = jm - nlay_s - 1
-                  IF ( .NOT. l_T_converged(ji) ) &
-                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
-               END DO
-            END DO
+                  DO jm = jm_min+1, jm_max
+                     zdiagbis(jm) = ztrid   (jm,2) - ztrid(jm,1) * ztrid   (jm-1,3) / zdiagbis(jm-1)
+                     zindtbis(jm) = zindterm(jm  ) - ztrid(jm,1) * zindtbis(jm-1  ) / zdiagbis(jm-1)
+                  END DO
 
-            ! snow temperatures
-            DO ji = 1, npti
-               ! Variables used after iterations
-               ! Value must be frozen after convergence for MPP independance reason
-               IF ( .NOT. l_T_converged(ji) .AND. h_s_1d(ji) > 0._wp ) &
-                  &   t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1)
-            END DO
-            !!clem SNWLAY
-            DO jm = nlay_s, 2, -1
-               DO ji = 1, npti
-                  jk = jm - 1
-                  IF ( .NOT. l_T_converged(ji) .AND. h_s_1d(ji) > 0._wp ) &
-                     &   t_s_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_s_1d(ji,jk+1) ) / zdiagbis(ji,jm)
-               END DO
-            END DO
+                  ! ice temperatures
+                  ! Variable used after iterations
+                  ! Value must be frozen after convergence for MPP independance reason
+                  t_i_1d(ji,nlay_i) = zindtbis(jm_max) / zdiagbis(jm_max)
+                  
+                  DO jm = nlay_i + nlay_s, nlay_s + 2, -1
+                     jk = jm - nlay_s - 1
+                     t_i_1d(ji,jk) = ( zindtbis(jm) - ztrid(jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(jm)
+                  END DO
 
-            ! surface temperature
-            DO ji = 1, npti
-               IF( .NOT. l_T_converged(ji) ) THEN
+                  ! snow temperatures
+                  ! Variables used after iterations
+                  ! Value must be frozen after convergence for MPP independance reason
+                  IF ( h_s_1d(ji) > 0._wp ) &
+                     &   t_s_1d(ji,nlay_s) = ( zindtbis(nlay_s+1) - ztrid(nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(nlay_s+1)
+                  !!clem SNWLAY
+                  DO jm = nlay_s, 2, -1
+                     jk = jm - 1
+                     IF ( h_s_1d(ji) > 0._wp ) &
+                        &   t_s_1d(ji,jk) = ( zindtbis(jm) - ztrid(jm,3) * t_s_1d(ji,jk+1) ) / zdiagbis(jm)
+                  END DO
+                  
+                  ! surface temperature
                   ztsub(ji) = t_su_1d(ji)
                   IF( t_su_1d(ji) < rt0 ) THEN
-                     t_su_1d(ji) = ( zindtbis(ji,jm_min(ji)) - ztrid(ji,jm_min(ji),3) *  &
-                        &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(ji,jm_min(ji))
+                     t_su_1d(ji) = ( zindtbis(jm_min) - ztrid(jm_min,3) *  &
+                        &          ( isnow(ji) * t_s_1d(ji,1) + ( 1._wp - isnow(ji) ) * t_i_1d(ji,1) ) ) / zdiagbis(jm_min)
                   ENDIF
-               ENDIF
-            END DO
-            !
-            !--------------------------------------------------------------
-            ! 9) Has the scheme converged?, end of the iterative procedure
-            !--------------------------------------------------------------
-            ! check that nowhere it has started to melt
-            ! zdti_max is a measure of error, it has to be under zdti_bnd
-
-            DO ji = 1, npti
-
-               zdti_max = 0._wp
-
-               IF ( .NOT. l_T_converged(ji) ) THEN
+                  !
+                  !--------------------------------------------------------------
+                  ! 9) Has the scheme converged?, end of the iterative procedure
+                  !--------------------------------------------------------------
+                  ! check that nowhere it has started to melt
+                  ! zdti_max is a measure of error, it has to be under zdti_bnd                  
+                  zdti_max = 0._wp
 
                   t_su_1d(ji) = MAX( MIN( t_su_1d(ji) , rt0 ) , rt0 - 100._wp )
                   zdti_max    = MAX( zdti_max, ABS( t_su_1d(ji) - ztsub(ji) ) )
@@ -618,14 +587,14 @@ CONTAINS
                   IF( h_s_1d(ji) > 0._wp ) THEN
                      DO jk = 1, nlay_s
                         t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
-                        zdti_max      = MAX ( zdti_max , ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
+                        zdti_max      = MAX ( zdti_max , ABS( t_s_1d(ji,jk) - ztsb(jk) ) )
                      END DO
                   ENDIF
 
                   DO jk = 1, nlay_i
                      ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0
                      t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
-                     zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
+                     zdti_max      =  MAX( zdti_max, ABS( t_i_1d(ji,jk) - ztib(jk) ) )
                   END DO
 
                   ! convergence test
@@ -637,194 +606,174 @@ CONTAINS
                   IF( zdti_max < zdti_bnd )   l_T_converged(ji) = .TRUE.
 
                ENDIF
-
-            END DO
-
-         !----------------------------------------!
-         !                                        !
-         !      Conduction flux is on             !
-         !                                        !
-         !----------------------------------------!
-         !
+               
+            END DO     
+            !
          ELSEIF( k_cnd == np_cnd_ON ) THEN
+            !----------------------------------------!
+            !                                        !
+            !      Conduction flux is on             !
+            !                                        !
+            !----------------------------------------!
             !
             ! ==> we use a modified BL99 solver with conduction flux (qcn_ice) as forcing term
             !
-            !----------------------------
-            ! 7) tridiagonal system terms
-            !----------------------------
-            ! layer denotes the number of the layer in the snow or in the ice
-            ! jm denotes the reference number of the equation in the tridiagonal
-            ! system, terms of tridiagonal system are indexed as following :
-            ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
-
-            ! ice interior terms (top equation has the same form as the others)
-            ztrid   (1:npti,:,:) = 0._wp
-            zindterm(1:npti,:)   = 0._wp
-            zindtbis(1:npti,:)   = 0._wp
-            zdiagbis(1:npti,:)   = 0._wp
-
-            DO jm = nlay_s + 2, nlay_s + nlay_i
-               DO ji = 1, npti
-                  jk = jm - nlay_s - 1
-                  ztrid   (ji,jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
-                  ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
-                  ztrid   (ji,jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
-                  zindterm(ji,jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
-               END DO
-            ENDDO
-
-            jm =  nlay_s + nlay_i + 1
             DO ji = 1, npti
-               ! ice bottom term
-               ztrid   (ji,jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)
-               ztrid   (ji,jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
-               ztrid   (ji,jm,3) = 0._wp
-               zindterm(ji,jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
-                  &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) )
-            ENDDO
-
-            DO ji = 1, npti
-               !                               !---------------------!
-               IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
-                  !                            !---------------------!
-                  ! snow interior terms (bottom equation has the same form as the others)
-                  DO jm = 3, nlay_s + 1
-                     jk = jm - 1
-                     ztrid   (ji,jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
-                     ztrid   (ji,jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
-                     ztrid   (ji,jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
-                     zindterm(ji,jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
+               !
+               IF ( .NOT. l_T_converged(ji) ) THEN
+                  ! before temperatures
+                  ztib(:) = t_i_1d(ji,:)
+                  ztsb(:) = t_s_1d(ji,:)
+                  !
+                  !----------------------------
+                  ! 7) tridiagonal system terms
+                  !----------------------------
+                  ! layer denotes the number of the layer in the snow or in the ice
+                  ! jm denotes the reference number of the equation in the tridiagonal
+                  ! system, terms of tridiagonal system are indexed as following :
+                  ! 1 is subdiagonal term, 2 is diagonal and 3 is superdiagonal one
+
+                  ! ice interior terms (top equation has the same form as the others)
+                  ztrid   (:,:) = 0._wp
+                  zindterm(:)   = 0._wp
+                  zindtbis(:)   = 0._wp
+                  zdiagbis(:)   = 0._wp
+
+                  DO jm = nlay_s + 2, nlay_s + nlay_i
+                     jk = jm - nlay_s - 1
+                     ztrid   (jm,1) =       - zeta_i(ji,jk) *   zkappa_i(ji,jk-1)
+                     ztrid   (jm,2) = 1._wp + zeta_i(ji,jk) * ( zkappa_i(ji,jk-1) + zkappa_i(ji,jk) )
+                     ztrid   (jm,3) =       - zeta_i(ji,jk) *                       zkappa_i(ji,jk)
+                     zindterm(jm)   = ztiold(ji,jk) + zeta_i(ji,jk) * zradab_i(ji,jk)
                   END DO
 
-                  ! case of only one layer in the ice (ice equation is altered)
-                  IF ( nlay_i == 1 ) THEN
-                     ztrid   (ji,nlay_s+2,3) = 0._wp
-                     zindterm(ji,nlay_s+2)   = zindterm(ji,nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji)
-                  ENDIF
+                  ! ice bottom term
+                  jm =  nlay_s + nlay_i + 1
+                  ztrid   (jm,1) =       - zeta_i(ji,nlay_i) *   zkappa_i(ji,nlay_i-1)
+                  ztrid   (jm,2) = 1._wp + zeta_i(ji,nlay_i) * ( zkappa_i(ji,nlay_i-1) + zkappa_i(ji,nlay_i) * zg1 )
+                  ztrid   (jm,3) = 0._wp
+                  zindterm(jm)   = ztiold(ji,nlay_i) + zeta_i(ji,nlay_i) *  &
+                     &              ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i) * zg1 * t_bo_1d(ji) )
+
+                  !                               !---------------------!
+                  IF( h_s_1d(ji) > 0._wp ) THEN   !  snow-covered cells !
+                     !                            !---------------------!
+                     ! snow interior terms (bottom equation has the same form as the others)
+                     DO jm = 3, nlay_s + 1
+                        jk = jm - 1
+                        ztrid   (jm,1) =       - zeta_s(ji,jk) *   zkappa_s(ji,jk-1)
+                        ztrid   (jm,2) = 1._wp + zeta_s(ji,jk) * ( zkappa_s(ji,jk-1) + zkappa_s(ji,jk) )
+                        ztrid   (jm,3) =       - zeta_s(ji,jk) *                       zkappa_s(ji,jk)
+                        zindterm(jm)   = ztsold(ji,jk) + zeta_s(ji,jk) * zradab_s(ji,jk)
+                     END DO
 
-                  jm_min(ji) = 2
-                  jm_max(ji) = nlay_i + nlay_s + 1
-
-                  ! first layer of snow equation
-                  ztrid   (ji,2,1) = 0._wp
-                  ztrid   (ji,2,2) = 1._wp + zeta_s(ji,1) * zkappa_s(ji,1)
-                  ztrid   (ji,2,3) =       - zeta_s(ji,1) * zkappa_s(ji,1)
-                  zindterm(ji,2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + qcn_ice_1d(ji) )
-
-                  !                            !---------------------!
-               ELSE                            ! cells without snow  !
-                  !                            !---------------------!
-                  jm_min(ji) = nlay_s + 2
-                  jm_max(ji) = nlay_i + nlay_s + 1
-
-                  ! first layer of ice equation
-                  ztrid   (ji,jm_min(ji),1) = 0._wp
-                  ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
-                  ztrid   (ji,jm_min(ji),3) =       - zeta_i(ji,1) * zkappa_i(ji,1)
-                  zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + qcn_ice_1d(ji) )
-
-                  ! case of only one layer in the ice (surface & ice equations are altered)
-                  IF( nlay_i == 1 ) THEN
-                     ztrid   (ji,jm_min(ji),1) = 0._wp
-                     ztrid   (ji,jm_min(ji),2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
-                     ztrid   (ji,jm_min(ji),3) = 0._wp
-                     zindterm(ji,jm_min(ji))   = ztiold(ji,1) + zeta_i(ji,1) *  &
-                        &                                     ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) + qcn_ice_1d(ji) )
-                  ENDIF
+                     ! case of only one layer in the ice (ice equation is altered)
+                     IF ( nlay_i == 1 ) THEN
+                        ztrid   (nlay_s+2,3) = 0._wp
+                        zindterm(nlay_s+2)   = zindterm(nlay_s+2) + zeta_i(ji,1) * zkappa_i(ji,1) * t_bo_1d(ji)
+                     ENDIF
 
-               ENDIF
-               !
-               zindtbis(ji,jm_min(ji)) = zindterm(ji,jm_min(ji))
-               zdiagbis(ji,jm_min(ji)) = ztrid   (ji,jm_min(ji),2)
-               !
-            END DO
-            !
-            !------------------------------
-            ! 8) tridiagonal system solving
-            !------------------------------
-            ! Solve the tridiagonal system with Gauss elimination method.
-            ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
+                     jm_min = 2
+                     jm_max = nlay_i + nlay_s + 1
+
+                     ! first layer of snow equation
+                     ztrid   (2,1) = 0._wp
+                     ztrid   (2,2) = 1._wp + zeta_s(ji,1) * zkappa_s(ji,1)
+                     ztrid   (2,3) =       - zeta_s(ji,1) * zkappa_s(ji,1)
+                     zindterm(2)   = ztsold(ji,1) + zeta_s(ji,1) * ( zradab_s(ji,1) + qcn_ice_1d(ji) )
+
+                     !                            !---------------------!
+                  ELSE                            ! cells without snow  !
+                     !                            !---------------------!
+                     jm_min = nlay_s + 2
+                     jm_max = nlay_i + nlay_s + 1
+
+                     ! first layer of ice equation
+                     ztrid   (jm_min,1) = 0._wp
+                     ztrid   (jm_min,2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
+                     ztrid   (jm_min,3) =       - zeta_i(ji,1) * zkappa_i(ji,1)
+                     zindterm(jm_min)   = ztiold(ji,1) + zeta_i(ji,1) * ( zradab_i(ji,1) + qcn_ice_1d(ji) )
+
+                     ! case of only one layer in the ice (surface & ice equations are altered)
+                     IF( nlay_i == 1 ) THEN
+                        ztrid   (jm_min,1) = 0._wp
+                        ztrid   (jm_min,2) = 1._wp + zeta_i(ji,1) * zkappa_i(ji,1)
+                        ztrid   (jm_min,3) = 0._wp
+                        zindterm(jm_min)   = ztiold(ji,1) + zeta_i(ji,1) *  &
+                           &                                     ( zradab_i(ji,1) + zkappa_i(ji,1) * t_bo_1d(ji) + qcn_ice_1d(ji) )
+                     ENDIF
+
+                  ENDIF
+                  !
+                  zindtbis(jm_min) = zindterm(jm_min)
+                  zdiagbis(jm_min) = ztrid   (jm_min,2)
+                  !
+                  !
+                  !------------------------------
+                  ! 8) tridiagonal system solving
+                  !------------------------------
+                  ! Solve the tridiagonal system with Gauss elimination method.
+                  ! Thomas algorithm, from Computational fluid Dynamics, J.D. ANDERSON, McGraw-Hill 1984
 !!$            jm_maxt = 0
 !!$            jm_mint = nlay_i+5
 !!$            DO ji = 1, npti
-!!$               jm_mint = MIN(jm_min(ji),jm_mint)
-!!$               jm_maxt = MAX(jm_max(ji),jm_maxt)
+!!$               jm_mint = MIN(jm_min,jm_mint)
+!!$               jm_maxt = MAX(jm_max,jm_maxt)
 !!$            END DO
 !!$
 !!$            DO jk = jm_mint+1, jm_maxt
 !!$               DO ji = 1, npti
-!!$                  jm = MIN(MAX(jm_min(ji)+1,jk),jm_max(ji))
+!!$                  jm = MIN(MAX(jm_min+1,jk),jm_max)
 !!$                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
 !!$                  zindtbis(ji,jm) = zindterm(ji,jm)   - ztrid(ji,jm,1) * zindtbis(ji,jm-1)   / zdiagbis(ji,jm-1)
 !!$               END DO
 !!$            END DO
-            ! clem: maybe one should find a way to reverse this loop for mpi performance
-            DO ji = 1, npti
-               jm_mint = jm_min(ji)
-               jm_maxt = jm_max(ji)
-               DO jm = jm_mint+1, jm_maxt
-                  zdiagbis(ji,jm) = ztrid   (ji,jm,2) - ztrid(ji,jm,1) * ztrid   (ji,jm-1,3) / zdiagbis(ji,jm-1)
-                  zindtbis(ji,jm) = zindterm(ji,jm  ) - ztrid(ji,jm,1) * zindtbis(ji,jm-1  ) / zdiagbis(ji,jm-1)
-               END DO
-            END DO
 
-            ! ice temperatures
-            DO ji = 1, npti
-               ! Variable used after iterations
-               ! Value must be frozen after convergence for MPP independance reason
-               IF ( .NOT. l_T_converged(ji) ) &
-                  t_i_1d(ji,nlay_i) = zindtbis(ji,jm_max(ji)) / zdiagbis(ji,jm_max(ji))
-            END DO
-
-            DO jm = nlay_i + nlay_s, nlay_s + 2, -1
-               DO ji = 1, npti
-                  IF ( .NOT. l_T_converged(ji) ) THEN
-                     jk = jm - nlay_s - 1
-                     t_i_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(ji,jm)
-                  ENDIF
-               END DO
-            END DO
-
-            ! snow temperatures
-            DO ji = 1, npti
-               ! Variables used after iterations
-               ! Value must be frozen after convergence for MPP independance reason
-               IF ( .NOT. l_T_converged(ji) .AND. h_s_1d(ji) > 0._wp ) &
-                  &   t_s_1d(ji,nlay_s) = ( zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(ji,nlay_s+1)
-            END DO
-            !!clem SNWLAY
-            DO jm = nlay_s, 2, -1
-               DO ji = 1, npti
-                  jk = jm - 1
-                  IF ( .NOT. l_T_converged(ji) .AND. h_s_1d(ji) > 0._wp ) &
-                     &   t_s_1d(ji,jk) = ( zindtbis(ji,jm) - ztrid(ji,jm,3) * t_s_1d(ji,jk+1) ) / zdiagbis(ji,jm)
-               END DO
-            END DO
-            !
-            !--------------------------------------------------------------
-            ! 9) Has the scheme converged?, end of the iterative procedure
-            !--------------------------------------------------------------
-            ! check that nowhere it has started to melt
-            ! zdti_max is a measure of error, it has to be under zdti_bnd
+                  DO jm = jm_min+1, jm_max
+                     zdiagbis(jm) = ztrid   (jm,2) - ztrid(jm,1) * ztrid   (jm-1,3) / zdiagbis(jm-1)
+                     zindtbis(jm) = zindterm(jm  ) - ztrid(jm,1) * zindtbis(jm-1  ) / zdiagbis(jm-1)
+                  END DO
 
-            DO ji = 1, npti
+                  ! ice temperatures
+                  ! Variable used after iterations
+                  ! Value must be frozen after convergence for MPP independance reason
+                  t_i_1d(ji,nlay_i) = zindtbis(jm_max) / zdiagbis(jm_max)
 
-               zdti_max = 0._wp
+                  DO jm = nlay_i + nlay_s, nlay_s + 2, -1
+                     jk = jm - nlay_s - 1
+                     t_i_1d(ji,jk) = ( zindtbis(jm) - ztrid(jm,3) * t_i_1d(ji,jk+1) ) / zdiagbis(jm)
+                  END DO
 
-               IF ( .NOT. l_T_converged(ji) ) THEN
+                  ! snow temperatures
+                  ! Variables used after iterations
+                  ! Value must be frozen after convergence for MPP independance reason
+                  IF ( h_s_1d(ji) > 0._wp ) &
+                     &   t_s_1d(ji,nlay_s) = ( zindtbis(nlay_s+1) - ztrid(nlay_s+1,3) * t_i_1d(ji,1) ) / zdiagbis(nlay_s+1)
+                  !!clem SNWLAY
+                  DO jm = nlay_s, 2, -1
+                     jk = jm - 1
+                     IF ( h_s_1d(ji) > 0._wp ) &
+                        &   t_s_1d(ji,jk) = ( zindtbis(jm) - ztrid(jm,3) * t_s_1d(ji,jk+1) ) / zdiagbis(jm)
+                  END DO
+                  !
+                  !--------------------------------------------------------------
+                  ! 9) Has the scheme converged?, end of the iterative procedure
+                  !--------------------------------------------------------------
+                  ! check that nowhere it has started to melt
+                  ! zdti_max is a measure of error, it has to be under zdti_bnd
+                  zdti_max = 0._wp
 
                   IF( h_s_1d(ji) > 0._wp ) THEN
                      DO jk = 1, nlay_s
                         t_s_1d(ji,jk) = MAX( MIN( t_s_1d(ji,jk), rt0 ), rt0 - 100._wp )
-                        zdti_max      = MAX ( zdti_max , ABS( t_s_1d(ji,jk) - ztsb(ji,jk) ) )
+                        zdti_max      = MAX ( zdti_max , ABS( t_s_1d(ji,jk) - ztsb(jk) ) )
                      END DO
                   ENDIF
 
                   DO jk = 1, nlay_i
                      ztmelts       = -rTmlt * sz_i_1d(ji,jk) + rt0
                      t_i_1d(ji,jk) =  MAX( MIN( t_i_1d(ji,jk), ztmelts ), rt0 - 100._wp )
-                     zdti_max      =  MAX ( zdti_max, ABS( t_i_1d(ji,jk) - ztib(ji,jk) ) )
+                     zdti_max      =  MAX ( zdti_max, ABS( t_i_1d(ji,jk) - ztib(jk) ) )
                   END DO
 
                   ! convergence test
@@ -847,49 +796,38 @@ CONTAINS
       ! 10) Fluxes at the interfaces
       !-----------------------------
       !
-      ! --- calculate conduction fluxes (positive downward)
-      !     bottom ice conduction flux
-      DO ji = 1, npti
-         qcn_ice_bot_1d(ji) = - zkappa_i(ji,nlay_i) * zg1 * ( t_bo_1d(ji ) - t_i_1d (ji,nlay_i) )
-      END DO
-      !     surface ice conduction flux
       IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
          !
          DO ji = 1, npti
-            qcn_ice_top_1d(ji) = -           isnow(ji)   * zkappa_s(ji,0) * zg1s * ( t_s_1d(ji,1) - t_su_1d(ji) ) &
+            ! --- ice conduction fluxes (positive downward)
+            qcn_ice_bot_1d(ji) = - zkappa_i(ji,nlay_i) * zg1 * ( t_bo_1d(ji ) - t_i_1d (ji,nlay_i) )                ! bottom
+            qcn_ice_top_1d(ji) = -           isnow(ji)   * zkappa_s(ji,0) * zg1s * ( t_s_1d(ji,1) - t_su_1d(ji) ) & ! surface
                &                 - ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * ( t_i_1d(ji,1) - t_su_1d(ji) )
+            ! --- Diagnose the heat loss due to changing non-solar / conduction flux
+            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji)           
          END DO
          !
       ELSEIF( k_cnd == np_cnd_ON ) THEN
          !
          DO ji = 1, npti
-            qcn_ice_top_1d(ji) = qcn_ice_1d(ji)
-         END DO
-         !
-      ENDIF
-      !     surface ice temperature
-      IF( k_cnd == np_cnd_ON .AND. ln_cndemulate ) THEN
-         !
-         DO ji = 1, npti
-            t_su_1d(ji) = ( qcn_ice_top_1d(ji) +          isnow(ji)   * zkappa_s(ji,0) * zg1s * t_s_1d(ji,1) + &
-               &                                ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * t_i_1d(ji,1) ) &
-               &          / MAX( epsi10, isnow(ji) * zkappa_s(ji,0) * zg1s + ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1 )
-            t_su_1d(ji) = MAX( MIN( t_su_1d(ji), rt0 ), rt0 - 100._wp )  ! cap t_su
+            ! --- ice conduction fluxes (positive downward)
+            qcn_ice_bot_1d(ji) = - zkappa_i(ji,nlay_i) * zg1 * ( t_bo_1d(ji ) - t_i_1d (ji,nlay_i) ) ! bottom
+            qcn_ice_top_1d(ji) = qcn_ice_1d(ji)                                                      ! surface
          END DO
          !
-      ENDIF
-      !
-      ! --- Diagnose the heat loss due to changing non-solar / conduction flux --- !
-      !
-      IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_EMU ) THEN
-         !
-         DO ji = 1, npti
-            hfx_err_dif_1d(ji) = hfx_err_dif_1d(ji) - ( qns_ice_1d(ji) - zqns_ice_b(ji) ) * a_i_1d(ji)
-         END DO
+         ! --- surface ice temperature
+         IF( ln_cndemulate ) THEN
+            DO ji = 1, npti
+               t_su_1d(ji) = ( qcn_ice_top_1d(ji) +          isnow(ji)   * zkappa_s(ji,0) * zg1s * t_s_1d(ji,1) + &
+                  &                                ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1  * t_i_1d(ji,1) ) &
+                  &          / MAX( epsi10, isnow(ji) * zkappa_s(ji,0) * zg1s + ( 1._wp - isnow(ji) ) * zkappa_i(ji,0) * zg1 )
+               t_su_1d(ji) = MAX( MIN( t_su_1d(ji), rt0 ), rt0 - 100._wp )  ! cap t_su
+            END DO
+         ENDIF
          !
       ENDIF
       !
-      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be above 10-4 W-m2) --- !
+      ! --- Diagnose the heat loss due to non-fully converged temperature solution (should not be larger than 10-4 W-m2)
       !
       IF( k_cnd == np_cnd_OFF .OR. k_cnd == np_cnd_ON ) THEN
 
@@ -949,10 +887,8 @@ CONTAINS
          qcn_ice_1d(1:npti)   = qcn_ice_top_1d(1:npti)
       ENDIF
       !
-      ! --- SIMIP diagnostics
-      !
+      ! --- SIMIP diagnostics (Snow-ice interfacial temperature)
       DO ji = 1, npti
-         !--- Snow-ice interfacial temperature (diagnostic SIMIP)
          IF( h_s_1d(ji) >= zhs_ssl ) THEN
             t_si_1d(ji) = (   rn_cnd_s       * h_i_1d(ji) * r1_nlay_i * t_s_1d(ji,nlay_s)   &
                &            + ztcond_i(ji,1) * h_s_1d(ji) * r1_nlay_s * t_i_1d(ji,1)      ) &
diff --git a/src/ICE/iceupdate.F90 b/src/ICE/iceupdate.F90
index 6c8221ca..3e6a29c0 100644
--- a/src/ICE/iceupdate.F90
+++ b/src/ICE/iceupdate.F90
@@ -55,7 +55,7 @@ CONTAINS
       !!-------------------------------------------------------------------
       !!             ***  ROUTINE ice_update_alloc ***
       !!-------------------------------------------------------------------
-      ALLOCATE( utau_oce(jpi,jpj), vtau_oce(jpi,jpj), tmod_io(jpi,jpj), STAT=ice_update_alloc )
+      ALLOCATE( utau_oce(A2D(0)), vtau_oce(A2D(0)), tmod_io(jpi,jpj), STAT=ice_update_alloc )
       !
       CALL mpp_sum( 'iceupdate', ice_update_alloc )
       IF( ice_update_alloc /= 0 )   CALL ctl_stop( 'STOP', 'ice_update_alloc: failed to allocate arrays' )
@@ -100,26 +100,33 @@ CONTAINS
          WRITE(numout,*)'ice_update_flx: update fluxes (mass, salt and heat) at the ice-ocean interface'
          WRITE(numout,*)'~~~~~~~~~~~~~~'
       ENDIF
-
+            
       ! Net heat flux on top of the ice-ocean (W.m-2)
       !----------------------------------------------
       IF( ln_cndflx ) THEN   ! ice-atm interface = conduction (and melting) fluxes
-         qt_atm_oi(:,:) = ( 1._wp - at_i_b(:,:) ) * ( qns_oce(:,:) + qsr_oce(:,:) ) + qemp_oce(:,:) + &
-            &             SUM( a_i_b * ( qcn_ice + qml_ice + qtr_ice_top ), dim=3 ) + qemp_ice(:,:)
+         DO_2D( 0, 0, 0, 0 )
+            qt_atm_oi(ji,jj) = ( 1._wp - at_i_b(ji,jj) ) * ( qns_oce(ji,jj) + qsr_oce(ji,jj) ) + qemp_oce(ji,jj) &
+               &               +     SUM( a_i_b(ji,jj,:) * ( qcn_ice(ji,jj,:) + qml_ice(ji,jj,:) + qtr_ice_top(ji,jj,:) ) ) &
+               &               + qemp_ice(ji,jj)
+         END_2D
       ELSE                   ! ice-atm interface = solar and non-solar fluxes
-         qt_atm_oi(:,:) = qns_tot(:,:) + qsr_tot(:,:) 
+         DO_2D( 0, 0, 0, 0 )
+            qt_atm_oi(ji,jj) = qns_tot(ji,jj) + qsr_tot(ji,jj) 
+         END_2D
       ENDIF
 
       ! --- case we bypass ice thermodynamics --- !
       IF( .NOT. ln_icethd ) THEN   ! we suppose ice is impermeable => ocean is isolated from atmosphere
-         qt_atm_oi  (:,:)   = ( 1._wp - at_i_b(:,:) ) * ( qns_oce(:,:) + qsr_oce(:,:) ) + qemp_oce(:,:)
-         qt_oce_ai  (:,:)   = ( 1._wp - at_i_b(:,:) ) *   qns_oce(:,:)                  + qemp_oce(:,:)
-         emp_ice    (:,:)   = 0._wp
-         qemp_ice   (:,:)   = 0._wp
-         qevap_ice  (:,:,:) = 0._wp
+         DO_2D( 0, 0, 0, 0 )
+            qt_atm_oi  (ji,jj)   = ( 1._wp - at_i_b(ji,jj) ) * ( qns_oce(ji,jj) + qsr_oce(ji,jj) ) + qemp_oce(ji,jj)
+            qt_oce_ai  (ji,jj)   = ( 1._wp - at_i_b(ji,jj) ) *   qns_oce(ji,jj)                    + qemp_oce(ji,jj)
+            emp_ice    (ji,jj)   = 0._wp
+            qemp_ice   (ji,jj)   = 0._wp
+            qevap_ice  (ji,jj,:) = 0._wp
+         END_2D
       ENDIF
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          ! Solar heat flux reaching the ocean (max) = zqsr (W.m-2)
          !---------------------------------------------------
@@ -170,7 +177,7 @@ CONTAINS
          wfx_snw(ji,jj) = wfx_snw_sni(ji,jj) + wfx_snw_dyn(ji,jj) + wfx_snw_sum(ji,jj)
 
          ! total mass flux at the ocean/ice interface
-         fmmflx(ji,jj) =                - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_pnd(ji,jj) - wfx_err_sub(ji,jj)   ! ice-ocean mass flux saved at least for biogeochemical model
+         fwfice(ji,jj) =                  wfx_ice(ji,jj) + wfx_snw(ji,jj) + wfx_pnd(ji,jj) + wfx_err_sub(ji,jj)   ! ice-ocean mass flux saved at least for biogeochemical model
          emp   (ji,jj) = emp_oce(ji,jj) - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_pnd(ji,jj) - wfx_err_sub(ji,jj)   ! atm-ocean + ice-ocean mass flux
 
          ! Salt flux at the ocean surface
@@ -178,24 +185,31 @@ CONTAINS
          sfx(ji,jj) = sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) + sfx_opw(ji,jj)   &
             &       + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_bri(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj)
 
-         ! Mass of snow and ice per unit area
-         !----------------------------------------
-         snwice_mass_b(ji,jj) = snwice_mass(ji,jj)       ! save mass from the previous ice time step
-         !                                               ! new mass per unit area
-         snwice_mass  (ji,jj) = tmask(ji,jj,1) * ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) )
-         !                                               ! time evolution of snow+ice mass
-         snwice_fmass (ji,jj) = ( snwice_mass(ji,jj) - snwice_mass_b(ji,jj) ) * r1_Dt_ice
+      END_2D
 
+      ! Mass of snow and ice per unit area
+      !----------------------------------------
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         snwice_mass_b(ji,jj) = snwice_mass(ji,jj)                               ! save mass from the previous ice time step
+         snwice_mass  (ji,jj) = tmask(ji,jj,1) * &                               ! new mass per unit area
+            &                   ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) )
+         snwice_fmass (ji,jj) = ( snwice_mass(ji,jj) - snwice_mass_b(ji,jj) ) * r1_Dt_ice ! time evolution of snow+ice mass
       END_2D
       ! Storing the transmitted variables
       !----------------------------------
-      fr_i  (:,:)   = at_i(:,:)             ! Sea-ice fraction
-      tn_ice(:,:,:) = t_su(:,:,:)           ! Ice surface temperature
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         fr_i(ji,jj) = at_i(ji,jj)             ! Sea-ice fraction
+      END_2D
+      DO jl = 1, jpl
+         DO_2D( 0, 0, 0, 0 )
+            tn_ice(ji,jj,jl) = t_su(ji,jj,jl)  ! Ice surface temperature
+         END_2D
+      ENDDO
 
       ! Snow/ice albedo (only if sent to coupler, useless in forced mode)
       !------------------------------------------------------------------
-      CALL ice_alb( t_su, h_i, h_s, ln_pnd_alb, a_ip_eff, h_ip, cloud_fra, alb_ice ) ! ice albedo
-
+      CALL ice_alb( ln_pnd_alb, t_su(A2D(0),:), h_i(A2D(0),:), h_s(A2D(0),:), a_ip_eff(:,:,:), h_ip(A2D(0),:), cloud_fra(:,:), & ! <<== in
+         &                                                                                                      alb_ice(:,:,:) ) ! ==>> out
       !
       IF( lrst_ice ) THEN                       !* write snwice_mass fields in the restart file
          CALL update_rst( 'WRITE', kt )
@@ -215,8 +229,8 @@ CONTAINS
       IF( iom_use('sfxopw'  ) )   CALL iom_put( 'sfxopw', sfx_opw * 1.e-03 )   ! salt flux from open water formation
       IF( iom_use('sfxdyn'  ) )   CALL iom_put( 'sfxdyn', sfx_dyn * 1.e-03 )   ! salt flux from ridging rafting
       IF( iom_use('sfxbri'  ) )   CALL iom_put( 'sfxbri', sfx_bri * 1.e-03 )   ! salt flux from brines
-      IF( iom_use('sfxres'  ) )   CALL iom_put( 'sfxres', sfx_res * 1.e-03 )   ! salt flux from undiagnosed processes
       IF( iom_use('sfxsub'  ) )   CALL iom_put( 'sfxsub', sfx_sub * 1.e-03 )   ! salt flux from sublimation
+      IF( iom_use('sfxres'  ) )   CALL iom_put( 'sfxres', sfx_res * 1.e-03 )   ! salt flux from undiagnosed processes
 
       ! --- mass fluxes [kg/m2/s] --- !
       CALL iom_put( 'emp_oce', emp_oce )   ! emp over ocean (taking into account the snow blown away from the ice)
@@ -231,13 +245,13 @@ CONTAINS
       CALL iom_put( 'vfxsni'    , wfx_sni     )   ! mass flux from snow-ice formation
       CALL iom_put( 'vfxopw'    , wfx_opw     )   ! mass flux from growth in open water
       CALL iom_put( 'vfxdyn'    , wfx_dyn     )   ! mass flux from dynamics (ridging)
-      CALL iom_put( 'vfxres'    , wfx_res     )   ! mass flux from undiagnosed processes
       CALL iom_put( 'vfxpnd'    , wfx_pnd     )   ! mass flux from melt ponds
       CALL iom_put( 'vfxsub'    , wfx_ice_sub )   ! mass flux from ice sublimation (ice-atm.)
       CALL iom_put( 'vfxsub_err', wfx_err_sub )   ! "excess" of sublimation sent to ocean
+      CALL iom_put( 'vfxres'    , wfx_res     )   ! mass flux from undiagnosed processes
 
       IF ( iom_use( 'vfxthin' ) ) THEN   ! mass flux from ice growth in open water + thin ice (<20cm) => comparable to observations
-         ALLOCATE( z2d(jpi,jpj) )
+         ALLOCATE( z2d(A2D(0)) )
          WHERE( hm_i(:,:) < 0.2 .AND. hm_i(:,:) > 0. ) ; z2d = wfx_bog
          ELSEWHERE                                     ; z2d = 0._wp
          END WHERE
@@ -263,8 +277,8 @@ CONTAINS
       IF( iom_use('qtr_ice_top') )   CALL iom_put( 'qtr_ice_top', SUM( qtr_ice_top * a_i_b, dim=3 )                          )   !     solar flux transmitted thru ice surface
       IF( iom_use('qt_oce'     ) )   CALL iom_put( 'qt_oce'     ,      ( qsr_oce + qns_oce ) * ( 1._wp - at_i_b ) + qemp_oce )
       IF( iom_use('qt_ice'     ) )   CALL iom_put( 'qt_ice'     , SUM( ( qns_ice + qsr_ice ) * a_i_b, dim=3 )     + qemp_ice )
-      IF( iom_use('qt_oce_ai'  ) )   CALL iom_put( 'qt_oce_ai'  , qt_oce_ai * tmask(:,:,1)                                   )   ! total heat flux at the ocean   surface: interface oce-(ice+atm)
-      IF( iom_use('qt_atm_oi'  ) )   CALL iom_put( 'qt_atm_oi'  , qt_atm_oi * tmask(:,:,1)                                   )   ! total heat flux at the oce-ice surface: interface atm-(ice+oce)
+      IF( iom_use('qt_oce_ai'  ) )   CALL iom_put( 'qt_oce_ai'  , qt_oce_ai * smask0                                         )   ! total heat flux at the ocean   surface: interface oce-(ice+atm)
+      IF( iom_use('qt_atm_oi'  ) )   CALL iom_put( 'qt_atm_oi'  , qt_atm_oi * smask0                                         )   ! total heat flux at the oce-ice surface: interface atm-(ice+oce)
       IF( iom_use('qemp_oce'   ) )   CALL iom_put( 'qemp_oce'   , qemp_oce                                                   )   ! Downward Heat Flux from E-P over ocean
       IF( iom_use('qemp_ice'   ) )   CALL iom_put( 'qemp_ice'   , qemp_ice                                                   )   ! Downward Heat Flux from E-P over ice
 
@@ -281,9 +295,9 @@ CONTAINS
       ! heat fluxes associated with mass exchange (freeze/melt/precip...)
       CALL iom_put ('hfxthd'     , hfx_thd     )   !
       CALL iom_put ('hfxdyn'     , hfx_dyn     )   !
-      CALL iom_put ('hfxres'     , hfx_res     )   !
       CALL iom_put ('hfxsub'     , hfx_sub     )   !
       CALL iom_put ('hfxspr'     , hfx_spr     )   ! Heat flux from snow precip heat content
+      CALL iom_put ('hfxres'     , hfx_res     )   !
 
       ! other heat fluxes
       IF( iom_use('hfxsensib'  ) )   CALL iom_put( 'hfxsensib'  ,      qsb_ice_bot * at_i_b         )   ! Sensible oceanic heat flux
@@ -313,7 +327,7 @@ CONTAINS
       !!
       !! ** Action  : * at each ice time step (every nn_fsbc time step):
       !!                - compute the modulus of ice-ocean relative velocity
-      !!                  (*rho*Cd) at T-point (C-grid) or I-point (B-grid)
+      !!                  (*rho*Cd) at T-point (C-grid)
       !!                      tmod_io = rhoco * | U_ice-U_oce |
       !!                - update the modulus of stress at ocean surface
       !!                      taum = (1-a) * taum + a * tmod_io * | U_ice-U_oce |
@@ -324,19 +338,19 @@ CONTAINS
       !!
       !!    NB: - ice-ocean rotation angle no more allowed
       !!        - here we make an approximation: taum is only computed every ice time step
-      !!          This avoids mutiple average to pass from T -> U,V grids and next from U,V grids
-      !!          to T grid. taum is used in TKE and GLS, which should not be too sensitive to this approximaton...
+      !!          This avoids mutiple average to pass from U,V grids to T grids
+      !!          taum is used in TKE and GLS, which should not be too sensitive to this approximaton...
       !!
-      !! ** Outputs : - utau, vtau   : surface ocean i- and j-stress (u- & v-pts) updated with ice-ocean fluxes
+      !! ** Outputs : - utau, vtau   : surface ocean i- and j-stress (T-pts) updated with ice-ocean fluxes
       !!              - taum         : modulus of the surface ocean stress (T-point) updated with ice-ocean fluxes
       !!---------------------------------------------------------------------
       INTEGER ,                     INTENT(in) ::   kt               ! ocean time-step index
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pu_oce, pv_oce   ! surface ocean currents
       !
       INTEGER  ::   ji, jj   ! dummy loop indices
-      REAL(wp) ::   zat_u, zutau_ice, zu_t, zmodt   ! local scalar
-      REAL(wp) ::   zat_v, zvtau_ice, zv_t, zrhoco  !   -      -
-      REAL(wp) ::   zflagi                          !   -      -
+      REAL(wp) ::   zutau_ice, zu_t, zmodt   ! local scalar
+      REAL(wp) ::   zvtau_ice, zv_t, zrhoco  !   -      -
+      REAL(wp) ::   zflagi                   !   -      -
       !!---------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('iceupdate')
 
@@ -349,46 +363,53 @@ CONTAINS
       zrhoco = rho0 * rn_cio
       !
       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN     !==  Ice time-step only  ==!   (i.e. surface module time-step)
-         DO_2D( 0, 0, 0, 0 )                          !* update the modulus of stress at ocean surface (T-point)
+         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )    !*  rhoco * |U_ice-U_oce| at T-point
+            !                                               ! 2*(U_ice-U_oce) at T-point
+            zu_t = ( u_ice(ji,jj) + u_ice(ji-1,jj) ) - ( u_oce(ji,jj) + u_oce(ji-1,jj) ) ! u_oce = ssu_m       add () for
+            zv_t = ( v_ice(ji,jj) + v_ice(ji,jj-1) ) - ( v_oce(ji,jj) + v_oce(ji,jj-1) ) ! v_oce = ssv_m       NP repro
+            !                                               ! |U_ice-U_oce|^2
+            zmodt =  0.25_wp * (  zu_t * zu_t + zv_t * zv_t  )
+            !
+            tmod_io(ji,jj) = zrhoco * SQRT( zmodt )
+         END_2D
+         IF( nn_hls == 1 )   CALL lbc_lnk( 'iceupdate', tmod_io, 'T', 1._wp )
+         !
+         DO_2D( 0, 0, 0, 0 )                                !* save the air-ocean stresses at ice time-step
             !                                               ! 2*(U_ice-U_oce) at T-point
-            zu_t = u_ice(ji,jj) + u_ice(ji-1,jj) - u_oce(ji,jj) - u_oce(ji-1,jj)
-            zv_t = v_ice(ji,jj) + v_ice(ji,jj-1) - v_oce(ji,jj) - v_oce(ji,jj-1)
-            !                                              ! |U_ice-U_oce|^2
+            zu_t = ( u_ice(ji,jj) + u_ice(ji-1,jj) ) - ( u_oce(ji,jj) + u_oce(ji-1,jj) ) ! u_oce = ssu_m       add () for
+            zv_t = ( v_ice(ji,jj) + v_ice(ji,jj-1) ) - ( v_oce(ji,jj) + v_oce(ji,jj-1) ) ! v_oce = ssv_m       NP repro
+            !                                               ! |U_ice-U_oce|^2
             zmodt =  0.25_wp * (  zu_t * zu_t + zv_t * zv_t  )
             !                                               ! update the ocean stress modulus
             taum(ji,jj) = ( 1._wp - at_i(ji,jj) ) * taum(ji,jj) + at_i(ji,jj) * zrhoco * zmodt
-            tmod_io(ji,jj) = zrhoco * SQRT( zmodt )          ! rhoco * |U_ice-U_oce| at T-point
+            !
+            utau_oce(ji,jj) = utau(ji,jj)
+            vtau_oce(ji,jj) = vtau(ji,jj)
          END_2D
-         CALL lbc_lnk( 'iceupdate', taum, 'T', 1.0_wp, tmod_io, 'T', 1.0_wp )
-         !
-         utau_oce(:,:) = utau(:,:)                    !* save the air-ocean stresses at ice time-step
-         vtau_oce(:,:) = vtau(:,:)
          !
       ENDIF
       !
       !                                      !==  every ocean time-step  ==!
       IF ( ln_drgice_imp ) THEN
          ! Save drag with right sign to update top drag in the ocean implicit friction
-         rCdU_ice(:,:) = -r1_rho0 * tmod_io(:,:) * at_i(:,:) * tmask(:,:,1)
+         DO_2D( 1, 1, 1, 1 )
+            rCdU_ice(ji,jj) = -r1_rho0 * tmod_io(ji,jj) * at_i(ji,jj) * tmask(ji,jj,1)
+         END_2D
          zflagi = 0._wp
       ELSE
          zflagi = 1._wp
       ENDIF
       !
       DO_2D( 0, 0, 0, 0 )                             !* update the stress WITHOUT an ice-ocean rotation angle
-         ! ice area at u and v-points
-         zat_u  = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji+1,jj    ) * tmask(ji+1,jj  ,1) )  &
-            &     / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji+1,jj  ,1) )
-         zat_v  = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji  ,jj+1  ) * tmask(ji  ,jj+1,1) )  &
-            &     / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji  ,jj+1,1) )
          !                                                   ! linearized quadratic drag formulation
-         zutau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - pu_oce(ji,jj) )
-         zvtau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - pv_oce(ji,jj) )
+         zutau_ice   = 0.5_wp * tmod_io(ji,jj)   &
+            &                 * ( ( u_ice(ji,jj) + u_ice(ji-1,jj) ) - ( pu_oce(ji,jj) + pu_oce(ji-1,jj) ) )   ! add () for
+         zvtau_ice   = 0.5_wp * tmod_io(ji,jj)   &
+            &                 * ( ( v_ice(ji,jj) + v_ice(ji,jj-1) ) - ( pv_oce(ji,jj) + pv_oce(ji,jj-1) ) )   ! NP repro
          !                                                   ! stresses at the ocean surface
-         utau(ji,jj) = ( 1._wp - zat_u ) * utau_oce(ji,jj) + zat_u * zutau_ice
-         vtau(ji,jj) = ( 1._wp - zat_v ) * vtau_oce(ji,jj) + zat_v * zvtau_ice
+         utau(ji,jj) = ( 1._wp - at_i(ji,jj) ) * utau_oce(ji,jj) + at_i(ji,jj) * zutau_ice
+         vtau(ji,jj) = ( 1._wp - at_i(ji,jj) ) * vtau_oce(ji,jj) + at_i(ji,jj) * zvtau_ice
       END_2D
-      CALL lbc_lnk( 'iceupdate', utau, 'U', -1.0_wp, vtau, 'V', -1.0_wp )   ! lateral boundary condition
       !
       IF( ln_timing )   CALL timing_stop('iceupdate')
       !
@@ -445,15 +466,13 @@ CONTAINS
                CALL iom_get( numrir, jpdom_auto, 'snwice_mass_b', snwice_mass_b )
             ELSE                                     ! start from rest
                IF(lwp) WRITE(numout,*) '   ==>>   previous run without snow-ice mass output then set it'
-               snwice_mass  (:,:) = tmask(:,:,1) * ( rhos * vt_s(:,:) + rhoi * vt_i(:,:) & 
-                                                &  + rhow * (vt_ip(:,:) + vt_il(:,:))  )
+               snwice_mass  (:,:) = tmask(:,:,1) * ( rhos * vt_s(:,:) + rhoi * vt_i(:,:) + rhow * (vt_ip(:,:) + vt_il(:,:)) )
                snwice_mass_b(:,:) = snwice_mass(:,:)
             ENDIF
          ELSE                                   !* Start from rest
 !JC: I think this is useless with what is now done in ice_istate
             IF(lwp) WRITE(numout,*) '   ==>>   start from rest: set the snow-ice mass'
-            snwice_mass  (:,:) = tmask(:,:,1) * ( rhos * vt_s(:,:) + rhoi * vt_i(:,:) & 
-                                             &  + rhow * (vt_ip(:,:) + vt_il(:,:))  )
+            snwice_mass  (:,:) = tmask(:,:,1) * ( rhos * vt_s(:,:) + rhoi * vt_i(:,:) + rhow * (vt_ip(:,:) + vt_il(:,:)) )
             snwice_mass_b(:,:) = snwice_mass(:,:)
          ENDIF
          !
diff --git a/src/ICE/icevar.F90 b/src/ICE/icevar.F90
index 535c5eb6..03d1fd6d 100644
--- a/src/ICE/icevar.F90
+++ b/src/ICE/icevar.F90
@@ -55,7 +55,7 @@ MODULE icevar
    !!----------------------------------------------------------------------
    USE dom_oce        ! ocean space and time domain
    USE phycst         ! physical constants (ocean directory)
-   USE sbc_oce , ONLY : sss_m, ln_ice_embd, nn_fsbc
+   USE sbc_oce , ONLY : sss_m, sst_m, ln_ice_embd, nn_fsbc
    USE ice            ! sea-ice: variables
    USE ice1D          ! sea-ice: thermodynamics variables
    !
@@ -113,100 +113,153 @@ CONTAINS
       INTEGER, INTENT( in ) ::   kn     ! =1 state variables only
       !                                 ! >1 state variables + others
       !
-      INTEGER ::   ji, jj, jk, jl   ! dummy loop indices
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   z1_at_i, z1_vt_i, z1_vt_s
+      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
+      REAL(wp) ::   z1_vt_i, z1_vt_s, z1_at_i
       !!-------------------------------------------------------------------
       !
-      !                                      ! integrated values
-      vt_i(:,:) =       SUM( v_i (:,:,:)           , dim=3 )
-      vt_s(:,:) =       SUM( v_s (:,:,:)           , dim=3 )
-      st_i(:,:) =       SUM( sv_i(:,:,:)           , dim=3 )
-      at_i(:,:) =       SUM( a_i (:,:,:)           , dim=3 )
-      et_s(:,:)  = SUM( SUM( e_s (:,:,:,:), dim=4 ), dim=3 )
-      et_i(:,:)  = SUM( SUM( e_i (:,:,:,:), dim=4 ), dim=3 )
-      !
-      at_ip(:,:) = SUM( a_ip(:,:,:), dim=3 ) ! melt ponds
-      vt_ip(:,:) = SUM( v_ip(:,:,:), dim=3 )
-      vt_il(:,:) = SUM( v_il(:,:,:), dim=3 )
+      ! full    arrays: vt_i, vt_s, at_i, vt_ip, vt_il, at_ip
+      ! reduced arrays: the rest
       !
-      ato_i(:,:) = 1._wp - at_i(:,:)         ! open water fraction
+      ! --- integrated values
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         vt_i(ji,jj)  = SUM( v_i (ji,jj,:) )
+         vt_s(ji,jj)  = SUM( v_s (ji,jj,:) )
+         at_i(ji,jj)  = SUM( a_i (ji,jj,:) )
+         !
+         at_ip(ji,jj) = SUM( a_ip(ji,jj,:) ) ! melt ponds
+         vt_ip(ji,jj) = SUM( v_ip(ji,jj,:) )
+         vt_il(ji,jj) = SUM( v_il(ji,jj,:) )
+         !
+         ato_i(ji,jj) = 1._wp - at_i(ji,jj)  ! open water fraction
+      END_2D
       !
-      !!GS: tm_su always needed by ABL over sea-ice
-      ALLOCATE( z1_at_i(jpi,jpj) )
-      WHERE( at_i(:,:) > epsi20 )   ;   z1_at_i(:,:) = 1._wp / at_i(:,:)
-      ELSEWHERE                     ;   z1_at_i(:,:) = 0._wp
-      END WHERE
-      tm_su(:,:) = SUM( t_su(:,:,:) * a_i(:,:,:) , dim=3 ) * z1_at_i(:,:)
-      WHERE( at_i(:,:)<=epsi20 ) tm_su(:,:) = rt0
+      DO_2D( 0, 0, 0, 0 )
+         st_i(ji,jj) =       SUM( sv_i(ji,jj,:)     )
+         et_s(ji,jj)  = SUM( SUM( e_s (ji,jj,:,:), dim=2 ) )
+         et_i(ji,jj)  = SUM( SUM( e_i (ji,jj,:,:), dim=2 ) )
+         !
+         !!GS: tm_su always needed by ABL over sea-ice
+         IF( at_i(ji,jj) <= epsi20 ) THEN
+            tm_su  (ji,jj) = rt0
+         ELSE
+            tm_su  (ji,jj) = SUM( t_su(ji,jj,:) * a_i(ji,jj,:) ) / at_i(ji,jj)
+         ENDIF
+      END_2D
       !
       ! The following fields are calculated for diagnostics and outputs only
       ! ==> Do not use them for other purposes
       IF( kn > 1 ) THEN
          !
-         ALLOCATE( z1_vt_i(jpi,jpj) , z1_vt_s(jpi,jpj) )
-         WHERE( vt_i(:,:) > epsi20 )   ;   z1_vt_i(:,:) = 1._wp / vt_i(:,:)
-         ELSEWHERE                     ;   z1_vt_i(:,:) = 0._wp
-         END WHERE
-         WHERE( vt_s(:,:) > epsi20 )   ;   z1_vt_s(:,:) = 1._wp / vt_s(:,:)
-         ELSEWHERE                     ;   z1_vt_s(:,:) = 0._wp
-         END WHERE
-         !
-         !                          ! mean ice/snow thickness
-         hm_i(:,:) = vt_i(:,:) * z1_at_i(:,:)
-         hm_s(:,:) = vt_s(:,:) * z1_at_i(:,:)
-         !
-         !                          ! mean temperature (K), salinity and age
-         tm_si(:,:) = SUM( t_si(:,:,:) * a_i(:,:,:) , dim=3 ) * z1_at_i(:,:)
-         om_i (:,:) = SUM( oa_i(:,:,:)              , dim=3 ) * z1_at_i(:,:)
-         sm_i (:,:) =      st_i(:,:)                          * z1_vt_i(:,:)
-         !
+         DO_2D( 0, 0, 0, 0 )
+            IF( at_i(ji,jj) > epsi20 ) THEN   ;   z1_at_i = 1._wp / at_i(ji,jj)
+            ELSE                              ;   z1_at_i = 0._wp
+            ENDIF
+            IF( vt_i(ji,jj) > epsi20 ) THEN   ;   z1_vt_i = 1._wp / vt_i(ji,jj)
+            ELSE                              ;   z1_vt_i = 0._wp
+            ENDIF
+
+            ! mean ice/snow thickness
+            hm_i(ji,jj) = vt_i(ji,jj) * z1_at_i
+            hm_s(ji,jj) = vt_s(ji,jj) * z1_at_i
+            !
+            ! mean temperature (K), salinity and age
+            tm_si(ji,jj) = SUM( t_si(ji,jj,:) * a_i(ji,jj,:)  ) * z1_at_i
+            om_i (ji,jj) = SUM( oa_i(ji,jj,:)                 ) * z1_at_i
+            sm_i (ji,jj) =      st_i(ji,jj)                     * z1_vt_i
+         END_2D
+            !
          tm_i(:,:) = 0._wp
          tm_s(:,:) = 0._wp
          DO jl = 1, jpl
-            DO jk = 1, nlay_i
-               tm_i(:,:) = tm_i(:,:) + r1_nlay_i * t_i (:,:,jk,jl) * v_i(:,:,jl) * z1_vt_i(:,:)
-            END DO
-            DO jk = 1, nlay_s
-               tm_s(:,:) = tm_s(:,:) + r1_nlay_s * t_s (:,:,jk,jl) * v_s(:,:,jl) * z1_vt_s(:,:)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nlay_i )
+               IF( vt_i(ji,jj) > epsi20 ) THEN
+                  tm_i(ji,jj) = tm_i(ji,jj) + r1_nlay_i * t_i (ji,jj,jk,jl) * v_i(ji,jj,jl) / vt_i(ji,jj)
+               ELSE
+                  tm_i(ji,jj) = rt0
+               ENDIF
+            END_3D
          END DO
-         !
-         !                           ! put rt0 where there is no ice
-         WHERE( at_i(:,:)<=epsi20 )
+         DO jl = 1, jpl
+            DO_3D( 0, 0, 0, 0, 1, nlay_s )
+               IF( vt_s(ji,jj) > epsi20 ) THEN
+                  tm_s(ji,jj) = tm_s(ji,jj) + r1_nlay_s * t_s (ji,jj,jk,jl) * v_s(ji,jj,jl) / vt_s(ji,jj)
+               ELSE
+                  tm_s(ji,jj) = rt0
+               ENDIF
+            END_3D
+         END DO
+            !            
+!!$         DO_2D( 0, 0, 0, 0 )
+!!$            IF( at_i(ji,jj) > epsi20 ) THEN   ;   z1_at_i = 1._wp / at_i(ji,jj)
+!!$            ELSE                              ;   z1_at_i = 0._wp
+!!$            ENDIF
+!!$            IF( vt_i(ji,jj) > epsi20 ) THEN   ;   z1_vt_i = 1._wp / vt_i(ji,jj)
+!!$            ELSE                              ;   z1_vt_i = 0._wp
+!!$            ENDIF
+!!$            IF( vt_s(ji,jj) > epsi20 ) THEN   ;   z1_vt_s = 1._wp / vt_s(ji,jj)
+!!$            ELSE                              ;   z1_vt_s = 0._wp
+!!$            ENDIF
+!!$
+!!$            ! mean ice/snow thickness
+!!$            hm_i(ji,jj) = vt_i(ji,jj) * z1_at_i
+!!$            hm_s(ji,jj) = vt_s(ji,jj) * z1_at_i
+!!$            !
+!!$            ! mean temperature (K), salinity and age
+!!$            tm_si(ji,jj) = SUM( t_si(ji,jj,:) * a_i(ji,jj,:)  ) * z1_at_i
+!!$            om_i (ji,jj) = SUM( oa_i(ji,jj,:)                 ) * z1_at_i
+!!$            sm_i (ji,jj) =      st_i(ji,jj)                     * z1_vt_i
+!!$            !
+!!$            tm_i(ji,jj) = 0._wp
+!!$            tm_s(ji,jj) = 0._wp
+!!$            DO jl = 1, jpl
+!!$               DO jk = 1, nlay_i
+!!$                  tm_i(ji,jj) = tm_i(ji,jj) + r1_nlay_i * t_i (ji,jj,jk,jl) * v_i(ji,jj,jl) * z1_vt_i
+!!$               END DO
+!!$               DO jk = 1, nlay_s
+!!$                  tm_s(ji,jj) = tm_s(ji,jj) + r1_nlay_s * t_s (ji,jj,jk,jl) * v_s(ji,jj,jl) * z1_vt_s
+!!$               END DO
+!!$            END DO
+!!$            !            
+!!$         END_2D
+         ! put rt0 where there is no ice
+         WHERE( at_i(A2D(0)) <= epsi20 )
             tm_si(:,:) = rt0
             tm_i (:,:) = rt0
             tm_s (:,:) = rt0
          END WHERE
          !
-         !                           ! mean melt pond depth
-         WHERE( at_ip(:,:) > epsi20 )   ;   hm_ip(:,:) = vt_ip(:,:) / at_ip(:,:)   ;   hm_il(:,:) = vt_il(:,:) / at_ip(:,:)
-         ELSEWHERE                      ;   hm_ip(:,:) = 0._wp                     ;   hm_il(:,:) = 0._wp
+         ! mean melt pond depth
+         WHERE( at_ip(A2D(0)) > epsi20 )
+            hm_ip(:,:) = vt_ip(A2D(0)) / at_ip(A2D(0))
+            hm_il(:,:) = vt_il(A2D(0)) / at_ip(A2D(0))
+         ELSEWHERE
+            hm_ip(:,:) = 0._wp
+            hm_il(:,:) = 0._wp
          END WHERE
          !
-         DEALLOCATE( z1_vt_i , z1_vt_s )
-         !
       ENDIF
       !
-      DEALLOCATE( z1_at_i )
-      !
    END SUBROUTINE ice_var_agg
 
 
-   SUBROUTINE ice_var_glo2eqv
+   SUBROUTINE ice_var_glo2eqv( kn )
       !!-------------------------------------------------------------------
       !!                ***  ROUTINE ice_var_glo2eqv ***
       !!
       !! ** Purpose :   computes equivalent variables as function of
       !!              global variables, i.e. it turns VGLO into VEQV
       !!-------------------------------------------------------------------
+      INTEGER, INTENT( in ) ::   kn     ! =1 everything including ponds (necessary for init)
+      !                                 ! =2            excluding ponds if ln_pnd=F
       INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
       REAL(wp) ::   ze_i             ! local scalars
       REAL(wp) ::   ze_s, ztmelts, zbbb, zccc       !   -      -
-      REAL(wp) ::   zhmax, z1_zhmax                 !   -      -
+      REAL(wp) ::   zhmax, z1_hmax                 !   -      -
       REAL(wp) ::   zlay_i, zlay_s                  !   -      -
       REAL(wp), PARAMETER ::   zhl_max =  0.015_wp  ! pond lid thickness above which the ponds disappear from the albedo calculation
       REAL(wp), PARAMETER ::   zhl_min =  0.005_wp  ! pond lid thickness below which the full pond area is used in the albedo calculation
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_a_i, z1_v_i, z1_a_ip, za_s_fra
+      REAL(wp) ::   z1_hl, z1_a_i, z1_a_ip
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   za_s_fra
       !!-------------------------------------------------------------------
 
 !!gm Question 2:  It is possible to define existence of sea-ice in a common way between
@@ -217,92 +270,115 @@ CONTAINS
       !---------------------------------------------------------------
       ! Ice thickness, snow thickness, ice salinity, ice age and ponds
       !---------------------------------------------------------------
-      !                                            !--- inverse of the ice area
-      WHERE( a_i(:,:,:) > epsi20 )   ;   z1_a_i(:,:,:) = 1._wp / a_i(:,:,:)
-      ELSEWHERE                      ;   z1_a_i(:,:,:) = 0._wp
-      END WHERE
-      !
-      WHERE( v_i(:,:,:) > epsi20 )   ;   z1_v_i(:,:,:) = 1._wp / v_i(:,:,:)
-      ELSEWHERE                      ;   z1_v_i(:,:,:) = 0._wp
-      END WHERE
-      !
-      WHERE( a_ip(:,:,:) > epsi20 )  ;   z1_a_ip(:,:,:) = 1._wp / a_ip(:,:,:)
-      ELSEWHERE                      ;   z1_a_ip(:,:,:) = 0._wp
-      END WHERE
-      !                                           !--- ice thickness
-      h_i(:,:,:) = v_i (:,:,:) * z1_a_i(:,:,:)
-
-      zhmax    =          hi_max(jpl)
-      z1_zhmax =  1._wp / hi_max(jpl)
-      WHERE( h_i(:,:,jpl) > zhmax )   ! bound h_i by hi_max (i.e. 99 m) with associated update of ice area
-         h_i   (:,:,jpl) = zhmax
-         a_i   (:,:,jpl) = v_i(:,:,jpl) * z1_zhmax
-         z1_a_i(:,:,jpl) = zhmax * z1_v_i(:,:,jpl)
-      END WHERE
-      !                                           !--- snow thickness
-      h_s(:,:,:) = v_s (:,:,:) * z1_a_i(:,:,:)
-      !                                           !--- ice age
-      o_i(:,:,:) = oa_i(:,:,:) * z1_a_i(:,:,:)
-      !                                           !--- pond and lid thickness
-      h_ip(:,:,:) = v_ip(:,:,:) * z1_a_ip(:,:,:)
-      h_il(:,:,:) = v_il(:,:,:) * z1_a_ip(:,:,:)
-      !                                           !--- melt pond effective area (used for albedo)
-      a_ip_frac(:,:,:) = a_ip(:,:,:) * z1_a_i(:,:,:)
-      WHERE    ( h_il(:,:,:) <= zhl_min )  ;   a_ip_eff(:,:,:) = a_ip_frac(:,:,:)       ! lid is very thin.  Expose all the pond
-      ELSEWHERE( h_il(:,:,:) >= zhl_max )  ;   a_ip_eff(:,:,:) = 0._wp                  ! lid is very thick. Cover all the pond up with ice and snow
-      ELSEWHERE                            ;   a_ip_eff(:,:,:) = a_ip_frac(:,:,:) * &   ! lid is in between. Expose part of the pond
-         &                                                       ( zhl_max - h_il(:,:,:) ) / ( zhl_max - zhl_min )
-      END WHERE
-      !
-      CALL ice_var_snwfra( h_s, za_s_fra )           ! calculate ice fraction covered by snow
-      a_ip_eff = MIN( a_ip_eff, 1._wp - za_s_fra )   ! make sure (a_ip_eff + a_s_fra) <= 1
       !
-      !                                           !---  salinity (with a minimum value imposed everywhere)
+      ! bound h_i by hi_max (i.e. 99 m) with associated update of ice area
+      ! clem: if a>1 then do something
+      zhmax   =          hi_max(jpl)
+      z1_hmax =  1._wp / hi_max(jpl)
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         IF( v_i(ji,jj,jpl) > ( zhmax*a_i(ji,jj,jpl) ) )   a_i(ji,jj,jpl) = MIN( 1._wp, v_i(ji,jj,jpl) * z1_hmax )
+      END_2D
+      
+      DO jl = 1, jpl
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            !                                            !--- inverse of the ice area
+            IF( a_i(ji,jj,jl) > epsi20 ) THEN   ;   z1_a_i = 1._wp / a_i(ji,jj,jl)
+            ELSE                                ;   z1_a_i = 0._wp
+            ENDIF
+            !                                            !--- ice thickness
+            h_i(ji,jj,jl) = v_i (ji,jj,jl) * z1_a_i
+            !                                            !--- snow thickness
+            h_s(ji,jj,jl) = v_s (ji,jj,jl) * z1_a_i
+            !                                            !--- ice age
+            o_i(ji,jj,jl) = oa_i(ji,jj,jl) * z1_a_i
+            !
+         END_2D
+      ENDDO
+      !                                                  !---  salinity (with a minimum value imposed everywhere)
       IF( nn_icesal == 2 ) THEN
-         WHERE( v_i(:,:,:) > epsi20 )   ;   s_i(:,:,:) = MAX( rn_simin , MIN( rn_simax, sv_i(:,:,:) * z1_v_i(:,:,:) ) )
+         WHERE( v_i(:,:,:) > epsi20 )   ;   s_i(:,:,:) = MAX( rn_simin , MIN( rn_simax, sv_i(:,:,:) / v_i(:,:,:) ) )
          ELSEWHERE                      ;   s_i(:,:,:) = rn_simin
          END WHERE
       ENDIF
       CALL ice_var_salprof   ! salinity profile
 
+      IF( kn == 1 .OR. ln_pnd ) THEN
+         ALLOCATE( za_s_fra(A2D(0),jpl) )
+         !
+         z1_hl = 1._wp / ( zhl_max - zhl_min )
+         DO jl = 1, jpl
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               IF( a_ip(ji,jj,jl) > epsi20 ) THEN   ;   z1_a_ip = 1._wp / a_ip(ji,jj,jl)
+               ELSE                                 ;   z1_a_ip = 0._wp
+               ENDIF
+               !                                         !--- pond and lid thickness
+               h_ip(ji,jj,jl) = v_ip(ji,jj,jl) * z1_a_ip
+               h_il(ji,jj,jl) = v_il(ji,jj,jl) * z1_a_ip
+            END_2D
+            !                                            !--- melt pond effective area (used for albedo)
+            DO_2D( 0, 0, 0, 0 )
+               IF( a_i(ji,jj,jl) > epsi20 ) THEN   ;   a_ip_frac(ji,jj,jl) = a_ip(ji,jj,jl) / a_i(ji,jj,jl)
+               ELSE                                ;   a_ip_frac(ji,jj,jl) = 0._wp
+               ENDIF
+               IF    ( h_il(ji,jj,jl) <= zhl_min ) THEN   ;   a_ip_eff(ji,jj,jl) = a_ip_frac(ji,jj,jl)       ! lid is very thin.  Expose all the pond
+               ELSEIF( h_il(ji,jj,jl) >= zhl_max ) THEN   ;   a_ip_eff(ji,jj,jl) = 0._wp                     ! lid is very thick. Cover all the pond up with ice and snow
+               ELSE                                       ;   a_ip_eff(ji,jj,jl) = a_ip_frac(ji,jj,jl) * &   ! lid is in between. Expose part of the pond
+                  &                                                         ( zhl_max - h_il(ji,jj,jl) ) * z1_hl 
+               ENDIF
+               !
+            END_2D
+         ENDDO
+         !
+         CALL ice_var_snwfra( h_s(A2D(0),:), za_s_fra(:,:,:) )               ! calculate ice fraction covered by snow
+         a_ip_eff(:,:,:) = MIN( a_ip_eff(:,:,:), 1._wp - za_s_fra(:,:,:) )   ! make sure (a_ip_eff + a_s_fra) <= 1
+         !
+         DEALLOCATE( za_s_fra )
+      ENDIF
+         
       !-------------------
       ! Ice temperature   [K]   (with a minimum value (rt0 - 100.))
       !-------------------
-      zlay_i   = REAL( nlay_i , wp )    ! number of layers
+      zlay_i = REAL( nlay_i , wp )    ! number of layers
       DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
-            IF ( v_i(ji,jj,jl) > epsi20 ) THEN     !--- icy area
-               !
-               ze_i             =   e_i (ji,jj,jk,jl) * z1_v_i(ji,jj,jl) * zlay_i             ! Energy of melting e(S,T) [J.m-3]
-               ztmelts          = - sz_i(ji,jj,jk,jl) * rTmlt                                 ! Ice layer melt temperature [C]
-               ! Conversion q(S,T) -> T (second order equation)
-               zbbb             = ( rcp - rcpi ) * ztmelts + ze_i * r1_rhoi - rLfus
-               zccc             = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts , 0._wp) )
-               t_i(ji,jj,jk,jl) = MAX( -100._wp , MIN( -( zbbb + zccc ) * 0.5_wp * r1_rcpi , ztmelts ) ) + rt0   ! [K] with bounds: -100 < t_i < ztmelts
-               !
-            ELSE                                   !--- no ice
-               t_i(ji,jj,jk,jl) = rt0
-            ENDIF
-         END_3D
+         DO jk = 1, nlay_i
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               IF ( v_i(ji,jj,jl) > epsi20 ) THEN     !--- icy area
+                  !
+                  ze_i             =   e_i (ji,jj,jk,jl) / v_i(ji,jj,jl) * zlay_i             ! Energy of melting e(S,T) [J.m-3]
+                  ztmelts          = - sz_i(ji,jj,jk,jl) * rTmlt                              ! Ice layer melt temperature [C]
+                  ! Conversion q(S,T) -> T (second order equation)
+                  zbbb             = ( rcp - rcpi ) * ztmelts + ze_i * r1_rhoi - rLfus
+                  zccc             = SQRT( MAX( zbbb * zbbb - 4._wp * rcpi * rLfus * ztmelts , 0._wp) )
+                  t_i(ji,jj,jk,jl) = MAX( -100._wp , MIN( -( zbbb + zccc ) * 0.5_wp * r1_rcpi , ztmelts ) ) + rt0   ! [K] with bounds: -100 < t_i < ztmelts
+                  !
+               ELSE                                   !--- no ice
+                  t_i(ji,jj,jk,jl) = rt0
+               ENDIF
+            END_2D
+         END DO
       END DO
 
       !--------------------
       ! Snow temperature   [K]   (with a minimum value (rt0 - 100.))
       !--------------------
       zlay_s = REAL( nlay_s , wp )
-      DO jk = 1, nlay_s
-         WHERE( v_s(:,:,:) > epsi20 )        !--- icy area
-            t_s(:,:,jk,:) = rt0 + MAX( -100._wp ,  &
-                 &                MIN( r1_rcpi * ( -r1_rhos * ( e_s(:,:,jk,:) / v_s(:,:,:) * zlay_s ) + rLfus ) , 0._wp ) )
-         ELSEWHERE                           !--- no ice
-            t_s(:,:,jk,:) = rt0
-         END WHERE
+      DO jl = 1, jpl
+         DO jk = 1, nlay_s
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               IF ( v_s(ji,jj,jl) > epsi20 ) THEN     !--- icy area
+                  t_s(ji,jj,jk,jl) = rt0 + MAX( -100._wp ,  &
+                     &               MIN( r1_rcpi*( -r1_rhos*( e_s(ji,jj,jk,jl) / v_s(ji,jj,jl) * zlay_s ) + rLfus ) , 0._wp ) )
+               ELSE                                   !--- no ice
+                  t_s(ji,jj,jk,jl) = rt0
+               ENDIF
+            END_2D
+         END DO
       END DO
       !
       ! integrated values
-      vt_i (:,:) = SUM( v_i , dim=3 )
-      vt_s (:,:) = SUM( v_s , dim=3 )
-      at_i (:,:) = SUM( a_i , dim=3 )
+      vt_i (:,:) = SUM( v_i, dim=3 )
+      vt_s (:,:) = SUM( v_s, dim=3 )
+      at_i (:,:) = SUM( a_i, dim=3 )
       !
    END SUBROUTINE ice_var_glo2eqv
 
@@ -314,12 +390,18 @@ CONTAINS
       !! ** Purpose :   computes global variables as function of
       !!              equivalent variables,  i.e. it turns VEQV into VGLO
       !!-------------------------------------------------------------------
+      INTEGER  ::   ji, jj, jl   ! dummy loop indices
+      !!-------------------------------------------------------------------
       !
-      v_i (:,:,:) = h_i (:,:,:) * a_i (:,:,:)
-      v_s (:,:,:) = h_s (:,:,:) * a_i (:,:,:)
-      sv_i(:,:,:) = s_i (:,:,:) * v_i (:,:,:)
-      v_ip(:,:,:) = h_ip(:,:,:) * a_ip(:,:,:)
-      v_il(:,:,:) = h_il(:,:,:) * a_ip(:,:,:)
+      DO jl = 1, jpl
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            v_i (ji,jj,jl) = h_i (ji,jj,jl) * a_i (ji,jj,jl)
+            v_s (ji,jj,jl) = h_s (ji,jj,jl) * a_i (ji,jj,jl)
+            sv_i(ji,jj,jl) = s_i (ji,jj,jl) * v_i (ji,jj,jl)
+            v_ip(ji,jj,jl) = h_ip(ji,jj,jl) * a_ip(ji,jj,jl)
+            v_il(ji,jj,jl) = h_il(ji,jj,jl) * a_ip(ji,jj,jl)
+         END_2D
+      ENDDO
       !
    END SUBROUTINE ice_var_eqv2glo
 
@@ -342,7 +424,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk, jl   ! dummy loop index
       REAL(wp) ::   z1_dS
       REAL(wp) ::   ztmp1, ztmp2, zs0, zs
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   z_slope_s, zalpha    ! case 2 only
+      REAL(wp) ::   z_slope_s, zalpha    ! case 2 only
       REAL(wp), PARAMETER :: zsi0 = 3.5_wp
       REAL(wp), PARAMETER :: zsi1 = 4.5_wp
       !!-------------------------------------------------------------------
@@ -362,33 +444,26 @@ CONTAINS
          !            !---------------------------------------------!
          z1_dS = 1._wp / ( zsi1 - zsi0 )
          !
-         ALLOCATE( z_slope_s(jpi,jpj) , zalpha(jpi,jpj) )
-         !
          DO jl = 1, jpl
-
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-               !                                      ! Slope of the linear profile
-               IF( h_i(ji,jj,jl) > epsi20 ) THEN
-                  z_slope_s(ji,jj) = 2._wp * s_i(ji,jj,jl) / h_i(ji,jj,jl)
-               ELSE
-                  z_slope_s(ji,jj) = 0._wp
-               ENDIF
-               !
-               zalpha(ji,jj) = MAX(  0._wp , MIN( ( zsi1 - s_i(ji,jj,jl) ) * z1_dS , 1._wp )  )
-               !                             ! force a constant profile when SSS too low (Baltic Sea)
-               IF( 2._wp * s_i(ji,jj,jl) >= sss_m(ji,jj) )   zalpha(ji,jj) = 0._wp
-            END_2D
-            !
-            ! Computation of the profile
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
-               !                          ! linear profile with 0 surface value
-               zs0 = z_slope_s(ji,jj) * ( REAL(jk,wp) - 0.5_wp ) * h_i(ji,jj,jl) * r1_nlay_i
-               zs  = zalpha(ji,jj) * zs0 + ( 1._wp - zalpha(ji,jj) ) * s_i(ji,jj,jl)     ! weighting the profile
-               sz_i(ji,jj,jk,jl) = MIN( rn_simax, MAX( zs, rn_simin ) )
-            END_3D
-         END DO
-         !
-         DEALLOCATE( z_slope_s , zalpha )
+            DO jk = 1, nlay_i
+               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                  !                                      ! Slope of the linear profile
+                  IF( h_i(ji,jj,jl) > epsi20 ) THEN   ;   z_slope_s = 2._wp * s_i(ji,jj,jl) / h_i(ji,jj,jl)
+                  ELSE                                ;   z_slope_s = 0._wp
+                  ENDIF
+                  !
+                  zalpha = MAX( 0._wp , MIN( ( zsi1 - s_i(ji,jj,jl) ) * z1_dS , 1._wp )  )
+                  !                             ! force a constant profile when SSS too low (Baltic Sea)
+                  IF( 2._wp * s_i(ji,jj,jl) >= sss_m(ji,jj) )   zalpha = 0._wp
+                  !
+                  ! Computation of the profile
+                  !                          ! linear profile with 0 surface value
+                  zs0 = z_slope_s * ( REAL(jk,wp) - 0.5_wp ) * h_i(ji,jj,jl) * r1_nlay_i
+                  zs  = zalpha * zs0 + ( 1._wp - zalpha ) * s_i(ji,jj,jl)     ! weighting the profile
+                  sz_i(ji,jj,jk,jl) = MIN( rn_simax, MAX( zs, rn_simin ) )
+               END_2D
+            ENDDO
+         ENDDO
          !
          !            !-------------------------------------------!
       CASE( 3 )       ! constant salinity with a fix profile      ! (Schwarzacher (1959) multiyear salinity profile
@@ -401,7 +476,6 @@ CONTAINS
 !            sz_i(:,:,jk,:) = S_prof(jk)
 !         END DO
 !!gm end
-         !
          DO jl = 1, jpl
             DO jk = 1, nlay_i
                ztmp1 = ( REAL(jk,wp) - 0.5_wp ) * r1_nlay_i
@@ -411,7 +485,7 @@ CONTAINS
                END_2D
             END DO
          END DO
-         !
+          !
       END SELECT
       !
    END SUBROUTINE ice_var_salprof
@@ -428,7 +502,7 @@ CONTAINS
       REAL(wp) ::   ztmp1, ztmp2, z1_dS   ! local scalars
       REAL(wp) ::   zs, zs0              !   -      -
       !
-      REAL(wp), ALLOCATABLE, DIMENSION(:) ::   z_slope_s, zalpha   !
+      REAL(wp) ::   z_slope_s, zalpha   !
       REAL(wp), PARAMETER :: zsi0 = 3.5_wp
       REAL(wp), PARAMETER :: zsi1 = 4.5_wp
       !!-------------------------------------------------------------------
@@ -445,34 +519,26 @@ CONTAINS
          !            !---------------------------------------------!
          z1_dS = 1._wp / ( zsi1 - zsi0 )
          !
-         ALLOCATE( z_slope_s(jpij), zalpha(jpij) )
-         !
-         DO ji = 1, npti
-            !                                      ! Slope of the linear profile
-            IF( h_i_1d(ji) > epsi20 ) THEN
-               z_slope_s(ji) = 2._wp * s_i_1d(ji) / h_i_1d(ji)
-            ELSE
-               z_slope_s(ji) = 0._wp
-            ENDIF
-            !
-            zalpha(ji) = MAX(  0._wp , MIN(  ( zsi1 - s_i_1d(ji) ) * z1_dS , 1._wp  )  )
-            !                             ! force a constant profile when SSS too low (Baltic Sea)
-            IF( 2._wp * s_i_1d(ji) >= sss_1d(ji) )   zalpha(ji) = 0._wp
-            !
-         END DO
-         !
-         ! Computation of the profile
          DO jk = 1, nlay_i
             DO ji = 1, npti
+               !                                      ! Slope of the linear profile
+               IF( h_i_1d(ji) > epsi20 ) THEN   ;   z_slope_s = 2._wp * s_i_1d(ji) / h_i_1d(ji)
+               ELSE                             ;   z_slope_s = 0._wp
+               ENDIF
+               !
+               zalpha = MAX(  0._wp , MIN(  ( zsi1 - s_i_1d(ji) ) * z1_dS , 1._wp  )  )
+               !                             ! force a constant profile when SSS too low (Baltic Sea)
+               IF( 2._wp * s_i_1d(ji) >= sss_1d(ji) )   zalpha = 0._wp
+               !
+               !
+               ! Computation of the profile
                !                          ! linear profile with 0 surface value
-               zs0 = z_slope_s(ji) * ( REAL(jk,wp) - 0.5_wp ) * h_i_1d(ji) * r1_nlay_i
-               zs  = zalpha(ji) * zs0 + ( 1._wp - zalpha(ji) ) * s_i_1d(ji)
+               zs0 = z_slope_s * ( REAL(jk,wp) - 0.5_wp ) * h_i_1d(ji) * r1_nlay_i
+               zs  = zalpha * zs0 + ( 1._wp - zalpha ) * s_i_1d(ji)
                sz_i_1d(ji,jk) = MIN( rn_simax , MAX( zs , rn_simin ) )
             END DO
          END DO
          !
-         DEALLOCATE( z_slope_s, zalpha )
-
          !            !-------------------------------------------!
       CASE( 3 )       ! constant salinity with a fix profile      ! (Schwarzacher (1959) multiyear salinity profile
          !            !-------------------------------------------!                                   (mean = 2.30)
@@ -500,69 +566,81 @@ CONTAINS
       !! ** Purpose :   Remove too small sea ice areas and correct fluxes
       !!-------------------------------------------------------------------
       INTEGER  ::   ji, jj, jl, jk   ! dummy loop indices
-      REAL(wp), DIMENSION(jpi,jpj) ::   zswitch
+      REAL(wp) ::   zsmall
       !!-------------------------------------------------------------------
       !
-      DO jl = 1, jpl       !==  loop over the categories  ==!
-         !
-         WHERE( a_i(:,:,jl) > epsi10 )   ;   h_i(:,:,jl) = v_i(:,:,jl) / a_i(:,:,jl)
-         ELSEWHERE                       ;   h_i(:,:,jl) = 0._wp
-         END WHERE
-         !
-         WHERE( a_i(:,:,jl) < epsi10 .OR. v_i(:,:,jl) < epsi10 .OR. h_i(:,:,jl) < epsi10 )   ;   zswitch(:,:) = 0._wp
-         ELSEWHERE                                                                           ;   zswitch(:,:) = 1._wp
-         END WHERE
-         !
-         !-----------------------------------------------------------------
-         ! Zap ice energy and use ocean heat to melt ice
-         !-----------------------------------------------------------------
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
-            ! update exchanges with ocean
-            hfx_res(ji,jj)   = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_i(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0
-            e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * zswitch(ji,jj)
-            t_i(ji,jj,jk,jl) = t_i(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) )
-         END_3D
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_s )
-            ! update exchanges with ocean
-            hfx_res(ji,jj)   = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_s(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0
-            e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * zswitch(ji,jj)
-            t_s(ji,jj,jk,jl) = t_s(ji,jj,jk,jl) * zswitch(ji,jj) + rt0 * ( 1._wp - zswitch(ji,jj) )
+      WHERE( a_i(A2D(0),:) > epsi10 )   ;   h_i(A2D(0),:) = v_i(A2D(0),:) / a_i(A2D(0),:)
+      ELSEWHERE                         ;   h_i(A2D(0),:) = 0._wp
+      END WHERE
+      !
+      !-----------------------------------------------------------------
+      ! Zap ice energy and use ocean heat to melt ice
+      !-----------------------------------------------------------------
+      DO jl = 1, jpl
+         DO_3D( 0, 0, 0, 0, 1, nlay_i )
+            !
+            zsmall = MIN( a_i(ji,jj,jl), v_i(ji,jj,jl),  h_i(ji,jj,jl) )
+            !
+            IF( zsmall < epsi10 ) THEN
+               ! update exchanges with ocean
+               hfx_res(ji,jj)   = hfx_res(ji,jj) - e_i(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0
+               e_i(ji,jj,jk,jl) = 0._wp
+               t_i(ji,jj,jk,jl) = rt0
+            ENDIF
          END_3D
-         !
-         !-----------------------------------------------------------------
-         ! zap ice and snow volume, add water and salt to ocean
-         !-----------------------------------------------------------------
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            ! update exchanges with ocean
-            sfx_res(ji,jj)  = sfx_res(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * sv_i(ji,jj,jl)   * rhoi * r1_Dt_ice
-            wfx_res(ji,jj)  = wfx_res(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * v_i (ji,jj,jl)   * rhoi * r1_Dt_ice
-            wfx_res(ji,jj)  = wfx_res(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * v_s (ji,jj,jl)   * rhos * r1_Dt_ice
-            wfx_pnd(ji,jj)  = wfx_pnd(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * ( v_ip(ji,jj,jl)+v_il(ji,jj,jl) ) * rhow * r1_Dt_ice
+      ENDDO
+      
+      DO jl = 1, jpl
+         DO_3D( 0, 0, 0, 0, 1, nlay_s )
             !
-            a_i  (ji,jj,jl) = a_i (ji,jj,jl) * zswitch(ji,jj)
-            v_i  (ji,jj,jl) = v_i (ji,jj,jl) * zswitch(ji,jj)
-            v_s  (ji,jj,jl) = v_s (ji,jj,jl) * zswitch(ji,jj)
-            t_su (ji,jj,jl) = t_su(ji,jj,jl) * zswitch(ji,jj) + t_bo(ji,jj) * ( 1._wp - zswitch(ji,jj) )
-            oa_i (ji,jj,jl) = oa_i(ji,jj,jl) * zswitch(ji,jj)
-            sv_i (ji,jj,jl) = sv_i(ji,jj,jl) * zswitch(ji,jj)
+            zsmall = MIN( a_i(ji,jj,jl), v_i(ji,jj,jl),  h_i(ji,jj,jl) )
             !
-            h_i (ji,jj,jl) = h_i (ji,jj,jl) * zswitch(ji,jj)
-            h_s (ji,jj,jl) = h_s (ji,jj,jl) * zswitch(ji,jj)
+            IF( zsmall < epsi10 ) THEN
+               ! update exchanges with ocean
+               hfx_res(ji,jj)   = hfx_res(ji,jj) - e_s(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0
+               e_s(ji,jj,jk,jl) = 0._wp
+               t_s(ji,jj,jk,jl) = rt0
+            ENDIF
+         END_3D
+      ENDDO
+      !
+      !-----------------------------------------------------------------
+      ! zap ice and snow volume, add water and salt to ocean
+      !-----------------------------------------------------------------
+      DO jl = 1, jpl
+         DO_2D( 0, 0, 0, 0 )
             !
-            a_ip (ji,jj,jl) = a_ip (ji,jj,jl) * zswitch(ji,jj)
-            v_ip (ji,jj,jl) = v_ip (ji,jj,jl) * zswitch(ji,jj)
-            v_il (ji,jj,jl) = v_il (ji,jj,jl) * zswitch(ji,jj)
-            h_ip (ji,jj,jl) = h_ip (ji,jj,jl) * zswitch(ji,jj)
-            h_il (ji,jj,jl) = h_il (ji,jj,jl) * zswitch(ji,jj)
+            zsmall = MIN( a_i(ji,jj,jl), v_i(ji,jj,jl),  h_i(ji,jj,jl) )
             !
+            IF( zsmall < epsi10 ) THEN
+               ! update exchanges with ocean
+               sfx_res(ji,jj)  = sfx_res(ji,jj) + sv_i(ji,jj,jl)   * rhoi * r1_Dt_ice
+               wfx_res(ji,jj)  = wfx_res(ji,jj) + v_i (ji,jj,jl)   * rhoi * r1_Dt_ice
+               wfx_res(ji,jj)  = wfx_res(ji,jj) + v_s (ji,jj,jl)   * rhos * r1_Dt_ice
+               wfx_res(ji,jj)  = wfx_res(ji,jj) + ( v_ip(ji,jj,jl)+v_il(ji,jj,jl) ) * rhow * r1_Dt_ice
+               !
+               a_i  (ji,jj,jl) = 0._wp
+               v_i  (ji,jj,jl) = 0._wp
+               v_s  (ji,jj,jl) = 0._wp
+               t_su (ji,jj,jl) = sst_m(ji,jj) + rt0
+               oa_i (ji,jj,jl) = 0._wp
+               sv_i (ji,jj,jl) = 0._wp
+               !
+               h_i (ji,jj,jl) = 0._wp
+               h_s (ji,jj,jl) = 0._wp
+               !
+               a_ip (ji,jj,jl) = 0._wp
+               v_ip (ji,jj,jl) = 0._wp
+               v_il (ji,jj,jl) = 0._wp
+               h_ip (ji,jj,jl) = 0._wp
+               h_il (ji,jj,jl) = 0._wp
+            ENDIF
          END_2D
-         !
       END DO
-
+      
       ! to be sure that at_i is the sum of a_i(jl)
-      at_i (:,:) = SUM( a_i (:,:,:), dim=3 )
-      vt_i (:,:) = SUM( v_i (:,:,:), dim=3 )
+      at_i (A2D(0)) = SUM( a_i (A2D(0),:), dim=3 )
+      vt_i (A2D(0)) = SUM( v_i (A2D(0),:), dim=3 )
 !!clem add?
 !      vt_s (:,:) = SUM( v_s (:,:,:), dim=3 )
 !      st_i (:,:) = SUM( sv_i(:,:,:), dim=3 )
@@ -571,17 +649,18 @@ CONTAINS
 !!clem
 
       ! open water = 1 if at_i=0
-      WHERE( at_i(:,:) == 0._wp )   ato_i(:,:) = 1._wp
+      WHERE( at_i(A2D(0)) == 0._wp )   ato_i(A2D(0)) = 1._wp
       !
    END SUBROUTINE ice_var_zapsmall
 
 
-   SUBROUTINE ice_var_zapneg( pdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
+   SUBROUTINE ice_var_zapneg( ihls, pdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i )
       !!-------------------------------------------------------------------
       !!                   ***  ROUTINE ice_var_zapneg ***
       !!
       !! ** Purpose :   Remove negative sea ice fields and correct fluxes
       !!-------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   ihls       ! loop index
       REAL(wp)                    , INTENT(in   ) ::   pdt        ! tracer time-step
       REAL(wp), DIMENSION(:,:)    , INTENT(inout) ::   pato_i     ! open water area
       REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i       ! ice volume
@@ -597,60 +676,76 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jl, jk   ! dummy loop indices
       REAL(wp) ::   z1_dt
+      REAL(wp), DIMENSION(jpi,jpj) ::   zwfx_res, zhfx_res, zsfx_res ! needed since loop is not (0,0,0,0)
       !!-------------------------------------------------------------------
       !
+      DO_2D( ihls, ihls, ihls, ihls )
+         zwfx_res(ji,jj) = 0._wp
+         zhfx_res(ji,jj) = 0._wp
+         zsfx_res(ji,jj) = 0._wp
+      END_2D
+      
       z1_dt = 1._wp / pdt
       !
-      DO jl = 1, jpl       !==  loop over the categories  ==!
-         !
-         ! make sure a_i=0 where v_i<=0
-         WHERE( pv_i(:,:,:) <= 0._wp )   pa_i(:,:,:) = 0._wp
-
-         !----------------------------------------
-         ! zap ice energy and send it to the ocean
-         !----------------------------------------
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
+      ! make sure a_i=0 where v_i<=0
+      WHERE( pv_i(:,:,:) <= 0._wp )   pa_i(:,:,:) = 0._wp
+      
+      !----------------------------------------
+      ! zap ice energy and send it to the ocean
+      !----------------------------------------
+      DO jl = 1, jpl
+         DO_3D( ihls, ihls, ihls, ihls, 1, nlay_i )
             IF( pe_i(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN
-               hfx_res(ji,jj)   = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * z1_dt ! W.m-2 >0
+               zhfx_res(ji,jj)   = zhfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * z1_dt ! W.m-2 >0
                pe_i(ji,jj,jk,jl) = 0._wp
             ENDIF
          END_3D
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_s )
+      ENDDO
+      !
+      DO jl = 1, jpl
+         DO_3D( ihls, ihls, ihls, ihls, 1, nlay_s )
             IF( pe_s(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN
-               hfx_res(ji,jj)   = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * z1_dt ! W.m-2 <0
+               zhfx_res(ji,jj)   = zhfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * z1_dt ! W.m-2 <0
                pe_s(ji,jj,jk,jl) = 0._wp
             ENDIF
          END_3D
-         !
-         !-----------------------------------------------------
-         ! zap ice and snow volume, add water and salt to ocean
-         !-----------------------------------------------------
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      ENDDO
+      !
+      !-----------------------------------------------------
+      ! zap ice and snow volume, add water and salt to ocean
+      !-----------------------------------------------------
+      DO jl = 1, jpl
+         DO_2D( ihls, ihls, ihls, ihls )
             IF( pv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN
-               wfx_res(ji,jj)    = wfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * z1_dt
-               pv_i   (ji,jj,jl) = 0._wp
+               zwfx_res(ji,jj)    = zwfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * z1_dt
+               pv_i    (ji,jj,jl) = 0._wp
             ENDIF
             IF( pv_s(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN
-               wfx_res(ji,jj)    = wfx_res(ji,jj) + pv_s (ji,jj,jl) * rhos * z1_dt
-               pv_s   (ji,jj,jl) = 0._wp
+               zwfx_res(ji,jj)    = zwfx_res(ji,jj) + pv_s (ji,jj,jl) * rhos * z1_dt
+               pv_s    (ji,jj,jl) = 0._wp
             ENDIF
             IF( psv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp .OR. pv_i(ji,jj,jl) <= 0._wp ) THEN
-               sfx_res(ji,jj)    = sfx_res(ji,jj) + psv_i(ji,jj,jl) * rhoi * z1_dt
-               psv_i  (ji,jj,jl) = 0._wp
+               zsfx_res(ji,jj)    = zsfx_res(ji,jj) + psv_i(ji,jj,jl) * rhoi * z1_dt
+               psv_i   (ji,jj,jl) = 0._wp
             ENDIF
             IF( pv_ip(ji,jj,jl) < 0._wp .OR. pv_il(ji,jj,jl) < 0._wp .OR. pa_ip(ji,jj,jl) <= 0._wp ) THEN
-               wfx_pnd(ji,jj)    = wfx_pnd(ji,jj) + pv_il(ji,jj,jl) * rhow * z1_dt
-               pv_il  (ji,jj,jl) = 0._wp
+               zwfx_res(ji,jj)    = zwfx_res(ji,jj) + pv_il(ji,jj,jl) * rhow * z1_dt
+               pv_il   (ji,jj,jl) = 0._wp
             ENDIF
             IF( pv_ip(ji,jj,jl) < 0._wp .OR. pa_ip(ji,jj,jl) <= 0._wp ) THEN
-               wfx_pnd(ji,jj)    = wfx_pnd(ji,jj) + pv_ip(ji,jj,jl) * rhow * z1_dt
-               pv_ip  (ji,jj,jl) = 0._wp
+               zwfx_res(ji,jj)    = zwfx_res(ji,jj) + pv_ip(ji,jj,jl) * rhow * z1_dt
+               pv_ip   (ji,jj,jl) = 0._wp
             ENDIF
          END_2D
-         !
       END DO
       !
+      ! record residual fluxes
+      DO_2D( 0, 0, 0, 0 )
+         wfx_res(ji,jj) = wfx_res(ji,jj) + zwfx_res(ji,jj)
+         hfx_res(ji,jj) = hfx_res(ji,jj) + zhfx_res(ji,jj)
+         sfx_res(ji,jj) = sfx_res(ji,jj) + zsfx_res(ji,jj)
+      END_2D
+      !
       WHERE( pato_i(:,:)   < 0._wp )   pato_i(:,:)   = 0._wp
       WHERE( poa_i (:,:,:) < 0._wp )   poa_i (:,:,:) = 0._wp
       WHERE( pa_i  (:,:,:) < 0._wp )   pa_i  (:,:,:) = 0._wp
@@ -676,7 +771,6 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pe_s       ! snw heat content
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pe_i       ! ice heat content
       !!-------------------------------------------------------------------
-      !
 
       WHERE( pa_i (1:npti,:)   < 0._wp )   pa_i (1:npti,:)   = 0._wp   !  a_i must be >= 0
       WHERE( pv_i (1:npti,:)   < 0._wp )   pv_i (1:npti,:)   = 0._wp   !  v_i must be >= 0
@@ -709,19 +803,22 @@ CONTAINS
       INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
       !!-------------------------------------------------------------------
       !
-!!gm I prefere to use WHERE / ELSEWHERE  to set it to zero only where needed   <<<=== to be done
-!!   instead of setting everything to zero as just below
       bv_i (:,:,:) = 0._wp
       DO jl = 1, jpl
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nlay_i )
+         DO_3D( 0, 0, 0, 0, 1, nlay_i )
             IF( t_i(ji,jj,jk,jl) < rt0 - epsi10 ) THEN
                bv_i(ji,jj,jl) = bv_i(ji,jj,jl) - rTmlt * sz_i(ji,jj,jk,jl) * r1_nlay_i / ( t_i(ji,jj,jk,jl) - rt0 )
             ENDIF
          END_3D
-      END DO
-      WHERE( vt_i(:,:) > epsi20 )   ;   bvm_i(:,:) = SUM( bv_i(:,:,:) * v_i(:,:,:) , dim=3 ) / vt_i(:,:)
-      ELSEWHERE                     ;   bvm_i(:,:) = 0._wp
-      END WHERE
+      ENDDO
+      !
+      DO_2D( 0, 0, 0, 0 )
+         IF( vt_i(ji,jj) > epsi20 ) THEN
+            bvm_i(ji,jj) = SUM( bv_i(ji,jj,:) * v_i(ji,jj,:) ) / vt_i(ji,jj)
+         ELSE
+            bvm_i(ji,jj) = 0._wp
+         ENDIF
+      END_2D
       !
    END SUBROUTINE ice_var_bv
 
@@ -740,7 +837,7 @@ CONTAINS
       !
       DO jk = 1, nlay_i             ! Sea ice energy of melting
          DO ji = 1, npti
-            ztmelts      = - rTmlt  * sz_i_1d(ji,jk)
+            ztmelts       = - rTmlt  * sz_i_1d(ji,jk)
             t_i_1d(ji,jk) = MIN( t_i_1d(ji,jk), ztmelts + rt0 ) ! Force t_i_1d to be lower than melting point => likely conservation issue
                                                                 !   (sometimes zdf scheme produces abnormally high temperatures)
             e_i_1d(ji,jk) = rhoi * ( rcpi  * ( ztmelts - ( t_i_1d(ji,jk) - rt0 ) )           &
@@ -748,6 +845,7 @@ CONTAINS
                &                   - rcp   * ztmelts )
          END DO
       END DO
+      !
       DO jk = 1, nlay_s             ! Snow energy of melting
          DO ji = 1, npti
             e_s_1d(ji,jk) = rhos * ( rcpi * ( rt0 - t_s_1d(ji,jk) ) + rLfus )
@@ -1286,8 +1384,8 @@ CONTAINS
    !!
    !!-------------------------------------------------------------------
    SUBROUTINE ice_var_snwfra_3d( ph_s, pa_s_fra )
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ph_s        ! snow thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pa_s_fra    ! ice fraction covered by snow
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   ph_s        ! snow thickness
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(  out) ::   pa_s_fra    ! ice fraction covered by snow
       IF    ( nn_snwfra == 0 ) THEN   ! basic 0 or 1 snow cover
          WHERE( ph_s > 0._wp ) ; pa_s_fra = 1._wp
          ELSEWHERE             ; pa_s_fra = 0._wp
@@ -1344,8 +1442,8 @@ CONTAINS
    !!--------------------------------------------------------------------------
 !!gm  I think it can be usefull to set this as a FUNCTION, not a SUBROUTINE....
    SUBROUTINE ice_var_snwblow_2d( pin, pout )
-      REAL(wp), DIMENSION(:,:), INTENT(in   ) :: pin   ! previous fraction lead ( 1. - a_i_b )
-      REAL(wp), DIMENSION(:,:), INTENT(inout) :: pout
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) :: pin   ! previous fraction lead ( 1. - a_i_b )
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) :: pout
       pout = ( 1._wp - ( pin )**rn_snwblow )
    END SUBROUTINE ice_var_snwblow_2d
 
diff --git a/src/ICE/icewri.F90 b/src/ICE/icewri.F90
index 078e3b00..d72fd7d8 100644
--- a/src/ICE/icewri.F90
+++ b/src/ICE/icewri.F90
@@ -26,7 +26,6 @@ MODULE icewri
    USE iom            ! I/O manager library
    USE lib_mpp        ! MPP library
    USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
-   USE lbclnk         ! lateral boundary conditions (or mpp links)
    USE timing         ! Timing
 
    IMPLICIT NONE
@@ -53,10 +52,10 @@ CONTAINS
       INTEGER  ::   ji, jj, jk, jl  ! dummy loop indices
       REAL(wp) ::   z2da, z2db, zrho1, zrho2
       REAL(wp) ::   zmiss_val       ! missing value retrieved from xios
-      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d                            ! 2D workspace
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zmsk00, zmsk05, zmsk15, zmsksn ! O%, 5% and 15% concentration mask and snow mask
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zmsk00l, zmsksnl               ! cat masks
-      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zfast, zalb, zmskalb      ! 2D workspace
+      REAL(wp), DIMENSION(A2D(0))     ::   z2d                            ! 2D workspace
+      REAL(wp), DIMENSION(A2D(0))     ::   zmsk00, zmsk05, zmsk15, zmsksn ! O%, 5% and 15% concentration mask and snow mask
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   zmsk00l, zmsksnl               ! cat masks
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zfast, zalb, zmskalb     ! 2D workspace
       !
       ! Global ice diagnostics (SIMIP)
       REAL(wp) ::   zdiag_area_nh, zdiag_extt_nh, zdiag_volu_nh   ! area, extent, volume
@@ -69,21 +68,33 @@ CONTAINS
       CALL iom_miss_val( 'icetemp', zmiss_val )
 
       ! brine volume
-      CALL ice_var_bv
+      IF( iom_use('icebrv') .OR. iom_use('icebrv_cat') )   CALL ice_var_bv
 
       ! tresholds for outputs
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06  ) ) ! 1 if ice    , 0 if no ice
-         zmsk05(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.05_wp ) ) ! 1 if 5% ice , 0 if less
-         zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less
-         zmsksn(ji,jj) = MAX( 0._wp , SIGN( 1._wp , vt_s(ji,jj) - epsi06  ) ) ! 1 if snow   , 0 if no snow
+      DO_2D( 0, 0, 0, 0 )
+         IF( at_i(ji,jj) >= epsi06  ) THEN ; zmsk00(ji,jj) = 1._wp ! 1 if ice    , 0 if no ice
+         ELSE                              ; zmsk00(ji,jj) = 0._wp
+         ENDIF
+         IF( at_i(ji,jj) >= 0.05_wp ) THEN ; zmsk05(ji,jj) = 1._wp ! 1 if 5% ice , 0 if less
+         ELSE                              ; zmsk05(ji,jj) = 0._wp
+         ENDIF
+         IF( at_i(ji,jj) >= 0.15_wp ) THEN ; zmsk15(ji,jj) = 1._wp ! 1 if 15% ice, 0 if less
+         ELSE                              ; zmsk15(ji,jj) = 0._wp
+         ENDIF
+         IF( vt_s(ji,jj) >= epsi06  ) THEN ; zmsksn(ji,jj) = 1._wp ! 1 if snow   , 0 if no snow
+         ELSE                              ; zmsksn(ji,jj) = 0._wp
+         ENDIF
       END_2D
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zmsk00l(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) )
-            zmsksnl(ji,jj,jl)  = MAX( 0._wp , SIGN( 1._wp , v_s(ji,jj,jl) - epsi06 ) )
+         DO_2D( 0, 0, 0, 0 )
+            IF( a_i(ji,jj,jl) >= epsi06  ) THEN ; zmsk00l(ji,jj,jl) = 1._wp ! 1 if ice    , 0 if no ice
+            ELSE                                ; zmsk00l(ji,jj,jl) = 0._wp
+            ENDIF
+            IF( v_s(ji,jj,jl) >= epsi06  ) THEN ; zmsksnl(ji,jj,jl) = 1._wp ! 1 if snow   , 0 if no snow
+            ELSE                                ; zmsksnl(ji,jj,jl) = 0._wp
+            ENDIF
          END_2D
-      END DO
+      ENDDO
 
       !-----------------
       ! Standard outputs
@@ -96,102 +107,111 @@ CONTAINS
       CALL iom_put( 'icepres'  , zmsk00 )   ! Ice presence (1 or 0)
       !
       ! general fields
-      IF( iom_use('icemass' ) )   CALL iom_put( 'icemass', vt_i * rhoi * zmsk00 )                                           ! Ice mass per cell area
-      IF( iom_use('snwmass' ) )   CALL iom_put( 'snwmass', vt_s * rhos * zmsksn )                                           ! Snow mass per cell area
-      IF( iom_use('iceconc' ) )   CALL iom_put( 'iceconc', at_i        * zmsk00 )                                           ! ice concentration
-      IF( iom_use('icevolu' ) )   CALL iom_put( 'icevolu', vt_i        * zmsk00 )                                           ! ice volume = mean ice thickness over the cell
-      IF( iom_use('icethic' ) )   CALL iom_put( 'icethic', hm_i        * zmsk00 )                                           ! ice thickness
-      IF( iom_use('snwthic' ) )   CALL iom_put( 'snwthic', hm_s        * zmsk00 )                                           ! snw thickness
-      IF( iom_use('icebrv'  ) )   CALL iom_put( 'icebrv' , bvm_i* 100. * zmsk00 )                                           ! brine volume
-      IF( iom_use('iceage'  ) )   CALL iom_put( 'iceage' , om_i / rday * zmsk15 + zmiss_val * ( 1._wp - zmsk15 ) )          ! ice age
-      IF( iom_use('icehnew' ) )   CALL iom_put( 'icehnew', ht_i_new             )                                           ! new ice thickness formed in the leads
-      IF( iom_use('snwvolu' ) )   CALL iom_put( 'snwvolu', vt_s        * zmsksn )                                           ! snow volume
-      IF( iom_use('icefrb'  ) ) THEN                                                                                        ! Ice freeboard
-         z2d(:,:) = ( zrho1 * hm_i(:,:) - zrho2 * hm_s(:,:) )
+      IF( iom_use('icemass' ) )   CALL iom_put( 'icemass', vt_i(A2D(0)) * rhoi * zmsk00 )                                         ! Ice mass per cell area
+      IF( iom_use('snwmass' ) )   CALL iom_put( 'snwmass', vt_s(A2D(0)) * rhos * zmsksn )                                         ! Snow mass per cell area
+      IF( iom_use('iceconc' ) )   CALL iom_put( 'iceconc', at_i(A2D(0))        * zmsk00 )                                         ! ice concentration
+      IF( iom_use('icevolu' ) )   CALL iom_put( 'icevolu', vt_i(A2D(0))        * zmsk00 )                                         ! ice volume = mean ice thickness over the cell
+      IF( iom_use('icethic' ) )   CALL iom_put( 'icethic', hm_i(:,:)           * zmsk00 )                                         ! ice thickness
+      IF( iom_use('snwthic' ) )   CALL iom_put( 'snwthic', hm_s(:,:)           * zmsk00 )                                         ! snw thickness
+      IF( iom_use('icebrv'  ) )   CALL iom_put( 'icebrv' , bvm_i(:,:)* 100.    * zmsk00 )                                         ! brine volume
+      IF( iom_use('iceage'  ) )   CALL iom_put( 'iceage' , om_i(:,:) / rday    * zmsk15 + zmiss_val * ( 1._wp - zmsk15 ) )        ! ice age
+      IF( iom_use('icehnew' ) )   CALL iom_put( 'icehnew', ht_i_new(:,:)                )                                         ! new ice thickness formed in the leads
+      IF( iom_use('snwvolu' ) )   CALL iom_put( 'snwvolu', vt_s(A2D(0))        * zmsksn )                                         ! snow volume
+      IF( iom_use('icefrb'  ) ) THEN                                                                                              ! Ice freeboard
+         z2d(:,:) = zrho1 * hm_i(:,:) - zrho2 * hm_s(:,:)
          WHERE( z2d < 0._wp )   z2d = 0._wp
-                                  CALL iom_put( 'icefrb' , z2d * zmsk00         )
+                                  CALL iom_put( 'icefrb' , z2d * zmsk00 )
       ENDIF
       ! melt ponds
-      IF( iom_use('iceapnd' ) )   CALL iom_put( 'iceapnd', at_ip  * zmsk00      )                                           ! melt pond total fraction
-      IF( iom_use('icehpnd' ) )   CALL iom_put( 'icehpnd', hm_ip  * zmsk00      )                                           ! melt pond depth
-      IF( iom_use('icevpnd' ) )   CALL iom_put( 'icevpnd', vt_ip  * zmsk00      )                                           ! melt pond total volume per unit area
-      IF( iom_use('icehlid' ) )   CALL iom_put( 'icehlid', hm_il  * zmsk00      )                                           ! melt pond lid depth
-      IF( iom_use('icevlid' ) )   CALL iom_put( 'icevlid', vt_il  * zmsk00      )                                           ! melt pond lid total volume per unit area
+      IF( iom_use('iceapnd' ) )   CALL iom_put( 'iceapnd', at_ip(A2D(0))  * zmsk00      )                                         ! melt pond total fraction
+      IF( iom_use('icehpnd' ) )   CALL iom_put( 'icehpnd', hm_ip(:,:)     * zmsk00      )                                         ! melt pond depth
+      IF( iom_use('icevpnd' ) )   CALL iom_put( 'icevpnd', vt_ip(A2D(0))  * zmsk00      )                                         ! melt pond total volume per unit area
+      IF( iom_use('icehlid' ) )   CALL iom_put( 'icehlid', hm_il(:,:)     * zmsk00      )                                         ! melt pond lid depth
+      IF( iom_use('icevlid' ) )   CALL iom_put( 'icevlid', vt_il(A2D(0))  * zmsk00      )                                         ! melt pond lid total volume per unit area
       ! salt
-      IF( iom_use('icesalt' ) )   CALL iom_put( 'icesalt', sm_i                 * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) ) ! mean ice salinity
-      IF( iom_use('icesalm' ) )   CALL iom_put( 'icesalm', st_i * rhoi * 1.0e-3 * zmsk00 )                                  ! Mass of salt in sea ice per cell area
+      IF( iom_use('icesalt' ) )   CALL iom_put( 'icesalt', sm_i(:,:)                 * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )  ! mean ice salinity
+      IF( iom_use('icesalm' ) )   CALL iom_put( 'icesalm', st_i(:,:) * rhoi * 1.0e-3 * zmsk00 )                                   ! Mass of salt in sea ice per cell area
       ! heat
-      IF( iom_use('icetemp' ) )   CALL iom_put( 'icetemp', ( tm_i  - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! ice mean temperature
-      IF( iom_use('snwtemp' ) )   CALL iom_put( 'snwtemp', ( tm_s  - rt0 ) * zmsksn + zmiss_val * ( 1._wp - zmsksn ) )      ! snw mean temperature
-      IF( iom_use('icettop' ) )   CALL iom_put( 'icettop', ( tm_su - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the ice surface
-      IF( iom_use('icetbot' ) )   CALL iom_put( 'icetbot', ( t_bo  - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the ice bottom
-      IF( iom_use('icetsni' ) )   CALL iom_put( 'icetsni', ( tm_si - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )      ! temperature at the snow-ice interface
-      IF( iom_use('icehc'   ) )   CALL iom_put( 'icehc'  ,  -et_i          * zmsk00 )                                       ! ice heat content
-      IF( iom_use('snwhc'   ) )   CALL iom_put( 'snwhc'  ,  -et_s          * zmsksn )                                       ! snow heat content
+      IF( iom_use('icetemp' ) )   CALL iom_put( 'icetemp', ( tm_i (:,:) - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )       ! ice mean temperature
+      IF( iom_use('snwtemp' ) )   CALL iom_put( 'snwtemp', ( tm_s (:,:) - rt0 ) * zmsksn + zmiss_val * ( 1._wp - zmsksn ) )       ! snw mean temperature
+      IF( iom_use('icettop' ) )   CALL iom_put( 'icettop', ( tm_su(:,:) - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )       ! temperature at the ice surface
+      IF( iom_use('icetbot' ) )   CALL iom_put( 'icetbot', ( t_bo (:,:) - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )       ! temperature at the ice bottom
+      IF( iom_use('icetsni' ) )   CALL iom_put( 'icetsni', ( tm_si(:,:) - rt0 ) * zmsk00 + zmiss_val * ( 1._wp - zmsk00 ) )       ! temperature at the snow-ice interface
+      IF( iom_use('icehc'   ) )   CALL iom_put( 'icehc'  ,  -et_i (:,:)         * zmsk00 )                                        ! ice heat content
+      IF( iom_use('snwhc'   ) )   CALL iom_put( 'snwhc'  ,  -et_s (:,:)         * zmsksn )                                        ! snow heat content
       ! momentum
-      IF( iom_use('uice'    ) )   CALL iom_put( 'uice'   , u_ice    )                                                       ! ice velocity u
-      IF( iom_use('vice'    ) )   CALL iom_put( 'vice'   , v_ice    )                                                       ! ice velocity v
+      IF( iom_use('uice'    ) )   CALL iom_put( 'uice'   ,   u_ice(:,:) )                                                         ! ice velocity u
+      IF( iom_use('vice'    ) )   CALL iom_put( 'vice'   ,   v_ice(:,:) )                                                         ! ice velocity v
       !
-      IF( iom_use('icevel') .OR. iom_use('fasticepres') ) THEN                                                              ! module of ice velocity & fast ice
-         ALLOCATE( zfast(jpi,jpj) )
+      IF( iom_use('icevel') .OR. iom_use('fasticepres') ) THEN                                                                    ! module of ice velocity & fast ice
+         ALLOCATE( zfast(A2D(0)) )
          DO_2D( 0, 0, 0, 0 )
             z2da  = u_ice(ji,jj) + u_ice(ji-1,jj)
             z2db  = v_ice(ji,jj) + v_ice(ji,jj-1)
             z2d(ji,jj) = 0.5_wp * SQRT( z2da * z2da + z2db * z2db )
          END_2D
-         CALL lbc_lnk( 'icewri', z2d, 'T', 1.0_wp )
          CALL iom_put( 'icevel', z2d )
 
-         WHERE( z2d(:,:) < 5.e-04_wp .AND. zmsk15(:,:) == 1._wp ) ; zfast(:,:) = 1._wp                                      ! record presence of fast ice
+         WHERE( z2d(:,:) < 5.e-04_wp .AND. zmsk15(:,:) == 1._wp ) ; zfast(:,:) = 1._wp                                            ! record presence of fast ice
          ELSEWHERE                                                ; zfast(:,:) = 0._wp
          END WHERE
          CALL iom_put( 'fasticepres', zfast )
          DEALLOCATE( zfast )
       ENDIF
       !
-      IF( iom_use('icealb') .OR. iom_use('albedo') ) THEN                                                                   ! ice albedo and surface albedo
-         ALLOCATE( zalb(jpi,jpj), zmskalb(jpi,jpj) )
+      IF( iom_use('icealb') .OR. iom_use('albedo') ) THEN                                                                         ! ice albedo and surface albedo
+         ALLOCATE( zalb(A2D(0)), zmskalb(A2D(0)) )
          ! ice albedo
-         WHERE( at_i_b < 1.e-03 )
+         WHERE( at_i_b(:,:) < 1.e-03 )
             zmskalb(:,:) = 0._wp
             zalb   (:,:) = rn_alb_oce
          ELSEWHERE
             zmskalb(:,:) = 1._wp
-            zalb   (:,:) = SUM( alb_ice * a_i_b, dim=3 ) / at_i_b
+            zalb   (:,:) = SUM( alb_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) / at_i_b(:,:)
          END WHERE
          CALL iom_put( 'icealb' , zalb * zmskalb + zmiss_val * ( 1._wp - zmskalb ) )
          ! ice+ocean albedo
-         zalb(:,:) = SUM( alb_ice * a_i_b, dim=3 ) + rn_alb_oce * ( 1._wp - at_i_b )
+         zalb(:,:) = SUM( alb_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) + rn_alb_oce * ( 1._wp - at_i_b(:,:) )
          CALL iom_put( 'albedo' , zalb )
          DEALLOCATE( zalb, zmskalb )
       ENDIF
       !
       ! --- category-dependent fields --- !
-      IF( iom_use('icemask_cat' ) )   CALL iom_put( 'icemask_cat' ,                  zmsk00l                                   ) ! ice mask 0%
-      IF( iom_use('iceconc_cat' ) )   CALL iom_put( 'iceconc_cat' , a_i            * zmsk00l                                   ) ! area for categories
-      IF( iom_use('icethic_cat' ) )   CALL iom_put( 'icethic_cat' , h_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! thickness for categories
-      IF( iom_use('snwthic_cat' ) )   CALL iom_put( 'snwthic_cat' , h_s            * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow depth for categories
-      IF( iom_use('icesalt_cat' ) )   CALL iom_put( 'icesalt_cat' , s_i            * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! salinity for categories
-      IF( iom_use('iceage_cat'  ) )   CALL iom_put( 'iceage_cat'  , o_i / rday     * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice age
-      IF( iom_use('icetemp_cat' ) )   CALL iom_put( 'icetemp_cat' , ( SUM( t_i, dim=3 ) * r1_nlay_i - rt0 ) &
-         &                                                                         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice temperature
-      IF( iom_use('snwtemp_cat' ) )   CALL iom_put( 'snwtemp_cat' , ( SUM( t_s, dim=3 ) * r1_nlay_s - rt0 ) &
-         &                                                                         * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow temperature
-      IF( iom_use('icettop_cat' ) )   CALL iom_put( 'icettop_cat' , ( t_su - rt0 ) * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! surface temperature
-      IF( iom_use('icebrv_cat'  ) )   CALL iom_put( 'icebrv_cat'  ,   bv_i * 100.  * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! brine volume
-      IF( iom_use('iceapnd_cat' ) )   CALL iom_put( 'iceapnd_cat' ,   a_ip         * zmsk00l                                   ) ! melt pond frac for categories
-      IF( iom_use('icevpnd_cat' ) )   CALL iom_put( 'icevpnd_cat' ,   v_ip         * zmsk00l                                   ) ! melt pond volume for categories
-      IF( iom_use('icehpnd_cat' ) )   CALL iom_put( 'icehpnd_cat' ,   h_ip         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! melt pond thickness for categories
-      IF( iom_use('icehlid_cat' ) )   CALL iom_put( 'icehlid_cat' ,   h_il         * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! melt pond lid thickness for categories
-      IF( iom_use('iceafpnd_cat') )   CALL iom_put( 'iceafpnd_cat',   a_ip_frac    * zmsk00l                                   ) ! melt pond frac per ice area for categories
-      IF( iom_use('iceaepnd_cat') )   CALL iom_put( 'iceaepnd_cat',   a_ip_eff     * zmsk00l                                   ) ! melt pond effective frac for categories
-      IF( iom_use('icealb_cat'  ) )   CALL iom_put( 'icealb_cat'  ,   alb_ice      * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice albedo for categories
+      IF( iom_use('icemask_cat' ) )   CALL iom_put( 'icemask_cat' ,                            zmsk00l                       ) ! ice mask 0%
+      IF( iom_use('iceconc_cat' ) )   CALL iom_put( 'iceconc_cat' , a_i(A2D(0),:)            * zmsk00l                       ) ! area for categories
+      IF( iom_use('icethic_cat' ) )   CALL iom_put( 'icethic_cat' , h_i(A2D(0),:)            * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! thickness for categories
+      IF( iom_use('snwthic_cat' ) )   CALL iom_put( 'snwthic_cat' , h_s(A2D(0),:)            * zmsksnl + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsksnl ) ) ! snow depth for categories
+      IF( iom_use('icesalt_cat' ) )   CALL iom_put( 'icesalt_cat' , s_i(A2D(0),:)            * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! salinity for categories
+      IF( iom_use('iceage_cat'  ) )   CALL iom_put( 'iceage_cat'  , o_i(A2D(0),:) / rday     * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! ice age
+      IF( iom_use('icetemp_cat' ) )   CALL iom_put( 'icetemp_cat' , ( SUM( t_i(A2D(0),:,:), dim=3 ) * r1_nlay_i - rt0 ) &
+         &                                                                       * zmsk00l + zmiss_val * ( 1._wp - zmsk00l ) ) ! ice temperature
+      IF( iom_use('snwtemp_cat' ) )   CALL iom_put( 'snwtemp_cat' , ( SUM( t_s(A2D(0),:,:), dim=3 ) * r1_nlay_s - rt0 ) &
+         &                                                                       * zmsksnl + zmiss_val * ( 1._wp - zmsksnl ) ) ! snow temperature
+      IF( iom_use('icettop_cat' ) )   CALL iom_put( 'icettop_cat' , ( t_su(A2D(0),:) - rt0 ) * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! surface temperature
+      IF( iom_use('icebrv_cat'  ) )   CALL iom_put( 'icebrv_cat'  ,   bv_i(:,:,:) * 100.  * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! brine volume
+      IF( iom_use('iceapnd_cat' ) )   CALL iom_put( 'iceapnd_cat' ,   a_ip(A2D(0),:)         * zmsk00l                       ) ! melt pond frac for categories
+      IF( iom_use('icevpnd_cat' ) )   CALL iom_put( 'icevpnd_cat' ,   v_ip(A2D(0),:)         * zmsk00l                       ) ! melt pond volume for categories
+      IF( iom_use('icehpnd_cat' ) )   CALL iom_put( 'icehpnd_cat' ,   h_ip(A2D(0),:)         * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! melt pond thickness for categories
+      IF( iom_use('icehlid_cat' ) )   CALL iom_put( 'icehlid_cat' ,   h_il(A2D(0),:)         * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! melt pond lid thickness for categories
+      IF( iom_use('iceafpnd_cat') )   CALL iom_put( 'iceafpnd_cat',   a_ip_frac(:,:,:)    * zmsk00l                          ) ! melt pond frac per ice area for categories
+      IF( iom_use('iceaepnd_cat') )   CALL iom_put( 'iceaepnd_cat',   a_ip_eff(:,:,:)     * zmsk00l                          ) ! melt pond effective frac for categories
+      IF( iom_use('icealb_cat'  ) )   CALL iom_put( 'icealb_cat'  ,   alb_ice(:,:,:)      * zmsk00l + zmiss_val &
+         &                                                                                             * ( 1._wp - zmsk00l ) ) ! ice albedo for categories
 
       !------------------
       ! Add-ons for SIMIP
       !------------------
       ! trends
-      IF( iom_use('dmithd') )   CALL iom_put( 'dmithd', - wfx_bog - wfx_bom - wfx_sum - wfx_sni - wfx_opw - wfx_lam - wfx_res ) ! Sea-ice mass change from thermodynamics
+      IF( iom_use('dmithd') )   CALL iom_put( 'dmithd', - wfx_bog(:,:) - wfx_bom(:,:) - wfx_sum(:,:) - wfx_sni(:,:) &
+         &                                              - wfx_opw(:,:) - wfx_lam(:,:) - wfx_res(:,:)                          ) ! Sea-ice mass change from thermodynamics
       IF( iom_use('dmidyn') )   CALL iom_put( 'dmidyn', - wfx_dyn + rhoi * diag_trp_vi                                        ) ! Sea-ice mass change from dynamics(kg/m2/s)
       IF( iom_use('dmiopw') )   CALL iom_put( 'dmiopw', - wfx_opw                                                             ) ! Sea-ice mass change through growth in open water
       IF( iom_use('dmibog') )   CALL iom_put( 'dmibog', - wfx_bog                                                             ) ! Sea-ice mass change through basal growth
@@ -211,17 +231,23 @@ CONTAINS
       IF(  iom_use('NH_icearea') .OR. iom_use('NH_icevolu') .OR. iom_use('NH_iceextt') .OR. &
          & iom_use('SH_icearea') .OR. iom_use('SH_icevolu') .OR. iom_use('SH_iceextt') ) THEN
          !
-         WHERE( ff_t(:,:) > 0._wp )   ;   z2d(:,:) = 1._wp
-         ELSEWHERE                    ;   z2d(:,:) = 0.
+         WHERE( ff_t(A2D(0)) > 0._wp )   ;   z2d(:,:) = 1._wp
+         ELSEWHERE                       ;   z2d(:,:) = 0.
          END WHERE
          !
-         IF( iom_use('NH_icearea') )   zdiag_area_nh = glob_sum( 'icewri', at_i *           z2d   * e1e2t * 1.e-12 )
-         IF( iom_use('NH_icevolu') )   zdiag_volu_nh = glob_sum( 'icewri', vt_i *           z2d   * e1e2t * 1.e-12 )
-         IF( iom_use('NH_iceextt') )   zdiag_extt_nh = glob_sum( 'icewri',                  z2d   * e1e2t * 1.e-12 * zmsk15 )
+         IF( iom_use('NH_icearea') )   zdiag_area_nh = glob_sum( 'icewri', at_i(A2D(0)) *           z2d   * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 )
+         IF( iom_use('NH_icevolu') )   zdiag_volu_nh = glob_sum( 'icewri', vt_i(A2D(0)) *           z2d   * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 )
+         IF( iom_use('NH_iceextt') )   zdiag_extt_nh = glob_sum( 'icewri',                          z2d   * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 * zmsk15 )
          !
-         IF( iom_use('SH_icearea') )   zdiag_area_sh = glob_sum( 'icewri', at_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
-         IF( iom_use('SH_icevolu') )   zdiag_volu_sh = glob_sum( 'icewri', vt_i * ( 1._wp - z2d ) * e1e2t * 1.e-12 )
-         IF( iom_use('SH_iceextt') )   zdiag_extt_sh = glob_sum( 'icewri',        ( 1._wp - z2d ) * e1e2t * 1.e-12 * zmsk15 )
+         IF( iom_use('SH_icearea') )   zdiag_area_sh = glob_sum( 'icewri', at_i(A2D(0)) * ( 1._wp - z2d ) * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 )
+         IF( iom_use('SH_icevolu') )   zdiag_volu_sh = glob_sum( 'icewri', vt_i(A2D(0)) * ( 1._wp - z2d ) * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 )
+         IF( iom_use('SH_iceextt') )   zdiag_extt_sh = glob_sum( 'icewri',                ( 1._wp - z2d ) * e1e2t(A2D(0)) &
+            &                                                                                             * 1.e-12 * zmsk15 )
          !
          CALL iom_put( 'NH_icearea' , zdiag_area_nh )
          CALL iom_put( 'NH_icevolu' , zdiag_volu_nh )
@@ -258,25 +284,28 @@ CONTAINS
       !
       !! The file is open in dia_wri_state (ocean routine)
 
-      CALL iom_rstput( 0, 0, kid, 'sithic', hm_i         )   ! Ice thickness
-      CALL iom_rstput( 0, 0, kid, 'siconc', at_i         )   ! Ice concentration
-      CALL iom_rstput( 0, 0, kid, 'sitemp', tm_i - rt0   )   ! Ice temperature
-      CALL iom_rstput( 0, 0, kid, 'sivelu', u_ice        )   ! i-Ice speed
-      CALL iom_rstput( 0, 0, kid, 'sivelv', v_ice        )   ! j-Ice speed
-      CALL iom_rstput( 0, 0, kid, 'sistru', utau_ice     )   ! i-Wind stress over ice
-      CALL iom_rstput( 0, 0, kid, 'sistrv', vtau_ice     )   ! i-Wind stress over ice
-      CALL iom_rstput( 0, 0, kid, 'sisflx', qsr          )   ! Solar flx over ocean
-      CALL iom_rstput( 0, 0, kid, 'sinflx', qns          )   ! NonSolar flx over ocean
-      CALL iom_rstput( 0, 0, kid, 'snwpre', sprecip      )   ! Snow precipitation
-      CALL iom_rstput( 0, 0, kid, 'sisali', sm_i         )   ! Ice salinity
-      CALL iom_rstput( 0, 0, kid, 'sivolu', vt_i         )   ! Ice volume
-      CALL iom_rstput( 0, 0, kid, 'sidive', divu_i*1.0e8 )   ! Ice divergence
-      CALL iom_rstput( 0, 0, kid, 'si_amp', at_ip        )   ! Melt pond fraction
-      CALL iom_rstput( 0, 0, kid, 'si_vmp', vt_ip        )   ! Melt pond volume
-      CALL iom_rstput( 0, 0, kid, 'sithicat', h_i        )   ! Ice thickness
-      CALL iom_rstput( 0, 0, kid, 'siconcat', a_i        )   ! Ice concentration
-      CALL iom_rstput( 0, 0, kid, 'sisalcat', s_i        )   ! Ice salinity
-      CALL iom_rstput( 0, 0, kid, 'snthicat', h_s        )   ! Snw thickness
+      CALL iom_rstput( 0, 0, kid, 'sithic'  , hm_i     )   ! Ice thickness
+      CALL iom_rstput( 0, 0, kid, 'siconc'  , at_i     )   ! Ice concentration
+      CALL iom_rstput( 0, 0, kid, 'sitemp'  , tm_i     )   ! Ice temperature
+      CALL iom_rstput( 0, 0, kid, 'sittop'  , t_su     )   ! Surface Ice temperature
+      CALL iom_rstput( 0, 0, kid, 'sitbot'  , t_bo     )   ! Bottom Ice temperature
+      CALL iom_rstput( 0, 0, kid, 'sivelu'  , u_ice    )   ! i-Ice speed
+      CALL iom_rstput( 0, 0, kid, 'sivelv'  , v_ice    )   ! j-Ice speed
+      CALL iom_rstput( 0, 0, kid, 'utau_ice', utau_ice )   ! i-Wind stress over ice
+      CALL iom_rstput( 0, 0, kid, 'vtau_ice', vtau_ice )   ! i-Wind stress over ice
+      CALL iom_rstput( 0, 0, kid, 'snowpre' , sprecip  )   ! Snow precipitation
+      CALL iom_rstput( 0, 0, kid, 'sisali'  , sm_i     )   ! Ice salinity
+      CALL iom_rstput( 0, 0, kid, 'sivolu'  , vt_i     )   ! Ice volume
+      CALL iom_rstput( 0, 0, kid, 'siapnd'  , at_ip    )   ! Melt pond fraction
+      CALL iom_rstput( 0, 0, kid, 'sivpnd'  , vt_ip    )   ! Melt pond volume
+      CALL iom_rstput( 0, 0, kid, 'sithicat', h_i      )   ! Ice thickness
+      CALL iom_rstput( 0, 0, kid, 'siconcat', a_i      )   ! Ice concentration
+      CALL iom_rstput( 0, 0, kid, 'sisalcat', s_i      )   ! Ice salinity
+      CALL iom_rstput( 0, 0, kid, 'snthicat', h_s      )   ! Snw thickness
+      CALL iom_rstput( 0, 0, kid, 'qsr'     , qsr      )   ! Solar flx over ocean
+      CALL iom_rstput( 0, 0, kid, 'qns'     , qns      )   ! NonSolar flx over ocean
+      CALL iom_rstput( 0, 0, kid, 'sst'     , sst_m    )   ! sst
+      CALL iom_rstput( 0, 0, kid, 'sss'     , sss_m    )   ! sss
 
     END SUBROUTINE ice_wri_state
 
diff --git a/src/NST/agrif_all_update.F90 b/src/NST/agrif_all_update.F90
index 5389c0c2..b8573fd9 100644
--- a/src/NST/agrif_all_update.F90
+++ b/src/NST/agrif_all_update.F90
@@ -117,12 +117,10 @@ CONTAINS
       CALL dom_qco_zgr( Kbb_a, Kmm_a ) 
 #endif
 #if defined key_si3
-      CALL lbc_lnk( 'finalize_lbc_for_agrif',  a_i, 'T',1._wp,  v_i,'T',1._wp,                 &
-           &                                   v_s, 'T',1._wp, sv_i,'T',1._wp, oa_i,'T',1._wp, &
-           &                                   a_ip,'T',1._wp, v_ip,'T',1._wp, v_il,'T',1._wp )
-      CALL lbc_lnk( 'finalize_lbc_for_agrif', t_su,'T',1._wp )
-      CALL lbc_lnk( 'finalize_lbc_for_agrif',  e_s,'T',1._wp )
-      CALL lbc_lnk( 'finalize_lbc_for_agrif',  e_i,'T',1._wp )
+      CALL lbc_lnk( 'finalize_lbc_for_agrif', a_i, 'T',1._wp,  v_i,'T',1._wp,                 &
+           &                                  v_s, 'T',1._wp, sv_i,'T',1._wp, oa_i,'T',1._wp, &
+           &                                  a_ip,'T',1._wp, v_ip,'T',1._wp, v_il,'T',1._wp, t_su,'T',1._wp )
+      CALL lbc_lnk( 'finalize_lbc_for_agrif', e_i,'T',1._wp, e_s,'T',1._wp )
       CALL lbc_lnk( 'finalize_lbc_for_agrif', u_ice, 'U', -1._wp, v_ice, 'V', -1._wp )
 #endif
 #if defined key_top
diff --git a/src/NST/agrif_ice_interp.F90 b/src/NST/agrif_ice_interp.F90
index eea3d947..9bc3d8aa 100644
--- a/src/NST/agrif_ice_interp.F90
+++ b/src/NST/agrif_ice_interp.F90
@@ -64,12 +64,10 @@ CONTAINS
       CALL Agrif_Set_MaskMaxSearch(10)
       CALL Agrif_init_variable(tra_iceini_id,procname=interp_tra_ice)
       !
-      CALL lbc_lnk( 'agrif_istate_ice',  a_i,'T',1._wp,  v_i,'T',1._wp, &
-               &         v_s,'T',1._wp, sv_i,'T',1._wp, oa_i,'T',1._wp, &
-               &        a_ip,'T',1._wp, v_ip,'T',1._wp, v_il,'T',1._wp )
-      CALL lbc_lnk( 'agrif_istate_ice', t_su,'T',1._wp )
-      CALL lbc_lnk( 'agrif_istate_ice',  e_s,'T',1._wp )
-      CALL lbc_lnk( 'agrif_istate_ice',  e_i,'T',1._wp )
+      CALL lbc_lnk( 'agrif_istate_ice', a_i,'T',1._wp,  v_i,'T',1._wp, &
+               &                        v_s,'T',1._wp, sv_i,'T',1._wp, oa_i,'T',1._wp, &
+               &                        a_ip,'T',1._wp, v_ip,'T',1._wp, v_il,'T',1._wp, t_su,'T',1._wp )
+      CALL lbc_lnk( 'agrif_istate_ice', e_i,'T',1._wp, e_s,'T',1._wp )
       !
       ! Set u_ice, v_ice:
       use_sign_north = .TRUE.
@@ -87,7 +85,7 @@ CONTAINS
       ! 
       CALL lbc_lnk( 'agrif_istate_ice', u_ice, 'U', -1._wp, v_ice, 'V', -1._wp )
       !
-      CALL ice_var_glo2eqv
+      CALL ice_var_glo2eqv(1)
       !
    END SUBROUTINE agrif_istate_ice
 
diff --git a/src/NST/agrif_oce_interp.F90 b/src/NST/agrif_oce_interp.F90
index 221450eb..19b62117 100644
--- a/src/NST/agrif_oce_interp.F90
+++ b/src/NST/agrif_oce_interp.F90
@@ -273,7 +273,7 @@ CONTAINS
          ibdy2 = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()   ! halo + land + nbghostcells
          !
          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
@@ -281,7 +281,7 @@ CONTAINS
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zub(ji,:)  = 0._wp  
             zhub(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -303,7 +303,7 @@ CONTAINS
             END DO
          END DO
          !   
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zvb(ji,:)  = 0._wp
             zhvb(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -333,14 +333,14 @@ CONTAINS
          ibdy2 = jpiglo - ( nn_hls + 2 )                 
          !
          IF( .NOT.ln_dynspg_ts ) THEN 
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zub(ji,:)  = 0._wp 
             zhub(ji,:) = 0._wp   
             DO jk = 1, jpkm1
@@ -366,14 +366,14 @@ CONTAINS
          ibdy2 = jpiglo - ( nn_hls + 1 )     
          !
          IF( .NOT.ln_dynspg_ts ) THEN 
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zvb(ji,:)  = 0._wp
             zhvb(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -403,7 +403,7 @@ CONTAINS
          jbdy2 = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()   
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
@@ -411,7 +411,7 @@ CONTAINS
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zvb(:,jj) = 0._wp
             zhvb(:,jj) = 0._wp
             DO jk=1,jpkm1
@@ -433,7 +433,7 @@ CONTAINS
             END DO
          END DO
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zub(:,jj) = 0._wp
             zhub(:,jj) = 0._wp
             DO jk = 1, jpkm1
@@ -463,14 +463,14 @@ CONTAINS
          jbdy2 = jpjglo - ( nn_hls + 2 )
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zvb(:,jj) = 0._wp 
             zhvb(:,jj) = 0._wp 
             DO jk=1,jpkm1
@@ -496,14 +496,14 @@ CONTAINS
          jbdy2 = jpjglo - ( nn_hls + 1 )
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zub(:,jj) = 0._wp
             zhub(:,jj) = 0._wp
             DO jk = 1, jpkm1
@@ -556,7 +556,7 @@ CONTAINS
          IF( lk_west ) THEN
             istart = nn_hls + 2                              ! halo + land + 1
             iend   = nn_hls + nbghostcells  + nn_shift_bar*Agrif_Rhox()              ! halo + land + nbghostcells
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
@@ -568,7 +568,7 @@ CONTAINS
          IF( lk_east ) THEN
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 1 )                
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
    
                DO jj=1,jpj
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
@@ -576,7 +576,7 @@ CONTAINS
             END DO
             istart = jpiglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 2 )                
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
                END DO
@@ -587,7 +587,7 @@ CONTAINS
          IF( lk_south ) THEN
             jstart = nn_hls + 2                              
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()           
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
    
                DO ji=1,jpi
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
@@ -600,14 +600,14 @@ CONTAINS
          IF( lk_north ) THEN
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()     
             jend   = jpjglo - ( nn_hls + 1 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
                END DO
             END DO
             jstart = jpjglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 2 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
                END DO
@@ -645,7 +645,7 @@ CONTAINS
          IF( lk_west ) THEN
             istart = nn_hls + 2                              
             iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox() 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
@@ -657,14 +657,14 @@ CONTAINS
          IF( lk_east ) THEN
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()
             iend   = jpiglo - ( nn_hls + 1 )                 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                END DO
             END DO
             istart = jpiglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 2 )                 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                END DO
@@ -675,7 +675,7 @@ CONTAINS
          IF( lk_south ) THEN
             jstart = nn_hls + 2                              
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy() 
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
@@ -687,14 +687,14 @@ CONTAINS
          IF( lk_north ) THEN
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 1 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                END DO
             END DO
             jstart = jpjglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 2 )               
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                END DO
@@ -804,7 +804,7 @@ CONTAINS
          istart = nn_hls + 2                                                          ! halo + land + 1
          iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()               ! halo + land + nbghostcells
          IF (lk_div_cons) iend = istart
-         DO ji = mi0(istart), mi1(iend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
             DO jj = 1, jpj
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -816,7 +816,7 @@ CONTAINS
          istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()       ! halo + land + nbghostcells - 1
          iend   = jpiglo - ( nn_hls + 1 )                                              ! halo + land + 1            - 1
          IF (lk_div_cons) istart = iend
-         DO ji = mi0(istart), mi1(iend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
             DO jj = 1, jpj
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -828,7 +828,7 @@ CONTAINS
          jstart = nn_hls + 2                                                          ! halo + land + 1
          jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()               ! halo + land + nbghostcells
          IF (lk_div_cons) jend = jstart
-         DO jj = mj0(jstart), mj1(jend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
             DO ji = 1, jpi
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -840,7 +840,7 @@ CONTAINS
          jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()     ! halo + land + nbghostcells - 1
          jend   = jpjglo - ( nn_hls + 1 )                                            ! halo + land + 1            - 1
          IF (lk_div_cons) jstart = jend
-         DO jj = mj0(jstart), mj1(jend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
             DO ji = 1, jpi
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -873,7 +873,7 @@ CONTAINS
             istart = nn_hls + 2                                                        ! halo + land + 1
             iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()             ! halo + land + nbghostcells
             IF (lk_div_cons) iend = istart
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj = 1, jpj
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -885,7 +885,7 @@ CONTAINS
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()    ! halo + land + nbghostcells - 1
             iend   = jpiglo - ( nn_hls + 1 )                                           ! halo + land + 1            - 1
             IF (lk_div_cons) istart = iend
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj = 1, jpj
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -897,7 +897,7 @@ CONTAINS
             jstart = nn_hls + 2                                                        ! halo + land + 1
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()             ! halo + land + nbghostcells
             IF (lk_div_cons) jend   = jstart
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji = 1, jpi
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -909,7 +909,7 @@ CONTAINS
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()    ! halo + land + nbghostcells - 1
             jend   = jpjglo - ( nn_hls + 1 )                                           ! halo + land + 1            - 1
             IF (lk_div_cons) jstart = jend
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji = 1, jpi
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -975,7 +975,7 @@ CONTAINS
            END DO
          END DO
 
-         IF( l_vremap .OR. l_ini_child .OR. ln_zps ) THEN
+         IF( l_vremap .OR. l_ini_child .OR. l_zps ) THEN
 
             ! Fill cell depths (i.e. gdept) to be interpolated
             ! Warning: these are masked, hence extrapolated prior interpolation.
@@ -1069,7 +1069,7 @@ CONTAINS
  
          ELSE
          
-            IF ( Agrif_Parent(ln_zps) ) THEN ! Account for partial cells 
+            IF ( Agrif_Parent(l_zps) ) THEN ! Account for partial cells 
                                              ! linear vertical interpolation
                DO jj=j1,j2
                   DO ji=i1,i2
@@ -1574,7 +1574,7 @@ CONTAINS
          DO ji=i1,i2
             DO jj=j1,j2
                IF (utint_stage(ji,jj)==0) THEN 
-                  zx = 2._wp*MOD(ABS(mig0(ji)-nbghostcells_x_w), INT(Agrif_Rhox()))/zrhox - 1._wp  
+                  zx = 2._wp*MOD(ABS(mig(ji,0)-nbghostcells_x_w), INT(Agrif_Rhox()))/zrhox - 1._wp  
                   ubdy(ji,jj) = ubdy(ji,jj) + 0.25_wp*(1._wp-zx*zx) * ptab(ji,jj) & 
                               &         / zrhoy *r1_e2u(ji,jj) * umask(ji,jj,1) 
                   utint_stage(ji,jj) = 1 
@@ -1694,7 +1694,7 @@ CONTAINS
          DO ji=i1,i2
             DO jj=j1,j2
                IF (vtint_stage(ji,jj)==0) THEN 
-                  zy = 2._wp*MOD(ABS(mjg0(jj)-nbghostcells_y_s), INT(Agrif_Rhoy()))/zrhoy - 1._wp  
+                  zy = 2._wp*MOD(ABS(mjg(jj,0)-nbghostcells_y_s), INT(Agrif_Rhoy()))/zrhoy - 1._wp  
                   vbdy(ji,jj) = vbdy(ji,jj) + 0.25_wp*(1._wp-zy*zy) * ptab(ji,jj) & 
                               &         / zrhox * r1_e1v(ji,jj) * vmask(ji,jj,1) 
                   vtint_stage(ji,jj) = 1 
@@ -1720,7 +1720,7 @@ CONTAINS
       !!----------------------------------------------------------------------  
       !    
       IF( before ) THEN
-         IF ( ln_zps ) THEN
+         IF ( lk_vco_1d3d ) THEN
             DO jk = k1, k2
                DO jj = j1, j2
                   DO ji = i1, i2
@@ -1729,7 +1729,13 @@ CONTAINS
                END DO
             END DO
          ELSE
-            ptab(i1:i2,j1:j2,k1:k2) = e3t_0(i1:i2,j1:j2,k1:k2)
+            DO jk = k1, k2
+               DO jj = j1, j2
+                  DO ji = i1, i2
+                     ptab(ji, jj, jk) = e3t_0(ji,jj,jk)
+                  END DO
+               END DO
+            END DO
          ENDIF
       ELSE
          !
@@ -1778,7 +1784,7 @@ CONTAINS
          DO jj = j1, j2
             DO ji = i1, i2
                IF( ABS( ptab(ji,jj) - glamt(ji,jj) ) > ztst ) THEN
-                  WRITE(numout,*) ' Agrif error for glamt: parent, child, i, j ', ptab(ji,jj), glamt(ji,jj), mig0(ji), mig0(jj)
+                  WRITE(numout,*) ' Agrif error for glamt: parent, child, i, j ', ptab(ji,jj), glamt(ji,jj), mig(ji,0), mjg(jj,0)
 !                  kindic_agr = kindic_agr + 1
                ENDIF
             END DO
@@ -1807,7 +1813,7 @@ CONTAINS
          DO jj = j1, j2
             DO ji = i1, i2
                IF( ABS( ptab(ji,jj) - gphit(ji,jj) ) > ztst ) THEN
-                  WRITE(numout,*) ' Agrif error for gphit: parent, child, i, j ', ptab(ji,jj), gphit(ji,jj), mig0(ji), mig0(jj)
+                  WRITE(numout,*) ' Agrif error for gphit: parent, child, i, j ', ptab(ji,jj), gphit(ji,jj), mig(ji,0), mjg(jj,0)
 !                  kindic_agr = kindic_agr + 1
                ENDIF
             END DO
@@ -1826,15 +1832,21 @@ CONTAINS
       LOGICAL                                    , INTENT(in   ) ::   before
       !
       INTEGER  :: ji, jj, jk
+      INTEGER  :: ii1, ii2, ij1, ij2
       INTEGER  :: N_in, N_out
       REAL(wp), DIMENSION(k1:k2) :: tabin, z_in
       REAL(wp), DIMENSION(1:jpk) :: z_out
-      !!----------------------------------------------------------------------  
-      !      
+      !!----------------------------------------------------------------------
+      ! TEMP: [summer 2022 halo] Quick fix for out of bounds indexing after avm_k declared with A2D(1)
+      ii1 = MAX(i1, LBOUND(avm_k, 1))
+      ii2 = MIN(i2, UBOUND(avm_k, 1))
+      ij1 = MAX(j1, LBOUND(avm_k, 2))
+      ij2 = MIN(j2, UBOUND(avm_k, 2))
+      !
       IF (before) THEN         
          DO jk=k1,k2
-            DO jj=j1,j2
-              DO ji=i1,i2
+            DO jj=ij1,ij2
+              DO ji=ii1,ii2
                     ptab(ji,jj,jk,1) = avm_k(ji,jj,jk)
               END DO
            END DO
@@ -1844,8 +1856,8 @@ CONTAINS
             ! Interpolate interfaces 
             ! Warning: these are masked, hence extrapolated prior interpolation.
             DO jk=k1,k2
-               DO jj=j1,j2
-                  DO ji=i1,i2
+               DO jj=ij1,ij2
+                  DO ji=ii1,ii2
                       ptab(ji,jj,jk,2) = tmask(ji,jj,jk) * gdepw(ji,jj,jk,Kmm_a)
                   END DO
                END DO
@@ -1853,20 +1865,20 @@ CONTAINS
         
            ! Save ssh at last level:
             IF (.NOT.ln_linssh) THEN
-               ptab(i1:i2,j1:j2,k2,2) = ssh(i1:i2,j1:j2,Kmm_a)*tmask(i1:i2,j1:j2,1) 
+               ptab(ii1:ii2,ij1:ij2,k2,2) = ssh(ii1:ii2,ij1:ij2,Kmm_a)*tmask(ii1:ii2,ij1:ij2,1)
             ELSE
-               ptab(i1:i2,j1:j2,k2,2) = 0._wp
+               ptab(ii1:ii2,ij1:ij2,k2,2) = 0._wp
             END IF      
           ENDIF
 
       ELSE 
 
          IF( l_vremap ) THEN
-            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp 
-            avm_k(i1:i2,j1:j2,1:jpkm1) = 0._wp
+            IF (ln_linssh) ptab(ii1:ii2,ij1:ij2,k2,2) = 0._wp
+            avm_k(ii1:ii2,ij1:ij2,1:jpkm1) = 0._wp
                
-            DO jj = j1, j2
-               DO ji =i1, i2
+            DO jj = ij1, ij2
+               DO ji =ii1, ii2
                   N_in = mbkt_parent(ji,jj)
                   N_out = mbkt(ji,jj)
                   IF (N_in*N_out > 0) THEN
@@ -1884,7 +1896,7 @@ CONTAINS
                END DO
             END DO
          ELSE
-            avm_k(i1:i2,j1:j2,1:jpkm1) = ptab (i1:i2,j1:j2,1:jpkm1,1)
+            avm_k(ii1:ii2,ij1:ij2,1:jpkm1) = ptab (ii1:ii2,ij1:ij2,1:jpkm1,1)
          ENDIF
       ENDIF
       !
@@ -2022,8 +2034,8 @@ CONTAINS
          iend   = nn_hls + nbghostcells + ispon           ! halo + land + nbghostcells + sponge
          jstart = nn_hls + 2 
          jend   = jpjglo - nn_hls - 1 
-         DO ji = mi0(istart), mi1(iend)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2031,7 +2043,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO jj = mj0(jstart), mj1(jend-1)
+            DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2040,8 +2052,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO ji = mi0(istart), mi1(iend-1)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2059,8 +2071,8 @@ CONTAINS
          iend   = jpiglo - nn_hls - 1                            ! halo + land + 1                     - 1
          jstart = nn_hls + 2 
          jend   = jpjglo - nn_hls - 1
-         DO ji = mi0(istart), mi1(iend)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2068,7 +2080,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO jj = mj0(jstart), mj1(jend-1)
+            DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2077,8 +2089,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO ji = mi0(istart), mi1(iend-1)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2096,8 +2108,8 @@ CONTAINS
          jend   = nn_hls + nbghostcells + ispon          ! halo + land + nbghostcells + sponge
          istart = nn_hls + 2 
          iend   = jpiglo - nn_hls - 1 
-         DO jj = mj0(jstart), mj1(jend)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2105,7 +2117,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO ji = mi0(istart), mi1(iend-1)
+            DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2114,8 +2126,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO jj = mj0(jstart), mj1(jend-1)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2133,8 +2145,8 @@ CONTAINS
          jend   = jpjglo - nn_hls - 1                            ! halo + land + 1            - 1
          istart = nn_hls + 2 
          iend   = jpiglo - nn_hls - 1 
-         DO jj = mj0(jstart), mj1(jend)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2142,7 +2154,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO ji = mi0(istart), mi1(iend-1)
+            DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2151,8 +2163,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO jj = mj0(jstart), mj1(jend-1)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
diff --git a/src/NST/agrif_oce_sponge.F90 b/src/NST/agrif_oce_sponge.F90
index d077f7b8..fe2997c0 100644
--- a/src/NST/agrif_oce_sponge.F90
+++ b/src/NST/agrif_oce_sponge.F90
@@ -161,15 +161,15 @@ CONTAINS
       IF( lk_west ) THEN                            ! --- West --- !
          ind1 = nn_hls + nbghostcells               ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + ispongearea 
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
-               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji), wp) * z1_ispongearea
+               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji,nn_hls), wp) * z1_ispongearea
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls +  nbghostcells              ! halo + nbghostcells
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -178,15 +178,15 @@ CONTAINS
       IF( lk_east ) THEN                             ! --- East --- !
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 ) - ispongearea - 1
          ind2 = jpiglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + land + nbghostcells - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji) - ind1, wp) * z1_ispongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji,nn_hls) - ind1, wp) * z1_ispongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + land + nbghostcells - 1
          ind2 = jpiglo - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -195,15 +195,15 @@ CONTAINS
       IF( lk_south ) THEN                            ! --- South --- !
          ind1 = nn_hls + nbghostcells                ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + jspongearea 
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj), wp) * z1_jspongearea )
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj,nn_hls), wp) * z1_jspongearea )
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells                ! halo + nbghostcells
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -212,15 +212,15 @@ CONTAINS
       IF( lk_north ) THEN                            ! --- North --- !
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 ) - jspongearea - 1
          ind2 = jpjglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + nbghostcells - 1
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj) - ind1, wp) * z1_jspongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj,nn_hls) - ind1, wp) * z1_jspongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 )      ! halo + land + nbghostcells - 1
          ind2 = jpjglo
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -239,8 +239,8 @@ CONTAINS
       fspt(:,:) = 0._wp
       fspf(:,:) = 0._wp
       DO_2D( 0, 0, 0, 0 )
-         fspt(ji,jj) = 0.25_wp * ( ztabramp(ji  ,jj  ) + ztabramp(ji-1,jj  ) &
-                               &  +ztabramp(ji  ,jj-1) + ztabramp(ji-1,jj-1) ) * ssmask(ji,jj)
+         fspt(ji,jj) = 0.25_wp * (  ( ztabramp(ji  ,jj  ) + ztabramp(ji-1,jj  ) ) &   ! add () for NP repro
+            &                     + ( ztabramp(ji  ,jj-1) + ztabramp(ji-1,jj-1) ) ) * ssmask(ji,jj)
          fspf(ji,jj) = ztabramp(ji,jj) * ssvmask(ji,jj) * ssvmask(ji,jj+1)
       END_2D
       
@@ -294,15 +294,15 @@ CONTAINS
       IF( lk_west ) THEN                             ! --- West --- !
          ind1 = nn_hls + nbghostcells + ishift
          ind2 = nn_hls + nbghostcells + ishift + ispongearea 
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
-               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji), wp) * z1_ispongearea
+               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji,nn_hls), wp) * z1_ispongearea
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells + ishift               ! halo + nbghostcells
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -311,15 +311,15 @@ CONTAINS
       IF( lk_east ) THEN                             ! --- East --- !
          ind1 = jpiglo - ( nn_hls + nbghostcells -1  + ishift) - ispongearea - 1
          ind2 = jpiglo - ( nn_hls + nbghostcells -1  + ishift) - 1    ! halo + nbghostcells - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji) - ind1, wp) * z1_ispongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji,nn_hls) - ind1, wp) * z1_ispongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 + ishift) - 1    ! halo + nbghostcells - 1
          ind2 = jpiglo - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -328,15 +328,15 @@ CONTAINS
       IF( lk_south ) THEN                            ! --- South --- !
          ind1 = nn_hls + nbghostcells + jshift                ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + jshift + jspongearea 
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj), wp) * z1_jspongearea )
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj,nn_hls), wp) * z1_jspongearea )
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells + jshift                ! halo + land + nbghostcells
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -345,15 +345,15 @@ CONTAINS
       IF( lk_north ) THEN                            ! --- North --- !
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 + jshift) - jspongearea - 1
          ind2 = jpjglo - ( nn_hls + nbghostcells -1 + jshift) - 1    ! halo + land + nbghostcells - 1
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj) - ind1, wp) * z1_jspongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj,nn_hls) - ind1, wp) * z1_jspongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 + jshift)      ! halo + land + nbghostcells - 1
          ind2 = jpjglo
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -372,8 +372,8 @@ CONTAINS
       fspt_2d(:,:) = 0._wp
       fspf_2d(:,:) = 0._wp
       DO_2D( 0, 0, 0, 0 )
-         fspt_2d(ji,jj) = 0.25_wp * ( ztabramp(ji  ,jj  ) + ztabramp(ji-1,jj  ) &
-                               &  +ztabramp(ji  ,jj-1) + ztabramp(ji-1,jj-1) ) * ssmask(ji,jj)
+         fspt_2d(ji,jj) = 0.25_wp * (  ( ztabramp(ji  ,jj  ) + ztabramp(ji-1,jj  ) ) &   ! add () for NP repro
+            &                        + ( ztabramp(ji  ,jj-1) + ztabramp(ji-1,jj-1) ) ) * ssmask(ji,jj)
          fspf_2d(ji,jj) = ztabramp(ji,jj) * ssvmask(ji,jj) * ssvmask(ji,jj+1)
          END_2D
       CALL lbc_lnk( 'agrif_Sponge_2d', fspu_2d, 'U', 1._wp, fspv_2d, 'V', 1._wp, fspt_2d, 'T', 1._wp, fspf_2d, 'F', 1._wp )
@@ -418,7 +418,7 @@ CONTAINS
             END DO
          END DO
 
-         IF ( l_vremap.OR.ln_zps ) THEN
+         IF ( l_vremap.OR.l_zps ) THEN
 
             ! Fill cell depths (i.e. gdept) to be interpolated
             ! Warning: these are masked, hence extrapolated prior interpolation.
@@ -512,7 +512,7 @@ CONTAINS
 
          ELSE
 
-            IF ( Agrif_Parent(ln_zps) ) THEN ! Account for partial cells
+            IF ( Agrif_Parent(l_zps) ) THEN ! Account for partial cells
 
                DO jj=j1,j2
                   DO ji=i1,i2
@@ -573,7 +573,7 @@ CONTAINS
                   END DO
                END DO
                !
-               IF( ln_zps ) THEN      ! set gradient at partial step level
+               IF( l_zps ) THEN      ! set gradient at partial step level
                   DO jj = j1,j2
                      DO ji = i1,i2
                         ! last level
@@ -593,8 +593,8 @@ CONTAINS
                      IF (.NOT. tabspongedone_tsn(ji,jj)) THEN 
                         zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm_a)
                         ! horizontal diffusive trends
-                        ztsa = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   & 
-                          &           + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) &
+                        ztsa = zbtr * ( ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) )   &   ! add () for NP repro
+                          &           + ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) ) &
                           &   - rn_trelax_tra * r1_Dt * fspt(ji,jj) * tsbdiff(ji,jj,jk,jn)
                         ! add it to the general tracer trends
                         ts(ji,jj,jk,jn,Krhs_a) = ts(ji,jj,jk,jn,Krhs_a) + ztsa
@@ -730,7 +730,7 @@ CONTAINS
 
          jmax = j2-1
          ind1 = jpjglo - ( nn_hls + nbghostcells + 1 )   ! North
-         DO jj = mj0(ind1), mj1(ind1)                 
+         DO jj = mj0(ind1,nn_hls), mj1(ind1,nn_hls)                 
             jmax = MIN(jmax,jj)
          END DO
 
@@ -858,7 +858,7 @@ CONTAINS
 
          imax = i2 - 1
          ind1 = jpiglo - ( nn_hls + nbghostcells + 1 )   ! East
-         DO ji = mi0(ind1), mi1(ind1)                
+         DO ji = mi0(ind1,nn_hls), mi1(ind1,nn_hls)                
             imax = MIN(imax,ji)
          END DO
          
@@ -958,7 +958,7 @@ CONTAINS
 
          jmax = j2-1
          ind1 = jpjglo - ( nn_hls + nbghostcells + 1 )   ! North
-         DO jj = mj0(ind1), mj1(ind1)                 
+         DO jj = mj0(ind1,nn_hls), mj1(ind1,nn_hls)                 
             jmax = MIN(jmax,jj)
          END DO
 
@@ -1025,7 +1025,7 @@ CONTAINS
 
          imax = i2 - 1
          ind1 = jpiglo - ( nn_hls + nbghostcells + 1 )   ! East
-         DO ji = mi0(ind1), mi1(ind1)                
+         DO ji = mi0(ind1,nn_hls), mi1(ind1,nn_hls)                
             imax = MIN(imax,ji)
          END DO
          
diff --git a/src/NST/agrif_oce_update.F90 b/src/NST/agrif_oce_update.F90
index 3de6bdc2..e48bd2df 100644
--- a/src/NST/agrif_oce_update.F90
+++ b/src/NST/agrif_oce_update.F90
@@ -25,7 +25,6 @@ MODULE agrif_oce_update
    !
    USE in_out_manager ! I/O manager
    USE lib_mpp        ! MPP library
-   USE domvvl         ! Need interpolation routines 
    USE vremap         ! Vertical remapping
    USE lbclnk 
 #if defined key_qco
@@ -201,17 +200,17 @@ CONTAINS
 #if defined key_qco
       !
       Agrif_UseSpecialValueInUpdate = .FALSE.
-#if ! defined DECAL_FEEDBACK_2D
+# if ! defined DECAL_FEEDBACK_2D
       CALL Agrif_Update_Variable(r3t_id,  locupdate=(/  nn_shift_bar,-2/), procname=update_r3t) 
       CALL Agrif_Update_Variable(r3f_id,  locupdate=(/  nn_shift_bar,-2/), procname=update_r3f) 
       CALL Agrif_Update_Variable(r3u_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_r3u) 
       CALL Agrif_Update_Variable(r3v_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_r3v) 
-#else
+# else
       CALL Agrif_Update_Variable(r3t_id,  locupdate=(/1+nn_shift_bar,-2/), procname=update_r3t) 
       CALL Agrif_Update_Variable(r3f_id,  locupdate=(/1+nn_shift_bar,-2/), procname=update_r3f) 
       CALL Agrif_Update_Variable(r3u_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/1+nn_shift_bar,-2/), procname=update_r3u) 
       CALL Agrif_Update_Variable(r3v_id, locupdate1=(/1+nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_r3v) 
-#endif
+# endif
       !
       ! Old way (update e3 at UVF-points everywhere on parent domain):
 !      CALL Agrif_ChildGrid_To_ParentGrid()
@@ -220,26 +219,6 @@ CONTAINS
 #elif defined key_linssh
       !
       ! DO NOTHING HERE
-#else
-      Agrif_UseSpecialValueInUpdate = .FALSE.
-      l_vremap                      = ln_vert_remap
-#if ! defined DECAL_FEEDBACK_2D
-      CALL Agrif_Update_Variable(e3t_id,  locupdate=(/  nn_shift_bar,-2/), procname=update_e3t) 
-      CALL Agrif_Update_Variable(e3f_id,  locupdate=(/  nn_shift_bar,-2/), procname=update_e3f) 
-      CALL Agrif_Update_Variable(e3u_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_e3u) 
-      CALL Agrif_Update_Variable(e3v_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_e3v) 
-#else
-      CALL Agrif_Update_Variable(e3t_id,  locupdate=(/1+nn_shift_bar,-2/), procname=update_e3t) 
-      CALL Agrif_Update_Variable(e3f_id,  locupdate=(/1+nn_shift_bar,-2/), procname=update_e3f) 
-      CALL Agrif_Update_Variable(e3u_id, locupdate1=(/  nn_shift_bar,-2/), locupdate2=(/1+nn_shift_bar,-2/), procname=update_e3u) 
-      CALL Agrif_Update_Variable(e3v_id, locupdate1=(/1+nn_shift_bar,-2/), locupdate2=(/  nn_shift_bar,-2/), procname=update_e3v) 
-#endif
-      l_vremap                      = .FALSE. 
-      !
-! Old way (update e3 at UVF-points everywhere on parent domain):
-!      CALL Agrif_ChildGrid_To_ParentGrid()
-!      CALL dom_vvl_update_UVF
-!      CALL Agrif_ParentGrid_To_ChildGrid()
 #endif
       !
    END SUBROUTINE Agrif_Update_vvl
@@ -261,80 +240,6 @@ CONTAINS
    END SUBROUTINE Agrif_Update_qco
 #endif
 
-#if ! defined key_qco   &&   ! defined key_linssh
-   SUBROUTINE dom_vvl_update_UVF
-      !!---------------------------------------------
-      !!       *** ROUTINE dom_vvl_update_UVF ***
-      !!---------------------------------------------
-      !!
-      INTEGER :: jk
-      REAL(wp):: zcoef
-      !!---------------------------------------------
-      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Finalize e3 on grid Number', &
-                  & Agrif_Fixed(), 'Step', Agrif_Nb_Step()
-
-      ! Save "old" scale factor (prior update) for subsequent asselin correction
-      ! of prognostic variables
-      ! -----------------------
-      !
-      e3u(:,:,:,Krhs_a) = e3u(:,:,:,Kmm_a)
-      e3v(:,:,:,Krhs_a) = e3v(:,:,:,Kmm_a)
-      hu(:,:,Krhs_a) = hu(:,:,Kmm_a)
-      hv(:,:,Krhs_a) = hv(:,:,Kmm_a)
-
-      ! 1) NOW fields
-      !--------------
-      
-         ! Vertical scale factor interpolations
-         ! ------------------------------------
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm_a), e3u(:,:,:,Kmm_a) ,  'U' )
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm_a), e3v(:,:,:,Kmm_a) ,  'V' )
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm_a), e3f(:,:,:) ,  'F' )
-
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm_a), e3uw(:,:,:,Kmm_a), 'UW' )
-      CALL dom_vvl_interpol( e3v(:,:,:,Kmm_a), e3vw(:,:,:,Kmm_a), 'VW' )
-
-         ! Update total depths:
-         ! --------------------
-      hu(:,:,Kmm_a) = 0._wp                    ! Ocean depth at U-points
-      hv(:,:,Kmm_a) = 0._wp                    ! Ocean depth at V-points
-      DO jk = 1, jpkm1
-         hu(:,:,Kmm_a) = hu(:,:,Kmm_a) + e3u(:,:,jk,Kmm_a) * umask(:,:,jk)
-         hv(:,:,Kmm_a) = hv(:,:,Kmm_a) + e3v(:,:,jk,Kmm_a) * vmask(:,:,jk)
-      END DO
-      !                                        ! Inverse of the local depth
-      r1_hu(:,:,Kmm_a) = ssumask(:,:) / ( hu(:,:,Kmm_a) + 1._wp - ssumask(:,:) )
-      r1_hv(:,:,Kmm_a) = ssvmask(:,:) / ( hv(:,:,Kmm_a) + 1._wp - ssvmask(:,:) )
-
-
-      ! 2) BEFORE fields:
-      !------------------
-      IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
-         !
-         ! Vertical scale factor interpolations
-         ! ------------------------------------
-         CALL dom_vvl_interpol( e3t(:,:,:,Kbb_a), e3u(:,:,:,Kbb_a),  'U'  )
-         CALL dom_vvl_interpol( e3t(:,:,:,Kbb_a), e3v(:,:,:,Kbb_a),  'V'  )
-
-         CALL dom_vvl_interpol( e3u(:,:,:,Kbb_a), e3uw(:,:,:,Kbb_a), 'UW' )
-         CALL dom_vvl_interpol( e3v(:,:,:,Kbb_a), e3vw(:,:,:,Kbb_a), 'VW' )
-
-         ! Update total depths:
-         ! --------------------
-         hu(:,:,Kbb_a) = 0._wp                     ! Ocean depth at U-points
-         hv(:,:,Kbb_a) = 0._wp                     ! Ocean depth at V-points
-         DO jk = 1, jpkm1
-            hu(:,:,Kbb_a) = hu(:,:,Kbb_a) + e3u(:,:,jk,Kbb_a) * umask(:,:,jk)
-            hv(:,:,Kbb_a) = hv(:,:,Kbb_a) + e3v(:,:,jk,Kbb_a) * vmask(:,:,jk)
-         END DO
-         !                                     ! Inverse of the local depth
-         r1_hu(:,:,Kbb_a) = ssumask(:,:) / ( hu(:,:,Kbb_a) + 1._wp - ssumask(:,:) )
-         r1_hv(:,:,Kbb_a) = ssvmask(:,:) / ( hv(:,:,Kbb_a) + 1._wp - ssvmask(:,:) )
-      ENDIF
-      !
-   END SUBROUTINE dom_vvl_update_UVF
-#endif
-
 
    SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before )
       !!----------------------------------------------------------------------
@@ -1321,7 +1226,6 @@ CONTAINS
          e3w (i1:i2,j1:j2,1,Kmm_a) = e3w_0(i1:i2,j1:j2,1) + e3t(i1:i2,j1:j2,1,Kmm_a) - e3t_0(i1:i2,j1:j2,1)
          gdept(i1:i2,j1:j2,1,Kmm_a) = 0.5_wp * e3w(i1:i2,j1:j2,1,Kmm_a)
          gdepw(i1:i2,j1:j2,1,Kmm_a) = 0.0_wp
-         gde3w(i1:i2,j1:j2,1) = gdept(i1:i2,j1:j2,1,Kmm_a) - (ht(i1:i2,j1:j2)-ht_0(i1:i2,j1:j2)) ! Last term in the rhs is ssh
          !
          DO jk = 2, jpkm1
             DO jj = j1,j2
@@ -1332,7 +1236,6 @@ CONTAINS
                gdepw(ji,jj,jk,Kmm_a) = gdepw(ji,jj,jk-1,Kmm_a) + e3t(ji,jj,jk-1,Kmm_a)
                gdept(ji,jj,jk,Kmm_a) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm_a) + 0.5_wp * e3w(ji,jj,jk,Kmm_a))  &
                    &               + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm_a) +       e3w(ji,jj,jk,Kmm_a)) 
-               gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm_a) - (ht(ji,jj)-ht_0(ji,jj)) ! Last term in the rhs is ssh
                END DO
             END DO
          END DO
@@ -1894,7 +1797,7 @@ CONTAINS
                      DO jk=k1,k2-1
                         IF  (ABS((ptab(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk)).GE.1.e-6)  THEN 
                            kindic_agr = kindic_agr + 1 
-                           print *, 'erro u-pt', mig0(ji), mjg0(jj), jk, mbku(ji,jj), ikbot, ptab(ji,jj,jk), e3u_0(ji,jj,jk)
+                           PRINT *, 'erro u-pt', mig(ji,0), mjg(jj,0), jk, mbku(ji,jj), ikbot, ptab(ji,jj,jk), e3u_0(ji,jj,jk)
                         ENDIF
                      END DO
                   ENDIF
@@ -1934,7 +1837,7 @@ CONTAINS
                      DO jk=k1,k2-1
                         IF  (ABS((ptab(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk)).GE.1.e-6)  THEN 
                            kindic_agr = kindic_agr + 1 
-                           print *, 'erro v-pt', mig0(ji), mjg0(jj), mbkv(ji,jj), ptab(ji,jj,jk), e3v_0(ji,jj,jk)
+                           PRINT *, 'erro v-pt', mig(ji,0), mjg(jj,0), mbkv(ji,jj), ptab(ji,jj,jk), e3v_0(ji,jj,jk)
                         ENDIF
                      END DO
                   ENDIF
diff --git a/src/NST/agrif_top_interp.F90 b/src/NST/agrif_top_interp.F90
index 23ad775d..cbd489e7 100644
--- a/src/NST/agrif_top_interp.F90
+++ b/src/NST/agrif_top_interp.F90
@@ -105,7 +105,7 @@ CONTAINS
            END DO
          END DO
 
-         IF( l_vremap .OR. l_ini_child .OR. ln_zps ) THEN
+         IF( l_vremap .OR. l_ini_child .OR. l_zps ) THEN
             ! Fill cell depths (i.e. gdept) to be interpolated
             ! Warning: these are masked, hence extrapolated prior interpolation.
             DO jj=j1,j2
@@ -198,7 +198,7 @@ CONTAINS
  
          ELSE
 
-            IF ( Agrif_Parent(ln_zps) ) THEN ! Account for partial cells 
+            IF ( Agrif_Parent(l_zps) ) THEN ! Account for partial cells 
                                              ! linear vertical interpolation
                DO jj=j1,j2
                   DO ji=i1,i2
diff --git a/src/NST/agrif_top_sponge.F90 b/src/NST/agrif_top_sponge.F90
index 641b9de7..a3706693 100644
--- a/src/NST/agrif_top_sponge.F90
+++ b/src/NST/agrif_top_sponge.F90
@@ -98,7 +98,7 @@ CONTAINS
             END DO
          END DO
 
-         IF ( l_vremap.OR.ln_zps ) THEN
+         IF ( l_vremap.OR.l_zps ) THEN
 
             ! Fill cell depths (i.e. gdept) to be interpolated
             ! Warning: these are masked, hence extrapolated prior interpolation.
@@ -191,7 +191,7 @@ CONTAINS
 
          ELSE
 
-            IF ( Agrif_Parent(ln_zps) ) THEN ! Account for partial cells
+            IF ( Agrif_Parent(l_zps) ) THEN ! Account for partial cells
 
                DO jj=j1,j2
                   DO ji=i1,i2
@@ -245,7 +245,7 @@ CONTAINS
                   END DO
                END DO
                !
-               IF( ln_zps ) THEN      ! set gradient at partial step level
+               IF( l_zps ) THEN      ! set gradient at partial step level
                   DO jj = j1,j2
                      DO ji = i1,i2
                         ! last level
@@ -265,8 +265,8 @@ CONTAINS
                      IF (.NOT. tabspongedone_trn(ji,jj)) THEN 
                         zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm_a)
                         ! horizontal diffusive trends
-                        ztra = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   & 
-                          &           + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) &
+                        ztra = zbtr * ( ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) )   &   ! add () for NP repro
+                          &           + ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) ) &
                           &   - rn_trelax_tra * r1_Dt * fspt(ji,jj) * trbdiff(ji,jj,jk,jn)
                         ! add it to the general tracer trends
                         tr(ji,jj,jk,jn,Krhs_a) = tr(ji,jj,jk,jn,Krhs_a) + ztra
diff --git a/src/NST/agrif_user.F90 b/src/NST/agrif_user.F90
index cdace1b3..bfe0ec9e 100644
--- a/src/NST/agrif_user.F90
+++ b/src/NST/agrif_user.F90
@@ -270,7 +270,7 @@
          mbku_parent(ji,jj) = MIN( mbkt_parent(ji+1,jj  ), mbkt_parent(ji,jj) )
          mbkv_parent(ji,jj) = MIN( mbkt_parent(ji  ,jj+1), mbkt_parent(ji,jj) )
       END_2D
-      IF ( ln_sco.AND.Agrif_Parent(ln_sco) ) THEN 
+      IF ( l_sco.AND.Agrif_Parent(l_sco) ) THEN 
          DO_2D( 1, 0, 1, 0 )
             hu0_parent(ji,jj) = 0.5_wp * ( ht0_parent(ji,jj)+ht0_parent(ji+1,jj) ) * ssumask(ji,jj)
             hv0_parent(ji,jj) = 0.5_wp * ( ht0_parent(ji,jj)+ht0_parent(ji,jj+1) ) * ssvmask(ji,jj)
@@ -313,7 +313,7 @@
       END_3D
 
       ! Assume a step at the bottom except if (pure) s-coordinates
-      IF ( .NOT.Agrif_Parent(ln_sco) ) THEN 
+      IF ( .NOT.Agrif_Parent(l_sco) ) THEN 
          DO_2D( 1, 0, 1, 0 )
             jk = mbku_parent(ji,jj)
             e3u0_parent(ji,jj,jk) = MIN(e3t0_parent(ji,jj,jk), e3t0_parent(ji+1,jj  ,jk))
@@ -1104,8 +1104,8 @@
       !!----------------------------------------------------------------------
       !
       SELECT CASE( i )
-      CASE(1)        ;   indglob = mig(indloc)
-      CASE(2)        ;   indglob = mjg(indloc)
+      CASE(1)        ;   indglob = mig(indloc,nn_hls)
+      CASE(2)        ;   indglob = mjg(indloc,nn_hls)
       CASE DEFAULT   ;   indglob = indloc
       END SELECT
       !
@@ -1124,10 +1124,10 @@
       INTEGER, INTENT(out) :: jmin, jmax
       !!----------------------------------------------------------------------
       !
-      imin = mig( 1 )
-      jmin = mjg( 1 )
-      imax = mig(jpi)
-      jmax = mjg(jpj)
+      imin = mig( 1 ,nn_hls)
+      jmin = mjg( 1 ,nn_hls)
+      imax = mig(jpi,nn_hls)
+      jmax = mjg(jpj,nn_hls)
       ! 
    END SUBROUTINE Agrif_get_proc_info
 
diff --git a/src/OCE/ASM/asminc.F90 b/src/OCE/ASM/asminc.F90
index 54371a62..9d5c6701 100644
--- a/src/OCE/ASM/asminc.F90
+++ b/src/OCE/ASM/asminc.F90
@@ -25,10 +25,8 @@ MODULE asminc
    USE oce             ! Dynamics and active tracers defined in memory
    USE par_oce         ! Ocean space and time domain variables
    USE dom_oce         ! Ocean space and time domain
-   USE domvvl          ! domain: variable volume level
    USE ldfdyn          ! lateral diffusion: eddy viscosity coefficients
    USE eosbn2          ! Equation of state - in situ and potential density
-   USE zpshde          ! Partial step : Horizontal Derivative
    USE asmpar          ! Parameters for the assmilation interface
    USE asmbkg          !
    USE c1d             ! 1D initialization
@@ -519,17 +517,8 @@ CONTAINS
       INTEGER  :: ji, jj, jk
       INTEGER  :: it
       REAL(wp) :: zincwgt  ! IAU weight for current time step
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: fzptnz ! 3d freezing point values
+      REAL(wp), DIMENSION(:,:),   ALLOCATABLE :: fzptnz, zdep2d ! freezing point values
       !!----------------------------------------------------------------------
-      !
-      ! freezing point calculation taken from oc_fz_pt (but calculated for all depths)
-      ! used to prevent the applied increments taking the temperature below the local freezing point
-      IF( ln_temnofreeze ) THEN
-         DO jk = 1, jpkm1
-           CALL eos_fzp( pts(:,:,jk,jp_sal,Kmm), fzptnz(:,:,jk), gdept(:,:,jk,Kmm) )
-         END DO
-      ENDIF
-         !
          !                             !--------------------------------------
       IF ( ln_asmiau ) THEN            ! Incremental Analysis Updating
          !                             !--------------------------------------
@@ -547,13 +536,21 @@ CONTAINS
                ENDIF
             ENDIF
             !
+            IF( ln_temnofreeze ) ALLOCATE( fzptnz(T2D(0)), zdep2d(T2D(0)) )
+            !
             ! Update the tracer tendencies
             DO jk = 1, jpkm1
                IF (ln_temnofreeze) THEN
                   ! Do not apply negative increments if the temperature will fall below freezing
-                  WHERE(t_bkginc(A2D(0),jk) > 0.0_wp .OR. &
-                     &   pts(A2D(0),jk,jp_tem,Kmm) + pts(A2D(0),jk,jp_tem,Krhs) + t_bkginc(A2D(0),jk) * wgtiau(it) > fzptnz(:,:,jk) )
-                     pts(A2D(0),jk,jp_tem,Krhs) = pts(A2D(0),jk,jp_tem,Krhs) + t_bkginc(A2D(0),jk) * zincwgt
+                  ! NOTE: @sibylle- I kept this using the old eos_fzp because with the new I have to specify pts(:,:,jk,:,:), which creates a temporary array. I moved the eos_fzp call here (and below in the ln_asmdin part) because then we only need a 2D fzptnz
+                  DO_2D( 0, 0, 0, 0 )
+                     zdep2d(ji,jj) = gdept(ji,jj,jk,Kmm)   ! better solution: define an interface for eos_fzp when gdept(ji,jj,jk,Kmm) is a scalar
+                  END_2D
+                  CALL eos_fzp( pts(:,:,jk,jp_sal,Kmm), fzptnz(:,:), zdep2d(:,:), kbnd=0 )
+                  !
+                  WHERE(t_bkginc(T2D(0),jk) > 0.0_wp .OR. &
+                     &   pts(T2D(0),jk,jp_tem,Kmm) + pts(T2D(0),jk,jp_tem,Krhs) + t_bkginc(T2D(0),jk) * wgtiau(it) > fzptnz(:,:) )
+                     pts(T2D(0),jk,jp_tem,Krhs) = pts(T2D(0),jk,jp_tem,Krhs) + t_bkginc(T2D(0),jk) * zincwgt
                   END WHERE
                ELSE
                   DO_2D( 0, 0, 0, 0 )
@@ -563,9 +560,9 @@ CONTAINS
                IF (ln_salfix) THEN
                   ! Do not apply negative increments if the salinity will fall below a specified
                   ! minimum value salfixmin
-                  WHERE(s_bkginc(A2D(0),jk) > 0.0_wp .OR. &
-                     &   pts(A2D(0),jk,jp_sal,Kmm) + pts(A2D(0),jk,jp_sal,Krhs) + s_bkginc(A2D(0),jk) * wgtiau(it) > salfixmin )
-                     pts(A2D(0),jk,jp_sal,Krhs) = pts(A2D(0),jk,jp_sal,Krhs) + s_bkginc(A2D(0),jk) * zincwgt
+                  WHERE(s_bkginc(T2D(0),jk) > 0.0_wp .OR. &
+                     &   pts(T2D(0),jk,jp_sal,Kmm) + pts(T2D(0),jk,jp_sal,Krhs) + s_bkginc(T2D(0),jk) * wgtiau(it) > salfixmin )
+                     pts(T2D(0),jk,jp_sal,Krhs) = pts(T2D(0),jk,jp_sal,Krhs) + s_bkginc(T2D(0),jk) * zincwgt
                   END WHERE
                ELSE
                   DO_2D( 0, 0, 0, 0 )
@@ -574,6 +571,8 @@ CONTAINS
                ENDIF
             END DO
             !
+            IF( ln_temnofreeze ) DEALLOCATE( fzptnz, zdep2d )
+            !
          ENDIF
          !
          IF( .NOT. l_istiled .OR. ntile == nijtile )  THEN                ! Do only on the last tile
@@ -593,9 +592,20 @@ CONTAINS
             ! Initialize the now fields with the background + increment
             IF (ln_temnofreeze) THEN
                ! Do not apply negative increments if the temperature will fall below freezing
-               WHERE( t_bkginc(:,:,:) > 0.0_wp .OR. pts(:,:,:,jp_tem,Kmm) + t_bkginc(:,:,:) > fzptnz(:,:,:) )
-                  pts(:,:,:,jp_tem,Kmm) = t_bkg(:,:,:) + t_bkginc(:,:,:)
-               END WHERE
+               ALLOCATE( fzptnz(A2D(nn_hls)), zdep2d(T2D(nn_hls)) )
+               !
+               DO jk = 1, jpkm1
+                  DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                     zdep2d(ji,jj) = gdept(ji,jj,jk,Kmm)   ! better solution: define an interface for eos_fzp when gdept(ji,jj,jk,Kmm) is a scalar
+                  END_2D
+                  CALL eos_fzp( pts(:,:,jk,jp_sal,Kmm), fzptnz(:,:), zdep2d(:,:) )
+                  !
+                  WHERE( t_bkginc(:,:,jk) > 0.0_wp .OR. pts(:,:,jk,jp_tem,Kmm) + t_bkginc(:,:,jk) > fzptnz(:,:) )
+                     pts(:,:,jk,jp_tem,Kmm) = t_bkg(:,:,jk) + t_bkginc(:,:,jk)
+                  END WHERE
+               END DO
+               !
+               DEALLOCATE( fzptnz, zdep2d )
             ELSE
                pts(:,:,:,jp_tem,Kmm) = t_bkg(:,:,:) + t_bkginc(:,:,:)
             ENDIF
@@ -610,18 +620,7 @@ CONTAINS
             ENDIF
 
             pts(:,:,:,:,Kbb) = pts(:,:,:,:,Kmm)                 ! Update before fields
-
-            CALL eos( pts(:,:,:,:,Kbb), rhd, rhop, gdept_0(:,:,:) )  ! Before potential and in situ densities
-!!gm  fabien
-!            CALL eos( pts(:,:,:,:,Kbb), rhd, rhop )                ! Before potential and in situ densities
-!!gm
-
-            IF( ln_zps .AND. .NOT. ln_c1d .AND. .NOT. ln_isfcav)           &
-               &  CALL zps_hde    ( kt, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv,        &  ! Partial steps: before horizontal gradient
-               &                              rhd, gru , grv               )  ! of t, s, rd at the last ocean level
-            IF( ln_zps .AND. .NOT. ln_c1d .AND.       ln_isfcav)                       &
-               &  CALL zps_hde_isf( nit000, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv, gtui, gtvi,    &  ! Partial steps for top cell (ISF)
-               &                                  rhd, gru , grv , grui, grvi          )  ! of t, s, rd at the last ocean level
+            CALL eos( pts, Kbb, rhd, rhop )                     ! Before potential and in situ densities
 
             DEALLOCATE( t_bkginc )
             DEALLOCATE( s_bkginc )
@@ -781,7 +780,7 @@ CONTAINS
             ssh(:,:,Kmm) = ssh_bkg(:,:) + ssh_bkginc(:,:)   ! Initialize the now fields the background + increment
             !
             ssh(:,:,Kbb) = ssh(:,:,Kmm)                        ! Update before fields
-#if ! defined key_qco
+#if ! defined key_qco && ! defined key_linssh
             e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
 #endif
 !!gm why not e3u(:,:,:,Kbb), e3v(:,:,:,Kbb), gdept(:,:,:,Kbb) ????
@@ -821,13 +820,13 @@ CONTAINS
       CALL ssh_asm_inc( kt, Kbb, Kmm ) !==   (calculate increments)
       !
       IF( ln_linssh ) THEN
-         DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             phdivn(ji,jj,1) = phdivn(ji,jj,1) - ssh_iau(ji,jj) / e3t(ji,jj,1,Kmm) * tmask(ji,jj,1)
          END_2D
       ELSE
-         ALLOCATE( ztim(A2D(nn_hls)) )
-         DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
-            ztim(ji,jj) = ssh_iau(ji,jj) / ( ht(ji,jj) + 1.0 - ssmask(ji,jj) )
+         ALLOCATE( ztim(T2D(0)) )
+         DO_2D( 0, 0, 0, 0 )
+            ztim(ji,jj) = ssh_iau(ji,jj) / ( ht(ji,jj,Kmm) + 1.0 - ssmask(ji,jj) )
             DO jk = 1, jpkm1
                phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ztim(ji,jj) * tmask(ji,jj,jk)
             END DO
@@ -858,7 +857,7 @@ CONTAINS
       INTEGER  ::   it
       REAL(wp) ::   zincwgt   ! IAU weight for current time step
 #if defined key_si3
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zofrld, zohicif, zseaicendg, zhicifinc
+      REAL(wp), DIMENSION(T2D(0)) ::   zofrld, zohicif, zseaicendg, zhicifinc
       REAL(wp) ::   zhicifmin = 0.5_wp      ! ice minimum depth in metres
 #endif
       !!----------------------------------------------------------------------
@@ -896,8 +895,8 @@ CONTAINS
             END_2D
             !
             ! Nudge sea ice depth to bring it up to a required minimum depth
-            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hm_i(A2D(0)) < zhicifmin )
-               zhicifinc(:,:) = (zhicifmin - hm_i(A2D(0))) * zincwgt
+            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hm_i(T2D(0)) < zhicifmin )
+               zhicifinc(:,:) = (zhicifmin - hm_i(T2D(0))) * zincwgt
             ELSEWHERE
                zhicifinc(:,:) = 0.0_wp
             END WHERE
@@ -956,8 +955,8 @@ CONTAINS
             END_2D
             !
             ! Nudge sea ice depth to bring it up to a required minimum depth
-            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hm_i(A2D(0)) < zhicifmin )
-               zhicifinc(:,:) = zhicifmin - hm_i(A2D(0))
+            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hm_i(T2D(0)) < zhicifmin )
+               zhicifinc(:,:) = zhicifmin - hm_i(T2D(0))
             ELSEWHERE
                zhicifinc(:,:) = 0.0_wp
             END WHERE
diff --git a/src/OCE/BDY/bdydyn.F90 b/src/OCE/BDY/bdydyn.F90
index 61e4d378..8402aba6 100644
--- a/src/OCE/BDY/bdydyn.F90
+++ b/src/OCE/BDY/bdydyn.F90
@@ -22,7 +22,6 @@ MODULE bdydyn
    USE bdydyn3d        ! open boundary conditions for baroclinic velocities
    USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
    USE in_out_manager  !
-   USE domvvl          ! variable volume
 
    IMPLICIT NONE
    PRIVATE
diff --git a/src/OCE/BDY/bdyice.F90 b/src/OCE/BDY/bdyice.F90
index cf2ea3a2..409e0cad 100644
--- a/src/OCE/BDY/bdyice.F90
+++ b/src/OCE/BDY/bdyice.F90
@@ -62,7 +62,7 @@ CONTAINS
       ! controls
       IF( ln_timing )   CALL timing_start('bdy_ice_thd')   ! timing
       !
-      CALL ice_var_glo2eqv
+      CALL ice_var_glo2eqv(2)
       !
       llsend1(:) = .false.   ;   llrecv1(:) = .false.
       DO ir = 1, 0, -1   ! treat rim 1 before rim 0
@@ -96,14 +96,19 @@ CONTAINS
                &                 , a_ip, 'T', 1._wp, v_ip, 'T', 1._wp, v_il, 'T', 1._wp                                     &
                &                 , kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
             ! exchange 4d arrays :   third dimension = 1   and then   third dimension = jpk
-            CALL lbc_lnk('bdyice', t_s , 'T', 1._wp, e_s , 'T', 1._wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
-            CALL lbc_lnk('bdyice', t_i , 'T', 1._wp, e_i , 'T', 1._wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
+            CALL lbc_lnk('bdyice', t_s , 'T', 1._wp, e_s , 'T', 1._wp, t_i , 'T', 1._wp, e_i , 'T', 1._wp, &
+               &                                     kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
          END IF
       END DO   ! ir
       !
       CALL ice_cor( kt , 0 )      ! -- In case categories are out of bounds, do a remapping
       !                           !    i.e. inputs have not the same ice thickness distribution (set by rn_himean)
       !                           !         than the regional simulation
+      !                           ! -- lbc_lnk needed because of iceitd_reb that is called in icecor.F90
+      CALL lbc_lnk( 'bdyice', a_i , 'T', 1._wp, v_i , 'T', 1._wp, v_s , 'T', 1._wp, sv_i, 'T', 1._wp, oa_i, 'T', 1._wp, &
+         &                    t_su, 'T', 1._wp, a_ip, 'T', 1._wp, v_ip, 'T', 1._wp, v_il, 'T', 1._wp )
+      CALL lbc_lnk( 'bdyice', e_i , 'T', 1._wp, e_s , 'T', 1._wp )
+      !
       CALL ice_var_agg(1)
       !
       ! controls
diff --git a/src/OCE/BDY/bdyini.F90 b/src/OCE/BDY/bdyini.F90
index 3de3150b..e0b1fe6d 100644
--- a/src/OCE/BDY/bdyini.F90
+++ b/src/OCE/BDY/bdyini.F90
@@ -491,10 +491,10 @@ CONTAINS
       ! Find lenght of boundaries and rim on local mpi domain
       !------------------------------------------------------
       !
-      iwe = mig(1)
-      ies = mig(jpi)
-      iso = mjg(1) 
-      ino = mjg(jpj) 
+      iwe = mig(  1,nn_hls)
+      ies = mig(jpi,nn_hls)
+      iso = mjg(  1,nn_hls) 
+      ino = mjg(jpj,nn_hls) 
       !
       DO ib_bdy = 1, nb_bdy
          DO igrd = 1, jpbgrd
@@ -554,8 +554,8 @@ CONTAINS
                      & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN
                      !
                      icount = icount  + 1
-                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy) - mig(1) + 1   ! global to local indexes
-                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy) - mjg(1) + 1   ! global to local indexes
+                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy) - mig(1,nn_hls) + 1   ! global to local indexes
+                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy) - mjg(1,nn_hls) + 1   ! global to local indexes
                      idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy)
                      idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib
                   ENDIF
@@ -1014,7 +1014,7 @@ CONTAINS
                DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)
                   ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
                   ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
-                  IF(  mig0(ii) > 2 .AND. mig0(ii) < Ni0glo-2 .AND. mjg0(ij) > 2 .AND. mjg0(ij) < Nj0glo-2  ) THEN
+                  IF(  mig(ii,0) > 2 .AND. mig(ii,0) < Ni0glo-2 .AND. mjg(ij,0) > 2 .AND. mjg(ij,0) < Nj0glo-2  ) THEN
                      WRITE(ctmp1,*) ' Orlanski is not safe when the open boundaries are on the interior of the computational domain'
                      CALL ctl_stop( ctmp1 )
                   END IF
@@ -1090,7 +1090,7 @@ CONTAINS
                ! This error check only works if you are using the bdyXmask arrays (which are set to 0 on rims)
                IF( i_offset == 1 .and. zefl + zwfl == 2._wp ) THEN
                   icount = icount + 1
-                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij)
+                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii,nn_hls),mjg(ij,nn_hls)
                ELSE
                   ztmp(ii,ij) = -zwfl + zefl
                ENDIF
@@ -1130,7 +1130,7 @@ CONTAINS
                znfl = zmask(ii,ij+j_offset  )
                ! This error check only works if you are using the bdyXmask arrays (which are set to 0 on rims)
                IF( j_offset == 1 .and. znfl + zsfl == 2._wp ) THEN
-                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij)
+                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii,nn_hls),mjg(ij,nn_hls)
                   icount = icount + 1
                ELSE
                   ztmp(ii,ij) = -zsfl + znfl
@@ -1594,8 +1594,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mig0(ji) == jpiwob(ib) .AND. mjg0(jj) == jpjwdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mig0(ji) == jpiwob(ib) .AND. mjg0(jj) == jpjwft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mig(ji,0) == jpiwob(ib) .AND. mjg(jj,0) == jpjwdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mig(ji,0) == jpiwob(ib) .AND. mjg(jj,0) == jpjwft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1630,8 +1630,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mig0(ji) == jpieob(ib)+1 .AND. mjg0(jj) == jpjedt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mig0(ji) == jpieob(ib)+1 .AND. mjg0(jj) == jpjeft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mig(ji,0) == jpieob(ib)+1 .AND. mjg(jj,0) == jpjedt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mig(ji,0) == jpieob(ib)+1 .AND. mjg(jj,0) == jpjeft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1666,8 +1666,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mjg0(jj) == jpjsob(ib) .AND. mig0(ji) == jpisdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mjg0(jj) == jpjsob(ib) .AND. mig0(ji) == jpisft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mjg(jj,0) == jpjsob(ib) .AND. mig(ji,0) == jpisdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mjg(jj,0) == jpjsob(ib) .AND. mig(ji,0) == jpisft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1688,8 +1688,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-               IF( mjg0(jj) == jpjnob(ib)+1 .AND. mig0(ji) == jpindt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-               IF( mjg0(jj) == jpjnob(ib)+1 .AND. mig0(ji) == jpinft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+               IF( mjg(jj,0) == jpjnob(ib)+1 .AND. mig(ji,0) == jpindt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+               IF( mjg(jj,0) == jpjnob(ib)+1 .AND. mig(ji,0) == jpinft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
diff --git a/src/OCE/BDY/bdyvol.F90 b/src/OCE/BDY/bdyvol.F90
index e058d671..883d27c1 100644
--- a/src/OCE/BDY/bdyvol.F90
+++ b/src/OCE/BDY/bdyvol.F90
@@ -99,14 +99,16 @@ CONTAINS
             ii = idx%nbi(jb,jgrd)
             ij = idx%nbj(jb,jgrd)
             IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! sum : else halo couted twice
-            zubtpecor = zubtpecor + idx%flagu(jb,jgrd) * pua2d(ii,ij) * e2u(ii,ij) * phu(ii,ij) * tmask_i(ii,ij) * tmask_i(ii+1,ij)
+            zubtpecor = zubtpecor + idx%flagu(jb,jgrd) * pua2d(ii,ij) * e2u(ii,ij) * phu(ii,ij)   &
+               &                                       * ( tmask_i(ii,ij) * tmask_i(ii+1,ij) )
          END DO
          jgrd = 3                               ! then add v component contribution
          DO jb = 1, idx%nblenrim(jgrd)
             ii = idx%nbi(jb,jgrd)
             ij = idx%nbj(jb,jgrd)
             IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! sum : else halo couted twice
-            zubtpecor = zubtpecor + idx%flagv(jb,jgrd) * pva2d(ii,ij) * e1v(ii,ij) * phv(ii,ij) * tmask_i(ii,ij) * tmask_i(ii,ij+1)
+            zubtpecor = zubtpecor + idx%flagv(jb,jgrd) * pva2d(ii,ij) * e1v(ii,ij) * phv(ii,ij)   &
+               &                                       * ( tmask_i(ii,ij) * tmask_i(ii,ij+1) )
          END DO
          !
       END DO
@@ -128,14 +130,14 @@ CONTAINS
                ii = idx%nbi(jb,jgrd)
                ij = idx%nbj(jb,jgrd)
                !IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove ?
-               pua2d(ii,ij) = pua2d(ii,ij) - idx%flagu(jb,jgrd) * zubtpecor * tmask_i(ii,ij) * tmask_i(ii+1,ij)
+               pua2d(ii,ij) = pua2d(ii,ij) - idx%flagu(jb,jgrd) * zubtpecor * ( tmask_i(ii,ij) * tmask_i(ii+1,ij) )
          END DO
          jgrd = 3                              ! correct v component
          DO jb = 1, idx%nblenrim(jgrd)
                ii = idx%nbi(jb,jgrd)
                ij = idx%nbj(jb,jgrd)
                !IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove ?
-               pva2d(ii,ij) = pva2d(ii,ij) - idx%flagv(jb,jgrd) * zubtpecor * tmask_i(ii,ij) * tmask_i(ii,ij+1)
+               pva2d(ii,ij) = pva2d(ii,ij) - idx%flagv(jb,jgrd) * zubtpecor * ( tmask_i(ii,ij) * tmask_i(ii,ij+1) )
          END DO
          !
       END DO
@@ -154,14 +156,16 @@ CONTAINS
                   ii = idx%nbi(jb,jgrd)
                   ij = idx%nbj(jb,jgrd)
                   IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE
-                  ztranst = ztranst + idx%flagu(jb,jgrd) * pua2d(ii,ij) * e2u(ii,ij) * phu(ii,ij) * tmask_i(ii,ij) * tmask_i(ii+1,ij)
+                  ztranst = ztranst + idx%flagu(jb,jgrd) * pua2d(ii,ij) * e2u(ii,ij) * phu(ii,ij)   &
+                     &                                   * ( tmask_i(ii,ij) * tmask_i(ii+1,ij) )
             END DO
             jgrd = 3                              ! correct v component
             DO jb = 1, idx%nblenrim(jgrd)
                   ii = idx%nbi(jb,jgrd)
                   ij = idx%nbj(jb,jgrd)
                   IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE
-                  ztranst = ztranst + idx%flagv(jb,jgrd) * pva2d(ii,ij) * e1v(ii,ij) * phv(ii,ij) * tmask_i(ii,ij) * tmask_i(ii,ij+1)
+                  ztranst = ztranst + idx%flagv(jb,jgrd) * pva2d(ii,ij) * e1v(ii,ij) * phv(ii,ij)   &
+                     &                                   * ( tmask_i(ii,ij) * tmask_i(ii,ij+1) )
             END DO
             !
          END DO
@@ -204,7 +208,7 @@ CONTAINS
             zflagu => idx_bdy(ib_bdy)%flagu(ib,igrd)
             bdy_segs_surf = bdy_segs_surf + phu(nbi, nbj)                              &
                &                            * e2u(nbi, nbj) * ABS( zflagu )            &
-               &                            * tmask_i(nbi, nbj) * tmask_i(nbi+1, nbj)
+               &                            * ( tmask_i(nbi, nbj) * tmask_i(nbi+1, nbj) )
          END DO
       END DO
 
@@ -217,7 +221,7 @@ CONTAINS
             zflagv => idx_bdy(ib_bdy)%flagv(ib,igrd)
             bdy_segs_surf = bdy_segs_surf + phv(nbi, nbj)                              &
                &                            * e1v(nbi, nbj) * ABS( zflagv )            &
-               &                            * tmask_i(nbi, nbj) * tmask_i(nbi, nbj+1)
+               &                            * ( tmask_i(nbi, nbj) * tmask_i(nbi, nbj+1) )
          END DO
       END DO
       !
diff --git a/src/OCE/C1D/dtauvd.F90 b/src/OCE/C1D/dtauvd.F90
index fc64c258..03adab4b 100644
--- a/src/OCE/C1D/dtauvd.F90
+++ b/src/OCE/C1D/dtauvd.F90
@@ -150,7 +150,7 @@ CONTAINS
       pud(:,:,:) = sf_uvd(1)%fnow(:,:,:)                 ! NO mask
       pvd(:,:,:) = sf_uvd(2)%fnow(:,:,:) 
       !
-      IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
+      IF( l_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
          !
          ALLOCATE( zup(jpk), zvp(jpk) )
          !
@@ -193,17 +193,6 @@ CONTAINS
          pud(:,:,:) = pud(:,:,:) * umask(:,:,:)       ! apply mask
          pvd(:,:,:) = pvd(:,:,:) * vmask(:,:,:)
          !
-         IF( ln_zps ) THEN                ! zps-coordinate (partial steps) interpolation at the last ocean level
-            DO_2D( 1, 1, 1, 1 )
-               ik = mbkt(ji,jj) 
-               IF( ik > 1 ) THEN
-                  zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
-                  pud(ji,jj,ik) = (1.-zl) * pud(ji,jj,ik) + zl * pud(ji,jj,ik-1)
-                  pvd(ji,jj,ik) = (1.-zl) * pvd(ji,jj,ik) + zl * pvd(ji,jj,ik-1)
-               ENDIF
-            END_2D
-         ENDIF
-         !
       ENDIF
       !
       IF( .NOT. ln_uvd_dyndmp    ) THEN   !==   deallocate U & V current structure   ==! 
diff --git a/src/OCE/C1D/dyndmp.F90 b/src/OCE/C1D/dyndmp.F90
index 5cfd953c..06104f3a 100644
--- a/src/OCE/C1D/dyndmp.F90
+++ b/src/OCE/C1D/dyndmp.F90
@@ -121,7 +121,7 @@ CONTAINS
          !
          !Read in mask from file
          CALL iom_open ( cn_resto, imask)
-         CALL iom_get  ( imask, jpdom_auto, 'resto', resto)
+         CALL iom_get  ( imask, jpdom_auto, 'resto', resto_uv)
          CALL iom_close( imask )
       ENDIF
       !
diff --git a/src/OCE/CRS/crs.F90 b/src/OCE/CRS/crs.F90
index 652c9f12..6be2b107 100644
--- a/src/OCE/CRS/crs.F90
+++ b/src/OCE/CRS/crs.F90
@@ -124,7 +124,8 @@ MODULE crs
       REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  ::  avs_crs           !: salinity    vertical diffusivity coeff. [m2/s] at w-point
 
       ! Mixing and Mixed Layer Depth
-      INTEGER,  PUBLIC, ALLOCATABLE, DIMENSION(:,:)    ::  nmln_crs, hmld_crs, hmlp_crs, hmlpt_crs                       
+      INTEGER,  PUBLIC, ALLOCATABLE, DIMENSION(:,:)    ::  nmln_crs
+      REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)    ::  hmld_crs, hmlp_crs
 
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -207,8 +208,8 @@ CONTAINS
      ALLOCATE( tsn_crs(jpi_crs,jpj_crs,jpk,jpts), avt_crs(jpi_crs,jpj_crs,jpk),   &
          &                                        avs_crs(jpi_crs,jpj_crs,jpk), STAT=ierr(13) )
 
-      ALLOCATE( nmln_crs(jpi_crs,jpj_crs) , hmld_crs(jpi_crs,jpj_crs) , &
-         &      hmlp_crs(jpi_crs,jpj_crs) , hmlpt_crs(jpi_crs,jpj_crs) , STAT=ierr(14) )
+      ALLOCATE( nmln_crs(jpi_crs,jpj_crs), hmld_crs(jpi_crs,jpj_crs) , &
+         &                                 hmlp_crs(jpi_crs,jpj_crs), STAT=ierr(14) )
          
 !!$      ALLOCATE( nimppt_crs (jpnij) , jpiall_crs (jpnij) , nis0all_crs (jpnij) , nie0all_crs (jpnij),   &
 !!$         &      nimppt_full(jpnij) , jpiall_full(jpnij) , nis0all_full(jpnij) , nie0all_full(jpnij),   &
diff --git a/src/OCE/CRS/crsfld.F90 b/src/OCE/CRS/crsfld.F90
index b8115048..efa11cf5 100644
--- a/src/OCE/CRS/crsfld.F90
+++ b/src/OCE/CRS/crsfld.F90
@@ -211,8 +211,8 @@ CONTAINS
       
       !  sbc fields  
       CALL crs_dom_ope( ssh(:,:,Kmm) , 'VOL', 'T', tmask, sshn_crs , p_e12=e1e2t, p_e3=ze3t           , psgn=1.0_wp )  
-      CALL crs_dom_ope( utau , 'SUM', 'U', umask, utau_crs , p_e12=e2u  , p_surf_crs=e2u_crs  , psgn=1.0_wp )
-      CALL crs_dom_ope( vtau , 'SUM', 'V', vmask, vtau_crs , p_e12=e1v  , p_surf_crs=e1v_crs  , psgn=1.0_wp )
+      CALL crs_dom_ope( utau , 'SUM', 'T', tmask, utau_crs , p_e12=e2t  , p_surf_crs=e2t_crs  , psgn=1.0_wp ) !clem tau: check psgn ??
+      CALL crs_dom_ope( vtau , 'SUM', 'T', tmask, vtau_crs , p_e12=e1t  , p_surf_crs=e1t_crs  , psgn=1.0_wp ) !
       CALL crs_dom_ope( wndm , 'SUM', 'T', tmask, wndm_crs , p_e12=e1e2t, p_surf_crs=e1e2t_crs, psgn=1.0_wp )
       CALL crs_dom_ope( rnf  , 'MAX', 'T', tmask, rnf_crs                                     , psgn=1.0_wp )
       CALL crs_dom_ope( qsr  , 'SUM', 'T', tmask, qsr_crs  , p_e12=e1e2t, p_surf_crs=e1e2t_crs, psgn=1.0_wp )
diff --git a/src/OCE/CRS/crsini.F90 b/src/OCE/CRS/crsini.F90
index f31fad26..a070ef98 100644
--- a/src/OCE/CRS/crsini.F90
+++ b/src/OCE/CRS/crsini.F90
@@ -74,7 +74,7 @@ CONTAINS
       INTEGER  :: ji,jj,jk      ! dummy indices
       INTEGER  :: ierr                                ! allocation error status
       INTEGER  ::   ios                 ! Local integer output status for namelist read
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t, ze3u, ze3v, ze3w
+      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t, ze3u, ze3v, ze3w, zdept0, zdepw0
 
       NAMELIST/namcrs/ nn_factx, nn_facty, nn_binref, ln_msh_crs, nn_crs_kz, ln_crs_wn
       !!----------------------------------------------------------------------
@@ -210,8 +210,12 @@ CONTAINS
      ENDDO
 
      !    3.d.3   Vertical depth (meters)
-     CALL crs_dom_ope( gdept_0, 'MAX', 'T', tmask, gdept_crs, p_e3=ze3t, psgn=1.0_wp ) 
-     CALL crs_dom_ope( gdepw_0, 'MAX', 'W', tmask, gdepw_crs, p_e3=ze3w, psgn=1.0_wp )
+     DO jk = 1, jpk
+        zdept0(:,:,jk) = gdept_0(:,:,jk)
+        zdepw0(:,:,jk) = gdepw_0(:,:,jk)
+     END DO
+     CALL crs_dom_ope( zdept0, 'MAX', 'T', tmask, gdept_crs, p_e3=ze3t, psgn=1.0_wp ) 
+     CALL crs_dom_ope( zdepw0, 'MAX', 'W', tmask, gdepw_crs, p_e3=ze3w, psgn=1.0_wp )
 
 
      !---------------------------------------------------------
diff --git a/src/OCE/DIA/dia25h.F90 b/src/OCE/DIA/dia25h.F90
index 418f54d1..b9bede46 100644
--- a/src/OCE/DIA/dia25h.F90
+++ b/src/OCE/DIA/dia25h.F90
@@ -75,20 +75,20 @@ CONTAINS
       ! 1 - Allocate memory !
       ! ------------------- !
       !                                ! ocean arrays
-      ALLOCATE( tn_25h (A2D(0),jpk), sn_25h (A2D(0),jpk), sshn_25h(A2D(0))  ,     &
-         &      un_25h (A2D(0),jpk), vn_25h (A2D(0),jpk), wn_25h(A2D(0),jpk),     &
-         &      avt_25h(A2D(0),jpk), avm_25h(A2D(0),jpk),                      STAT=ierror )
+      ALLOCATE( tn_25h (T2D(0),jpk), sn_25h (T2D(0),jpk), sshn_25h(T2D(0))  ,     &
+         &      un_25h (T2D(0),jpk), vn_25h (T2D(0),jpk), wn_25h(T2D(0),jpk),     &
+         &      avt_25h(T2D(0),jpk), avm_25h(T2D(0),jpk),                      STAT=ierror )
       IF( ierror > 0 ) THEN
          CALL ctl_stop( 'dia_25h: unable to allocate ocean arrays' )   ;   RETURN
       ENDIF
       IF( ln_zdftke ) THEN             ! TKE physics
-         ALLOCATE( en_25h(A2D(0),jpk), STAT=ierror )
+         ALLOCATE( en_25h(T2D(0),jpk), STAT=ierror )
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'dia_25h: unable to allocate en_25h' )   ;   RETURN
          ENDIF
       ENDIF
       IF( ln_zdfgls ) THEN             ! GLS physics
-         ALLOCATE( en_25h(A2D(0),jpk), rmxln_25h(A2D(0),jpk), STAT=ierror )
+         ALLOCATE( en_25h(T2D(0),jpk), rmxln_25h(T2D(0),jpk), STAT=ierror )
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'dia_25h: unable to allocate en_25h and rmxln_25h' )   ;   RETURN
          ENDIF
@@ -142,9 +142,9 @@ CONTAINS
       LOGICAL ::   ll_print = .FALSE.    ! =T print and flush numout
       REAL(wp)                         ::   zsto, zout, zmax, zjulian, zmdi   ! local scalars
       INTEGER                          ::   i_steps                           ! no of timesteps per hour
-      REAL(wp), DIMENSION(A2D(0)    )  ::   zw2d, un_dm, vn_dm                ! workspace
-      REAL(wp), DIMENSION(A2D(0),jpk)  ::   zw3d                              ! workspace
-      REAL(wp), DIMENSION(A2D(0),3)    ::   zwtmb                             ! workspace
+      REAL(wp), DIMENSION(T2D(0)    )  ::   zw2d, un_dm, vn_dm                ! workspace
+      REAL(wp), DIMENSION(T2D(0),jpk)  ::   zw3d                              ! workspace
+      REAL(wp), DIMENSION(T2D(0),3)    ::   zwtmb                             ! workspace
       !!----------------------------------------------------------------------
 
       ! 0. Initialisation
diff --git a/src/OCE/DIA/diaar5.F90 b/src/OCE/DIA/diaar5.F90
index 82fe74e6..a8eaa2c0 100644
--- a/src/OCE/DIA/diaar5.F90
+++ b/src/OCE/DIA/diaar5.F90
@@ -55,7 +55,7 @@ CONTAINS
       INTEGER :: dia_ar5_alloc
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( thick0(jpi,jpj) , sn0(jpi,jpj,jpk), STAT=dia_ar5_alloc )
+      ALLOCATE( thick0(A2D(0)) , sn0(A2D(0),jpk), STAT=dia_ar5_alloc )
       !
       CALL mpp_sum ( 'diaar5', dia_ar5_alloc )
       IF( dia_ar5_alloc /= 0 )   CALL ctl_stop( 'STOP', 'dia_ar5_alloc: failed to allocate arrays' )
@@ -77,20 +77,22 @@ CONTAINS
       REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass, zsst
       REAL(wp) ::   zaw, zbw, zrw, ztf
       !
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: zarea_ssh , zbotpres       ! 2D workspace
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: z2d, zpe                   ! 2D workspace
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   :: z3d, zrhd, ztpot, zgdept   ! 3D workspace (zgdept: needed to use the substitute)
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ztsn                       ! 4D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:)       :: zarea_ssh   ! 2D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:)       :: z2d         ! 2D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)     :: z3d, zrhd   ! 3D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ztsn        ! 5D workspace
       !!--------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('dia_ar5')
 
       IF( kt == nit000 )     CALL dia_ar5_init
 
       IF( l_ar5 ) THEN
-         ALLOCATE( zarea_ssh(jpi,jpj), zbotpres(jpi,jpj), z2d(jpi,jpj) )
-         ALLOCATE( zrhd(jpi,jpj,jpk) )
-         ALLOCATE( ztsn(jpi,jpj,jpk,jpts) )
-         zarea_ssh(:,:) = e1e2t(:,:) * ssh(:,:,Kmm)
+         ALLOCATE( zarea_ssh(A2D(0)), z2d(A2D(0)), z3d(A2D(0),jpk) )
+         ALLOCATE( zrhd(A2D(0),jpk) )
+         ALLOCATE( ztsn(A2D(0),jpk,jpts,jpt) )
+         zarea_ssh(:,:) = e1e2t(A2D(0)) * ssh(A2D(0),Kmm)
+         ztsn(:,:,:,:,:) = 0._wp
+         zrhd(:,:,:) = 0._wp
       ENDIF
       !
       CALL iom_put( 'e2u'      , e2u  (:,:) )
@@ -98,19 +100,19 @@ CONTAINS
       CALL iom_put( 'areacello', e1e2t(:,:) )
       !
       IF( iom_use( 'volcello' ) .OR. iom_use( 'masscello' )  ) THEN
-         zrhd(:,:,jpk) = 0._wp        ! ocean volume ; rhd is used as workspace
-         DO jk = 1, jpkm1
-            zrhd(:,:,jk) = e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-         END DO
-         DO jk = 1, jpk
-            z3d(:,:,jk) =  rho0 * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-         END DO
-         CALL iom_put( 'volcello'  , zrhd(:,:,:)  )  ! WARNING not consistent with CMIP DR where volcello is at ca. 2000
+         z3d(:,:,jpk) = 0._wp        ! ocean volume ; rhd is used as workspace
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            z3d(ji,jj,jk) = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+         END_3D
+         CALL iom_put( 'volcello'  , z3d(:,:,:)  )  ! WARNING not consistent with CMIP DR where volcello is at ca. 2000
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            z3d(ji,jj,jk) =  rho0 * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+         END_3D
          CALL iom_put( 'masscello' , z3d (:,:,:) )   ! ocean mass
       ENDIF
       !
       IF( iom_use( 'e3tb' ) )  THEN    ! bottom layer thickness
-         DO_2D( 1, 1, 1, 1 )
+         DO_2D( 0, 0, 0, 0 )
             ikb = mbkt(ji,jj)
             z2d(ji,jj) = e3t(ji,jj,ikb,Kmm)
          END_2D
@@ -144,92 +146,88 @@ CONTAINS
 
       IF( iom_use( 'botpres' ) .OR. iom_use( 'sshthster' )  .OR. iom_use( 'sshsteric' )  ) THEN
          !
-         ztsn(:,:,:,jp_tem) = ts(:,:,:,jp_tem,Kmm)                    ! thermosteric ssh
-         ztsn(:,:,:,jp_sal) = sn0(:,:,:)
-         ALLOCATE( zgdept(jpi,jpj,jpk) )
-         DO jk = 1, jpk
-            zgdept(:,:,jk) = gdept(:,:,jk,Kmm)
-         END DO
-         CALL eos( ztsn, zrhd, zgdept)                       ! now in situ density using initial salinity
+         ztsn(:,:,:,jp_tem,Kmm) = ts(A2D(0),:,jp_tem,Kmm)                ! thermosteric ssh
+         ztsn(:,:,:,jp_sal,Kmm) = sn0(:,:,:)
+         CALL eos( ztsn, Kmm, zrhd, kbnd=0 )                           ! now in situ density using initial salinity
          !
-         zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice
-         DO jk = 1, jpkm1
-            zbotpres(:,:) = zbotpres(:,:) + e3t(:,:,jk,Kmm) * zrhd(:,:,jk)
-         END DO
+         z2d(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * zrhd(ji,jj,jk)
+         END_3D
          IF( ln_linssh ) THEN
             IF( ln_isfcav ) THEN
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               DO_2D( 0, 0, 0, 0 )
                   iks = mikt(ji,jj)
-                  zbotpres(ji,jj) = zbotpres(ji,jj) + ssh(ji,jj,Kmm) * zrhd(ji,jj,iks) + riceload(ji,jj)
+                  z2d(ji,jj) = z2d(ji,jj) + ssh(ji,jj,Kmm) * zrhd(ji,jj,iks) + riceload(ji,jj)
                END_2D
             ELSE
-               zbotpres(:,:) = zbotpres(:,:) + ssh(:,:,Kmm) * zrhd(:,:,1)
+               DO_2D( 0, 0, 0, 0 )
+                  z2d(ji,jj) = z2d(ji,jj) + ssh(ji,jj,Kmm) * zrhd(ji,jj,1)
+               END_2D
             END IF
 !!gm
 !!gm   riceload should be added in both ln_linssh=T or F, no?
 !!gm
          END IF
          !
-         zarho = glob_sum( 'diaar5', e1e2t(:,:) * zbotpres(:,:) )
+         zarho = glob_sum( 'diaar5', e1e2t(A2D(0)) * z2d(:,:) )
          zssh_steric = - zarho / area_tot
          CALL iom_put( 'sshthster', zssh_steric )
 
          !                                         ! steric sea surface height
-         zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice
-         DO jk = 1, jpkm1
-            zbotpres(:,:) = zbotpres(:,:) + e3t(:,:,jk,Kmm) * rhd(:,:,jk)
-         END DO
+         z2d(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * rhd(ji,jj,jk)
+         END_3D
          IF( ln_linssh ) THEN
             IF ( ln_isfcav ) THEN
-               DO ji = 1,jpi
-                  DO jj = 1,jpj
-                     iks = mikt(ji,jj)
-                     zbotpres(ji,jj) = zbotpres(ji,jj) + ssh(ji,jj,Kmm) * rhd(ji,jj,iks) + riceload(ji,jj)
-                  END DO
-               END DO
+               DO_2D( 0, 0, 0, 0 )
+                  iks = mikt(ji,jj)
+                  z2d(ji,jj) = z2d(ji,jj) + ssh(ji,jj,Kmm) * rhd(ji,jj,iks) + riceload(ji,jj)
+               END_2D
             ELSE
-               zbotpres(:,:) = zbotpres(:,:) + ssh(:,:,Kmm) * rhd(:,:,1)
+               DO_2D( 0, 0, 0, 0 )
+                  z2d(ji,jj) = z2d(ji,jj) + ssh(ji,jj,Kmm) * rhd(ji,jj,1)
+               END_2D
             END IF
          END IF
          !
-         zarho = glob_sum( 'diaar5', e1e2t(:,:) * zbotpres(:,:) )
+         zarho = glob_sum( 'diaar5', e1e2t(A2D(0)) * z2d(:,:) )
          zssh_steric = - zarho / area_tot
          CALL iom_put( 'sshsteric', zssh_steric )
          !                                         ! ocean bottom pressure
          zztmp = rho0 * grav * 1.e-4_wp               ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa
-         zbotpres(:,:) = zztmp * ( zbotpres(:,:) + ssh(:,:,Kmm) + thick0(:,:) )
-         CALL iom_put( 'botpres', zbotpres )
-         !
-         DEALLOCATE( zgdept )
+         z2d(:,:) = zztmp * ( z2d(:,:) + ssh(A2D(0),Kmm) + thick0(:,:) )
+         CALL iom_put( 'botpres', z2d )
          !
       ENDIF
 
       IF( iom_use( 'masstot' ) .OR. iom_use( 'temptot' )  .OR. iom_use( 'saltot' )  ) THEN
           !                                         ! Mean density anomalie, temperature and salinity
-          ztsn(:,:,:,:) = 0._wp                    ! ztsn(:,:,1,jp_tem/sal) is used here as 2D Workspace for temperature & salinity
-          DO_3D( 1, 1, 1, 1, 1, jpkm1 )
+          ztsn(:,:,:,:,Kmm) = 0._wp                 ! ztsn(:,:,1,jp_tem/sal) is used here as 2D Workspace for temperature & salinity
+          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
              zztmp = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)
-             ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zztmp * ts(ji,jj,jk,jp_tem,Kmm)
-             ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zztmp * ts(ji,jj,jk,jp_sal,Kmm)
+             ztsn(ji,jj,1,jp_tem,Kmm) = ztsn(ji,jj,1,jp_tem,Kmm) + zztmp * ts(ji,jj,jk,jp_tem,Kmm)
+             ztsn(ji,jj,1,jp_sal,Kmm) = ztsn(ji,jj,1,jp_sal,Kmm) + zztmp * ts(ji,jj,jk,jp_sal,Kmm)
           END_3D
 
           IF( ln_linssh ) THEN
             IF( ln_isfcav ) THEN
-               DO ji = 1, jpi
-                  DO jj = 1, jpj
-                     iks = mikt(ji,jj)
-                     ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_tem,Kmm)
-                     ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_sal,Kmm)
-                  END DO
-               END DO
+               DO_2D( 0, 0, 0, 0 )
+                  iks = mikt(ji,jj)
+                  ztsn(ji,jj,1,jp_tem,Kmm) = ztsn(ji,jj,1,jp_tem,Kmm) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_tem,Kmm)
+                  ztsn(ji,jj,1,jp_sal,Kmm) = ztsn(ji,jj,1,jp_sal,Kmm) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_sal,Kmm)
+               END_2D
             ELSE
-               ztsn(:,:,1,jp_tem) = ztsn(:,:,1,jp_tem) + zarea_ssh(:,:) * ts(:,:,1,jp_tem,Kmm)
-               ztsn(:,:,1,jp_sal) = ztsn(:,:,1,jp_sal) + zarea_ssh(:,:) * ts(:,:,1,jp_sal,Kmm)
+               DO_2D( 0, 0, 0, 0 )
+                  ztsn(ji,jj,1,jp_tem,Kmm) = ztsn(ji,jj,1,jp_tem,Kmm) + zarea_ssh(ji,jj) * ts(ji,jj,1,jp_tem,Kmm)
+                  ztsn(ji,jj,1,jp_sal,Kmm) = ztsn(ji,jj,1,jp_sal,Kmm) + zarea_ssh(ji,jj) * ts(ji,jj,1,jp_sal,Kmm)
+               END_2D
             END IF
          ENDIF
          !
-         ztemp = glob_sum( 'diaar5', ztsn(:,:,1,jp_tem) )
-         zsal  = glob_sum( 'diaar5', ztsn(:,:,1,jp_sal) )
+         ztemp = glob_sum( 'diaar5', ztsn(:,:,1,jp_tem,Kmm) )
+         zsal  = glob_sum( 'diaar5', ztsn(:,:,1,jp_sal,Kmm) )
          zmass = rho0 * ( zarho + zvol )
          !
          CALL iom_put( 'masstot', zmass )
@@ -242,37 +240,35 @@ CONTAINS
          IF( iom_use( 'toce_pot') .OR. iom_use( 'temptot_pot' ) .OR. iom_use( 'sst_pot' )  &
                                   .OR. iom_use( 'ssttot' ) .OR.  iom_use( 'tosmint_pot' ) ) THEN
             !
-            ALLOCATE( ztpot(jpi,jpj,jpk) )
-            ztpot(:,:,jpk) = 0._wp
+            z3d(:,:,jpk) = 0._wp
             DO jk = 1, jpkm1
-               ztpot(:,:,jk) = eos_pt_from_ct( ts(:,:,jk,jp_tem,Kmm), ts(:,:,jk,jp_sal,Kmm) )
+               CALL eos_pt_from_ct( ts(:,:,jk,jp_tem,Kmm), ts(:,:,jk,jp_sal,Kmm), z3d(:,:,jk), kbnd=0 )
             END DO
             !
-            CALL iom_put( 'toce_pot', ztpot(:,:,:) )  ! potential temperature (TEOS-10 case)
-            CALL iom_put( 'sst_pot' , ztpot(:,:,1) )  ! surface temperature
+            CALL iom_put( 'toce_pot', z3d(:,:,:) )  ! potential temperature (TEOS-10 case)
+            CALL iom_put( 'sst_pot' , z3d(:,:,1) )  ! surface temperature
             !
             IF( iom_use( 'temptot_pot' ) ) THEN   ! Output potential temperature in case we use TEOS-10
                z2d(:,:) = 0._wp
-               DO jk = 1, jpkm1
-                 z2d(:,:) = z2d(:,:) + e1e2t(:,:) * e3t(:,:,jk,Kmm) * ztpot(:,:,jk)
-               END DO
+               DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+                 z2d(ji,jj) = z2d(ji,jj) + e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * z3d(ji,jj,jk)
+               END_3D
                ztemp = glob_sum( 'diaar5', z2d(:,:)  )
                CALL iom_put( 'temptot_pot', ztemp / zvol )
              ENDIF
              !
              IF( iom_use( 'ssttot' ) ) THEN   ! Output potential temperature in case we use TEOS-10
-               zsst = glob_sum( 'diaar5',  e1e2t(:,:) * ztpot(:,:,1)  )
+               zsst = glob_sum( 'diaar5',  e1e2t(A2D(0)) * z3d(:,:,1)  )
                CALL iom_put( 'ssttot', zsst / area_tot )
              ENDIF
              ! Vertical integral of temperature
              IF( iom_use( 'tosmint_pot') ) THEN
                z2d(:,:) = 0._wp
-               DO_3D( 1, 1, 1, 1, 1, jpkm1 )
-                  z2d(ji,jj) = z2d(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) *  ztpot(ji,jj,jk)
+               DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+                  z2d(ji,jj) = z2d(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) *  z3d(ji,jj,jk)
                END_3D
                CALL iom_put( 'tosmint_pot', z2d )
             ENDIF
-            DEALLOCATE( ztpot )
         ENDIF
       ELSE
          IF( iom_use('ssttot') ) THEN   ! Output sst in case we use EOS-80
@@ -285,33 +281,31 @@ CONTAINS
         ! Work done against stratification by vertical mixing
         ! Exclude points where rn2 is negative as convection kicks in here and
         ! work is not being done against stratification
-         ALLOCATE( zpe(jpi,jpj) )
-         zpe(:,:) = 0._wp
+         z2d(:,:) = 0._wp
          IF( ln_zdfddm ) THEN
-            DO_3D( 1, 1, 1, 1, 2, jpk )
+            DO_3D( 0, 0, 0, 0, 2, jpk )
                IF( rn2(ji,jj,jk) > 0._wp ) THEN
                   zrw = ( gdept(ji,jj,jk,Kmm) - gdepw(ji,jj,jk,Kmm) ) / e3w(ji,jj,jk,Kmm)
                   !
                   zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw
                   zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw
                   !
-                  zpe(ji, jj) = zpe(ji,jj)   &
+                  z2d(ji, jj) = z2d(ji,jj)   &
                      &        -  grav * (  avt(ji,jj,jk) * zaw * (ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) )  &
                      &                   - avs(ji,jj,jk) * zbw * (ts(ji,jj,jk-1,jp_sal,Kmm) - ts(ji,jj,jk,jp_sal,Kmm) ) )
                ENDIF
             END_3D
           ELSE
-            DO_3D( 1, 1, 1, 1, 1, jpk )
-               zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rho0 * e3w(ji,jj,jk,Kmm)
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z2d(ji,jj) = z2d(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rho0 * e3w(ji,jj,jk,Kmm)
             END_3D
          ENDIF
-          CALL iom_put( 'tnpeo', zpe )
-          DEALLOCATE( zpe )
+          CALL iom_put( 'tnpeo', z2d )
       ENDIF
 
       IF( l_ar5 ) THEN
-        DEALLOCATE( zarea_ssh , zbotpres, z2d )
-        DEALLOCATE( ztsn                 )
+        DEALLOCATE( zarea_ssh , z2d, z3d )
+        DEALLOCATE( ztsn )
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('dia_ar5')
@@ -328,37 +322,37 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in )  :: ktra  ! tracer index
       CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in)   :: puflx  ! u-flux of advection/diffusion
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in)   :: pvflx  ! v-flux of advection/diffusion
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk)    , INTENT(in)   :: puflx  ! u-flux of advection/diffusion
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk)    , INTENT(in)   :: pvflx  ! v-flux of advection/diffusion
       !
       INTEGER    ::  ji, jj, jk
-      REAL(wp), DIMENSION(A2D(nn_hls))  :: z2d
+      REAL(wp), DIMENSION(T2D(0))  :: z2d
       !!----------------------------------------------------------------------
 
-      z2d(:,:) = puflx(:,:,1)
+      z2d(:,:) = 0._wp
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          z2d(ji,jj) = z2d(ji,jj) + puflx(ji,jj,jk)
       END_3D
 
       IF( cptr == 'adv' ) THEN
-         IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * z2d(:,:) )  ! advective heat transport in i-direction
-         IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0     * z2d(:,:) )  ! advective salt transport in i-direction
+         IF( ktra == jp_tem )   CALL iom_put( 'uadv_heattr'  , rho0_rcp * z2d(:,:) ) ! advective heat transport in i-direction
+         IF( ktra == jp_sal )   CALL iom_put( 'uadv_salttr'  , rho0     * z2d(:,:) ) ! advective salt transport in i-direction
       ELSE IF( cptr == 'ldf' ) THEN
-         IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in i-direction
-         IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0     * z2d(:,:) ) ! diffusive salt transport in i-direction
+         IF( ktra == jp_tem )   CALL iom_put( 'udiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in i-direction
+         IF( ktra == jp_sal )   CALL iom_put( 'udiff_salttr' , rho0     * z2d(:,:) ) ! diffusive salt transport in i-direction
       ENDIF
       !
-      z2d(:,:) = pvflx(:,:,1)
+      z2d(:,:) = 0._wp
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          z2d(ji,jj) = z2d(ji,jj) + pvflx(ji,jj,jk)
       END_3D
 
       IF( cptr == 'adv' ) THEN
-         IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * z2d(:,:) )  ! advective heat transport in j-direction
-         IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0     * z2d(:,:) )  ! advective salt transport in j-direction
+         IF( ktra == jp_tem )   CALL iom_put( 'vadv_heattr'  , rho0_rcp * z2d(:,:) ) ! advective heat transport in j-direction
+         IF( ktra == jp_sal )   CALL iom_put( 'vadv_salttr'  , rho0     * z2d(:,:) ) ! advective salt transport in j-direction
       ELSE IF( cptr == 'ldf' ) THEN
-         IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in j-direction
-         IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0     * z2d(:,:) ) ! diffusive salt transport in j-direction
+         IF( ktra == jp_tem )   CALL iom_put( 'vdiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in j-direction
+         IF( ktra == jp_sal )   CALL iom_put( 'vdiff_salttr' , rho0     * z2d(:,:) ) ! diffusive salt transport in j-direction
       ENDIF
 
    END SUBROUTINE dia_ar5_hst
@@ -396,10 +390,10 @@ CONTAINS
 
          area_tot  = glob_sum( 'diaar5', e1e2t(:,:) )
 
-         ALLOCATE( zvol0(jpi,jpj) )
+         ALLOCATE( zvol0(A2D(0)) )
          zvol0 (:,:) = 0._wp
          thick0(:,:) = 0._wp
-         DO_3D( 1, 1, 1, 1, 1, jpkm1 )   ! interpolation of salinity at the last ocean level (i.e. the partial step)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! interpolation of salinity at the last ocean level (i.e. the partial step)
             zztmp = tmask(ji,jj,jk) * e3t_0(ji,jj,jk)
             zvol0 (ji,jj) = zvol0 (ji,jj) + zztmp * e1e2t(ji,jj)
             thick0(ji,jj) = thick0(ji,jj) + zztmp
@@ -408,16 +402,16 @@ CONTAINS
          DEALLOCATE( zvol0 )
 
          IF( iom_use( 'sshthster' ) ) THEN
-            ALLOCATE( zsaldta(jpi,jpj,jpk,jpts) )
+            ALLOCATE( zsaldta(A2D(0),jpk,jpts) )
             CALL iom_open ( 'sali_ref_clim_monthly', inum )
             CALL iom_get  ( inum, jpdom_global, 'vosaline' , zsaldta(:,:,:,1), 1  )
             CALL iom_get  ( inum, jpdom_global, 'vosaline' , zsaldta(:,:,:,2), 12 )
             CALL iom_close( inum )
 
             sn0(:,:,:) = 0.5_wp * ( zsaldta(:,:,:,1) + zsaldta(:,:,:,2) )
-            sn0(:,:,:) = sn0(:,:,:) * tmask(:,:,:)
-            IF( ln_zps ) THEN               ! z-coord. partial steps
-               DO_2D( 1, 1, 1, 1 )          ! interpolation of salinity at the last ocean level (i.e. the partial step)
+            sn0(:,:,:) = sn0(:,:,:) * tmask(A2D(0),:)
+            IF( l_zps ) THEN                ! z-coord. partial steps
+               DO_2D( 0, 0, 0, 0 )          ! interpolation of salinity at the last ocean level (i.e. the partial step)
                   ik = mbkt(ji,jj)
                   IF( ik > 1 ) THEN
                      zztmp = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
diff --git a/src/OCE/DIA/diacfl.F90 b/src/OCE/DIA/diacfl.F90
index e35764b3..6ce29566 100644
--- a/src/OCE/DIA/diacfl.F90
+++ b/src/OCE/DIA/diacfl.F90
@@ -11,7 +11,6 @@ MODULE diacfl
    !!----------------------------------------------------------------------
    USE oce             ! ocean dynamics and active tracers
    USE dom_oce         ! ocean space and time domain
-   USE domvvl          ! 
    !
    USE lib_mpp         ! distribued memory computing
    USE lbclnk          ! ocean lateral boundary condition (or mpp link)
@@ -51,19 +50,19 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt   ! ocean time-step index
       INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
       !
-      INTEGER                          ::   ji, jj, jk                       ! dummy loop indices
-      REAL(wp)                         ::   zCu_max, zCv_max, zCw_max        ! local scalars
-      INTEGER , DIMENSION(3)           ::   iloc_u , iloc_v , iloc_w , iloc  ! workspace
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zCu_cfl, zCv_cfl, zCw_cfl        ! workspace
-      LOGICAL , DIMENSION(jpi,jpj,jpk) ::   llmsk
+      INTEGER                         ::   ji, jj, jk                       ! dummy loop indices
+      REAL(wp)                        ::   zCu_max, zCv_max, zCw_max        ! local scalars
+      INTEGER , DIMENSION(3)          ::   iloc_u , iloc_v , iloc_w , iloc  ! workspace
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   zCu_cfl, zCv_cfl, zCw_cfl        ! workspace
+      LOGICAL , DIMENSION(A2D(0),jpk) ::   llmsk
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dia_cfl')
       !
-      llmsk(     1:nn_hls,:,:) = .FALSE.   ! exclude halos from the checked region
-      llmsk(Nie0+1:   jpi,:,:) = .FALSE.
-      llmsk(:,     1:nn_hls,:) = .FALSE.
-      llmsk(:,Nje0+1:   jpj,:) = .FALSE.
+      !llmsk(     1:nn_hls,:,:) = .FALSE.   ! exclude halos from the checked region
+      !llmsk(Nie0+1:   jpi,:,:) = .FALSE.
+      !llmsk(:,     1:nn_hls,:) = .FALSE.
+      !llmsk(:,Nje0+1:   jpj,:) = .FALSE.
       !
       DO_3D( 0, 0, 0, 0, 1, jpk )      ! calculate Courant numbers
          zCu_cfl(ji,jj,jk) = ABS( uu(ji,jj,jk,Kmm) ) * rDt / e1u  (ji,jj)      ! for i-direction
diff --git a/src/OCE/DIA/diadct.F90 b/src/OCE/DIA/diadct.F90
index 4fa5479f..31c991cf 100644
--- a/src/OCE/DIA/diadct.F90
+++ b/src/OCE/DIA/diadct.F90
@@ -32,7 +32,6 @@ MODULE diadct
 #if defined key_si3
    USE ice
 #endif
-   USE domvvl
    USE timing          ! preformance summary
 
    IMPLICIT NONE
@@ -414,9 +413,9 @@ CONTAINS
               !verify if the point is on the local domain:(1,Nie0)*(1,Nje0)
               IF( iiloc >= 1 .AND. iiloc <= Nie0 .AND. &
                   ijloc >= 1 .AND. ijloc <= Nje0       )THEN
-                 iptloc = iptloc + 1                                                 ! count local points
-                 secs(jsec)%listPoint(iptloc) = POINT_SECTION(mi0(iiglo),mj0(ijglo)) ! store local coordinates
-                 secs(jsec)%direction(iptloc) = directemp(jpt)                       ! store local direction
+                 iptloc = iptloc + 1                                                               ! count local points
+                 secs(jsec)%listPoint(iptloc) = POINT_SECTION(mi0(iiglo,nn_hls),mj0(ijglo,nn_hls)) ! store local coordinates
+                 secs(jsec)%direction(iptloc) = directemp(jpt)                                     ! store local direction
               ENDIF
               !
            END DO
@@ -1198,7 +1197,7 @@ CONTAINS
 
   ENDIF
 
-  IF( ln_sco )THEN   ! s-coordinate case
+  IF( l_sco )THEN   ! s-coordinate case
 
      zdepu = ( gdept(ii1,ij1,kk,Kmm) +  gdept(ii2,ij2,kk,Kmm) ) * 0.5_wp 
      zdep1 = gdept(ii1,ij1,kk,Kmm) - zdepu
diff --git a/src/OCE/DIA/diadetide.F90 b/src/OCE/DIA/diadetide.F90
index 9d676003..0669a852 100644
--- a/src/OCE/DIA/diadetide.F90
+++ b/src/OCE/DIA/diadetide.F90
@@ -5,11 +5,11 @@ MODULE diadetide
    !!======================================================================
    !! History :       !  2019  (S. Mueller)
    !!----------------------------------------------------------------------
-   USE par_oce        , ONLY :   wp, jpi, jpj
-   USE in_out_manager , ONLY :   lwp, numout
-   USE iom            , ONLY :   iom_put
-   USE dom_oce        , ONLY :   rn_Dt, nsec_day
-   USE phycst         , ONLY :   rpi
+   USE par_oce        
+   USE in_out_manager 
+   USE iom            
+   USE dom_oce        
+   USE phycst        
    USE tide_mod
 #if defined key_xios
    USE xios
@@ -24,6 +24,8 @@ MODULE diadetide
 
    PUBLIC ::   dia_detide_init, dia_detide
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2019)
    !! $Id$
@@ -90,9 +92,9 @@ CONTAINS
       !!----------------------------------------------------------------------
 
       INTEGER, INTENT(in)          ::   kt
-      REAL(wp), DIMENSION(jpi,jpj) ::   zwght_2D
+      REAL(wp), DIMENSION(T2D(0))  ::   zwght_2D
       REAL(wp)                     ::   zwght, ztmp
-      INTEGER                      ::   jn
+      INTEGER                      ::   ji, jj, jn
 
       ! Compute detiding weight at the current time-step; the daily total weight
       ! is one, and the daily summation of a diagnosed field multiplied by this
@@ -104,7 +106,10 @@ CONTAINS
             zwght = zwght + 1.0_wp / REAL( ndiadetide, KIND=wp )
          END IF
       END DO
-      zwght_2D(:,:) = zwght
+ 
+      DO_2D( 0, 0, 0, 0 )
+         zwght_2D(ji,jj) = zwght
+      END_2D
       CALL iom_put( "diadetide_weight", zwght_2D)
 
    END SUBROUTINE dia_detide
diff --git a/src/OCE/DIA/diahsb.F90 b/src/OCE/DIA/diahsb.F90
index f9307c0a..6ce30b21 100644
--- a/src/OCE/DIA/diahsb.F90
+++ b/src/OCE/DIA/diahsb.F90
@@ -18,7 +18,6 @@ MODULE diahsb
    USE sbc_oce        ! surface thermohaline fluxes
    USE isf_oce        ! ice shelf fluxes
    USE sbcrnf         ! river runoff
-   USE domvvl         ! vertical scale factors
    USE traqsr         ! penetrative solar radiation
    USE trabbc         ! bottom boundary condition
    USE trabbc         ! bottom boundary condition
@@ -50,6 +49,7 @@ MODULE diahsb
    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   tmask_ini
 
    !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -82,42 +82,73 @@ CONTAINS
       REAL(wp)   ::   z_frc_trd_v                 !    -     -
       REAL(wp)   ::   z_wn_trd_t , z_wn_trd_s     !    -     -
       REAL(wp)   ::   z_ssh_hc , z_ssh_sc         !    -     -
-      REAL(wp), DIMENSION(jpi,jpj,13)      ::   ztmp
-      REAL(wp), DIMENSION(jpi,jpj,jpkm1,4) ::   ztmpk
-      REAL(wp), DIMENSION(17)              ::   zbg          
+      REAL(wp), DIMENSION(A2D(0),13)      ::   ztmp
+      REAL(wp), DIMENSION(A2D(0),jpkm1,4) ::   ztmpk
+      REAL(wp), DIMENSION(17)             ::   zbg
       !!---------------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('dia_hsb')
       !
-      ztmp (:,:,:)   = 0._wp ! should be better coded
-      ztmpk(:,:,:,:) = 0._wp ! should be better coded
-      !
-      ts(:,:,:,1,Kmm) = ts(:,:,:,1,Kmm) * tmask(:,:,:) ; ts(:,:,:,1,Kbb) = ts(:,:,:,1,Kbb) * tmask(:,:,:) ;
-      ts(:,:,:,2,Kmm) = ts(:,:,:,2,Kmm) * tmask(:,:,:) ; ts(:,:,:,2,Kbb) = ts(:,:,:,2,Kbb) * tmask(:,:,:) ;
+      DO_2D( 0, 0, 0, 0 )
+         ztmp (ji,jj,:)   = 0._wp ! should be better coded
+         ztmpk(ji,jj,:,:) = 0._wp ! should be better coded
+         !
+         ts(ji,jj,:,1,Kmm) = ts(ji,jj,:,1,Kmm) * tmask(ji,jj,:)
+         ts(ji,jj,:,1,Kbb) = ts(ji,jj,:,1,Kbb) * tmask(ji,jj,:)
+         !
+         ts(ji,jj,:,2,Kmm) = ts(ji,jj,:,2,Kmm) * tmask(ji,jj,:)
+         ts(ji,jj,:,2,Kbb) = ts(ji,jj,:,2,Kbb) * tmask(ji,jj,:)
+      END_2D
       !
       ! ------------------------- !
       ! 1 - Trends due to forcing !
       ! ------------------------- !
       ! prepare trends
-      ztmp(:,:,1)  = - r1_rho0 * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) * surf(:,:)    ! volume
-      ztmp(:,:,2)  =   sbc_tsc(:,:,jp_tem) * surf(:,:)                                                      ! heat
-      ztmp(:,:,3)  =   sbc_tsc(:,:,jp_sal) * surf(:,:)                                                      ! salt
-      IF( ln_rnf     )    ztmp(:,:,4) =   rnf_tsc(:,:,jp_tem) * surf(:,:)                                   ! runoff temp
-      IF( ln_rnf_sal )    ztmp(:,:,5) =   rnf_tsc(:,:,jp_sal) * surf(:,:)                                   ! runoff salt
-      IF( ln_isf     )    ztmp(:,:,6) = ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ! isf temp
-      IF( ln_traqsr  )    ztmp(:,:,7) =   r1_rho0_rcp * qsr(:,:) * surf(:,:)                                ! penetrative solar radiation
-      IF( ln_trabbc  )    ztmp(:,:,8) =   qgh_trd0(:,:) * surf(:,:)                                         ! geothermal heat
+      DO_2D( 0, 0, 0, 0 )
+         ztmp(ji,jj,1)  = - r1_rho0 * (   emp(ji,jj)        &                         ! volume
+             &                          - rnf(ji,jj)        &
+             &                          - fwfisf_cav(ji,jj) &
+             &                          - fwfisf_par(ji,jj) ) * surf(ji,jj)
+         ztmp(ji,jj,2)  =   sbc_tsc(ji,jj,jp_tem) * surf(ji,jj)                       ! heat
+         ztmp(ji,jj,3)  =   sbc_tsc(ji,jj,jp_sal) * surf(ji,jj)                       ! salt
+      END_2D
+      IF( ln_rnf     ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj,4) = rnf_tsc(ji,jj,jp_tem) * surf(ji,jj)    ! runoff temp
+         END_2D
+      END IF
+      IF( ln_rnf_sal ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj,5) = rnf_tsc(ji,jj,jp_sal) * surf(ji,jj)    ! runoff salt
+         END_2D
+      END IF
+      IF( ln_isf     ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj,6) = (   risf_cav_tsc(ji,jj,jp_tem) &
+                &             + risf_par_tsc(ji,jj,jp_tem) ) * surf(ji,jj) ! isf temp
+         END_2D
+      END IF
+      IF( ln_traqsr  ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj,7) = r1_rho0_rcp * qsr(ji,jj) * surf(ji,jj) ! penetrative solar radiation
+         END_2D
+      END IF
+      IF( ln_trabbc  ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj,8) = qgh_trd0(ji,jj) * surf(ji,jj)             ! geothermal heat
+         END_2D
+      END IF
       !
       IF( ln_linssh ) THEN   ! Advection flux through fixed surface (z=0)
          IF( ln_isfcav ) THEN
-            DO ji=1,jpi
-               DO jj=1,jpj
-                  ztmp(ji,jj,9 ) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb)
-                  ztmp(ji,jj,10) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb)
-               END DO
-            END DO
+            DO_2D( 0, 0, 0, 0 )
+               ztmp(ji,jj,9 ) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb)
+               ztmp(ji,jj,10) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb)
+            END_2D
          ELSE
-            ztmp(:,:,9 ) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb)
-            ztmp(:,:,10) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb)
+            DO_2D( 0, 0, 0, 0 )
+               ztmp(ji,jj,9 ) = - surf(ji,jj) * ww(ji,jj,1) * ts(ji,jj,1,jp_tem,Kbb)
+               ztmp(ji,jj,10) = - surf(ji,jj) * ww(ji,jj,1) * ts(ji,jj,1,jp_sal,Kbb)
+            END_2D
          END IF
       ENDIF
       
@@ -152,20 +183,22 @@ CONTAINS
       ! glob_sum is needed because you keep only the interior domain to compute the sum (iscpl)
       !
       !                    ! volume variation (calculated with ssh)
-      ztmp(:,:,11) = surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:)
+      DO_2D( 0, 0, 0, 0 )
+         ztmp(ji,jj,11) = surf(ji,jj)*ssh(ji,jj,Kmm) - surf_ini(ji,jj)*ssh_ini(ji,jj)
+      END_2D
 
       !                    ! heat & salt content variation (associated with ssh)
       IF( ln_linssh ) THEN       ! linear free surface case
          IF( ln_isfcav ) THEN          ! ISF case
-            DO ji = 1, jpi
-               DO jj = 1, jpj
-                  ztmp(ji,jj,12) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) )
-                  ztmp(ji,jj,13) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) )
-               END DO
-            END DO
+            DO_2D( 0, 0, 0, 0 )
+               ztmp(ji,jj,12) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) )
+               ztmp(ji,jj,13) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) )
+            END_2D
          ELSE                          ! no under ice-shelf seas
-            ztmp(:,:,12) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) )
-            ztmp(:,:,13) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) )
+            DO_2D( 0, 0, 0, 0 )
+               ztmp(ji,jj,12) = surf(ji,jj) * ( ts(ji,jj,1,jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) )
+               ztmp(ji,jj,13) = surf(ji,jj) * ( ts(ji,jj,1,jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) )
+            END_2D
          END IF
       ENDIF
 
@@ -185,19 +218,27 @@ CONTAINS
       ! glob_sum is needed because you keep only the interior domain to compute the sum (iscpl)
       !
       DO jk = 1, jpkm1           ! volume
-         ztmpk(:,:,jk,1) =   surf    (:,:) * e3t(:,:,jk,Kmm)*tmask(:,:,jk)   &
-            &              - surf_ini(:,:) * e3t_ini(:,:,jk    )*tmask_ini(:,:,jk)
+         DO_2D( 0, 0, 0, 0 )
+            ztmpk(ji,jj,jk,1) =   surf    (ji,jj) * e3t(ji,jj,jk,Kmm)*tmask(ji,jj,jk)   &
+               &                - surf_ini(ji,jj) * e3t_ini(ji,jj,jk    )*tmask_ini(ji,jj,jk)
+         END_2D
       END DO
       DO jk = 1, jpkm1           ! heat
-         ztmpk(:,:,jk,2) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm)   &
-            &              - surf_ini(:,:) *         hc_loc_ini(:,:,jk) )
+         DO_2D( 0, 0, 0, 0 )
+            ztmpk(ji,jj,jk,2) = ( surf    (ji,jj) * e3t(ji,jj,jk,Kmm)*ts(ji,jj,jk,jp_tem,Kmm)   &
+               &                - surf_ini(ji,jj) *         hc_loc_ini(ji,jj,jk) )
+         END_2D
       END DO
       DO jk = 1, jpkm1           ! salt
-         ztmpk(:,:,jk,3) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm)   &
-            &              - surf_ini(:,:) *         sc_loc_ini(:,:,jk) )
+         DO_2D( 0, 0, 0, 0 )
+            ztmpk(ji,jj,jk,3) = ( surf    (ji,jj) * e3t(ji,jj,jk,Kmm)*ts(ji,jj,jk,jp_sal,Kmm)   &
+               &                - surf_ini(ji,jj) *         sc_loc_ini(ji,jj,jk) )
+         END_2D
       END DO
       DO jk = 1, jpkm1           ! total ocean volume
-         ztmpk(:,:,jk,4) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
+         DO_2D( 0, 0, 0, 0 )
+            ztmpk(ji,jj,jk,4) = surf(ji,jj) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+         END_2D
       END DO
       
       ! global sum
@@ -315,32 +356,34 @@ CONTAINS
             IF(lwp) WRITE(numout,*)
             IF(lwp) WRITE(numout,*) '   dia_hsb_rst : initialise hsb at initial state '
             IF(lwp) WRITE(numout,*)
-            surf_ini(:,:) = e1e2t(:,:) * tmask_i(:,:)         ! initial ocean surface
-            ssh_ini(:,:) = ssh(:,:,Kmm)                          ! initial ssh
-            DO jk = 1, jpk
-              ! if ice sheet/oceqn coupling, need to mask ini variables here (mask could change at the next NEMO instance).
-               e3t_ini   (:,:,jk) = e3t(:,:,jk,Kmm)                      * tmask(:,:,jk)  ! initial vertical scale factors
-               tmask_ini (:,:,jk) = tmask(:,:,jk)                                       ! initial mask
-               hc_loc_ini(:,:,jk) = ts(:,:,jk,jp_tem,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)  ! initial heat content
-               sc_loc_ini(:,:,jk) = ts(:,:,jk,jp_sal,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)  ! initial salt content
-            END DO
+            DO_2D( 0, 0, 0, 0 )
+               surf_ini(ji,jj) = e1e2t(ji,jj) * tmask_i(ji,jj)         ! initial ocean surface
+               ssh_ini(ji,jj) = ssh(ji,jj,Kmm)                          ! initial ssh
+            END_2D
+            ! if ice sheet/oceqn coupling, need to mask ini variables here (mask could change at the next NEMO instance).
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               e3t_ini   (ji,jj,jk) = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)  ! initial vertical scale factors
+               tmask_ini (ji,jj,jk) = tmask(ji,jj,jk)                      ! initial mask
+               hc_loc_ini(ji,jj,jk) = ts(ji,jj,jk,jp_tem,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)  ! initial heat content
+               sc_loc_ini(ji,jj,jk) = ts(ji,jj,jk,jp_sal,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)  ! initial salt content
+            END_3D
             frc_v = 0._wp                                           ! volume       trend due to forcing
             frc_t = 0._wp                                           ! heat content   -    -   -    -
             frc_s = 0._wp                                           ! salt content   -    -   -    -
             IF( ln_linssh ) THEN
                IF( ln_isfcav ) THEN
-                  DO ji = 1, jpi
-                     DO jj = 1, jpj
-                        ssh_hc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm)   ! initial heat content in ssh
-                        ssh_sc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm)   ! initial salt content in ssh
-                     END DO
-                   END DO
-                ELSE
-                  ssh_hc_loc_ini(:,:) = ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm)   ! initial heat content in ssh
-                  ssh_sc_loc_ini(:,:) = ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm)   ! initial salt content in ssh
+                  DO_2D( 0, 0, 0, 0 )
+                     ssh_hc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm)   ! initial heat content in ssh
+                     ssh_sc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm)   ! initial salt content in ssh
+                  END_2D
+               ELSE
+                  DO_2D( 0, 0, 0, 0 )
+                     ssh_hc_loc_ini(ji,jj) = ts(ji,jj,1,jp_tem,Kmm) * ssh(ji,jj,Kmm)   ! initial heat content in ssh
+                     ssh_sc_loc_ini(ji,jj) = ts(ji,jj,1,jp_sal,Kmm) * ssh(ji,jj,Kmm)   ! initial salt content in ssh
+                  END_2D
                END IF
-               frc_wn_t = 0._wp                                       ! initial heat content misfit due to free surface
-               frc_wn_s = 0._wp                                       ! initial salt content misfit due to free surface
+               frc_wn_t = 0._wp    ! initial heat content misfit due to free surface
+               frc_wn_s = 0._wp    ! initial salt content misfit due to free surface
             ENDIF
          ENDIF
          !
@@ -388,6 +431,7 @@ CONTAINS
       INTEGER, INTENT(in) :: Kmm ! time level index
       !
       INTEGER ::   ierror, ios   ! local integer
+      INTEGER ::   ji, jj        ! loop index
       !!
       NAMELIST/namhsb/ ln_diahsb
       !!----------------------------------------------------------------------
@@ -413,13 +457,13 @@ CONTAINS
       ! ------------------- !
       ! 1 - Allocate memory !
       ! ------------------- !
-      ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), surf_ini(jpi,jpj), &
-         &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), tmask_ini(jpi,jpj,jpk),STAT=ierror  )
+      ALLOCATE( hc_loc_ini(A2D(0),jpk), sc_loc_ini(A2D(0),jpk), surf_ini(A2D(0)), &
+         &      e3t_ini(A2D(0),jpk), surf(A2D(0)),  ssh_ini(A2D(0)), tmask_ini(A2D(0),jpk),STAT=ierror  )
       IF( ierror > 0 ) THEN
          CALL ctl_stop( 'dia_hsb_init: unable to allocate hc_loc_ini' )   ;   RETURN
       ENDIF
 
-      IF( ln_linssh )   ALLOCATE( ssh_hc_loc_ini(jpi,jpj), ssh_sc_loc_ini(jpi,jpj),STAT=ierror )
+      IF( ln_linssh )   ALLOCATE( ssh_hc_loc_ini(A2D(0)), ssh_sc_loc_ini(A2D(0)),STAT=ierror )
       IF( ierror > 0 ) THEN
          CALL ctl_stop( 'dia_hsb: unable to allocate ssh_hc_loc_ini' )   ;   RETURN
       ENDIF
@@ -427,7 +471,10 @@ CONTAINS
       ! ----------------------------------------------- !
       ! 2 - Time independant variables and file opening !
       ! ----------------------------------------------- !
-      surf(:,:) = e1e2t(:,:) * tmask_i(:,:)               ! masked surface grid cell area
+ 
+      DO_2D( 0, 0, 0, 0 )
+         surf(ji,jj) = e1e2t(ji,jj) * smask0_i(ji,jj)               ! masked surface grid cell area
+      END_2D
       surf_tot  = glob_sum( 'diahsb', surf(:,:) )         ! total ocean surface area
 
       IF( ln_bdy ) CALL ctl_warn( 'dia_hsb_init: heat/salt budget does not consider open boundary fluxes' )
diff --git a/src/OCE/DIA/diahth.F90 b/src/OCE/DIA/diahth.F90
index 0b8650ac..a20b476a 100644
--- a/src/OCE/DIA/diahth.F90
+++ b/src/OCE/DIA/diahth.F90
@@ -54,8 +54,8 @@ CONTAINS
       INTEGER :: dia_hth_alloc
       !!---------------------------------------------------------------------
       !
-      ALLOCATE( hth(jpi,jpj), hd20(jpi,jpj), hd26(jpi,jpj), hd28(jpi,jpj), &
-         &      htc3(jpi,jpj), htc7(jpi,jpj), htc20(jpi,jpj), STAT=dia_hth_alloc )
+      ALLOCATE( hth(A2D(0)), hd20(A2D(0)), hd26(A2D(0)), hd28(A2D(0)), &
+         &      htc3(A2D(0)), htc7(A2D(0)), htc20(A2D(0)), STAT=dia_hth_alloc )
       !
       CALL mpp_sum ( 'diahth', dia_hth_alloc )
       IF(dia_hth_alloc /= 0)   CALL ctl_stop( 'STOP', 'dia_hth_alloc: failed to allocate arrays.' )
@@ -86,22 +86,22 @@ CONTAINS
       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
       INTEGER, INTENT( in ) ::   Kmm     ! ocean time level index
       !!
-      INTEGER                      ::   ji, jj, jk            ! dummy loop arguments
-      REAL(wp)                     ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth
-      REAL(wp)                     ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth
-      REAL(wp)                     ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth
-      REAL(wp)                     ::   zztmp, zzdep          ! temporary scalars inside do loop
-      REAL(wp)                     ::   zu, zv, zw, zut, zvt  ! temporary workspace
-      REAL(wp), DIMENSION(jpi,jpj) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2 
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2     
-      REAL(wp), DIMENSION(jpi,jpj) ::   zrho10_3   ! MLD: rho = rho10m + zrho3      
-      REAL(wp), DIMENSION(jpi,jpj) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztinv      ! max of temperature inversion
-      REAL(wp), DIMENSION(jpi,jpj) ::   zdepinv    ! depth of temperature inversion
-      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03
-      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01
-      REAL(wp), DIMENSION(jpi,jpj) ::   zmaxdzT    ! max of dT/dz
-      REAL(wp), DIMENSION(jpi,jpj) ::   zdelr      ! delta rho equivalent to deltaT = 0.2
+      INTEGER                     ::   ji, jj, jk            ! dummy loop arguments
+      REAL(wp)                    ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth
+      REAL(wp)                    ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth
+      REAL(wp)                    ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth
+      REAL(wp)                    ::   zztmp, zzdep          ! temporary scalars inside do loop
+      REAL(wp)                    ::   zu, zv, zw, zut, zvt  ! temporary workspace
+      REAL(wp), DIMENSION(A2D(0)) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2
+      REAL(wp), DIMENSION(A2D(0)) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2
+      REAL(wp), DIMENSION(A2D(0)) ::   zrho10_3   ! MLD: rho = rho10m + zrho3
+      REAL(wp), DIMENSION(A2D(0)) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)
+      REAL(wp), DIMENSION(A2D(0)) ::   ztinv      ! max of temperature inversion
+      REAL(wp), DIMENSION(A2D(0)) ::   zdepinv    ! depth of temperature inversion
+      REAL(wp), DIMENSION(A2D(0)) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03
+      REAL(wp), DIMENSION(A2D(0)) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01
+      REAL(wp), DIMENSION(A2D(0)) ::   zmaxdzT    ! max of dT/dz
+      REAL(wp), DIMENSION(A2D(0)) ::   zdelr      ! delta rho equivalent to deltaT = 0.2
       !!----------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('dia_hth')
 
@@ -131,7 +131,7 @@ CONTAINS
          IF( iom_use( 'mlddzt' ) )   zmaxdzT(:,:) = 0._wp  
          IF( iom_use( 'mlddzt' ) .OR. iom_use( 'mld_dt02' ) .OR. iom_use( 'topthdep' )   &
             &                    .OR. iom_use( 'mldr10_3' ) .OR. iom_use( 'pycndep'  ) ) THEN
-            DO_2D( 1, 1, 1, 1 )
+            DO_2D( 0, 0, 0, 0 )
                zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) 
                hth     (ji,jj) = zztmp
                zabs2   (ji,jj) = zztmp
@@ -142,7 +142,7 @@ CONTAINS
          ENDIF
          IF( iom_use( 'mldr0_3' ) .OR. iom_use( 'mldr0_1' ) ) THEN
             IF( nla10 > 1 ) THEN 
-               DO_2D( 1, 1, 1, 1 )
+               DO_2D( 0, 0, 0, 0 )
                   zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) 
                   zrho0_3(ji,jj) = zztmp
                   zrho0_1(ji,jj) = zztmp
@@ -157,7 +157,7 @@ CONTAINS
             ! MLD: rho = rho(1) + zrho3                                     !
             ! MLD: rho = rho(1) + zrho1                                     !
             ! ------------------------------------------------------------- !
-            DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 )   ! loop from bottom to 2
+            DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )   ! loop from bottom to 2
                !
                zzdep = gdepw(ji,jj,jk,Kmm)
                zztmp = ( ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) ) &
@@ -189,7 +189,7 @@ CONTAINS
             !
             ! Preliminary computation
             ! computation of zdelr = (dr/dT)(T,S,10m)*(-0.2 degC)
-            DO_2D( 1, 1, 1, 1 )
+            DO_2D( 0, 0, 0, 0 )
                IF( tmask(ji,jj,nla10) == 1. ) THEN
                   zu  =  1779.50 + 11.250 * ts(ji,jj,nla10,jp_tem,Kmm) - 3.80   * ts(ji,jj,nla10,jp_sal,Kmm)  &
                      &           - 0.0745 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm)   &
@@ -213,7 +213,7 @@ CONTAINS
             ! temperature inversion: max( 0, max of tn - tn(10m) )          !
             ! depth of temperature inversion                                !
             ! ------------------------------------------------------------- !
-            DO_3DS( 1, 1, 1, 1, jpkm1, nlb10, -1 )   ! loop from bottom to nlb10
+            DO_3DS( 0, 0, 0, 0, jpkm1, nlb10, -1 )   ! loop from bottom to nlb10
                !
                zzdep = gdepw(ji,jj,jk,Kmm) * tmask(ji,jj,1)
                !
@@ -301,17 +301,20 @@ CONTAINS
       !
       INTEGER , INTENT(in) :: Kmm      ! ocean time level index
       REAL(wp), INTENT(in) :: ptem
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pdept     
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pdept     
       !
       INTEGER  :: ji, jj, jk, iid
       REAL(wp) :: zztmp, zzdep
-      INTEGER, DIMENSION(jpi,jpj) :: iktem
+      INTEGER, DIMENSION(A2D(0)) :: iktem
       
       ! --------------------------------------- !
       ! search deepest level above ptem         !
       ! --------------------------------------- !
-      iktem(:,:) = 1
-      DO_3D( 1, 1, 1, 1, 1, jpkm1 )   ! beware temperature is not always decreasing with depth => loop from top to bottom
+      DO_2D( 0, 0, 0, 0 )
+         iktem(ji,jj) = 1
+      END_2D
+
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! beware temperature is not always decreasing with depth => loop from top to bottom
          zztmp = ts(ji,jj,jk,jp_tem,Kmm)
          IF( zztmp >= ptem )   iktem(ji,jj) = jk
       END_3D
@@ -319,7 +322,7 @@ CONTAINS
       ! ------------------------------- !
       !  Depth of ptem isotherm         !
       ! ------------------------------- !
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          !
          zzdep = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)       ! depth of the ocean bottom
          !
@@ -343,21 +346,32 @@ CONTAINS
       INTEGER , INTENT(in) ::   Kmm      ! ocean time level index
       REAL(wp), INTENT(in) ::   pdep     ! depth over the heat content
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)    ::   pt   
-      REAL(wp), DIMENSION(jpi,jpj),     INTENT(inout) ::   phtc  
+      REAL(wp), DIMENSION(A2D(0)),      INTENT(inout) ::   phtc  
       !
       INTEGER  ::   ji, jj, jk, ik
-      REAL(wp), DIMENSION(jpi,jpj) ::   zthick
-      INTEGER , DIMENSION(jpi,jpj) ::   ilevel
+      REAL(wp), DIMENSION(A2D(0)) ::   zthick
+      INTEGER , DIMENSION(A2D(0)) ::   ilevel
 
 
       ! surface boundary condition
       
-      IF( .NOT. ln_linssh ) THEN   ;   zthick(:,:) = 0._wp          ;   phtc(:,:) = 0._wp                                   
-      ELSE                         ;   zthick(:,:) = ssh(:,:,Kmm)   ;   phtc(:,:) = pt(:,:,1) * ssh(:,:,Kmm) * tmask(:,:,1)   
+      IF( .NOT. ln_linssh ) THEN 
+         DO_2D( 0, 0, 0, 0 )
+            zthick(ji,jj) = 0._wp 
+            phtc  (ji,jj) = 0._wp                                   
+         END_2D
+      ELSE                
+         DO_2D( 0, 0, 0, 0 )
+            zthick(ji,jj) = ssh(ji,jj,Kmm)   
+            phtc  (ji,jj) = pt(ji,jj,1) * ssh(ji,jj,Kmm) * tmask(ji,jj,1)   
+         END_2D
       ENDIF
       !
-      ilevel(:,:) = 1
-      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
+      DO_2D( 0, 0, 0, 0 )
+         ilevel(ji,jj) = 1
+      END_2D
+      !
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          IF( ( gdepw(ji,jj,jk+1,Kmm) < pdep ) .AND. ( tmask(ji,jj,jk) == 1 ) ) THEN
              ilevel(ji,jj) = jk+1
              zthick(ji,jj) = zthick(ji,jj) + e3t(ji,jj,jk,Kmm)
@@ -365,7 +379,7 @@ CONTAINS
          ENDIF
       END_3D
       !
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          ik = ilevel(ji,jj)
          IF( tmask(ji,jj,ik) == 1 ) THEN
             zthick(ji,jj) = MIN ( gdepw(ji,jj,ik+1,Kmm), pdep ) - zthick(ji,jj)   ! remaining thickness to reach dephw pdep
diff --git a/src/OCE/DIA/diamlr.F90 b/src/OCE/DIA/diamlr.F90
index edd8e19f..728e964a 100644
--- a/src/OCE/DIA/diamlr.F90
+++ b/src/OCE/DIA/diamlr.F90
@@ -6,7 +6,7 @@ MODULE diamlr
    !! History :  4.0  !  2019  (S. Mueller)   Original code
    !!----------------------------------------------------------------------
 
-   USE par_oce        , ONLY :   wp, jpi, jpj
+   USE par_oce        , ONLY :   wp, jpi, jpj, ntsi, ntei, ntsj, ntej 
    USE phycst         , ONLY :   rpi
    USE dom_oce        , ONLY :   adatrj
    USE tide_mod
@@ -407,8 +407,9 @@ CONTAINS
       !! ** Purpose : update time used in multiple-linear-regression analysis
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) ::   zadatrj2d
+      REAL(wp), DIMENSION(T2D(0)) ::   zadatrj2d
       !!----------------------------------------------------------------------
+      INTEGER ::   ji, jj
 
       IF( ln_timing )   CALL timing_start('dia_mlr')
 
@@ -417,7 +418,9 @@ CONTAINS
       !
       ! A 2-dimensional field of constant value is sent, and subsequently used directly 
       ! or transformed to a scalar or a constant 3-dimensional field as required.
-      zadatrj2d(:,:) = adatrj*86400.0_wp
+      DO_2D( 0, 0, 0, 0 )
+         zadatrj2d(ji,jj) = adatrj*86400.0_wp
+      END_2D
       IF ( iom_use('diamlr_time') ) CALL iom_put('diamlr_time', zadatrj2d)
       !
       IF( ln_timing )   CALL timing_stop('dia_mlr')
diff --git a/src/OCE/DIA/diaptr.F90 b/src/OCE/DIA/diaptr.F90
index 8962bd37..e04e88fe 100644
--- a/src/OCE/DIA/diaptr.F90
+++ b/src/OCE/DIA/diaptr.F90
@@ -76,9 +76,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE dia_ptr  ***
       !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in)           ::   kt     ! ocean time-step index
-      INTEGER                         , INTENT(in)           ::   Kmm    ! time level index
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport
+      INTEGER                              , INTENT(in)           ::   kt     ! ocean time-step index
+      INTEGER                              , INTENT(in)           ::   Kmm    ! time level index
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) , INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dia_ptr')
@@ -110,13 +110,13 @@ CONTAINS
       !!----------------------------------------------------------------------
       !! ** Purpose : Calculate diagnostics and send to XIOS
       !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in)           ::   kt     ! ocean time-step index
-      INTEGER                         , INTENT(in)           ::   Kmm    ! time level index
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport
+      INTEGER                   , INTENT(in)           ::   kt     ! ocean time-step index
+      INTEGER                   , INTENT(in)           ::   Kmm    ! time level index
+      REAL(wp), DIMENSION(:,:,:), INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport (used only by PRESENT)
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace
-      REAL(wp), DIMENSION(jpj)      ::  zvsum, ztsum, zssum   ! 1D workspace
+      REAL(wp), DIMENSION(A2D(0))   ::  z2d                   ! 2D workspace
+      REAL(wp), DIMENSION(A1Dj(0))  ::  zvsum, ztsum, zssum   ! 1D workspace
       !
       !overturning calculation
       REAL(wp), DIMENSION(:,:,:  ), ALLOCATABLE ::   sjk, r1_sjk, v_msf  ! i-mean i-k-surface and its inverse
@@ -126,19 +126,19 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:  ), ALLOCATABLE ::   z3dtr
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( z3dtr(jpi,jpj,nbasin) )
+      ALLOCATE( z3dtr(A2D(0),nbasin) )
 
       IF( PRESENT( pvtr ) ) THEN
          IF( iom_use( 'zomsf' ) ) THEN    ! effective MSF
-            ALLOCATE( z4d1(jpi,jpj,jpk,nbasin) )
+            ALLOCATE( z4d1(A2D(0),jpk,nbasin) )
             !
             DO jn = 1, nbasin                                    ! by sub-basins
-               z4d1(1,:,:,jn) =  pvtr_int(:,:,jp_vtr,jn)                  ! zonal cumulative effective transport excluding closed seas
+               z4d1(Nis0,:,:,jn) =  pvtr_int(:,:,jp_vtr,jn)                  ! zonal cumulative effective transport excluding closed seas
                DO jk = jpkm1, 1, -1
-                  z4d1(1,:,jk,jn) = z4d1(1,:,jk+1,jn) - z4d1(1,:,jk,jn)    ! effective j-Stream-Function (MSF)
+                  z4d1(Nis0,:,jk,jn) = z4d1(Nis0,:,jk+1,jn) - z4d1(Nis0,:,jk,jn)    ! effective j-Stream-Function (MSF)
                END DO
-               DO ji = 2, jpi
-                  z4d1(ji,:,:,jn) = z4d1(1,:,:,jn)
+               DO ji = Nis0+1, Nie0
+                  z4d1(ji,:,:,jn) = z4d1(Nis0,:,:,jn)
                ENDDO
             END DO
             CALL iom_put( 'zomsf', z4d1 * rc_sv )
@@ -146,8 +146,8 @@ CONTAINS
             DEALLOCATE( z4d1 )
          ENDIF
          IF( iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) ) THEN
-            ALLOCATE( sjk(jpj,jpk,nbasin), r1_sjk(jpj,jpk,nbasin), v_msf(jpj,jpk,nbasin),   &
-               &      zt_jk(jpj,jpk,nbasin), zs_jk(jpj,jpk,nbasin) )
+            ALLOCATE( sjk(  A1Dj(0),jpk,nbasin), r1_sjk(A1Dj(0),jpk,nbasin), v_msf(A1Dj(0),jpk,nbasin),   &
+               &      zt_jk(A1Dj(0),jpk,nbasin), zs_jk( A1Dj(0),jpk,nbasin) )
             !
             DO jn = 1, nbasin
                sjk(:,:,jn) = pvtr_int(:,:,jp_msk,jn)
@@ -162,16 +162,16 @@ CONTAINS
                !
             ENDDO
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_ove(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_ove(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sophtove', z3dtr )
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_ove(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_ove(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopstove', z3dtr )
@@ -181,7 +181,7 @@ CONTAINS
 
          IF( iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) ) THEN
             ! Calculate barotropic heat and salt transport here
-            ALLOCATE( sjk(jpj,1,nbasin), r1_sjk(jpj,1,nbasin) )
+            ALLOCATE( sjk(A1Dj(0),1,nbasin), r1_sjk(A1Dj(0),1,nbasin) )
             !
             DO jn = 1, nbasin
                sjk(:,1,jn) = SUM( pvtr_int(:,:,jp_msk,jn), 2 )
@@ -196,16 +196,16 @@ CONTAINS
                !
             ENDDO
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_btr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_btr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sophtbtr', z3dtr )
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_btr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_btr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopstbtr', z3dtr )
@@ -218,28 +218,28 @@ CONTAINS
          pvtr_int(:,:,:,:) = 0._wp
       ELSE
          IF( iom_use( 'zotem' ) .OR. iom_use( 'zosal' ) .OR. iom_use( 'zosrf' )  ) THEN    ! i-mean i-k-surface
-            ALLOCATE( z4d1(jpi,jpj,jpk,nbasin), z4d2(jpi,jpj,jpk,nbasin) )
+            ALLOCATE( z4d1(A2D(0),jpk,nbasin), z4d2(A2D(0),jpk,nbasin) )
             !
             DO jn = 1, nbasin
-               z4d1(1,:,:,jn) = pzon_int(:,:,jp_msk,jn)
-               DO ji = 2, jpi
-                  z4d1(ji,:,:,jn) = z4d1(1,:,:,jn)
+               z4d1(Nis0,:,:,jn) = pzon_int(:,:,jp_msk,jn)
+               DO ji = Nis0+1, Nie0
+                  z4d1(ji,:,:,jn) = z4d1(Nis0,:,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'zosrf', z4d1 )
             !
             DO jn = 1, nbasin
-               z4d2(1,:,:,jn) = pzon_int(:,:,jp_tem,jn) / MAX( z4d1(1,:,:,jn), 10.e-15 )
-               DO ji = 2, jpi
-                  z4d2(ji,:,:,jn) = z4d2(1,:,:,jn)
+               z4d2(Nis0,:,:,jn) = pzon_int(:,:,jp_tem,jn) / MAX( z4d1(Nis0,:,:,jn), 10.e-15 )
+               DO ji = Nis0+1, Nie0
+                  z4d2(ji,:,:,jn) = z4d2(Nis0,:,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'zotem', z4d2 )
             !
             DO jn = 1, nbasin
-               z4d2(1,:,:,jn) = pzon_int(:,:,jp_sal,jn) / MAX( z4d1(1,:,:,jn), 10.e-15 )
-               DO ji = 2, jpi
-                  z4d2(ji,:,:,jn) = z4d2(1,:,:,jn)
+               z4d2(Nis0,:,:,jn) = pzon_int(:,:,jp_sal,jn) / MAX( z4d1(Nis0,:,:,jn), 10.e-15 )
+               DO ji = Nis0+1, Nie0
+                  z4d2(ji,:,:,jn) = z4d2(Nis0,:,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'zosal', z4d2 )
@@ -251,16 +251,16 @@ CONTAINS
          IF( iom_use( 'sophtadv' ) .OR. iom_use( 'sopstadv' ) ) THEN
             !
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_adv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_adv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sophtadv', z3dtr )
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_adv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_adv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopstadv', z3dtr )
@@ -269,16 +269,16 @@ CONTAINS
          IF( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) THEN
             !
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_ldf(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_ldf(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sophtldf', z3dtr )
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_ldf(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_ldf(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopstldf', z3dtr )
@@ -287,16 +287,16 @@ CONTAINS
          IF( iom_use( 'sophteiv' ) .OR. iom_use( 'sopsteiv' ) ) THEN
             !
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_eiv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_eiv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sophteiv', z3dtr )
             DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_eiv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_eiv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopsteiv', z3dtr )
@@ -304,16 +304,16 @@ CONTAINS
          !
          IF( iom_use( 'sopstvtr' ) .OR. iom_use( 'sophtvtr' ) ) THEN
              DO jn = 1, nbasin
-                z3dtr(1,:,jn) = hstr_vtr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
-                DO ji = 2, jpi
-                   z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+                z3dtr(Nis0,:,jn) = hstr_vtr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW)
+                DO ji = Nis0+1, Nie0
+                   z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                 ENDDO
              ENDDO
              CALL iom_put( 'sophtvtr', z3dtr )
              DO jn = 1, nbasin
-               z3dtr(1,:,jn) = hstr_vtr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
-               DO ji = 2, jpi
-                  z3dtr(ji,:,jn) = z3dtr(1,:,jn)
+               z3dtr(Nis0,:,jn) = hstr_vtr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg)
+               DO ji = Nis0+1, Nie0
+                  z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn)
                ENDDO
             ENDDO
             CALL iom_put( 'sopstvtr', z3dtr )
@@ -349,8 +349,9 @@ CONTAINS
       !! ** Action  : pvtr_int - terms for volume streamfunction, heat/salt transport barotropic/overturning terms
       !!              pzon_int - terms for i mean temperature/salinity
       !!----------------------------------------------------------------------
-      INTEGER                     , INTENT(in)           :: Kmm          ! time level index
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in), OPTIONAL :: pvtr         ! j-effective transport
+      INTEGER                             , INTENT(in)           :: Kmm  ! time level index
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in), OPTIONAL :: pvtr ! j-effective transport
+      !
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE            :: zmask        ! 3D workspace
       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE          :: zts          ! 4D workspace
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE            :: sjk, v_msf   ! Zonal sum: i-k surface area, j-effective transport
@@ -362,7 +363,7 @@ CONTAINS
       IF( PRESENT( pvtr ) ) THEN
          ! i sum of effective j transport excluding closed seas
          IF( iom_use( 'zomsf' ) .OR. iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) ) THEN
-            ALLOCATE( v_msf(A1Dj(nn_hls),jpk,nbasin) )
+            ALLOCATE( v_msf(T1Dj(0),jpk,nbasin) )
 
             DO jn = 1, nbasin
                v_msf(:,:,jn) = ptr_sjk( pvtr(:,:,:), btmsk34(:,:,jn) )
@@ -374,16 +375,13 @@ CONTAINS
          ENDIF
 
          ! i sum of j surface area, j surface area - temperature/salinity product on V grid
-         IF(  iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) .OR.   &
+         IF(  iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) .OR.          &
             & iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) ) THEN
-            ALLOCATE( zmask(A2D(nn_hls),jpk), zts(A2D(nn_hls),jpk,jpts), &
-               &      sjk(A1Dj(nn_hls),jpk,nbasin), &
-               &      zt_jk(A1Dj(nn_hls),jpk,nbasin), zs_jk(A1Dj(nn_hls),jpk,nbasin) )
-
-            zmask(:,:,:) = 0._wp
-            zts(:,:,:,:) = 0._wp
+            ALLOCATE( zmask( T2D(0),jpk       ), zts(   T2D(0),jpk,jpts  ),  &
+               &      sjk(  T1Dj(0),jpk,nbasin),                             &
+               &      zt_jk(T1Dj(0),jpk,nbasin), zs_jk(T1Dj(0),jpk,nbasin) )
 
-            DO_3D( 1, 1, 1, 0, 1, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
                zvfc = e1v(ji,jj) * e3v(ji,jj,jk,Kmm)
                zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc
                zts(ji,jj,jk,jp_tem) = (ts(ji,jj,jk,jp_tem,Kmm)+ts(ji,jj+1,jk,jp_tem,Kmm)) * 0.5 * zvfc !Tracers averaged onto V grid
@@ -405,14 +403,11 @@ CONTAINS
       ELSE
          ! i sum of j surface area - temperature/salinity product on T grid
          IF( iom_use( 'zotem' ) .OR. iom_use( 'zosal' ) .OR. iom_use( 'zosrf' )  ) THEN
-            ALLOCATE( zmask(A2D(nn_hls),jpk), zts(A2D(nn_hls),jpk,jpts), &
-               &      sjk(A1Dj(nn_hls),jpk,nbasin), &
-               &      zt_jk(A1Dj(nn_hls),jpk,nbasin), zs_jk(A1Dj(nn_hls),jpk,nbasin) )
-
-            zmask(:,:,:) = 0._wp
-            zts(:,:,:,:) = 0._wp
+            ALLOCATE( zmask( T2D(0),jpk       ), zts(   T2D(0),jpk,jpts  ),   &
+               &      sjk(  T1Dj(0),jpk,nbasin),                              &
+               &      zt_jk(T1Dj(0),jpk,nbasin), zs_jk(T1Dj(0),jpk,nbasin) )
 
-            DO_3D( 1, 1, 1, 1, 1, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
                zsfc = e1t(ji,jj) * e3t(ji,jj,jk,Kmm)
                zmask(ji,jj,jk)      = tmask(ji,jj,jk)      * zsfc
                zts(ji,jj,jk,jp_tem) = ts(ji,jj,jk,jp_tem,Kmm) * zsfc
@@ -434,11 +429,9 @@ CONTAINS
 
          ! i-k sum of j surface area - temperature/salinity product on V grid
          IF( iom_use( 'sopstvtr' ) .OR. iom_use( 'sophtvtr' ) ) THEN
-            ALLOCATE( zts(A2D(nn_hls),jpk,jpts) )
+            ALLOCATE( zts(T2D(0),jpk,jpts) )
 
-            zts(:,:,:,:) = 0._wp
-
-            DO_3D( 1, 1, 1, 0, 1, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
                zvfc = e1v(ji,jj) * e3v(ji,jj,jk,Kmm)
                zts(ji,jj,jk,jp_tem) = (ts(ji,jj,jk,jp_tem,Kmm)+ts(ji,jj+1,jk,jp_tem,Kmm)) * 0.5 * zvfc  !Tracers averaged onto V grid
                zts(ji,jj,jk,jp_sal) = (ts(ji,jj,jk,jp_sal,Kmm)+ts(ji,jj+1,jk,jp_sal,Kmm)) * 0.5 * zvfc
@@ -532,17 +525,28 @@ CONTAINS
 
 
    SUBROUTINE dia_ptr_hst( ktra, cptr, pvflx )
+      !!
+      INTEGER,                    INTENT(in)  ::  ktra  ! tracer index
+      CHARACTER(len=3),           INTENT(in)  ::  cptr  ! transport type  'adv'/'ldf'/'eiv'
+      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::  pvflx ! 3D input array of advection/diffusion
+      !!
+      CALL dia_ptr_hst_t( ktra, cptr, pvflx(:,:,:), lbnd_ij(pvflx) )
+   END SUBROUTINE dia_ptr_hst
+
+
+   SUBROUTINE dia_ptr_hst_t( ktra, cptr, pvflx, ktvflx )
       !!----------------------------------------------------------------------
       !!                    ***  ROUTINE dia_ptr_hst ***
       !!----------------------------------------------------------------------
       !! Wrapper for heat and salt transport calculations to calculate them for each basin
       !! Called from all advection and/or diffusion routines
       !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in )  :: ktra  ! tracer index
-      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'/'eiv'
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in)   :: pvflx ! 3D input array of advection/diffusion
-      REAL(wp), DIMENSION(A1Dj(nn_hls),nbasin)                 :: zsj   !
-      INTEGER                                        :: jn    !
+      INTEGER,  DIMENSION(2),                INTENT(in)  ::  ktvflx
+      INTEGER,                               INTENT(in)  ::  ktra  ! tracer index
+      CHARACTER(len=3),                      INTENT(in)  ::  cptr  ! transport type  'adv'/'ldf'/'eiv'
+      REAL(wp), DIMENSION(AB2D(ktvflx),JPK), INTENT(in)  ::  pvflx ! 3D input array of advection/diffusion
+      REAL(wp), DIMENSION(T1Dj(0),nbasin)                ::  zsj   !
+      INTEGER                                            ::  jn    !
 
       DO jn = 1, nbasin
          zsj(:,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) )
@@ -562,7 +566,7 @@ CONTAINS
          IF( ktra == jp_sal )  CALL ptr_sum( hstr_vtr(:,jp_sal,:), zsj(:,:) )
       ENDIF
       !
-   END SUBROUTINE dia_ptr_hst
+   END SUBROUTINE dia_ptr_hst_t
 
 
    SUBROUTINE ptr_sum_2d( phstr, pva )
@@ -576,26 +580,28 @@ CONTAINS
       !!
       !! ** Action  : phstr
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpj,nbasin) , INTENT(inout)         ::  phstr  !
-      REAL(wp), DIMENSION(A1Dj(nn_hls),nbasin), INTENT(in)            ::  pva    !
-      INTEGER                                               ::  jj
+      REAL(wp), DIMENSION(A1Dj(0),nbasin), INTENT(inout)  ::  phstr  !
+      REAL(wp), DIMENSION(T1Dj(0),nbasin), INTENT(in   )  ::  pva    !
+      INTEGER                                             ::  jj
 #if ! defined key_mpi_off
-      INTEGER, DIMENSION(1)           ::  ish1d
-      INTEGER, DIMENSION(2)           ::  ish2d
-      REAL(wp), DIMENSION(jpj*nbasin) ::  zwork
+      INTEGER,  DIMENSION(1)               ::  ish1d
+      INTEGER,  DIMENSION(2)               ::  ish2d
+      REAL(wp), DIMENSION(:), ALLOCATABLE  ::  zwork
 #endif
 
-      DO jj = ntsj, ntej
+      DO_1Dj( 0, 0 )
          phstr(jj,:) = phstr(jj,:)  + pva(jj,:)
-      END DO
+      END_1D
 
 #if ! defined key_mpi_off
       IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
-         ish1d(1) = jpj*nbasin
-         ish2d(1) = jpj ; ish2d(2) = nbasin
+         ALLOCATE( zwork(Nj_0*nbasin) )
+         ish1d(1) = Nj_0*nbasin
+         ish2d(1) = Nj_0 ; ish2d(2) = nbasin
          zwork(:) = RESHAPE( phstr(:,:), ish1d )
          CALL mpp_sum( 'diaptr', zwork, ish1d(1), ncomm_znl )
          phstr(:,:) = RESHAPE( zwork, ish2d )
+         DEALLOCATE( zwork )
       ENDIF
 #endif
    END SUBROUTINE ptr_sum_2d
@@ -612,28 +618,30 @@ CONTAINS
       !!
       !! ** Action  : phstr
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpj,jpk,nbasin) , INTENT(inout)     ::  phstr  !
-      REAL(wp), DIMENSION(A1Dj(nn_hls),jpk,nbasin), INTENT(in)        ::  pva    !
-      INTEGER                                               ::  jj, jk
+      REAL(wp), DIMENSION(Njs0:Nje0,jpk,nbasin), INTENT(inout)   ::  phstr  !
+      REAL(wp), DIMENSION(T1Dj(0)  ,jpk,nbasin), INTENT(in   )   ::  pva    !
+      INTEGER                                                    ::  jj, jk
 #if ! defined key_mpi_off
-      INTEGER, DIMENSION(1)              ::  ish1d
-      INTEGER, DIMENSION(3)              ::  ish3d
-      REAL(wp), DIMENSION(jpj*jpk*nbasin)  ::  zwork
+      INTEGER,  DIMENSION(1)               ::  ish1d
+      INTEGER,  DIMENSION(3)               ::  ish3d
+      REAL(wp), DIMENSION(:), ALLOCATABLE  ::  zwork
 #endif
 
       DO jk = 1, jpk
-         DO jj = ntsj, ntej
+         DO_1Dj( 0, 0 )
             phstr(jj,jk,:) = phstr(jj,jk,:)  + pva(jj,jk,:)
-         END DO
+         END_1D
       END DO
 
 #if ! defined key_mpi_off
       IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
-         ish1d(1) = jpj*jpk*nbasin
-         ish3d(1) = jpj ; ish3d(2) = jpk ; ish3d(3) = nbasin
+         ALLOCATE( zwork(Nj_0*jpk*nbasin) )
+         ish1d(1) = Nj_0*jpk*nbasin
+         ish3d(1) = Nj_0 ; ish3d(2) = jpk ; ish3d(3) = nbasin
          zwork(:) = RESHAPE( phstr(:,:,:), ish1d )
          CALL mpp_sum( 'diaptr', zwork, ish1d(1), ncomm_znl )
          phstr(:,:,:) = RESHAPE( zwork, ish3d )
+         DEALLOCATE( zwork )
       ENDIF
 #endif
    END SUBROUTINE ptr_sum_3d
@@ -651,13 +659,13 @@ CONTAINS
       ! nbasin has been initialized in iom_init to define the axis "basin"
       !
       IF( .NOT. ALLOCATED( btmsk ) ) THEN
-         ALLOCATE( btmsk(jpi,jpj,nbasin)    , btmsk34(jpi,jpj,nbasin),   &
-            &      hstr_adv(jpj,jpts,nbasin), hstr_eiv(jpj,jpts,nbasin), &
-            &      hstr_ove(jpj,jpts,nbasin), hstr_btr(jpj,jpts,nbasin), &
-            &      hstr_ldf(jpj,jpts,nbasin), hstr_vtr(jpj,jpts,nbasin), STAT=ierr(1)  )
+         ALLOCATE( btmsk(A2D(nn_hls),nbasin)    , btmsk34(A2D(nn_hls),nbasin)  , &
+            &      hstr_adv(A1Dj(0),jpts,nbasin), hstr_eiv(A1Dj(0),jpts,nbasin), &
+            &      hstr_ove(A1Dj(0),jpts,nbasin), hstr_btr(A1Dj(0),jpts,nbasin), &
+            &      hstr_ldf(A1Dj(0),jpts,nbasin), hstr_vtr(A1Dj(0),jpts,nbasin), STAT=ierr(1)  )
             !
-         ALLOCATE( pvtr_int(jpj,jpk,jpts+2,nbasin), &
-            &      pzon_int(jpj,jpk,jpts+1,nbasin), STAT=ierr(2) )
+         ALLOCATE( pvtr_int(A1Dj(0),jpk,jpts+2,nbasin), &
+            &      pzon_int(A1Dj(0),jpk,jpts+1,nbasin), STAT=ierr(2) )
          !
          dia_ptr_alloc = MAXVAL( ierr )
          CALL mpp_sum( 'diaptr', dia_ptr_alloc )
@@ -667,6 +675,17 @@ CONTAINS
 
 
    FUNCTION ptr_sj_3d( pvflx, pmsk )   RESULT ( p_fval )
+      !!
+      REAL(wp), INTENT(in), DIMENSION(:,:,:)       ::  pvflx  ! mask flux array at V-point
+      REAL(wp), INTENT(in), DIMENSION(A2D(nn_hls)) ::  pmsk   ! Optional 2D basin mask
+      !
+      REAL(wp), DIMENSION(T1Dj(0)) :: p_fval              ! i-k-mean poleward flux of pvflx
+      !!
+      CALL ptr_sj_3d_t( pvflx(:,:,:), lbnd_ij(pvflx), pmsk(:,:), p_fval(:) )
+   END FUNCTION ptr_sj_3d
+
+
+   SUBROUTINE ptr_sj_3d_t( pvflx, ktvflx, pmsk, p_fval )
       !!----------------------------------------------------------------------
       !!                    ***  ROUTINE ptr_sj_3d  ***
       !!
@@ -677,21 +696,33 @@ CONTAINS
       !!
       !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx
       !!----------------------------------------------------------------------
-      REAL(wp), INTENT(in), DIMENSION(A2D(nn_hls),jpk)  ::   pvflx  ! mask flux array at V-point
-      REAL(wp), INTENT(in), DIMENSION(jpi,jpj)  ::   pmsk   ! Optional 2D basin mask
+      INTEGER,  INTENT(in   ), DIMENSION(2)                 ::   ktvflx
+      REAL(wp), INTENT(in   ), DIMENSION(AB2D(ktvflx),JPK)  ::   pvflx  ! mask flux array at V-point
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(nn_hls))       ::   pmsk   ! Optional 2D basin mask
+      REAL(wp), INTENT(  out), DIMENSION(T1Dj(0))           ::   p_fval ! i-k-mean poleward flux of pvflx
       !
-      INTEGER                  ::   ji, jj, jk   ! dummy loop arguments
-      REAL(wp), DIMENSION(A1Dj(nn_hls)) :: p_fval  ! function value
+      INTEGER :: ji, jj, jk  ! dummy loop arguments
       !!--------------------------------------------------------------------
       !
       p_fval(:) = 0._wp
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          p_fval(jj) = p_fval(jj) + pvflx(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj)
       END_3D
-   END FUNCTION ptr_sj_3d
+   END SUBROUTINE ptr_sj_3d_t
 
 
    FUNCTION ptr_sj_2d( pvflx, pmsk )   RESULT ( p_fval )
+      !!
+      REAL(wp), INTENT(in), DIMENSION(:,:)         ::  pvflx  ! mask flux array at V-point
+      REAL(wp), INTENT(in), DIMENSION(A2D(nn_hls)) ::  pmsk   ! Optional 2D basin mask
+      !
+      REAL(wp), DIMENSION(T1Dj(0)) :: p_fval              ! i-k-mean poleward flux of pvflx
+      !!
+      CALL ptr_sj_2d_t( pvflx(:,:), lbnd_ij(pvflx), pmsk(:,:), p_fval(:) )
+   END FUNCTION ptr_sj_2d
+
+
+   SUBROUTINE ptr_sj_2d_t( pvflx, ktvflx, pmsk, p_fval )
       !!----------------------------------------------------------------------
       !!                    ***  ROUTINE ptr_sj_2d  ***
       !!
@@ -702,18 +733,20 @@ CONTAINS
       !!
       !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx
       !!----------------------------------------------------------------------
-      REAL(wp) , INTENT(in), DIMENSION(A2D(nn_hls))     ::   pvflx  ! mask flux array at V-point
-      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask
+      INTEGER,  INTENT(in   ), DIMENSION(2)             ::   ktvflx
+      REAL(wp), INTENT(in   ), DIMENSION(AB2D(ktvflx))  ::   pvflx  ! mask flux array at V-point
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(nn_hls))   ::   pmsk   ! Optional 2D basin mask
+      REAL(wp), INTENT(  out), DIMENSION(T1Dj(0))       ::   p_fval ! i-k-mean poleward flux of pvflx
       !
-      INTEGER                  ::   ji,jj       ! dummy loop arguments
-      REAL(wp), DIMENSION(A1Dj(nn_hls)) :: p_fval ! function value
+      INTEGER :: ji, jj  ! dummy loop arguments
       !!--------------------------------------------------------------------
       !
       p_fval(:) = 0._wp
       DO_2D( 0, 0, 0, 0 )
          p_fval(jj) = p_fval(jj) + pvflx(ji,jj) * pmsk(ji,jj) * tmask_i(ji,jj)
       END_2D
-   END FUNCTION ptr_sj_2d
+   END SUBROUTINE ptr_sj_2d_t
+
 
    FUNCTION ptr_ci_2d( pva )   RESULT ( p_fval )
       !!----------------------------------------------------------------------
@@ -725,14 +758,13 @@ CONTAINS
       !!
       !! ** Action  : - p_fval: j-cumulated sum of pva
       !!----------------------------------------------------------------------
-      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)  ::   pva   ! mask flux array at V-point
+      REAL(wp) , INTENT(in), DIMENSION(T2D(0))  ::   pva   ! mask flux array at V-point
       !
-      INTEGER                  ::   ji,jj,jc       ! dummy loop arguments
-      INTEGER                  ::   ijpj        ! ???
-      REAL(wp), DIMENSION(jpi,jpj) :: p_fval ! function value
+      INTEGER                     ::   ji,jj,jc  ! dummy loop arguments
+      INTEGER                     ::   ijpj      ! ???
+      REAL(wp), DIMENSION(T2D(0)) :: p_fval      ! function value
       !!--------------------------------------------------------------------
       !
-      ijpj = jpj  ! ???
       p_fval(:,:) = 0._wp
       DO jc = 1, jpnj ! looping over all processors in j axis
          DO_2D( 0, 0, 0, 0 )
@@ -743,8 +775,18 @@ CONTAINS
    END FUNCTION ptr_ci_2d
 
 
-
    FUNCTION ptr_sjk( pta, pmsk )   RESULT ( p_fval )
+      !!
+      REAL(wp) , INTENT(in), DIMENSION(:,:,:)       ::   pta    ! mask flux array at V-point
+      REAL(wp) , INTENT(in), DIMENSION(A2D(nn_hls)) ::   pmsk   ! Optional 2D basin mask
+      !
+      REAL(wp), DIMENSION(T1Dj(0),jpk) :: p_fval            ! i-sum of masked field
+      !!
+      CALL ptr_sjk_t( pta(:,:,:), lbnd_ij(pta), pmsk(:,:), p_fval(:,:) )
+   END FUNCTION ptr_sjk
+
+
+   SUBROUTINE ptr_sjk_t( pta, ktta, pmsk, p_fval )
       !!----------------------------------------------------------------------
       !!                    ***  ROUTINE ptr_sjk  ***
       !!
@@ -754,13 +796,12 @@ CONTAINS
       !!
       !! ** Action  : - p_fval: i-sum of masked field
       !!----------------------------------------------------------------------
-      !!
-      IMPLICIT none
-      REAL(wp) , INTENT(in), DIMENSION(A2D(nn_hls),jpk) ::   pta    ! mask flux array at V-point
-      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask
-      !!
-      INTEGER                           :: ji, jj, jk ! dummy loop arguments
-      REAL(wp), DIMENSION(A1Dj(nn_hls),jpk) :: p_fval     ! return function value
+      INTEGER,  INTENT(in   ), DIMENSION(2)              ::   ktta
+      REAL(wp), INTENT(in   ), DIMENSION(AB2D(ktta),JPK) ::   pta    ! mask flux array at V-point
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(nn_hls))    ::   pmsk   ! Optional 2D basin mask
+      REAL(wp), INTENT(  out), DIMENSION(T1Dj(0),jpk)    ::   p_fval ! i-sum of masked field
+      !
+      INTEGER :: ji, jj, jk  ! dummy loop arguments
       !!--------------------------------------------------------------------
       !
       p_fval(:,:) = 0._wp
@@ -768,7 +809,7 @@ CONTAINS
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj)
       END_3D
-   END FUNCTION ptr_sjk
+   END SUBROUTINE ptr_sjk_t
 
 
    !!======================================================================
diff --git a/src/OCE/DIA/diawri.F90 b/src/OCE/DIA/diawri.F90
index db5da93a..48ab63b5 100644
--- a/src/OCE/DIA/diawri.F90
+++ b/src/OCE/DIA/diawri.F90
@@ -122,8 +122,9 @@ CONTAINS
       REAL(wp)::   zztmp , zztmpx   ! local scalar
       REAL(wp)::   zztmp2, zztmpy   !   -      -
       REAL(wp)::   ze3
-      REAL(wp), DIMENSION(A2D(     0))     ::   z2d   ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   z3d   ! 3D workspace
+      REAL(wp), DIMENSION(A2D(0))          ::   z2d0   ! 2D workspace
+      REAL(wp), DIMENSION(A2D(0)     ,jpk) ::   z3d0   ! 3D workspace
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   z3d    ! 3D workspace
       !!----------------------------------------------------------------------
       ! 
       IF( ln_timing )   CALL timing_start('dia_wri')
@@ -135,58 +136,81 @@ CONTAINS
       ENDIF
 
       ! initialize arrays
-      z2d(:,:)   = 0._wp
-      z3d(:,:,:) = 0._wp
+      z2d0(:,:)   = 0._wp
+      z3d0(:,:,:) = 0._wp
+      z3d (:,:,:) = 0._wp
       
       ! Output of initial vertical scale factor
-      CALL iom_put("e3t_0", e3t_0(:,:,:) )
-      CALL iom_put("e3u_0", e3u_0(:,:,:) )
-      CALL iom_put("e3v_0", e3v_0(:,:,:) )
-      CALL iom_put("e3f_0", e3f_0(:,:,:) )
+      IF( lk_vco_3d ) THEN
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3t_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3t_0", z3d )
+            !
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3u_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3u_0", z3d )
+            !
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3v_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3v_0", z3d )
+            !
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3f_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3f_0", z3d )
+         ELSE
+            CALL iom_put( "e3t_0", e3t_0(:,:,:) )
+            CALL iom_put( "e3u_0", e3u_0(:,:,:) )
+            CALL iom_put( "e3v_0", e3v_0(:,:,:) )
+            CALL iom_put( "e3f_0", e3f_0(:,:,:) )
+      ENDIF
       !
       IF ( iom_use("tpt_dep") ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = gdept(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) = gdept(ji,jj,jk,Kmm)
          END_3D
-         CALL iom_put( "tpt_dep", z3d )
+         CALL iom_put( "tpt_dep", z3d0 )
       ENDIF
 
       ! --- vertical scale factors --- !
       IF ( iom_use("e3t") .OR. iom_use("e3tdef") ) THEN  ! time-varying e3t
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) =  e3t(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) =  e3t(ji,jj,jk,Kmm)
          END_3D
-         CALL iom_put( "e3t", z3d )
+         CALL iom_put( "e3t", z3d0 )
          IF ( iom_use("e3tdef") ) THEN
             DO_3D( 0, 0, 0, 0, 1, jpk )
-               z3d(ji,jj,jk) = ( ( z3d(ji,jj,jk) - e3t_0(ji,jj,jk) ) / e3t_0(ji,jj,jk) * 100._wp * tmask(ji,jj,jk) ) ** 2
+               z3d0(ji,jj,jk) = ( ( z3d0(ji,jj,jk) - e3t_0(ji,jj,jk) ) / e3t_0(ji,jj,jk) * 100._wp * tmask(ji,jj,jk) ) ** 2
             END_3D
-            CALL iom_put( "e3tdef", z3d ) 
+            CALL iom_put( "e3tdef", z3d0 )
          ENDIF
       ENDIF 
       IF ( iom_use("e3u") ) THEN                         ! time-varying e3u
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) =  e3u(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) =  e3u(ji,jj,jk,Kmm)
          END_3D 
-         CALL iom_put( "e3u" , z3d )
+         CALL iom_put( "e3u" , z3d0 )
       ENDIF
       IF ( iom_use("e3v") ) THEN                         ! time-varying e3v
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) =  e3v(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) =  e3v(ji,jj,jk,Kmm)
          END_3D
-         CALL iom_put( "e3v" , z3d )
+         CALL iom_put( "e3v" , z3d0 )
       ENDIF
       IF ( iom_use("e3w") ) THEN                         ! time-varying e3w
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) =  e3w(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) =  e3w(ji,jj,jk,Kmm)
          END_3D
-         CALL iom_put( "e3w" , z3d )
+         CALL iom_put( "e3w" , z3d0 )
       ENDIF
       IF ( iom_use("e3f") ) THEN                         ! time-varying e3f caution here at Kaa
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) =  e3f(ji,jj,jk)
+            z3d0(ji,jj,jk) =  e3f(ji,jj,jk)
          END_3D
-         CALL iom_put( "e3f" , z3d )
+         CALL iom_put( "e3f" , z3d0 )
       ENDIF
 
       IF ( iom_use("ssh") ) THEN
@@ -200,7 +224,7 @@ CONTAINS
       IF( iom_use("wetdep") )    CALL iom_put( "wetdep" , ht_0(:,:) + ssh(:,:,Kmm) )   ! wet depth
          
 #if defined key_qco
-      IF( iom_use("ht") )   CALL iom_put( "ht" , ht(:,:)     )   ! water column at t-point
+      IF( iom_use("ht") )   CALL iom_put( "ht" , ht(:,:,Kmm) )   ! water column at t-point
       IF( iom_use("hu") )   CALL iom_put( "hu" , hu(:,:,Kmm) )   ! water column at u-point
       IF( iom_use("hv") )   CALL iom_put( "hv" , hv(:,:,Kmm) )   ! water column at v-point
       IF( iom_use("hf") )   CALL iom_put( "hf" , hf_0(:,:)*( 1._wp + r3f(:,:) ) )   ! water column at f-point (caution here at Naa)
@@ -213,9 +237,9 @@ CONTAINS
       IF ( iom_use("sbt") ) THEN
          DO_2D( 0, 0, 0, 0 )
             ikbot = mbkt(ji,jj)
-            z2d(ji,jj) = ts(ji,jj,ikbot,jp_tem,Kmm)
+            z2d0(ji,jj) = ts(ji,jj,ikbot,jp_tem,Kmm)
          END_2D
-         CALL iom_put( "sbt", z2d )                ! bottom temperature
+         CALL iom_put( "sbt", z2d0 )                ! bottom temperature
       ENDIF
       
       CALL iom_put( "soce", ts(:,:,:,jp_sal,Kmm) )    ! 3D salinity
@@ -223,9 +247,9 @@ CONTAINS
       IF ( iom_use("sbs") ) THEN
          DO_2D( 0, 0, 0, 0 )
             ikbot = mbkt(ji,jj)
-            z2d(ji,jj) = ts(ji,jj,ikbot,jp_sal,Kmm)
+            z2d0(ji,jj) = ts(ji,jj,ikbot,jp_sal,Kmm)
          END_2D
-         CALL iom_put( "sbs", z2d )                ! bottom salinity
+         CALL iom_put( "sbs", z2d0 )                ! bottom salinity
       ENDIF
 
       IF( .NOT.lk_SWE )   CALL iom_put( "rhop", rhop(:,:,:) )          ! 3D potential density (sigma0)
@@ -233,16 +257,16 @@ CONTAINS
       ! --- momentum --- !
       IF ( iom_use("taubot") ) THEN                ! bottom stress
          zztmp = rho0 * 0.25_wp
-         z2d(:,:) = 0._wp
+         z2d0(:,:) = 0._wp
          DO_2D( 0, 0, 0, 0 )
             zztmp2 = (  ( rCdU_bot(ji+1,jj)+rCdU_bot(ji  ,jj) ) * uu(ji  ,jj,mbku(ji  ,jj),Kmm)  )**2   &
                &   + (  ( rCdU_bot(ji  ,jj)+rCdU_bot(ji-1,jj) ) * uu(ji-1,jj,mbku(ji-1,jj),Kmm)  )**2   &
                &   + (  ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj  ) ) * vv(ji,jj  ,mbkv(ji,jj  ),Kmm)  )**2   &
                &   + (  ( rCdU_bot(ji,jj  )+rCdU_bot(ji,jj-1) ) * vv(ji,jj-1,mbkv(ji,jj-1),Kmm)  )**2
-            z2d(ji,jj) = zztmp * SQRT( zztmp2 ) * tmask(ji,jj,1) 
+            z2d0(ji,jj) = zztmp * SQRT( zztmp2 ) * tmask(ji,jj,1)
             !
          END_2D
-         CALL iom_put( "taubot", z2d )           
+         CALL iom_put( "taubot", z2d0 )
       ENDIF
          
       CALL iom_put( "uoce", uu(:,:,:,Kmm) )            ! 3D i-current
@@ -250,9 +274,9 @@ CONTAINS
       IF ( iom_use("sbu") ) THEN
          DO_2D( 0, 0, 0, 0 )
             ikbot = mbku(ji,jj)
-            z2d(ji,jj) = uu(ji,jj,ikbot,Kmm)
+            z2d0(ji,jj) = uu(ji,jj,ikbot,Kmm)
          END_2D
-         CALL iom_put( "sbu", z2d )                ! bottom i-current
+         CALL iom_put( "sbu", z2d0 )                ! bottom i-current
       ENDIF
       
       CALL iom_put( "voce", vv(:,:,:,Kmm) )            ! 3D j-current
@@ -260,9 +284,9 @@ CONTAINS
       IF ( iom_use("sbv") ) THEN
          DO_2D( 0, 0, 0, 0 )
             ikbot = mbkv(ji,jj)
-            z2d(ji,jj) = vv(ji,jj,ikbot,Kmm)
+            z2d0(ji,jj) = vv(ji,jj,ikbot,Kmm)
          END_2D
-         CALL iom_put( "sbv", z2d )                ! bottom j-current
+         CALL iom_put( "sbv", z2d0 )                ! bottom j-current
       ENDIF
 
       !                                            ! vertical velocity
@@ -281,20 +305,20 @@ CONTAINS
          !                     ! Caution: in the VVL case, it only correponds to the baroclinic mass transport.
          IF( ln_zad_Aimp ) THEN
             DO_3D( 0, 0, 0, 0, 1, jpk )
-               z3d(ji,jj,jk) = rho0 * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wi(ji,jj,jk) )
+               z3d0(ji,jj,jk) = rho0 * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wi(ji,jj,jk) )
             END_3D
          ELSE
             DO_3D( 0, 0, 0, 0, 1, jpk )
-               z3d(ji,jj,jk) = rho0 * e1e2t(ji,jj) * ww(ji,jj,jk)
+               z3d0(ji,jj,jk) = rho0 * e1e2t(ji,jj) * ww(ji,jj,jk)
             END_3D
          ENDIF
-         CALL iom_put( "w_masstr" , z3d )  
-         IF( iom_use('w_masstr2') )   CALL iom_put( "w_masstr2", z3d * z3d )
+         CALL iom_put( "w_masstr" , z3d0 )
+         IF( iom_use('w_masstr2') )   CALL iom_put( "w_masstr2", z3d0 * z3d0 )
       ENDIF
 
-      CALL iom_put( "avt" , avt )                  ! T vert. eddy diff. coef.
-      CALL iom_put( "avs" , avs )                  ! S vert. eddy diff. coef.
-      CALL iom_put( "avm" , avm )                  ! T vert. eddy visc. coef.
+      CALL iom_put( "avt" , avt )        ! T vert. eddy diff. coef.
+      CALL iom_put( "avs" , avs )        ! S vert. eddy diff. coef.
+      CALL iom_put( "avm" , avm )        ! T vert. eddy visc. coef.
 
       IF( iom_use('logavt') )   CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt(:,:,:) ) ) )
       IF( iom_use('logavs') )   CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, avs(:,:,:) ) ) )
@@ -304,15 +328,15 @@ CONTAINS
             zztmp  = ts(ji,jj,1,jp_sal,Kmm)
             zztmpx = (ts(ji+1,jj,1,jp_sal,Kmm) - zztmp) * r1_e1u(ji,jj) + (zztmp - ts(ji-1,jj  ,1,jp_sal,Kmm)) * r1_e1u(ji-1,jj)
             zztmpy = (ts(ji,jj+1,1,jp_sal,Kmm) - zztmp) * r1_e2v(ji,jj) + (zztmp - ts(ji  ,jj-1,1,jp_sal,Kmm)) * r1_e2v(ji,jj-1)
-            z2d(ji,jj) = 0.25_wp * ( zztmpx * zztmpx + zztmpy * zztmpy )   &
+            z2d0(ji,jj) = 0.25_wp * ( zztmpx * zztmpx + zztmpy * zztmpy )   &
                &                 * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * vmask(ji,jj-1,1)
          END_2D
-         CALL iom_put( "sssgrad2",  z2d )          ! square of module of sss gradient
+         CALL iom_put( "sssgrad2",  z2d0 )          ! square of module of sss gradient
          IF ( iom_use("sssgrad") ) THEN
             DO_2D( 0, 0, 0, 0 )
-               z2d(ji,jj) = SQRT( z2d(ji,jj) )
+               z2d0(ji,jj) = SQRT( z2d0(ji,jj) )
             END_2D
-            CALL iom_put( "sssgrad",  z2d )        ! module of sss gradient
+            CALL iom_put( "sssgrad",  z2d0 )        ! module of sss gradient
          ENDIF
       ENDIF
          
@@ -321,80 +345,80 @@ CONTAINS
             zztmp  = ts(ji,jj,1,jp_tem,Kmm)
             zztmpx = ( ts(ji+1,jj,1,jp_tem,Kmm) - zztmp ) * r1_e1u(ji,jj) + ( zztmp - ts(ji-1,jj  ,1,jp_tem,Kmm) ) * r1_e1u(ji-1,jj)
             zztmpy = ( ts(ji,jj+1,1,jp_tem,Kmm) - zztmp ) * r1_e2v(ji,jj) + ( zztmp - ts(ji  ,jj-1,1,jp_tem,Kmm) ) * r1_e2v(ji,jj-1)
-            z2d(ji,jj) = 0.25_wp * ( zztmpx * zztmpx + zztmpy * zztmpy )   &
+            z2d0(ji,jj) = 0.25_wp * ( zztmpx * zztmpx + zztmpy * zztmpy )   &
                &                 * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * vmask(ji,jj-1,1)
          END_2D
-         CALL iom_put( "sstgrad2",  z2d )          ! square of module of sst gradient
+         CALL iom_put( "sstgrad2",  z2d0 )          ! square of module of sst gradient
          IF ( iom_use("sstgrad") ) THEN
             DO_2D( 0, 0, 0, 0 )
-               z2d(ji,jj) = SQRT( z2d(ji,jj) )
+               z2d0(ji,jj) = SQRT( z2d0(ji,jj) )
             END_2D
-            CALL iom_put( "sstgrad",  z2d )        ! module of sst gradient
+            CALL iom_put( "sstgrad",  z2d0 )        ! module of sst gradient
          ENDIF
       ENDIF
          
       ! heat and salt contents
       IF( iom_use("heatc") ) THEN
-         z2d(:,:)  = 0._wp 
+         z2d0(:,:)  = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) * tmask(ji,jj,jk)
+            z2d0(ji,jj) = z2d0(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) * tmask(ji,jj,jk)
          END_3D
-         CALL iom_put( "heatc", rho0_rcp * z2d )   ! vertically integrated heat content (J/m2)
+         CALL iom_put( "heatc", rho0_rcp * z2d0 )   ! vertically integrated heat content (J/m2)
       ENDIF
 
       IF( iom_use("saltc") ) THEN
-         z2d(:,:)  = 0._wp 
+         z2d0(:,:)  = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk)
+            z2d0(ji,jj) = z2d0(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk)
          END_3D
-         CALL iom_put( "saltc", rho0 * z2d )       ! vertically integrated salt content (PSU*kg/m2)
+         CALL iom_put( "saltc", rho0 * z2d0 )       ! vertically integrated salt content (PSU*kg/m2)
       ENDIF
       !
       IF( iom_use("salt2c") ) THEN
-         z2d(:,:)  = 0._wp 
+         z2d0(:,:)  = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk)
+            z2d0(ji,jj) = z2d0(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk)
          END_3D
-         CALL iom_put( "salt2c", rho0 * z2d )      ! vertically integrated square of salt content (PSU2*kg/m2)
+         CALL iom_put( "salt2c", rho0 * z2d0 )      ! vertically integrated square of salt content (PSU2*kg/m2)
       ENDIF
       !
       IF ( iom_use("ke") .OR. iom_use("ke_int") ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
             zztmpx = uu(ji-1,jj  ,jk,Kmm) + uu(ji,jj,jk,Kmm)
             zztmpy = vv(ji  ,jj-1,jk,Kmm) + vv(ji,jj,jk,Kmm)
-            z3d(ji,jj,jk) = 0.25_wp * ( zztmpx*zztmpx + zztmpy*zztmpy )
+            z3d0(ji,jj,jk) = 0.25_wp * ( zztmpx*zztmpx + zztmpy*zztmpy )
          END_3D
-         CALL iom_put( "ke", z3d )                 ! kinetic energy
+         CALL iom_put( "ke", z3d0 )                 ! kinetic energy
 
-         z2d(:,:)  = 0._wp 
+         z2d0(:,:)  = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * z3d(ji,jj,jk) * e1e2t(ji,jj) * tmask(ji,jj,jk)
+            z2d0(ji,jj) = z2d0(ji,jj) + e3t(ji,jj,jk,Kmm) * z3d0(ji,jj,jk) * e1e2t(ji,jj) * tmask(ji,jj,jk)
          END_3D
-         CALL iom_put( "ke_int", z2d )             ! vertically integrated kinetic energy
+         CALL iom_put( "ke_int", z2d0 )             ! vertically integrated kinetic energy
       ENDIF
       !
       IF ( iom_use("sKE") ) THEN                   ! surface kinetic energy at T point
-         z2d(:,:) = 0._wp
+         z2d0(:,:) = 0._wp
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = 0.25_wp * ( uu(ji  ,jj,1,Kmm) * uu(ji  ,jj,1,Kmm) * e1e2u(ji  ,jj) * e3u(ji  ,jj,1,Kmm)  &
+            z2d0(ji,jj) = 0.25_wp * ( uu(ji  ,jj,1,Kmm) * uu(ji  ,jj,1,Kmm) * e1e2u(ji  ,jj) * e3u(ji  ,jj,1,Kmm)  &
                &                   + uu(ji-1,jj,1,Kmm) * uu(ji-1,jj,1,Kmm) * e1e2u(ji-1,jj) * e3u(ji-1,jj,1,Kmm)  &
                &                   + vv(ji,jj  ,1,Kmm) * vv(ji,jj  ,1,Kmm) * e1e2v(ji,jj  ) * e3v(ji,jj  ,1,Kmm)  & 
                &                   + vv(ji,jj-1,1,Kmm) * vv(ji,jj-1,1,Kmm) * e1e2v(ji,jj-1) * e3v(ji,jj-1,1,Kmm)  )  &
                &                 * r1_e1e2t(ji,jj) / e3t(ji,jj,1,Kmm) * ssmask(ji,jj)
          END_2D
-         IF ( iom_use("sKE" ) )  CALL iom_put( "sKE" , z2d )   
+         IF ( iom_use("sKE" ) )  CALL iom_put( "sKE" , z2d0 )
       ENDIF
       !    
       IF ( iom_use("ssKEf") ) THEN                 ! surface kinetic energy at F point
-         z2d(:,:) = 0._wp                          ! CAUTION : only valid in SWE, not with bathymetry
+         z2d0(:,:) = 0._wp                          ! CAUTION : only valid in SWE, not with bathymetry
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = 0.25_wp * ( uu(ji,jj  ,1,Kmm) * uu(ji,jj  ,1,Kmm) * e1e2u(ji,jj  ) * e3u(ji,jj  ,1,Kmm)  &
+            z2d0(ji,jj) = 0.25_wp * ( uu(ji,jj  ,1,Kmm) * uu(ji,jj  ,1,Kmm) * e1e2u(ji,jj  ) * e3u(ji,jj  ,1,Kmm)  &
                &                   + uu(ji,jj+1,1,Kmm) * uu(ji,jj+1,1,Kmm) * e1e2u(ji,jj+1) * e3u(ji,jj+1,1,Kmm)  &
                &                   + vv(ji  ,jj,1,Kmm) * vv(ji,jj  ,1,Kmm) * e1e2v(ji  ,jj) * e3v(ji  ,jj,1,Kmm)  & 
                &                   + vv(ji+1,jj,1,Kmm) * vv(ji+1,jj,1,Kmm) * e1e2v(ji+1,jj) * e3v(ji+1,jj,1,Kmm)  )  &
                &                 * r1_e1e2f(ji,jj) / e3f(ji,jj,1) * ssfmask(ji,jj)
          END_2D
-         CALL iom_put( "ssKEf", z2d )                     
+         CALL iom_put( "ssKEf", z2d0 )
       ENDIF
       !
       CALL iom_put( "hdiv", hdiv )                 ! Horizontal divergence
@@ -402,31 +426,31 @@ CONTAINS
       IF( iom_use("u_masstr") .OR. iom_use("u_masstr_vint") .OR. iom_use("u_heattr") .OR. iom_use("u_salttr") ) THEN
          
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = rho0 * uu(ji,jj,jk,Kmm) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * umask(ji,jj,jk)
+            z3d0(ji,jj,jk) = rho0 * uu(ji,jj,jk,Kmm) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * umask(ji,jj,jk)
          END_3D
-         CALL iom_put( "u_masstr"     , z3d )      ! mass transport in i-direction
+         CALL iom_put( "u_masstr"     , z3d0 )      ! mass transport in i-direction
          
          IF( iom_use("u_masstr_vint") ) THEN
-            z2d(:,:) = 0._wp 
+            z2d0(:,:) = 0._wp
             DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk)
+               z2d0(ji,jj) = z2d0(ji,jj) + z3d0(ji,jj,jk)
             END_3D
-            CALL iom_put( "u_masstr_vint", z2d )   ! mass transport in i-direction vertical sum
+            CALL iom_put( "u_masstr_vint", z2d0 )   ! mass transport in i-direction vertical sum
          ENDIF
          IF( iom_use("u_heattr") ) THEN
-            z2d(:,:) = 0._wp 
+            z2d0(:,:) = 0._wp
             zztmp = 0.5_wp * rcp
             DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z2d(ji,jj) = z2d(ji,jj) + zztmp * z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji+1,jj,jk,jp_tem,Kmm) )
+               z2d0(ji,jj) = z2d0(ji,jj) + zztmp * z3d0(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji+1,jj,jk,jp_tem,Kmm) )
             END_3D
-            CALL iom_put( "u_heattr", z2d )        ! heat transport in i-direction
+            CALL iom_put( "u_heattr", z2d0 )        ! heat transport in i-direction
          ENDIF
          IF( iom_use("u_salttr") ) THEN
-            z2d(:,:) = 0._wp 
+            z2d0(:,:) = 0._wp
             DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z2d(ji,jj) = z2d(ji,jj) +   0.5 * z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji+1,jj,jk,jp_sal,Kmm) )
+               z2d0(ji,jj) = z2d0(ji,jj) +   0.5 * z3d0(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji+1,jj,jk,jp_sal,Kmm) )
             END_3D
-            CALL iom_put( "u_salttr", z2d )        ! heat transport in i-direction
+            CALL iom_put( "u_salttr", z2d0 )        ! heat transport in i-direction
          ENDIF
          
       ENDIF
@@ -434,41 +458,41 @@ CONTAINS
       IF( iom_use("v_masstr") .OR. iom_use("v_heattr") .OR. iom_use("v_salttr") ) THEN
          
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = rho0 * vv(ji,jj,jk,Kmm) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * vmask(ji,jj,jk)
+            z3d0(ji,jj,jk) = rho0 * vv(ji,jj,jk,Kmm) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * vmask(ji,jj,jk)
          END_3D
-         CALL iom_put( "v_masstr", z3d )           ! mass transport in j-direction
+         CALL iom_put( "v_masstr", z3d0 )           ! mass transport in j-direction
          
          IF( iom_use("v_heattr") ) THEN
-            z2d(:,:) = 0._wp
+            z2d0(:,:) = 0._wp
             zztmp = 0.5_wp * rcp
             DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z2d(ji,jj) = z2d(ji,jj) + zztmp * z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji,jj+1,jk,jp_tem,Kmm) )
+               z2d0(ji,jj) = z2d0(ji,jj) + zztmp * z3d0(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji,jj+1,jk,jp_tem,Kmm) )
             END_3D
-            CALL iom_put( "v_heattr", z2d )        !  heat transport in j-direction
+            CALL iom_put( "v_heattr", z2d0 )        !  heat transport in j-direction
          ENDIF
          IF( iom_use("v_salttr") ) THEN
-            z2d(:,:) = 0._wp 
+            z2d0(:,:) = 0._wp
             DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z2d(ji,jj) = z2d(ji,jj) +   0.5 * z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji,jj+1,jk,jp_sal,Kmm) )
+               z2d0(ji,jj) = z2d0(ji,jj) +   0.5 * z3d0(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji,jj+1,jk,jp_sal,Kmm) )
             END_3D
-            CALL iom_put( "v_salttr", z2d )        !  heat transport in j-direction
+            CALL iom_put( "v_salttr", z2d0 )        !  heat transport in j-direction
          ENDIF
 
       ENDIF
 
       IF( iom_use("tosmint") ) THEN
-         z2d(:,:) = 0._wp
+         z2d0(:,:) = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm)
+            z2d0(ji,jj) = z2d0(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm)
          END_3D
-         CALL iom_put( "tosmint", z2d )            ! Vertical integral of temperature
+         CALL iom_put( "tosmint", z2d0 )            ! Vertical integral of temperature
       ENDIF
       IF( iom_use("somint") ) THEN
-         z2d(:,:) = 0._wp
+         z2d0(:,:) = 0._wp
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            z2d(ji,jj) = z2d(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm)
+            z2d0(ji,jj) = z2d0(ji,jj) + rho0 * e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm)
          END_3D
-         CALL iom_put( "somint", z2d )             ! Vertical integral of salinity
+         CALL iom_put( "somint", z2d0 )             ! Vertical integral of salinity
       ENDIF
 
       CALL iom_put( "bn2", rn2 )                   ! Brunt-Vaisala buoyancy frequency (N^2)
@@ -477,45 +501,47 @@ CONTAINS
       
       ! Output of surface vorticity terms
       !
-      CALL iom_put( "ssplavor", ff_f )             ! planetary vorticity ( f )
-      !
-      IF ( iom_use("ssrelvor")    .OR. iom_use("ssEns")    .OR.   &
+      IF ( iom_use("ssplavor")    .OR. iom_use("ssrelvor")    .OR. iom_use("ssEns")    .OR.   &
          & iom_use("ssrelpotvor") .OR. iom_use("ssabspotvor") ) THEN
          !
-         z2d(:,:) = 0._wp 
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = (   e2v(ji+1,jj  ) * vv(ji+1,jj  ,1,Kmm) - e2v(ji,jj) * vv(ji,jj,1,Kmm)    &
+            z2d0(ji,jj) = ff_f(ji,jj)
+         END_2D
+         CALL iom_put( "ssplavor", z2d0 )           ! planetary vorticity ( f )
+
+         DO_2D( 0, 0, 0, 0 )
+            z2d0(ji,jj) = (   e2v(ji+1,jj  ) * vv(ji+1,jj  ,1,Kmm) - e2v(ji,jj) * vv(ji,jj,1,Kmm)    &
             &              - e1u(ji  ,jj+1) * uu(ji  ,jj+1,1,Kmm) + e1u(ji,jj) * uu(ji,jj,1,Kmm)  ) * r1_e1e2f(ji,jj)
          END_2D
-         CALL iom_put( "ssrelvor", z2d )           ! relative vorticity ( zeta ) 
+         CALL iom_put( "ssrelvor", z2d0 )           ! relative vorticity ( zeta )
          !
          IF ( iom_use("ssEns") .OR. iom_use("ssrelpotvor") .OR. iom_use("ssabspotvor") ) THEN
             DO_2D( 0, 0, 0, 0 )  
                ze3 = (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1) + e3t(ji+1,jj+1,1,Kmm) * e1e2t(ji+1,jj+1)    &
-                  &    + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj)
+                  &   + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj)
                IF( ze3 /= 0._wp ) THEN   ;   ze3 = 4._wp / ze3
                ELSE                      ;   ze3 = 0._wp
                ENDIF
-               z2d(ji,jj) = ze3 * z2d(ji,jj) 
+               z2d0(ji,jj) = ze3 * z2d0(ji,jj)
             END_2D
-            CALL iom_put( "ssrelpotvor", z2d )     ! relative potential vorticity (zeta/h)
+            CALL iom_put( "ssrelpotvor", z2d0 )     ! relative potential vorticity (zeta/h)
             !
             IF ( iom_use("ssEns") .OR. iom_use("ssabspotvor") ) THEN
                DO_2D( 0, 0, 0, 0 )
                   ze3 = (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1) + e3t(ji+1,jj+1,1,Kmm) * e1e2t(ji+1,jj+1)    &
-                     &    + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj)
+                     &   + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj)
                   IF( ze3 /= 0._wp ) THEN   ;   ze3 = 4._wp / ze3
                   ELSE                      ;   ze3 = 0._wp
                   ENDIF
-                  z2d(ji,jj) = ze3 * ff_f(ji,jj) + z2d(ji,jj) 
+                  z2d0(ji,jj) = ze3 * ff_f(ji,jj) + z2d0(ji,jj)
                END_2D
-               CALL iom_put( "ssabspotvor", z2d )  ! absolute potential vorticity ( q )
+               CALL iom_put( "ssabspotvor", z2d0 )  ! absolute potential vorticity ( q )
                !
                IF ( iom_use("ssEns") ) THEN
                   DO_2D( 0, 0, 0, 0 )  
-                     z2d(ji,jj) = 0.5_wp * z2d(ji,jj) * z2d(ji,jj) 
+                     z2d0(ji,jj) = 0.5_wp * z2d0(ji,jj) * z2d0(ji,jj)
                   END_2D
-                  CALL iom_put( "ssEns", z2d )     ! potential enstrophy ( 1/2*q2 )
+                  CALL iom_put( "ssEns", z2d0 )     ! potential enstrophy ( 1/2*q2 )
                ENDIF
             ENDIF
          ENDIF
@@ -582,8 +608,8 @@ CONTAINS
       INTEGER  ::   jn, ierror                               ! local integers
       REAL(wp) ::   zsto, zout, zmax, zjulian                ! local scalars
       !
-      REAL(wp), DIMENSION(jpi,jpj    ) :: z2d     ! 2D workspace
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3d     ! 3D workspace
+      REAL(wp), DIMENSION(jpi,jpj    ) :: z2d0     ! 2D workspace
+      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3d0     ! 3D workspace
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zw3d_abl   ! ABL 3D workspace
       !!----------------------------------------------------------------------
       !
@@ -868,7 +894,11 @@ CONTAINS
          CALL histdef( nid_T, "sohtc300", "Heat content 300 m"                 , "J/m2"   ,   & ! htc3
             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout )
 #endif
-
+         CALL histdef( nid_T, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   & ! utau
+            &          jpi, jpj, nh_T, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
+         CALL histdef( nid_T, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   & ! vtau
+            &          jpi, jpj, nh_T, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
+         !
          CALL histend( nid_T, snc4chunks=snc4set )
 
          !                                                                                      !!! nid_U : 3D
@@ -878,10 +908,7 @@ CONTAINS
             CALL histdef( nid_U, "sdzocrtx", "Stokes Drift Zonal Current"         , "m/s"    ,   &  ! usd
                &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout )
          ENDIF
-         !                                                                                      !!! nid_U : 2D
-         CALL histdef( nid_U, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   &  ! utau
-            &          jpi, jpj, nh_U, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
-
+         !
          CALL histend( nid_U, snc4chunks=snc4set )
 
          !                                                                                      !!! nid_V : 3D
@@ -891,10 +918,7 @@ CONTAINS
             CALL histdef( nid_V, "sdmecrty", "Stokes Drift Meridional Current"    , "m/s"    ,   &  ! vsd
                &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout )
          ENDIF
-         !                                                                                      !!! nid_V : 2D
-         CALL histdef( nid_V, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   &  ! vtau
-            &          jpi, jpj, nh_V, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
-
+         !
          CALL histend( nid_V, snc4chunks=snc4set )
 
          !                                                                                      !!! nid_W : 3D
@@ -937,21 +961,21 @@ CONTAINS
 
       IF( .NOT.ln_linssh ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = ts(ji,jj,jk,jp_tem,Kmm) * e3t(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) = ts(ji,jj,jk,jp_tem,Kmm) * e3t(ji,jj,jk,Kmm)
          END_3D
-         CALL histwrite( nid_T, "votemper", it, z3d, ndim_T , ndex_T  )   ! heat content
+         CALL histwrite( nid_T, "votemper", it, z3d0, ndim_T , ndex_T  )   ! heat content
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = ts(ji,jj,jk,jp_sal,Kmm) * e3t(ji,jj,jk,Kmm)
+            z3d0(ji,jj,jk) = ts(ji,jj,jk,jp_sal,Kmm) * e3t(ji,jj,jk,Kmm)
          END_3D
-         CALL histwrite( nid_T, "vosaline", it, z3d, ndim_T , ndex_T  )   ! salt content
+         CALL histwrite( nid_T, "vosaline", it, z3d0, ndim_T , ndex_T  )   ! salt content
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj   ) = ts(ji,jj, 1,jp_tem,Kmm) * e3t(ji,jj, 1,Kmm)
+            z2d0(ji,jj   ) = ts(ji,jj, 1,jp_tem,Kmm) * e3t(ji,jj, 1,Kmm)
          END_2D
-         CALL histwrite( nid_T, "sosstsst", it, z2d, ndim_hT, ndex_hT )   ! sea surface heat content
+         CALL histwrite( nid_T, "sosstsst", it, z2d0, ndim_hT, ndex_hT )   ! sea surface heat content
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj   ) = ts(ji,jj, 1,jp_sal,Kmm) * e3t(ji,jj, 1,Kmm)
+            z2d0(ji,jj   ) = ts(ji,jj, 1,jp_sal,Kmm) * e3t(ji,jj, 1,Kmm)
          END_2D
-         CALL histwrite( nid_T, "sosaline", it, z2d, ndim_hT, ndex_hT )   ! sea surface salinity content
+         CALL histwrite( nid_T, "sosaline", it, z2d0, ndim_hT, ndex_hT )   ! sea surface salinity content
       ELSE
          CALL histwrite( nid_T, "votemper", it, ts(:,:,:,jp_tem,Kmm) , ndim_T , ndex_T  )   ! temperature
          CALL histwrite( nid_T, "vosaline", it, ts(:,:,:,jp_sal,Kmm) , ndim_T , ndex_T  )   ! salinity
@@ -960,41 +984,41 @@ CONTAINS
       ENDIF
       IF( .NOT.ln_linssh ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = e3t(ji,jj,jk,Kmm)     ! 3D workspace for qco substitution
+           z3d0(ji,jj,jk) = e3t(ji,jj,jk,Kmm)     ! 3D workspace for qco substitution
          END_3D
-         CALL histwrite( nid_T, "vovvle3t", it, z3d        , ndim_T , ndex_T  )   ! level thickness
+         CALL histwrite( nid_T, "vovvle3t", it, z3d0        , ndim_T , ndex_T  )   ! level thickness
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = gdept(ji,jj,jk,Kmm)   ! 3D workspace for qco substitution
+           z3d0(ji,jj,jk) = gdept(ji,jj,jk,Kmm)   ! 3D workspace for qco substitution
          END_3D
-         CALL histwrite( nid_T, "vovvldep", it, z3d        , ndim_T , ndex_T  )   ! t-point depth 
+         CALL histwrite( nid_T, "vovvldep", it, z3d0        , ndim_T , ndex_T  )   ! t-point depth
          DO_3D( 0, 0, 0, 0, 1, jpk )
-            z3d(ji,jj,jk) = ( ( e3t(ji,jj,jk,Kmm) - e3t_0(ji,jj,jk) ) / e3t_0(ji,jj,jk) * 100._wp * tmask(ji,jj,jk) ) ** 2
+            z3d0(ji,jj,jk) = ( ( e3t(ji,jj,jk,Kmm) - e3t_0(ji,jj,jk) ) / e3t_0(ji,jj,jk) * 100._wp * tmask(ji,jj,jk) ) ** 2
          END_3D         
-         CALL histwrite( nid_T, "vovvldef", it, z3d        , ndim_T , ndex_T  )   ! level thickness deformation
+         CALL histwrite( nid_T, "vovvldef", it, z3d0        , ndim_T , ndex_T  )   ! level thickness deformation
       ENDIF
       CALL histwrite( nid_T, "sossheig", it, ssh(:,:,Kmm)  , ndim_hT, ndex_hT )   ! sea surface height
       DO_2D( 0, 0, 0, 0 )
-         z2d(ji,jj) = emp(ji,jj) - rnf(ji,jj)
+         z2d0(ji,jj) = emp(ji,jj) - rnf(ji,jj)
       END_2D
-      CALL histwrite( nid_T, "sowaflup", it, z2d           , ndim_hT, ndex_hT )   ! upward water flux
+      CALL histwrite( nid_T, "sowaflup", it, z2d0           , ndim_hT, ndex_hT )   ! upward water flux
       CALL histwrite( nid_T, "sorunoff", it, rnf           , ndim_hT, ndex_hT )   ! river runoffs
       CALL histwrite( nid_T, "sosfldow", it, sfx           , ndim_hT, ndex_hT )   ! downward salt flux 
                                                                                   ! (includes virtual salt flux beneath ice 
                                                                                   ! in linear free surface case)
       IF( ln_linssh ) THEN
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = emp (ji,jj) * ts(ji,jj,1,jp_tem,Kmm)
+            z2d0(ji,jj) = emp (ji,jj) * ts(ji,jj,1,jp_tem,Kmm)
          END_2D
-         CALL histwrite( nid_T, "sosst_cd", it, z2d, ndim_hT, ndex_hT )          ! c/d term on sst
+         CALL histwrite( nid_T, "sosst_cd", it, z2d0, ndim_hT, ndex_hT )          ! c/d term on sst
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = emp (ji,jj) * ts(ji,jj,1,jp_sal,Kmm)
+            z2d0(ji,jj) = emp (ji,jj) * ts(ji,jj,1,jp_sal,Kmm)
          END_2D
-         CALL histwrite( nid_T, "sosss_cd", it, z2d, ndim_hT, ndex_hT )          ! c/d term on sss
+         CALL histwrite( nid_T, "sosss_cd", it, z2d0, ndim_hT, ndex_hT )          ! c/d term on sss
       ENDIF
       DO_2D( 0, 0, 0, 0 )
-         z2d(ji,jj) = qsr(ji,jj) + qns(ji,jj)
+         z2d0(ji,jj) = qsr(ji,jj) + qns(ji,jj)
       END_2D
-      CALL histwrite( nid_T, "sohefldo", it, z2d           , ndim_hT, ndex_hT )   ! total heat flux
+      CALL histwrite( nid_T, "sohefldo", it, z2d0           , ndim_hT, ndex_hT )   ! total heat flux
       CALL histwrite( nid_T, "soshfldo", it, qsr           , ndim_hT, ndex_hT )   ! solar heat flux
       IF( ALLOCATED(hmld) ) THEN   ! zdf_mxl not called by SWE
          CALL histwrite( nid_T, "somixhgt", it, hmld          , ndim_hT, ndex_hT )   ! turbocline depth
@@ -1053,9 +1077,9 @@ CONTAINS
          CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping
          CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping
          DO_2D( 0, 0, 0, 0 )
-            z2d(ji,jj) = erp(ji,jj) * ts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1)
+            z2d0(ji,jj) = erp(ji,jj) * ts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1)
          END_2D
-         CALL histwrite( nid_T, "sosafldp", it, z2d           , ndim_hT, ndex_hT )   ! salt flux damping
+         CALL histwrite( nid_T, "sosafldp", it, z2d0           , ndim_hT, ndex_hT )   ! salt flux damping
       ENDIF
 !      zw2d(:,:) = FLOAT( nmln(:,:) ) * tmask(:,:,1)
 !      CALL histwrite( nid_T, "sobowlin", it, zw2d          , ndim_hT, ndex_hT )   ! ???
@@ -1066,18 +1090,18 @@ CONTAINS
       CALL histwrite( nid_T, "so28chgt", it, hd28          , ndim_hT, ndex_hT )   ! depth of the 28 isotherm
       CALL histwrite( nid_T, "sohtc300", it, htc3          , ndim_hT, ndex_hT )   ! first 300m heaat content
 #endif
+      CALL histwrite( nid_T, "sozotaux", it, utau          , ndim_hT, ndex_hT )   ! i-wind stress
+      CALL histwrite( nid_T, "sometauy", it, vtau          , ndim_hT, ndex_hT )   ! j-wind stress
 
       CALL histwrite( nid_U, "vozocrtx", it, uu(:,:,:,Kmm) , ndim_U , ndex_U )    ! i-current
-      CALL histwrite( nid_U, "sozotaux", it, utau          , ndim_hU, ndex_hU )   ! i-wind stress
 
       CALL histwrite( nid_V, "vomecrty", it, vv(:,:,:,Kmm) , ndim_V , ndex_V  )   ! j-current
-      CALL histwrite( nid_V, "sometauy", it, vtau          , ndim_hV, ndex_hV )   ! j-wind stress
 
       IF( ln_zad_Aimp ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = ww(ji,jj,jk) + wi(ji,jj,jk)
+           z3d0(ji,jj,jk) = ww(ji,jj,jk) + wi(ji,jj,jk)
          END_3D         
-         CALL histwrite( nid_W, "vovecrtz", it, z3d         , ndim_T, ndex_T )    ! vert. current
+         CALL histwrite( nid_W, "vovecrtz", it, z3d0         , ndim_T, ndex_T )    ! vert. current
       ELSE
          CALL histwrite( nid_W, "vovecrtz", it, ww          , ndim_T, ndex_T )    ! vert. current
       ENDIF
@@ -1126,8 +1150,8 @@ CONTAINS
       !!
       INTEGER ::   ji, jj, jk       ! dummy loop indices
       INTEGER ::   inum
-      REAL(wp), DIMENSION(jpi,jpj)     :: z2d      
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3d      
+      REAL(wp), DIMENSION(A2D(0))     :: z2d0
+      REAL(wp), DIMENSION(A2D(0),jpk) :: z3d0
       !!----------------------------------------------------------------------
       ! 
       IF(lwp) THEN
@@ -1146,14 +1170,14 @@ CONTAINS
       CALL iom_rstput( 0, 0, inum, 'vomecrty', vv(:,:,:,Kmm)        )    ! now j-velocity
       IF( ln_zad_Aimp ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = ww(ji,jj,jk) + wi(ji,jj,jk)
+           z3d0(ji,jj,jk) = ww(ji,jj,jk) + wi(ji,jj,jk)
          END_3D
-         CALL iom_rstput( 0, 0, inum, 'vovecrtz', z3d            )    ! now k-velocity
+         CALL iom_rstput( 0, 0, inum, 'vovecrtz', z3d0           )    ! now k-velocity
       ELSE
          CALL iom_rstput( 0, 0, inum, 'vovecrtz', ww             )    ! now k-velocity
       ENDIF
       CALL iom_rstput( 0, 0, inum, 'risfdep', risfdep            )
-      CALL iom_rstput( 0, 0, inum, 'ht'     , ht(:,:)            )    ! now water column height
+      CALL iom_rstput( 0, 0, inum, 'ht'     , ht(:,:,Kmm)        )    ! now water column height
       !
       IF ( ln_isf ) THEN
          IF (ln_isfcav_mlt) THEN
@@ -1184,26 +1208,26 @@ CONTAINS
          CALL iom_rstput( 0, 0, inum,  'ahmf', ahmf              )    ! ahmf at v-point
       ENDIF
       DO_2D( 0, 0, 0, 0 )
-         z2d(ji,jj) = emp(ji,jj) - rnf(ji,jj)
+         z2d0(ji,jj) = emp(ji,jj) - rnf(ji,jj)
       END_2D
-      CALL iom_rstput( 0, 0, inum, 'sowaflup', z2d               )    ! freshwater budget
+      CALL iom_rstput( 0, 0, inum, 'sowaflup', z2d0              )    ! freshwater budget
       DO_2D( 0, 0, 0, 0 )
-         z2d(ji,jj) = qsr(ji,jj) + qns(ji,jj)
+         z2d0(ji,jj) = qsr(ji,jj) + qns(ji,jj)
       END_2D
-      CALL iom_rstput( 0, 0, inum, 'sohefldo', z2d               )    ! total heat flux
+      CALL iom_rstput( 0, 0, inum, 'sohefldo', z2d0              )    ! total heat flux
       CALL iom_rstput( 0, 0, inum, 'soshfldo', qsr               )    ! solar heat flux
       CALL iom_rstput( 0, 0, inum, 'soicecov', fr_i              )    ! ice fraction
       CALL iom_rstput( 0, 0, inum, 'sozotaux', utau              )    ! i-wind stress
       CALL iom_rstput( 0, 0, inum, 'sometauy', vtau              )    ! j-wind stress
       IF(  .NOT.ln_linssh  ) THEN
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = gdept(ji,jj,jk,Kmm)   ! 3D workspace for qco substitution
+           z3d0(ji,jj,jk) = gdept(ji,jj,jk,Kmm)   ! 3D workspace for qco substitution
          END_3D
-         CALL iom_rstput( 0, 0, inum, 'vovvldep', z3d            )    !  T-cell depth 
+         CALL iom_rstput( 0, 0, inum, 'vovvldep', z3d0           )    !  T-cell depth
          DO_3D( 0, 0, 0, 0, 1, jpk )
-           z3d(ji,jj,jk) = e3t(ji,jj,jk,Kmm)     ! 3D workspace for qco substitution
+           z3d0(ji,jj,jk) = e3t(ji,jj,jk,Kmm)     ! 3D workspace for qco substitution
          END_3D
-         CALL iom_rstput( 0, 0, inum, 'vovvle3t', z3d            )    !  T-cell thickness  
+         CALL iom_rstput( 0, 0, inum, 'vovvle3t', z3d0           )    !  T-cell thickness
       END IF
       IF( ln_wave .AND. ln_sdw ) THEN
          CALL iom_rstput( 0, 0, inum, 'sdzocrtx', usd            )    ! now StokesDrift i-velocity
@@ -1217,14 +1241,14 @@ CONTAINS
          CALL iom_rstput ( 0, 0, inum, "qz1_abl",  tq_abl(:,:,2,nt_a,2) )   ! now first level humidity
       ENDIF
       IF( ln_zdfosm ) THEN
-         CALL iom_rstput( 0, 0, inum, 'hbl', hbl*tmask(:,:,1)  )      ! now boundary-layer depth
-         CALL iom_rstput( 0, 0, inum, 'hml', hml*tmask(:,:,1)  )      ! now mixed-layer depth
-         CALL iom_rstput( 0, 0, inum, 'avt_k', avt_k*wmask     )      ! w-level diffusion
-         CALL iom_rstput( 0, 0, inum, 'avm_k', avm_k*wmask     )      ! now w-level viscosity
-         CALL iom_rstput( 0, 0, inum, 'ghamt', ghamt*wmask     )      ! non-local t forcing
-         CALL iom_rstput( 0, 0, inum, 'ghams', ghams*wmask     )      ! non-local s forcing
-         CALL iom_rstput( 0, 0, inum, 'ghamu', ghamu*umask     )      ! non-local u forcing
-         CALL iom_rstput( 0, 0, inum, 'ghamv', ghamv*vmask     )      ! non-local v forcing
+         CALL iom_rstput( 0, 0, inum, 'hbl', hbl*tmask(:,:,1)        )      ! now boundary-layer depth
+         CALL iom_rstput( 0, 0, inum, 'hml', hml*tmask(:,:,1)        )      ! now mixed-layer depth
+         CALL iom_rstput( 0, 0, inum, 'avt_k', avt_k*wmask(A2D(0),:) )      ! w-level diffusion
+         CALL iom_rstput( 0, 0, inum, 'avm_k', avm_k*wmask           )      ! now w-level viscosity
+         CALL iom_rstput( 0, 0, inum, 'ghamt', ghamt*wmask           )      ! non-local t forcing
+         CALL iom_rstput( 0, 0, inum, 'ghams', ghams*wmask           )      ! non-local s forcing
+         CALL iom_rstput( 0, 0, inum, 'ghamu', ghamu*umask           )      ! non-local u forcing
+         CALL iom_rstput( 0, 0, inum, 'ghamv', ghamv*vmask           )      ! non-local v forcing
          IF( ln_osm_mle ) THEN
             CALL iom_rstput( 0, 0, inum, 'hmle', hmle*tmask(:,:,1)  ) ! now transition-layer depth
          END IF
diff --git a/src/OCE/DIU/diu_bulk.F90 b/src/OCE/DIU/diu_bulk.F90
index af1e5adf..aa7e9600 100644
--- a/src/OCE/DIU/diu_bulk.F90
+++ b/src/OCE/DIU/diu_bulk.F90
@@ -64,7 +64,7 @@ CONTAINS
       
       IF( ln_diurnal ) THEN      
          !         
-         ALLOCATE( x_dsst(jpi,jpj), x_solfrac(jpi,jpj) )
+         ALLOCATE( x_dsst(A2D(0)), x_solfrac(A2D(0)) )
          !
          x_solfrac = 0._wp         ! Initialise the solar fraction
          x_dsst    = 0._wp
@@ -92,25 +92,25 @@ CONTAINS
       !! ** Reference : Refinements to a prognostic scheme of skin sea surface
       !!                temperature, Takaya et al, JGR, 2010 
       !!----------------------------------------------------------------------
-      INTEGER                               , INTENT(in) ::   kt             ! time step
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   psolflux       ! solar flux (Watts)
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   pqflux         ! heat (non-solar) flux (Watts)
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   ptauflux       ! wind stress  (kg/ m s^2)
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   prho           ! water density  (kg/m^3)
-      REAL(wp)                              , INTENT(in) ::   p_rdt          ! time-step
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pLa            ! Langmuir number
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pthick         ! warm layer thickness (m)
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pcoolthick     ! cool skin thickness (m)
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pmu            ! mu parameter
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   p_hflux_bkginc ! increment to the heat flux
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   p_fvel_bkginc  ! increment to the friction velocity
+      INTEGER                              , INTENT(in) ::   kt             ! time step
+      REAL(wp), DIMENSION(A2D(0))          , INTENT(in) ::   psolflux       ! solar flux (Watts)
+      REAL(wp), DIMENSION(A2D(0))          , INTENT(in) ::   pqflux         ! heat (non-solar) flux (Watts)
+      REAL(wp), DIMENSION(A2D(0))          , INTENT(in) ::   ptauflux       ! wind stress  (kg/ m s^2)
+      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(in) ::   prho           ! water density  (kg/m^3)
+      REAL(wp)                             , INTENT(in) ::   p_rdt          ! time-step
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   pLa            ! Langmuir number
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   pthick         ! warm layer thickness (m)
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   pcoolthick     ! cool skin thickness (m)
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   pmu            ! mu parameter
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   p_hflux_bkginc ! increment to the heat flux
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) ::   p_fvel_bkginc  ! increment to the friction velocity
       !
       INTEGER :: ji,jj
       LOGICAL  :: ll_calcfrac
-      REAL(wp), DIMENSION(jpi,jpj) :: z_fvel              ! friction velocity     
-      REAL(wp), DIMENSION(jpi,jpj) :: zthick, zcoolthick, zmu, zla
-      REAL(wp), DIMENSION(jpi,jpj) :: z_abflux            ! absorbed flux           
-      REAL(wp), DIMENSION(jpi,jpj) :: z_fla               ! Langmuir function value 
+      REAL(wp), DIMENSION(A2D(0)) :: z_fvel              ! friction velocity     
+      REAL(wp), DIMENSION(A2D(0)) :: zthick, zcoolthick, zmu, zla
+      REAL(wp), DIMENSION(A2D(0)) :: z_abflux            ! absorbed flux           
+      REAL(wp), DIMENSION(A2D(0)) :: z_fla               ! Langmuir function value 
       !!----------------------------------------------------------------------
 
       ! Set optional arguments to their defaults
@@ -129,14 +129,14 @@ CONTAINS
       
       ! If not done already, calculate the solar fraction
       IF ( kt==nit000 ) THEN
-         DO_2D( 1, 1, 1, 1 )
-            IF(  ( x_solfrac(ji,jj) == 0._wp ) .AND. ( tmask(ji,jj,1) == 1._wp ) ) &
+         DO_2D( 0, 0, 0, 0 )
+            IF(  ( x_solfrac(ji,jj) == 0._wp ) .AND. ( smask0(ji,jj) == 1._wp ) ) &
                &   x_solfrac(ji,jj) = solfrac( zcoolthick(ji,jj),zthick(ji,jj) )
          END_2D
       ENDIF   
 
       ! convert solar flux and heat flux to absorbed flux   
-      WHERE ( tmask(:,:,1) == 1._wp) 
+      WHERE ( smask0(:,:) == 1._wp) 
          z_abflux(:,:) = (  x_solfrac(:,:) *  psolflux (:,:)) + pqflux(:,:)     
       ELSEWHERE
          z_abflux(:,:) = 0._wp
@@ -147,8 +147,8 @@ CONTAINS
       ENDWHERE 
       
       ! Calculate the friction velocity
-      WHERE ( (ptauflux /= 0) .AND. ( tmask(:,:,1) == 1.) )   
-         z_fvel(:,:) = SQRT( ptauflux(:,:) / prho(:,:) )
+      WHERE ( (ptauflux(:,:) /= 0) .AND. ( smask0(:,:) == 1.) )   
+         z_fvel(:,:) = SQRT( ptauflux(:,:) / prho(A2D(0)) )
       ELSEWHERE
          z_fvel(:,:) = 0._wp
       ENDWHERE
@@ -157,7 +157,7 @@ CONTAINS
        
        
       ! Calculate the Langmuir function value
-      WHERE ( tmask(:,:,1) == 1.)
+      WHERE ( smask0(:,:) == 1.)
          z_fla(:,:) = MAX( 1._wp, zla(:,:)**( -2._wp / 3._wp ) )  
       ELSEWHERE
          z_fla(:,:) = 0._wp
@@ -176,16 +176,16 @@ CONTAINS
       IMPLICIT NONE
       
       ! Function definition
-      REAL(wp), DIMENSION(jpi,jpj) :: t_imp
+      REAL(wp), DIMENSION(A2D(0)) :: t_imp
       ! Dummy variables
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: p_dsst     ! Delta SST
-      REAL(wp), INTENT(IN)                     :: p_rdt      ! Time-step
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: p_abflux   ! Heat forcing
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: p_fvel     ! Friction velocity
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: p_fla      ! Langmuir number
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: pmu        ! Structure parameter
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: pthick     ! Layer thickness
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: prho       ! Water density
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: p_dsst     ! Delta SST
+      REAL(wp), INTENT(IN)                    :: p_rdt      ! Time-step
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: p_abflux   ! Heat forcing
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: p_fvel     ! Friction velocity
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: p_fla      ! Langmuir number
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: pmu        ! Structure parameter
+      REAL(wp), DIMENSION(A2D(0)), INTENT(IN) :: pthick     ! Layer thickness
+      REAL(wp), DIMENSION(jpi,jpj),INTENT(IN) :: prho       ! Water density
    
       ! Local variables
       REAL(wp) :: z_olength          ! Obukhov length
@@ -198,10 +198,10 @@ CONTAINS
        
       INTEGER :: ji,jj
                      
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          
          ! Only calculate outside tmask
-         IF ( tmask(ji,jj,1) /= 1._wp ) THEN
+         IF ( smask0(ji,jj) /= 1._wp ) THEN
             t_imp(ji,jj) = 0._wp
             CYCLE   
          END IF
diff --git a/src/OCE/DIU/diu_coolskin.F90 b/src/OCE/DIU/diu_coolskin.F90
index 594a8b13..92ec5e84 100644
--- a/src/OCE/DIU/diu_coolskin.F90
+++ b/src/OCE/DIU/diu_coolskin.F90
@@ -59,7 +59,7 @@ MODULE diu_coolskin
       !! ** Reference :
       !!
       !!----------------------------------------------------------------------
-      ALLOCATE( x_csdsst(jpi,jpj), x_csthick(jpi,jpj) )
+      ALLOCATE( x_csdsst(A2D(0)), x_csthick(A2D(0)) )
       x_csdsst = 0.
       x_csthick = 0.
       !
@@ -77,16 +77,16 @@ MODULE diu_coolskin
       !! ** Reference :
       !!----------------------------------------------------------------------
       ! Dummy variables
-      REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: psqflux     ! Heat (non-solar)(Watts)
-      REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: pstauflux   ! Wind stress (kg/ m s^2)
+      REAL(wp), INTENT(IN), DIMENSION(A2D(0))  :: psqflux     ! Heat (non-solar)(Watts)
+      REAL(wp), INTENT(IN), DIMENSION(A2D(0))  :: pstauflux   ! Wind stress (kg/ m s^2)
       REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: psrho       ! Water density (kg/m^3)
       REAL(wp), INTENT(IN) :: pDt                             ! Time-step
 
       ! Local variables
-      REAL(wp), DIMENSION(jpi,jpj) :: z_fv                    ! Friction velocity
-      REAL(wp), DIMENSION(jpi,jpj) :: z_gamma                 ! Dimensionless function of wind speed
-      REAL(wp), DIMENSION(jpi,jpj) :: z_lamda                 ! Sauders (dimensionless) proportionality constant
-      REAL(wp), DIMENSION(jpi,jpj) :: z_wspd                  ! Wind speed (m/s)
+      REAL(wp), DIMENSION(A2D(0)) :: z_fv                     ! Friction velocity
+      REAL(wp), DIMENSION(A2D(0)) :: z_gamma                  ! Dimensionless function of wind speed
+      REAL(wp), DIMENSION(A2D(0)) :: z_lamda                  ! Sauders (dimensionless) proportionality constant
+      REAL(wp), DIMENSION(A2D(0)) :: z_wspd                   ! Wind speed (m/s)
       REAL(wp) :: z_ztx                                       ! Temporary u wind stress
       REAL(wp) :: z_zty                                       ! Temporary v wind stress
       REAL(wp) :: z_zmod                                      ! Temporary total wind stress
@@ -96,10 +96,10 @@ MODULE diu_coolskin
       !
       IF( .NOT. (ln_blk .OR. ln_abl) )   CALL ctl_stop("diu_coolskin.f90: diurnal flux processing only implemented for bulk forcing")
       !
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          !
          ! Calcualte wind speed from wind stress and friction velocity
-         IF( tmask(ji,jj,1) == 1. .AND. pstauflux(ji,jj) /= 0 .AND. psrho(ji,jj) /=0 ) THEN
+         IF( smask0(ji,jj) == 1. .AND. pstauflux(ji,jj) /= 0 .AND. psrho(ji,jj) /=0 ) THEN
             z_fv(ji,jj) = SQRT( pstauflux(ji,jj) / psrho(ji,jj) )
             z_wspd(ji,jj) = SQRT( pstauflux(ji,jj) / ( pp_cda * pp_rhoa ) )
          ELSE
@@ -108,28 +108,28 @@ MODULE diu_coolskin
          ENDIF
          !
          ! Calculate gamma function which is dependent upon wind speed
-         IF( tmask(ji,jj,1) == 1. ) THEN
+         IF( smask0(ji,jj) == 1. ) THEN
             IF( ( z_wspd(ji,jj) <= 7.5 ) ) z_gamma(ji,jj) = ( 0.2 * z_wspd(ji,jj) ) + 0.5
             IF( ( z_wspd(ji,jj) > 7.5 ) .AND. ( z_wspd(ji,jj) < 10. ) ) z_gamma(ji,jj) = ( 1.6 * z_wspd(ji,jj) ) - 10.
             IF( ( z_wspd(ji,jj) >= 10. ) ) z_gamma(ji,jj) = 6.
          ENDIF
          !
          ! Calculate lamda function
-         IF( tmask(ji,jj,1) == 1. .AND. z_fv(ji,jj) /= 0 ) THEN
+         IF( smask0(ji,jj) == 1. .AND. z_fv(ji,jj) /= 0 ) THEN
             z_lamda(ji,jj) = ( z_fv(ji,jj) * pp_k * pp_C ) / ( z_gamma(ji,jj) * psrho(ji,jj) * pp_cw * pp_h * pp_v )
          ELSE
             z_lamda(ji,jj) = 0.
          ENDIF
          !
          ! Calculate the cool skin thickness - only when heat flux is out of the ocean
-         IF( tmask(ji,jj,1) == 1. .AND. z_fv(ji,jj) /= 0 .AND. psqflux(ji,jj) < 0 ) THEN
+         IF( smask0(ji,jj) == 1. .AND. z_fv(ji,jj) /= 0 .AND. psqflux(ji,jj) < 0 ) THEN
             x_csthick(ji,jj) = ( z_lamda(ji,jj) * pp_v ) / z_fv(ji,jj)
          ELSE
             x_csthick(ji,jj) = 0.
          ENDIF
          !
          ! Calculate the cool skin correction - only when the heat flux is out of the ocean
-         IF( tmask(ji,jj,1) == 1. .AND. x_csthick(ji,jj) /= 0. .AND. psqflux(ji,jj) < 0. ) THEN
+         IF( smask0(ji,jj) == 1. .AND. x_csthick(ji,jj) /= 0. .AND. psqflux(ji,jj) < 0. ) THEN
             x_csdsst(ji,jj) = ( psqflux(ji,jj) * x_csthick(ji,jj) ) / pp_k
           ELSE
             x_csdsst(ji,jj) = 0.
diff --git a/src/OCE/DIU/step_diu.F90 b/src/OCE/DIU/step_diu.F90
index ed8baa71..a4b44e38 100644
--- a/src/OCE/DIU/step_diu.F90
+++ b/src/OCE/DIU/step_diu.F90
@@ -46,8 +46,7 @@ MODULE step_diu
       !!---------------------------------------------------------------------- 
       INTEGER ::   jk       ! dummy loop indices
       INTEGER ::   indic    ! error indicator if < 0 
-      REAL(wp), DIMENSION(jpi,jpj) :: z_fvel_bkginc, z_hflux_bkginc     
-      INTEGER :: Nbb, Nnn, Naa, Nrhs    ! local definitions as placeholders for now
+      INTEGER ::   Nbb, Nnn, Naa, Nrhs    ! local definitions as placeholders for now
       !! --------------------------------------------------------------------- 
       
       IF(ln_diurnal_only) THEN
diff --git a/src/OCE/DOM/closea.F90 b/src/OCE/DOM/closea.F90
index eb523c63..3505bb0f 100644
--- a/src/OCE/DOM/closea.F90
+++ b/src/OCE/DOM/closea.F90
@@ -51,6 +51,8 @@ MODULE closea
    INTEGER, PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: mask_csrnf , mask_csgrprnf !: mask of integers defining closed seas rnf mappings
    INTEGER, PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: mask_csemp , mask_csgrpemp !: mask of integers defining closed seas empmr mappings
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: closea.F90 13558 2020-10-02 15:30:22Z smasson $
@@ -173,17 +175,17 @@ CONTAINS
       !! ** Action  :   update (p_)mskrnf (set 1 at closed sea outflow)
       !!----------------------------------------------------------------------
       !! subroutine parameter
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   p_rnfmsk   ! river runoff mask (rnfmsk array)
-      !!
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   p_rnfmsk   ! river runoff mask (rnfmsk array)
       !! local variables
-      REAL(wp), DIMENSION(jpi,jpj) :: zmsk
+      INTEGER ::   ji, jj
+      INTEGER ::   zmsk
       !!----------------------------------------------------------------------
       !
       ! zmsk > 0 where cs river mouth defined (case rnf and emp)
-      zmsk(:,:) = ( mask_csgrprnf (:,:) + mask_csgrpemp(:,:) ) * mask_opnsea(:,:)
-      WHERE( zmsk(:,:) > 0 )
-         p_rnfmsk(:,:) = 1.0_wp
-      END WHERE
+      DO_2D( 0, 0, 0, 0 )
+         zmsk = ( mask_csgrprnf(ji,jj) + mask_csgrpemp(ji,jj) ) * mask_opnsea(ji,jj)
+         IF( zmsk > 0 )   p_rnfmsk(ji,jj) = 1.0_wp
+      END_2D
       !
    END SUBROUTINE clo_rnf
       
diff --git a/src/OCE/DOM/dom_oce.F90 b/src/OCE/DOM/dom_oce.F90
index cb50b135..75a49ead 100644
--- a/src/OCE/DOM/dom_oce.F90
+++ b/src/OCE/DOM/dom_oce.F90
@@ -27,6 +27,8 @@ MODULE dom_oce
 
    PUBLIC dom_oce_alloc  ! Called from nemogcm.F90
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! time & space domain namelist
    !! ----------------------------
@@ -38,6 +40,11 @@ MODULE dom_oce
    LOGICAL , PUBLIC ::   ln_1st_euler   !: =T start with forward time step or not (=F)
    LOGICAL , PUBLIC ::   ln_crs         !: Apply grid coarsening to dynamical model output or online passive tracers
    LOGICAL , PUBLIC ::   ln_c1d         !: =T  single column domain (1x1 pt)
+#if defined key_RK3
+   LOGICAL, PUBLIC, PARAMETER ::   lk_RK3    = .TRUE.   !: RK3 key flag
+#else
+   LOGICAL, PUBLIC, PARAMETER ::   lk_RK3    = .FALSE.  !: RK3 key flag
+#endif
 
    !! Free surface parameters
    !! =======================
@@ -74,10 +81,10 @@ MODULE dom_oce
    INTEGER         ::   nn_ltile_i, nn_ltile_j
 
    ! Domain tiling
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntsi_a       !: start of internal part of tile domain
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntsj_a       !
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntei_a       !: end of internal part of tile domain
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntej_a       !
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntsi_a       !: start of internal part of tile domain
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntsj_a       !
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntei_a       !: end of internal part of tile domain
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntej_a       !
    LOGICAL, PUBLIC                                  ::   l_istiled    ! whether tiling is currently active or not
 
    !                             !: domain MPP decomposition parameters
@@ -85,32 +92,30 @@ MODULE dom_oce
    INTEGER              , PUBLIC ::   narea            !: number for local area (starting at 1) = MPI rank + 1
    INTEGER,               PUBLIC ::   nidom      !: IOIPSL things...
 
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mig        !: local ==> global domain, including halos (jpiglo), i-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mjg        !: local ==> global domain, including halos (jpjglo), j-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mig0       !: local ==> global domain, excluding halos (Ni0glo), i-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mjg0       !: local ==> global domain, excluding halos (Nj0glo), j-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mi0, mi1   !: global, including halos (jpiglo) ==> local domain i-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mig        !: local ==> global domain, i-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mjg        !: local ==> global domain, j-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mi0, mi1   !: global ==> local domain, i-index
    !                                                                !:    (mi0=1 and mi1=0 if global index not in local domain)
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mj0, mj1   !: global, including halos (jpjglo) ==> local domain j-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mj0, mj1   !: global ==> local domain, j-index
    !                                                                !:    (mj0=1 and mj1=0 if global index not in local domain)
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   nfimpp, nfproc, nfjpi
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   nfimpp, nfproc, nfjpi, nfni_0
 
    !!----------------------------------------------------------------------
    !! horizontal curvilinear coordinate and scale factors
    !! ---------------------------------------------------------------------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   glamt , glamu, glamv , glamf    !: longitude at t, u, v, f-points [degree]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   gphit , gphiu, gphiv , gphif    !: latitude  at t, u, v, f-points [degree]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1t   , e2t  , r1_e1t, r1_e2t   !: t-point horizontal scale factors    [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1u   , e2u  , r1_e1u, r1_e2u   !: horizontal scale factors at u-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1v   , e2v  , r1_e1v, r1_e2v   !: horizontal scale factors at v-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1f   , e2f  , r1_e1f, r1_e2f   !: horizontal scale factors at f-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   glamt , glamu, glamv , glamf    !: longitude at t, u, v, f-points [degree]
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   gphit , gphiu, gphiv , gphif    !: latitude  at t, u, v, f-points [degree]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1t   , e2t  , r1_e1t, r1_e2t   !: t-point horizontal scale factors    [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1u   , e2u  , r1_e1u, r1_e2u   !: horizontal scale factors at u-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1v   , e2v  , r1_e1v, r1_e2v   !: horizontal scale factors at v-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1f   , e2f  , r1_e1f, r1_e2f   !: horizontal scale factors at f-point [m]
    !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2u , r1_e1e2u , e2_e1u       !: associated metrics at u-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2v , r1_e1e2v , e1_e2v       !: associated metrics at v-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2f , r1_e1e2f                !: associated metrics at f-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2u , r1_e1e2u , e2_e1u       !: associated metrics at u-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2v , r1_e1e2v , e1_e2v       !: associated metrics at v-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2f , r1_e1e2f                !: associated metrics at f-point
    !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ff_f  , ff_t                    !: Coriolis factor at f- & t-points  [1/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   ff_f  , ff_t                    !: Coriolis factor at f- & t-points  [1/s]
    
    !!----------------------------------------------------------------------
    !! vertical coordinate and scale factors
@@ -125,60 +130,105 @@ MODULE dom_oce
 #else
    LOGICAL, PUBLIC, PARAMETER ::   lk_linssh = .FALSE.  !: linssh key flag
 #endif
-   LOGICAL, PUBLIC ::   ln_zco       !: z-coordinate - full step
-   LOGICAL, PUBLIC ::   ln_zps       !: z-coordinate - partial step
-   LOGICAL, PUBLIC ::   ln_sco       !: s-coordinate or hybrid z-s coordinate
-   LOGICAL, PUBLIC ::   ln_isfcav    !: presence of ISF
-   !                                                        !  reference scale factors
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3t_0   !: t- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3u_0   !: u- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3v_0   !: v- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3f_0   !: f- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3w_0   !: w- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3uw_0   !: uw-vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3vw_0   !: vw-vert. scale factor [m]
-
-   !                                                        !  time-dependent scale factors     (domvvl)
-#if defined key_qco || defined key_linssh
+#if defined key_ALE
+   LOGICAL, PUBLIC, PARAMETER ::   lk_ALE    = .TRUE.   !: ALE key flag
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e3t, e3u, e3v, e3w, e3uw, e3vw  !: vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   e3f                             !: F-point vert. scale factor [m]
+   LOGICAL, PUBLIC, PARAMETER ::   lk_ALE    = .FALSE.  !: ALE key flag
 #endif
-   !                                                        !  time-dependent ratio ssh / h_0   (domqco)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v                   !: time-dependent    ratio at t-, u- and v-point [-]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3f                             !: mid-time-level    ratio at f-point            [-]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3t_f, r3u_f, r3v_f             !: now time-filtered ratio at t-, u- and v-point [-]
-
-   !                                                        !  reference depths of cells
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdept_0  !: t- depth              [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdepw_0  !: w- depth              [m]
-   
-   !                                                        !  time-dependent depths of cells   (domvvl)
-#if defined key_qco || defined key_linssh
+#if defined key_vco_1d
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_1d   = .TRUE.   !: zco key flag
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gde3w_0, gde3w !: w- depth (sum of e3w) [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   gdept, gdepw
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_1d   = .FALSE.  !: zco key flag
 #endif
-   !                                                        !  reference heights of ocean water column and its inverse
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht_0, r1_ht_0   !: t-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hu_0, r1_hu_0   !: u-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hv_0, r1_hv_0   !: v-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hf_0, r1_hf_0   !: f-depth        [m] and [1/m]
-   
-   !                                                        ! time-dependent heights of ocean water column   (domvvl)
-#if defined key_qco || defined key_linssh 
+#if defined key_vco_1d3d
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_1d3d = .TRUE.   !: zps key flag
+#else
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_1d3d = .FALSE.  !: zps key flag
+#endif
+#if defined key_vco_3d
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_3d   = .TRUE.   !: sco key flag
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht          !: t-points           [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hu, r1_hu   !: u-depth            [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hv, r1_hv   !: v-depth            [m] and [1/m]
+   LOGICAL, PUBLIC, PARAMETER ::   lk_vco_3d   = .FALSE.  !: sco key flag
 #endif
+
+!!gm obsolescent feature replaced by key_xxx ==>>>  to be removed when z-tilde and or ALE key added (and domvvl removed)
+   LOGICAL, PUBLIC ::   l_zco       !: z-coordinate - full step
+   LOGICAL, PUBLIC ::   l_zps       !: z-coordinate - partial step
+   LOGICAL, PUBLIC ::   l_sco       !: s-coordinate or hybrid z-s coordinate
+!!st for unknown reason this is init at TRUE in dbg mode   LOGICAL, PUBLIC ::   ln_isfcav    !: presence of ISF
+!!gm end
+
+   !        !-----------------------------------!
+   !        !  split of time & space variation  !      coord(i,j,k,t) = coord_0(i,j,k) * (1+rt(i,j,t))
+   !        !-----------------------------------!
+
+   !                    !==  reference thickness of ocean water column and its inverse  ==!   (all coord. except ALE/z-tilde)
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   ht_0, r1_ht_0   !: t-depth   [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hu_0, r1_hu_0   !: u-depth   [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hv_0, r1_hv_0   !: v-depth   [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hf_0, r1_hf_0   !: f-depth   [m] and [1/m]
+   
+
+   !                    !==  1D reference coordinate  ==!   used in zco and zps cases (z- or z-partial cell coord.)
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:)     ::   gdept_1d, e3t_1d   !: reference depth & scale factor of T-level points [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:)     ::   gdepw_1d, e3w_1d   !: reference depth & scale factor of W-level points [m]
+
+
+   !                    !==  3D reference coordinate  ==!   used in zps and sco cases (z-partial cell ans s- coord.)
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   gdept_3d   !: t- depth                [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   gdepw_3d   !: w- depth                [m]
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3t_3d   !: t- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3u_3d   !: u- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3v_3d   !: v- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3f_3d   !: f- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3w_3d   !: w- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::    e3uw_3d   !: uw-vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::    e3vw_3d   !: vw-vert. scale factor   [m]
+
+   !                    !==  time varying factor  ==!   used in qco case (quasi-eulerian coordinate) 
+   !                                                                           !!!  time-dependent ratio ssh / h_0   (domqco)
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v         !: time-dependent    ratio at t-, u- and v-point [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   r3f                   !: mid-time-level    ratio at f-point            [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   r3t_f, r3u_f, r3v_f   !: now time-filtered ratio at t-, u- and v-point [-]
+   
+   !        !----------------------------------------!
+   !        !  combined of time & space variations   !      coord(i,j,k,t)
+   !        !----------------------------------------!
+
+   !                    !==  z-tilde or ALE case  ==!   default : time-dependent coord.   (currently use of domvvl old staff)
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   ht          !: t-points           [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   hu, r1_hu   !: u-depth            [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   hv, r1_hv   !: v-depth            [m] and [1/m]
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::   gdept     !: t- depth                [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::   gdepw     !: w- depth                [m]
+   !
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::       e3t   !: t- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::       e3u   !: u- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::       e3v   !: v- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::       e3f   !: f- vert. scale factor   [m]   (only need at Nmm)
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::       e3w   !: w- vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::      e3uw   !: uw-vert. scale factor   [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::      e3vw   !: vw-vert. scale factor   [m]
+
+   
+!!gm this is to be replaced by a 2D field for sco  
    INTEGER, PUBLIC ::   nla10              !: deepest    W level Above  ~10m (nlb10 - 1)
    INTEGER, PUBLIC ::   nlb10              !: shallowest W level Bellow ~10m (nla10 + 1)
 
-   !! 1D reference  vertical coordinate
-   !! =-----------------====------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   gdept_1d, gdepw_1d !: reference depth of t- and w-points (m)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   e3t_1d  , e3w_1d   !: reference vertical scale factors at T- and W-pts (m)
+!!gm bathy should be removed  use ht_0 or ht-ssh
+#if defined key_isf
+   LOGICAL, PUBLIC, PARAMETER ::   lk_isf    = .TRUE.   !: isf key flag
+#else
+   LOGICAL, PUBLIC, PARAMETER ::   lk_isf    = .FALSE.  !: isf key flag
+#endif
+   LOGICAL, PUBLIC            ::   ln_isfcav = .FALSE.  !: absence of ISF (init for debug mode)
+
 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   risfdep, bathy
 
@@ -186,20 +236,22 @@ MODULE dom_oce
    !! masks, top and bottom ocean point position
    !! ---------------------------------------------------------------------
 !!gm Proposition of new name for top/bottom vertical indices
-!   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mtk_t, mtk_u, mtk_v   !: top    first wet T-, U-, and V-level (ISF)
-!   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbk_t, mbk_u, mbk_v   !: bottom last  wet T-, U-, and V-level
+!   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mtk_t, mtk_u, mtk_v   !: top    first wet T-, U-, and V-level (ISF)
+!   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mbk_t, mbk_u, mbk_v   !: bottom last  wet T-, U-, and V-level
 !!gm
-   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbkt, mbku, mbkv, mbkf   !: bottom last wet T-, U-, V- and F-level
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i                  !: interior (excluding halos+duplicated points) domain T-point mask
+   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mbkt, mbku, mbkv, mbkf   !: bottom last wet T-, U-, V- and F-level
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   tmask_i                  !: interior (excluding halos+duplicated points) domain T-point mask
 
-   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf   !: top first wet T-, U-, V-, F-level           (ISF)
+   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf   !: top first wet T-, U-, V-, F-level           (ISF)
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   ssmask, ssumask, ssvmask, ssfmask   !: surface mask at T-,U-, V- and F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_upd, umask_upd, vmask_upd                 !: agrif mask defining barotropic update 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_agrif                !: agrif mask at T-points excluding ghosts and updated areas 
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)           ::   smask0                              !: surface mask at T-pts on inner domain
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)           ::   smask0_i                            !: equivalent of tmask_i for inner domain
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)           ::   ssmask, ssumask, ssvmask, ssfmask   !: surface mask at T-,U-, V- and F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tmask_upd, umask_upd, vmask_upd                 !: land/ocean mask at F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tmask_agrif                !: agrif mask at T-points excluding ghosts and updated areas 
 
    !!----------------------------------------------------------------------
    !! calendar variables
@@ -284,50 +336,76 @@ CONTAINS
          &      e1e2v(jpi,jpj) , r1_e1e2v(jpi,jpj) , e1_e2v(jpi,jpj)                   ,     &
          &      e1e2f(jpi,jpj) , r1_e1e2f(jpi,jpj)                                     ,     &
          &      ff_f (jpi,jpj) ,    ff_t (jpi,jpj)                                     , STAT=ierr(ii) )
+      !
+      !           !=====================!
+      !           !==  vertical mesh  ==!   gdep and e3 arrays allocation
+      !           !=====================!
+      !                                   !-----------------------------------!
+      IF( lk_qco .OR. lk_linssh ) THEN    !-  split time & space variations  -!    qco or linear ssh
+         !                                !-----------------------------------!
+         ii = ii+1
+         ALLOCATE( ht_0(jpi,jpj) ,    hu_0(jpi,jpj)    ,    hv_0(jpi,jpj)     , hf_0(jpi,jpj) ,       &
+            &   r1_ht_0(jpi,jpj) , r1_hu_0(jpi,jpj) ,    r1_hv_0(jpi,jpj),   r1_hf_0(jpi,jpj) ,   STAT=ierr(ii)  )
          !
-      ii = ii+1
-      ALLOCATE( gdept_0 (jpi,jpj,jpk) , gdepw_0 (jpi,jpj,jpk) ,     &
-         &      gdept_1d(        jpk) , gdepw_1d(        jpk)                        , STAT=ierr(ii) )
-         !
-      ii = ii+1
-      ALLOCATE(  e3t_0 (jpi,jpj,jpk) , e3u_0 (jpi,jpj,jpk) , e3v_0 (jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) ,     &
-         &       e3w_0 (jpi,jpj,jpk) , e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk)                      ,     &
-         &       e3t_1d(        jpk) , e3w_1d(        jpk)                                            , STAT=ierr(ii) )
-         !
-      ii = ii+1
-      ALLOCATE( ht_0(jpi,jpj) ,    hu_0(jpi,jpj)    ,    hv_0(jpi,jpj)     , hf_0(jpi,jpj) ,       &
-         &   r1_ht_0(jpi,jpj) , r1_hu_0(jpi,jpj) ,    r1_hv_0(jpi,jpj),   r1_hf_0(jpi,jpj) ,   STAT=ierr(ii)  )
-         !
-#if defined key_qco
-         ! qco : ssh to h ratio and specific fmask
-      ii = ii+1
-      ALLOCATE( r3t  (jpi,jpj,jpt) , r3u  (jpi,jpj,jpt) , r3v  (jpi,jpj,jpt) , r3f  (jpi,jpj) ,      &
-         &      r3t_f(jpi,jpj)     , r3u_f(jpi,jpj)     , r3v_f(jpi,jpj)                      ,  STAT=ierr(ii) )
+         IF( lk_qco ) THEN                !* qco only :   time variation factor (ssh/h ratio)
+            ii = ii+1
+            ALLOCATE( r3t(jpi,jpj,jpt) , r3u(jpi,jpj,jpt) , r3v(jpi,jpj,jpt) , r3f(jpi,jpj) ,   STAT=ierr(ii) )
+            !
+            IF( .NOT. lk_RK3 ) THEN       !   +  MLF  :   Asselin filter applied to r3. at f-point
+               ii = ii+1            
+               ALLOCATE( r3t_f(jpi,jpj) , r3u_f(jpi,jpj) , r3v_f(jpi,jpj) ,   STAT=ierr(ii) )
+            ENDIF
+         ENDIF
          !
-      ii = ii+1
+         ii = ii+1
+         IF(     lk_vco_1d ) THEN         !* zco :   allocate 1d vertical arrays for all gdep and e3 fields
+            !
+            ALLOCATE(        gdept_1d(jpk) ,        gdepw_1d(jpk) ,       &
+               &               e3t_1d(jpk) ,          e3w_1d(jpk) ,   STAT=ierr(ii) )
+               !
+         ELSEIF( lk_vco_1d3d ) THEN       !* zps :   allocate 1d vertical arrays, except t-level e3 !!st WHT not ??? 
+            !                 
+            ALLOCATE(        gdept_1d(jpk) ,        gdepw_1d(jpk) ,       &
+               &               e3t_1d(jpk) ,          e3w_1d(jpk) ,       &
+               &       e3t_3d(jpi,jpj,jpk) ,  e3u_3d(jpi,jpj,jpk) ,       &
+               &       e3v_3d(jpi,jpj,jpk) ,  e3f_3d(jpi,jpj,jpk) ,   STAT=ierr(ii) )
+         ELSEIF( lk_vco_3d ) THEN
+            !                             !* sco :   allocate 3d vertical arrays for all gdep and e3 fields (no more _1d) !!st WHT not ???
+            ALLOCATE(        gdept_1d(jpk) ,        gdepw_1d(jpk) ,       &
+               &               e3t_1d(jpk) ,          e3w_1d(jpk) ,       &
+               &     gdept_3d(jpi,jpj,jpk) ,gdepw_3d(jpi,jpj,jpk) ,       &
+               &       e3t_3d(jpi,jpj,jpk) ,  e3u_3d(jpi,jpj,jpk) ,       &
+               &       e3v_3d(jpi,jpj,jpk) ,  e3f_3d(jpi,jpj,jpk) ,       &
+               &       e3w_3d(jpi,jpj,jpk) , e3uw_3d(jpi,jpj,jpk) ,       &
+               &                             e3vw_3d(jpi,jpj,jpk) ,   STAT=ierr(ii) )
+         ENDIF !!st on ne devrait pas mettre un STOP/WARNING quelque part si aucune clé de coordonnée n'est spécifiée ? 
+         !                                !-------------------------------------!
+      ELSEIF( lk_ALE ) THEN               !-  combine time & space variations  -!   (vertical ALE coordinate)
+         !                                !-------------------------------------!      NOT yet implemented
+         !!st ca ne devrait pas etre des *_0 qui varient dans le temps ? 
+         ii = ii+1
+         ALLOCATE(    ht(jpi,jpj,jpt) ,    hu(jpi,jpj,jpt) ,      hv(jpi,jpj,jpt) ,       &
+            &                           r1_hu(jpi,jpj,jpt) , r1_hv  (jpi,jpj,jpt) ,   STAT=ierr(ii)  )
          !
-#elif defined key_linssh
-         ! linear ssh no time varying coordinate arrays
-#else
-         ! vvl : time varation for all vertical coordinate variables
-      ii = ii+1
-      ALLOCATE( gdept  (jpi,jpj,jpk,jpt) , gdepw  (jpi,jpj,jpk,jpt) ,     &
-         &      gde3w_0(jpi,jpj,jpk)     , gde3w  (jpi,jpj,jpk)     , STAT=ierr(ii) )
+         ii = ii+1
+         ALLOCATE( gdept(jpi,jpj,jpk,jpt) , gdepw(jpi,jpj,jpk,jpt) ,       &
+            &        e3t(jpi,jpj,jpk,jpt) ,   e3u(jpi,jpj,jpk,jpt) ,       &
+            &        e3v(jpi,jpj,jpk,jpt) ,   e3f(jpi,jpj,jpk)     ,       &
+            &        e3w(jpi,jpj,jpk,jpt) ,  e3uw(jpi,jpj,jpk,jpt) ,       &
+            &                                e3vw(jpi,jpj,jpk,jpt) ,   STAT=ierr(ii) )
+         !                                !-------------------------------------!
+      ELSE                                !-       use old domvvl module       -!   (default : old z-tilde coord)
+         !                                !-------------------------------------!
          !
-      ii = ii+1
-      ALLOCATE( e3t(jpi,jpj,jpk,jpt) , e3u (jpi,jpj,jpk,jpt) , e3v (jpi,jpj,jpk,jpt) , e3f(jpi,jpj,jpk) ,      &
-         &      e3w(jpi,jpj,jpk,jpt) , e3uw(jpi,jpj,jpk,jpt) , e3vw(jpi,jpj,jpk,jpt)                    ,  STAT=ierr(ii) )
+         ! mettre un STOP/WARNING 
          !
-      ii = ii+1
-      ALLOCATE( ht  (jpi,jpj) ,    hu  (jpi,jpj,jpt),    hv  (jpi,jpj,jpt) ,       &
-         &                      r1_hu  (jpi,jpj,jpt), r1_hv  (jpi,jpj,jpt) ,   STAT=ierr(ii)  )
-#endif
+      ENDIF
          !
       ii = ii+1
       ALLOCATE( risfdep(jpi,jpj) , bathy(jpi,jpj) , STAT=ierr(ii)  )
          !
       ii = ii+1
-      ALLOCATE( tmask_i(jpi,jpj) ,                                                              &
+      ALLOCATE( tmask_i(jpi,jpj) , smask0(A2D(0)) , smask0_i(A2D(0)) , &
          &      ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , ssfmask(jpi,jpj) ,     &
          &      mbkt   (jpi,jpj) , mbku   (jpi,jpj) , mbkv   (jpi,jpj) , mbkf(jpi,jpj)    , STAT=ierr(ii) )
          !
diff --git a/src/OCE/DOM/domain.F90 b/src/OCE/DOM/domain.F90
index dbbe4a90..07d5d884 100644
--- a/src/OCE/DOM/domain.F90
+++ b/src/OCE/DOM/domain.F90
@@ -31,8 +31,6 @@ MODULE domain
    USE domqco         ! quasi-eulerian coord.
 #elif defined key_linssh
    !                  ! fix in time coord.
-#else
-   USE domvvl         ! variable volume coord.
 #endif
 #if defined key_agrif
    USE agrif_oce_interp, ONLY : Agrif_istate_ssh ! ssh interpolated from parent
@@ -65,6 +63,7 @@ MODULE domain
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!-------------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: domain.F90 14547 2021-02-25 17:07:15Z techene $
@@ -195,39 +194,6 @@ CONTAINS
       IF( .NOT.l_offline )   CALL dom_qco_init( Kbb, Kmm, Kaa )
 #elif defined key_linssh
       !                                 != Fix in time : key_linssh case, set through domzgr_substitute.h90
-#else
-      !
-      IF( ln_linssh ) THEN              != Fix in time : set to the reference one for all
-         !
-         DO jt = 1, jpt                         ! depth of t- and w-grid-points
-            gdept(:,:,:,jt) = gdept_0(:,:,:)
-            gdepw(:,:,:,jt) = gdepw_0(:,:,:)
-         END DO
-            gde3w(:,:,:)    = gde3w_0(:,:,:)    ! = gdept as the sum of e3t
-         !
-         DO jt = 1, jpt                         ! vertical scale factors
-            e3t (:,:,:,jt) =  e3t_0(:,:,:)
-            e3u (:,:,:,jt) =  e3u_0(:,:,:)
-            e3v (:,:,:,jt) =  e3v_0(:,:,:)
-            e3w (:,:,:,jt) =  e3w_0(:,:,:)
-            e3uw(:,:,:,jt) = e3uw_0(:,:,:)
-            e3vw(:,:,:,jt) = e3vw_0(:,:,:)
-         END DO
-            e3f (:,:,:)    =  e3f_0(:,:,:)
-         !
-         DO jt = 1, jpt                         ! water column thickness and its inverse
-               hu(:,:,jt) =    hu_0(:,:)
-               hv(:,:,jt) =    hv_0(:,:)
-            r1_hu(:,:,jt) = r1_hu_0(:,:)
-            r1_hv(:,:,jt) = r1_hv_0(:,:)
-         END DO
-               ht   (:,:) =    ht_0(:,:)
-         !
-      ELSE                              != Time varying : initialize before/now/after variables
-         !
-         IF( .NOT.l_offline )   CALL dom_vvl_init( Kbb, Kmm, Kaa )
-         !
-      ENDIF
 #endif
 
       !
@@ -263,7 +229,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       USE ioipsl
       !!
-      INTEGER ::   ios   ! Local integer
+      INTEGER ::   ios, imax   ! Local integer
       REAL(wp)::   zrdt
       !!----------------------------------------------------------------------
       !
@@ -515,8 +481,40 @@ CONTAINS
          WRITE(numout,*)
          WRITE(numout,*)    '   Namelist : namtile   ---   Domain tiling decomposition'
          WRITE(numout,*)    '      Tiling (T) or not (F)                ln_tile    = ', ln_tile
-         WRITE(numout,*)    '      Length of tile in i                  nn_ltile_i = ', nn_ltile_i
-         WRITE(numout,*)    '      Length of tile in j                  nn_ltile_j = ', nn_ltile_j
+      ENDIF
+
+      ! is_tile in domutl uses the array size to determine if the array represents a tile or the full domain.
+      ! To avoid ambiguity, either the tile must be the size of the full domain (i.e. nn_ltile_i = Ni_0), or the largest
+      ! possible tile array (internal and halo points) must be smaller than the internal area of the full domain
+      IF( ln_tile ) THEN
+         IF(lwp) WRITE(numout,*)    '      Length of tile in i                  nn_ltile_i = ', nn_ltile_i
+
+         imax = Ni_0 - (2 * nn_hls) - 1
+         IF( imax < 1 ) imax = Ni_0                      ! Avoid zero tile size for small domains
+         IF( nn_ltile_i > imax .AND. nn_ltile_i /= Ni_0 ) THEN
+            IF( nn_ltile_i < Ni_0 ) THEN
+               nn_ltile_i = MIN( nn_ltile_i, imax )      ! 2+ tiles
+            ELSE
+               nn_ltile_i = MIN( nn_ltile_i, Ni_0 )      ! 1 tile
+            ENDIF
+            IF(lwp) WRITE(numout,*)    '         ===> Reduced to size ', nn_ltile_i
+         ENDIF
+
+         IF(lwp) WRITE(numout,*)    '      Length of tile in j                  nn_ltile_j = ', nn_ltile_j
+
+         imax = Nj_0 - (2 * nn_hls) - 1
+         IF( imax < 1 ) imax = Nj_0                      ! Avoid zero tile size for small domains
+         IF( nn_ltile_j > imax .AND. nn_ltile_j /= Nj_0 ) THEN
+            IF( nn_ltile_j < Nj_0 ) THEN
+               nn_ltile_j = MIN( nn_ltile_j, imax )      ! 2+ tiles
+            ELSE
+               nn_ltile_j = MIN( nn_ltile_j, Nj_0 )      ! 1 tile
+            ENDIF
+            IF(lwp) WRITE(numout,*)    '         ===> Reduced to size ', nn_ltile_j
+         ENDIF
+      ENDIF
+
+      IF(lwp) THEN
          WRITE(numout,*)
          IF( ln_tile ) THEN
             WRITE(numout,*) '      The domain will be decomposed into tiles of size', nn_ltile_i, 'x', nn_ltile_j
@@ -707,6 +705,7 @@ CONTAINS
       INTEGER           ::   inum     ! local units
       CHARACTER(len=21) ::   clnam    ! filename (mesh and mask informations)
       REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! workspace
+      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z3d   ! workspace
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -734,9 +733,9 @@ CONTAINS
       CALL iom_putatt( inum, 'NFtype',          c_NFtype     )
 
       !                                   ! type of vertical coordinate
-      IF(ln_zco)   CALL iom_putatt( inum, 'VertCoord', 'zco' )
-      IF(ln_zps)   CALL iom_putatt( inum, 'VertCoord', 'zps' )
-      IF(ln_sco)   CALL iom_putatt( inum, 'VertCoord', 'sco' )
+      IF(l_zco)   CALL iom_putatt( inum, 'VertCoord', 'zco' )
+      IF(l_zps)   CALL iom_putatt( inum, 'VertCoord', 'zps' )
+      IF(l_sco)   CALL iom_putatt( inum, 'VertCoord', 'sco' )
       
       !                                   ! ocean cavities under iceshelves
       CALL iom_putatt( inum, 'IsfCav', COUNT( (/ln_isfcav/) ) )
@@ -771,20 +770,41 @@ CONTAINS
       CALL iom_rstput( 0, 0, inum, 'e3t_1d'  , e3t_1d , ktype = jp_r8 )   ! reference 1D-coordinate
       CALL iom_rstput( 0, 0, inum, 'e3w_1d'  , e3w_1d , ktype = jp_r8 )
       !
-      CALL iom_rstput( 0, 0, inum, 'e3t_0'   , e3t_0  , ktype = jp_r8 )   ! vertical scale factors
-      CALL iom_rstput( 0, 0, inum, 'e3u_0'   , e3u_0  , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'e3v_0'   , e3v_0  , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'e3f_0'   , e3f_0  , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'e3w_0'   , e3w_0  , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'e3uw_0'  , e3uw_0 , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'e3vw_0'  , e3vw_0 , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3t_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3t_0'   , z3d  , ktype = jp_r8 )   ! vertical scale factors
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3u_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3u_0'   , z3d  , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3v_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3v_0'   , z3d  , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3f_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3f_0'   , z3d  , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3w_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3w_0'   , z3d  , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3uw_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3uw_0'  , z3d , ktype = jp_r8 )
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         z3d(ji,jj,jk) = e3vw_0(ji,jj,jk)
+      END_3D
+      CALL iom_rstput( 0, 0, inum, 'e3vw_0'  , z3d , ktype = jp_r8 )
       !
       !                             !==  wet top and bottom level  ==!   (caution: multiplied by ssmask)
       !
       CALL iom_rstput( 0, 0, inum, 'top_level'    , REAL( mikt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points (ISF)
       CALL iom_rstput( 0, 0, inum, 'bottom_level' , REAL( mbkt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points
       !
-      IF( ln_sco ) THEN             ! s-coordinate: store grid stiffness ratio  (Not required anyway)
+      IF( l_sco ) THEN             ! s-coordinate: store grid stiffness ratio  (Not required anyway)
          CALL dom_stiff( z2d )
          CALL iom_rstput( 0, 0, inum, 'stiffness', z2d )        !    ! Max. grid stiffness ratio
       ENDIF
diff --git a/src/OCE/DOM/dommsk.F90 b/src/OCE/DOM/dommsk.F90
index 362b11e3..77fcef60 100644
--- a/src/OCE/DOM/dommsk.F90
+++ b/src/OCE/DOM/dommsk.F90
@@ -144,7 +144,8 @@ CONTAINS
             tmask(ji,jj,jk) = tmask(ji,jj,jk) * bdytmask(ji,jj)
          END_3D
       ENDIF
-         
+      smask0(:,:) = tmask(A2D(0),1)
+      
       !  Ocean/land mask at u-, v-, and f-points   (computed from tmask)
       ! ----------------------------------------
       ! NB: at this point, fmask is designed for free slip lateral boundary condition
@@ -203,7 +204,8 @@ CONTAINS
       ! --------------------
       !
       CALL dom_uniq( tmask_i, 'T' )
-      tmask_i(:,:) = ssmask(:,:) * tmask_i(:,:)
+      tmask_i (:,:) = ssmask(:,:) * tmask_i(:,:)
+      smask0_i(:,:) = tmask_i(A2D(0))
 
       ! Lateral boundary conditions on velocity (modify fmask)
       ! ---------------------------------------  
diff --git a/src/OCE/DOM/domqco.F90 b/src/OCE/DOM/domqco.F90
index 5944f59c..678fd864 100644
--- a/src/OCE/DOM/domqco.F90
+++ b/src/OCE/DOM/domqco.F90
@@ -180,9 +180,9 @@ CONTAINS
             ! round brackets added to fix the order of floating point operations
             ! needed to ensure halo 1 - halo 2 compatibility
             pr3f(ji,jj) = 0.25_wp * (   (  e1e2t(ji  ,jj  ) * pssh(ji  ,jj  )      &
-               &                         + e1e2t(ji+1,jj  ) * pssh(ji+1,jj  )  )   & ! bracket for halo 1 - halo 2 compatibility
+               &                         + e1e2t(ji+1,jj  ) * pssh(ji+1,jj  )  )   & ! add () for  NP reproducibility
                &                     +  (  e1e2t(ji  ,jj+1) * pssh(ji  ,jj+1)      &
-               &                         + e1e2t(ji+1,jj+1) * pssh(ji+1,jj+1)  )   & ! bracket for halo 1 - halo 2 compatibility
+               &                         + e1e2t(ji+1,jj+1) * pssh(ji+1,jj+1)  )   & ! add () for NP reproducibility
                &                    ) * r1_hf_0(ji,jj) * r1_e1e2f(ji,jj)
          END_2D
          !                                                 ! lbc on ratio at u-,v-,f-points
@@ -247,9 +247,9 @@ CONTAINS
          ! round brackets added to fix the order of floating point operations
          ! needed to ensure halo 1 - halo 2 compatibility
          pr3f(ji,jj) = 0.25_wp * (   (  e1e2t(ji  ,jj  ) * pssh(ji  ,jj  )      &
-            &                         + e1e2t(ji+1,jj  ) * pssh(ji+1,jj  )  )   & ! bracket for halo 1 - halo 2 compatibility
+            &                         + e1e2t(ji+1,jj  ) * pssh(ji+1,jj  )  )   & ! add () for  NP reproducibility
             &                     +  (  e1e2t(ji  ,jj+1) * pssh(ji  ,jj+1)      &
-            &                         + e1e2t(ji+1,jj+1) * pssh(ji+1,jj+1)  )   & ! bracket for halo 1 - halo 2 compatibility
+            &                         + e1e2t(ji+1,jj+1) * pssh(ji+1,jj+1)  )   & ! add () for  NP reproducibility
             &                    ) * r1_hf_0(ji,jj) * r1_e1e2f(ji,jj)
       END_2D
 !!st         ELSE                                      !- Flux Form   (simple averaging)
@@ -258,7 +258,7 @@ CONTAINS
          ! round brackets added to fix the order of floating point operations
          ! needed to ensure halo 1 - halo 2 compatibility
          pr3f(ji,jj) = 0.25_wp * (   (  pssh(ji,jj  ) + pssh(ji+1,jj  )  )   &
-            &                     +  (  pssh(ji,jj+1) + pssh(ji+1,jj+1)  )   & ! bracket for halo 1 - halo 2 compatibility
+            &                     +  (  pssh(ji,jj+1) + pssh(ji+1,jj+1)  )   & ! add () for  NP reproducibility
             &                    ) * r1_hf_0(ji,jj)
       END_2D
 !!st         ENDIF
diff --git a/src/OCE/DOM/domutl.F90 b/src/OCE/DOM/domutl.F90
index 0c56f8f1..0af7f93f 100644
--- a/src/OCE/DOM/domutl.F90
+++ b/src/OCE/DOM/domutl.F90
@@ -20,13 +20,17 @@ MODULE domutl
    IMPLICIT NONE
    PRIVATE
 
-   INTERFACE is_tile
-      MODULE PROCEDURE is_tile_2d_sp, is_tile_3d_sp, is_tile_4d_sp, is_tile_2d_dp, is_tile_3d_dp, is_tile_4d_dp
-   END INTERFACE is_tile
+   INTERFACE lbnd_ij
+      MODULE PROCEDURE arr_lbnd_2d_i,  arr_lbnd_3d_i,  arr_lbnd_4d_i,  arr_lbnd_5d_i,  &
+         &             arr_lbnd_2d_sp, arr_lbnd_3d_sp, arr_lbnd_4d_sp, arr_lbnd_5d_sp, &
+         &             arr_lbnd_2d_dp, arr_lbnd_3d_dp, arr_lbnd_4d_dp, arr_lbnd_5d_dp
+   END INTERFACE lbnd_ij
 
    PUBLIC dom_ngb    ! routine called in iom.F90 module
    PUBLIC dom_uniq   ! Called by dommsk and domwri
    PUBLIC is_tile
+   PUBLIC lbnd_ij
+   PUBLIC arr_hls
 
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.2 , NEMO Consortium (2020)
@@ -115,69 +119,199 @@ CONTAINS
    END SUBROUTINE dom_uniq
 
 
-   INTEGER FUNCTION is_tile_2d_sp( pt )
-      REAL(sp), DIMENSION(:,:), INTENT(in) ::   pt
-
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_2d_sp = 1
+   FUNCTION arr_lbnd( kasi, kasj, ldtile ) RESULT(kbnd)
+      !!----------------------------------------------------------------------
+      !!                  ***  FUNCTION arr_lbnd  ***
+      !!
+      !! ** Purpose :   Determine the lower bounds of an array's internal area from its i-j shape
+      !!
+      !! ** Method  :   1) Identify whether the array shape corresponds to a tile or MPI domain (is_tile)
+      !!                2) Compare the array shape to the internal area shape to get the halo size
+      !!                3) Determine the lower bounds of the internal area
+      !!----------------------------------------------------------------------
+      INTEGER, INTENT(in)           :: kasi, kasj                 ! Size of i, j dimensions
+      LOGICAL, INTENT(in), OPTIONAL :: ldtile                     ! Is the array on the tile (T) or MPI (F) domain?
+      !
+      INTEGER, DIMENSION(2) :: kbnd                               ! Lower bounds of i, j dimensions
+      INTEGER, DIMENSION(2) :: ihls                               ! Halo size along i, j dimensions
+      LOGICAL :: lltile                                           ! Is the array on the tile (T) or MPI (F) domain?
+      !!----------------------------------------------------------------------
+      ! Is this array on the tile or MPI domain?
+      IF( PRESENT(ldtile) ) THEN
+         lltile = ldtile
       ELSE
-         is_tile_2d_sp = 0
+         lltile = is_tile(kasi, kasj)
       ENDIF
-   END FUNCTION is_tile_2d_sp
 
+      ! Halo size
+      ihls = arr_hls(kasi, kasj, ldtile=lltile, ldsize=.TRUE.)
 
-   INTEGER FUNCTION is_tile_2d_dp( pt )
-      REAL(dp), DIMENSION(:,:), INTENT(in) ::   pt
+      ! Lower bounds
+      IF( lltile ) THEN                      ! Tile domain
+         kbnd(1) = ntsi - ihls(1)
+         kbnd(2) = ntsj - ihls(2)
+      ELSE                                   ! MPI domain
+         kbnd(1) = Nis0 - ihls(1)
+         kbnd(2) = Njs0 - ihls(2)
+      ENDIF
+   END FUNCTION arr_lbnd
+
+
+   FUNCTION arr_hls( kasi, kasj, ldtile, ldsize ) RESULT(khls)
+      !!----------------------------------------------------------------------
+      !!                  ***  FUNCTION arr_hls  ***
+      !!
+      !! ** Purpose :   Determine the halo size or number of halo points in an array from its i-j shape
+      !!
+      !! ** Method  :   Compare the array shape to that of the MPI domain internal area
+      !!----------------------------------------------------------------------
+      INTEGER, INTENT(in)           :: kasi, kasj                 ! Size of i, j dimensions
+      LOGICAL, INTENT(in), OPTIONAL :: ldtile                     ! Is the array on the tile (T) or MPI (F) domain?
+      LOGICAL, INTENT(in), OPTIONAL :: ldsize                     ! Return the halo size (T) or total number of halo points (F)
+      !
+      INTEGER, DIMENSION(2) :: khls                               ! No. halo points or halo size along i, j dimensions
+      LOGICAL               :: lltile, llsize
+      !!----------------------------------------------------------------------
+      llsize = .FALSE.
+      IF( PRESENT(ldsize) ) llsize = ldsize
 
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_2d_dp = 1
+      IF( PRESENT(ldtile) ) THEN                                  ! Is this array on the tile or MPI domain?
+         lltile = ldtile
       ELSE
-         is_tile_2d_dp = 0
+         lltile = is_tile(kasi, kasj)
+      ENDIF
+
+      ! Number of halo points
+      IF( lltile ) THEN                                           ! Tile domain (smaller than MPI domain internal area)
+         khls(1) = kasi - (ntei - ntsi + 1)
+         khls(2) = kasj - (ntej - ntsj + 1)
+      ELSE                                                        ! MPI domain
+         khls(1) = kasi - Ni_0
+         khls(2) = kasj - Nj_0
       ENDIF
-   END FUNCTION is_tile_2d_dp
+
+      ! Halo size
+      IF( llsize ) THEN
+         IF( MOD(khls(1), 2) == 1 .OR. MOD(khls(2), 2) == 1 ) THEN
+            WRITE(ctmp1,*) 'Cannot determine halo size of an array with an odd number of i-j halo points:'
+            WRITE(ctmp2,*) khls(1), 'x', khls(2)
+            CALL ctl_stop('STOP', ctmp1, ctmp2)                         ! Stop before out of bounds errors
+         ELSE
+            khls(1) = khls(1) / 2
+            khls(2) = khls(2) / 2
+         ENDIF
+      ENDIF
+   END FUNCTION arr_hls
+
+
+   LOGICAL FUNCTION is_tile( kasi, kasj )
+      !!----------------------------------------------------------------------
+      !!                  ***  FUNCTION is_tile  ***
+      !!
+      !! ** Purpose :   Determine whether an array's shape corresponds to a tile or MPI domain
+      !!
+      !! ** Method  :   Compare the array shape to that of the MPI domain internal area.
+      !!                The maximum tile size is limited (in domain.F90) to ensure this is not ambiguous.
+      !!----------------------------------------------------------------------
+      INTEGER, INTENT(in) :: kasi, kasj                           ! Size of i, j dimensions
+      !!----------------------------------------------------------------------
+      is_tile = l_istiled .AND. (kasi < Ni_0 .OR. kasj < Nj_0)
+   END FUNCTION is_tile
+
+
+   FUNCTION arr_lbnd_2d_i( pt ) RESULT(kbnd)
+      INTEGER, DIMENSION(:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_2d_i
 
 
-   INTEGER FUNCTION is_tile_3d_sp( pt )
+   FUNCTION arr_lbnd_2d_sp( pt ) RESULT(kbnd)
+      REAL(sp), DIMENSION(:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_2d_sp
+
+
+   FUNCTION arr_lbnd_2d_dp( pt ) RESULT(kbnd)
+      REAL(dp), DIMENSION(:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_2d_dp
+
+
+   FUNCTION arr_lbnd_3d_i( pt ) RESULT(kbnd)
+      INTEGER, DIMENSION(:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_3d_i
+
+
+   FUNCTION arr_lbnd_3d_sp( pt ) RESULT(kbnd)
       REAL(sp), DIMENSION(:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
 
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_3d_sp = 1
-      ELSE
-         is_tile_3d_sp = 0
-      ENDIF
-   END FUNCTION is_tile_3d_sp
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_3d_sp
 
 
-   INTEGER FUNCTION is_tile_3d_dp( pt )
+   FUNCTION arr_lbnd_3d_dp( pt ) RESULT(kbnd)
       REAL(dp), DIMENSION(:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_3d_dp
 
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_3d_dp = 1
-      ELSE
-         is_tile_3d_dp = 0
-      ENDIF
-   END FUNCTION is_tile_3d_dp
 
+   FUNCTION arr_lbnd_4d_i( pt ) RESULT(kbnd)
+      INTEGER, DIMENSION(:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
 
-   INTEGER FUNCTION is_tile_4d_sp( pt )
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_4d_i
+
+
+   FUNCTION arr_lbnd_4d_sp( pt ) RESULT(kbnd)
       REAL(sp), DIMENSION(:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
 
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_4d_sp = 1
-      ELSE
-         is_tile_4d_sp = 0
-      ENDIF
-   END FUNCTION is_tile_4d_sp
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_4d_sp
 
 
-   INTEGER FUNCTION is_tile_4d_dp( pt )
+   FUNCTION arr_lbnd_4d_dp( pt ) RESULT(kbnd)
       REAL(dp), DIMENSION(:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
 
-      IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN
-         is_tile_4d_dp = 1
-      ELSE
-         is_tile_4d_dp = 0
-      ENDIF
-   END FUNCTION is_tile_4d_dp
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_4d_dp
+
+
+   FUNCTION arr_lbnd_5d_i( pt ) RESULT(kbnd)
+      INTEGER, DIMENSION(:,:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_5d_i
+
+
+   FUNCTION arr_lbnd_5d_sp( pt ) RESULT(kbnd)
+      REAL(sp), DIMENSION(:,:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_5d_sp
+
+
+   FUNCTION arr_lbnd_5d_dp( pt ) RESULT(kbnd)
+      REAL(dp), DIMENSION(:,:,:,:,:), INTENT(in) ::   pt
+      INTEGER, DIMENSION(2) :: kbnd
+
+      kbnd = arr_lbnd(SIZE(pt, 1), SIZE(pt, 2))
+   END FUNCTION arr_lbnd_5d_dp
    !!======================================================================
 END MODULE domutl
diff --git a/src/OCE/DOM/domvvl.F90 b/src/OCE/DOM/domvvl.F90
deleted file mode 100644
index 94bf1ce8..00000000
--- a/src/OCE/DOM/domvvl.F90
+++ /dev/null
@@ -1,1105 +0,0 @@
-MODULE domvvl
-   !!======================================================================
-   !!                       ***  MODULE domvvl   ***
-   !! Ocean :
-   !!======================================================================
-   !! History :  2.0  !  2006-06  (B. Levier, L. Marie)  original code
-   !!            3.1  !  2009-02  (G. Madec, M. Leclair, R. Benshila)  pure z* coordinate
-   !!            3.3  !  2011-10  (M. Leclair) totally rewrote domvvl: vvl option includes z_star and z_tilde coordinates
-   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability
-   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename dom_vvl_sf_swp -> dom_vvl_sf_update for new timestepping
-   !!             -   !  2020-02  (G. Madec, S. Techene) introduce ssh to h0 ratio
-   !!----------------------------------------------------------------------
-
-   USE oce             ! ocean dynamics and tracers
-   USE phycst          ! physical constant
-   USE dom_oce         ! ocean space and time domain
-   USE sbc_oce         ! ocean surface boundary condition
-   USE wet_dry         ! wetting and drying
-   USE usrdef_istate   ! user defined initial state (wad only)
-   USE restart         ! ocean restart
-   !
-   USE in_out_manager  ! I/O manager
-   USE iom             ! I/O manager library
-   USE lib_mpp         ! distributed memory computing library
-   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
-   USE timing          ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   !                                                      !!* Namelist nam_vvl
-   LOGICAL , PUBLIC :: ln_vvl_zstar           = .FALSE.    ! zstar  vertical coordinate
-   LOGICAL , PUBLIC :: ln_vvl_ztilde          = .FALSE.    ! ztilde vertical coordinate
-   LOGICAL , PUBLIC :: ln_vvl_layer           = .FALSE.    ! level  vertical coordinate
-   LOGICAL , PUBLIC :: ln_vvl_ztilde_as_zstar = .FALSE.    ! ztilde vertical coordinate
-   LOGICAL , PUBLIC :: ln_vvl_zstar_at_eqtor  = .FALSE.    ! ztilde vertical coordinate
-   LOGICAL , PUBLIC :: ln_vvl_kepe            = .FALSE.    ! kinetic/potential energy transfer
-   !
-   INTEGER          :: nn_vvl_interp = 0                   ! scale factors anomaly interpolation method at U-V-F points
-                                                           ! =0 linear with no bottom correction over steps (old)
-                                                           ! =1 linear with bottom correction over steps
-                                                           ! =2 "qco like", i.e. proportional to thicknesses at rest
-   !
-   !                                                       ! conservation: not used yet
-   REAL(wp)         :: rn_ahe3                             ! thickness diffusion coefficient
-   REAL(wp)         :: rn_rst_e3t                          ! ztilde to zstar restoration timescale [days]
-   REAL(wp)         :: rn_lf_cutoff                        ! cutoff frequency for low-pass filter  [days]
-   REAL(wp)         :: rn_zdef_max                         ! maximum fractional e3t deformation
-   LOGICAL , PUBLIC :: ln_vvl_dbg = .FALSE.                ! debug control prints
-
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_td, vn_td                ! thickness diffusion transport
-   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdiv_lf                     ! low frequency part of hz divergence
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tilde_e3t_b, tilde_e3t_n    ! baroclinic scale factors
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tilde_e3t_a, dtilde_e3t_a   ! baroclinic scale factors
-   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: frq_rst_e3t                 ! retoring period for scale factors
-   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: frq_rst_hdv                 ! retoring period for low freq. divergence
-
-#if defined key_qco   ||   defined key_linssh
-   !!----------------------------------------------------------------------
-   !!   'key_qco'                        Quasi-Eulerian vertical coordinate
-   !!       OR         EMPTY MODULE
-   !!   'key_linssh'                        Fix in time vertical coordinate
-   !!----------------------------------------------------------------------
-#else
-   !!----------------------------------------------------------------------
-   !!   Default key      Old management of time varying vertical coordinate
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   dom_vvl_init     : define initial vertical scale factors, depths and column thickness
-   !!   dom_vvl_sf_nxt   : Compute next vertical scale factors
-   !!   dom_vvl_sf_update   : Swap vertical scale factors and update the vertical grid
-   !!   dom_vvl_interpol : Interpolate vertical scale factors from one grid point to another
-   !!   dom_vvl_rst      : read/write restart file
-   !!   dom_vvl_ctl      : Check the vvl options
-   !!----------------------------------------------------------------------
-
-   PUBLIC  dom_vvl_init       ! called by domain.F90
-   PUBLIC  dom_vvl_zgr        ! called by isfcpl.F90
-   PUBLIC  dom_vvl_sf_nxt     ! called by step.F90
-   PUBLIC  dom_vvl_sf_update  ! called by step.F90
-   PUBLIC  dom_vvl_interpol   ! called by dynnxt.F90
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: domvvl.F90 15471 2021-11-04 16:28:56Z jchanut $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   INTEGER FUNCTION dom_vvl_alloc()
-      !!----------------------------------------------------------------------
-      !!                ***  FUNCTION dom_vvl_alloc  ***
-      !!----------------------------------------------------------------------
-      IF( ln_vvl_zstar )   dom_vvl_alloc = 0
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN
-         ALLOCATE( tilde_e3t_b(jpi,jpj,jpk)  , tilde_e3t_n(jpi,jpj,jpk) , tilde_e3t_a(jpi,jpj,jpk) ,   &
-            &      dtilde_e3t_a(jpi,jpj,jpk) , un_td  (jpi,jpj,jpk)     , vn_td  (jpi,jpj,jpk)     ,   &
-            &      STAT = dom_vvl_alloc        )
-         CALL mpp_sum ( 'domvvl', dom_vvl_alloc )
-         IF( dom_vvl_alloc /= 0 )   CALL ctl_stop( 'STOP', 'dom_vvl_alloc: failed to allocate arrays' )
-         un_td = 0._wp
-         vn_td = 0._wp
-      ENDIF
-      IF( ln_vvl_ztilde ) THEN
-         ALLOCATE( frq_rst_e3t(jpi,jpj) , frq_rst_hdv(jpi,jpj) , hdiv_lf(jpi,jpj,jpk) , STAT= dom_vvl_alloc )
-         CALL mpp_sum ( 'domvvl', dom_vvl_alloc )
-         IF( dom_vvl_alloc /= 0 )   CALL ctl_stop( 'STOP', 'dom_vvl_alloc: failed to allocate arrays' )
-      ENDIF
-      !
-   END FUNCTION dom_vvl_alloc
-
-
-   SUBROUTINE dom_vvl_init( Kbb, Kmm, Kaa )
-      !!----------------------------------------------------------------------
-      !!                ***  ROUTINE dom_vvl_init  ***
-      !!
-      !! ** Purpose :  Initialization of all scale factors, depths
-      !!               and water column heights
-      !!
-      !! ** Method  :  - use restart file and/or initialize
-      !!               - interpolate scale factors
-      !!
-      !! ** Action  : - e3t_(n/b) and tilde_e3t_(n/b)
-      !!              - Regrid: e3[u/v](:,:,:,Kmm)
-      !!                        e3[u/v](:,:,:,Kmm)
-      !!                        e3w(:,:,:,Kmm)
-      !!                        e3[u/v]w_b
-      !!                        e3[u/v]w_n
-      !!                        gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm) and gde3w
-      !!              - h(t/u/v)_0
-      !!              - frq_rst_e3t and frq_rst_hdv
-      !!
-      !! Reference  : Leclair, M., and G. Madec, 2011, Ocean Modelling.
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) :: Kbb, Kmm, Kaa
-      !
-      IF(lwp) WRITE(numout,*)
-      IF(lwp) WRITE(numout,*) 'dom_vvl_init : Variable volume activated'
-      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
-      !
-      CALL dom_vvl_ctl     ! choose vertical coordinate (z_star, z_tilde or layer)
-      !
-      !                    ! Allocate module arrays
-      IF( dom_vvl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dom_vvl_init : unable to allocate arrays' )
-      !
-      !                    ! Read or initialize e3t_(b/n), tilde_e3t_(b/n) and hdiv_lf
-      CALL dom_vvl_rst( nit000, Kbb, Kmm, 'READ' )
-      e3t(:,:,jpk,Kaa) = e3t_0(:,:,jpk)  ! last level always inside the sea floor set one for all
-      !
-      CALL dom_vvl_zgr(Kbb, Kmm, Kaa) ! interpolation scale factor, depth and water column
-      !
-   END SUBROUTINE dom_vvl_init
-
-
-   SUBROUTINE dom_vvl_zgr(Kbb, Kmm, Kaa)
-      !!----------------------------------------------------------------------
-      !!                ***  ROUTINE dom_vvl_init  ***
-      !!
-      !! ** Purpose :  Interpolation of all scale factors,
-      !!               depths and water column heights
-      !!
-      !! ** Method  :  - interpolate scale factors
-      !!
-      !! ** Action  : - e3t_(n/b) and tilde_e3t_(n/b)
-      !!              - Regrid: e3(u/v)_n
-      !!                        e3(u/v)_b
-      !!                        e3w_n
-      !!                        e3(u/v)w_b
-      !!                        e3(u/v)w_n
-      !!                        gdept_n, gdepw_n and gde3w_n
-      !!              - h(t/u/v)_0
-      !!              - frq_rst_e3t and frq_rst_hdv
-      !!
-      !! Reference  : Leclair, M., and G. Madec, 2011, Ocean Modelling.
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) :: Kbb, Kmm, Kaa
-      !!----------------------------------------------------------------------
-      INTEGER ::   ji, jj, jk
-      INTEGER ::   ii0, ii1, ij0, ij1
-      REAL(wp)::   zcoef
-      !!----------------------------------------------------------------------
-      !
-      !                    !== Set of all other vertical scale factors  ==!  (now and before)
-      !                                ! Horizontal interpolation of e3t
-      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3u(:,:,:,Kbb), 'U' )    ! from T to U
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3u(:,:,:,Kmm), 'U' )
-      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3v(:,:,:,Kbb), 'V' )    ! from T to V
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3v(:,:,:,Kmm), 'V' )
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F' )    ! from U to F
-      !                                ! Vertical interpolation of e3t,u,v
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3w (:,:,:,Kmm), 'W'  )  ! from T to W
-      CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3w (:,:,:,Kbb), 'W'  )
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3uw(:,:,:,Kmm), 'UW' )  ! from U to UW
-      CALL dom_vvl_interpol( e3u(:,:,:,Kbb), e3uw(:,:,:,Kbb), 'UW' )
-      CALL dom_vvl_interpol( e3v(:,:,:,Kmm), e3vw(:,:,:,Kmm), 'VW' )  ! from V to UW
-      CALL dom_vvl_interpol( e3v(:,:,:,Kbb), e3vw(:,:,:,Kbb), 'VW' )
-
-      ! We need to define e3[tuv]_a for AGRIF initialisation (should not be a problem for the restartability...)
-      e3t(:,:,:,Kaa) = e3t(:,:,:,Kmm)
-      e3u(:,:,:,Kaa) = e3u(:,:,:,Kmm)
-      e3v(:,:,:,Kaa) = e3v(:,:,:,Kmm)
-      !
-      !                    !==  depth of t and w-point  ==!   (set the isf depth as it is in the initial timestep)
-      gdept(:,:,1,Kmm) = 0.5_wp * e3w(:,:,1,Kmm)       ! reference to the ocean surface (used for MLD and light penetration)
-      gdepw(:,:,1,Kmm) = 0.0_wp
-      gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm)  ! reference to a common level z=0 for hpg
-      gdept(:,:,1,Kbb) = 0.5_wp * e3w(:,:,1,Kbb)
-      gdepw(:,:,1,Kbb) = 0.0_wp
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk )                     ! vertical sum
-         !    zcoef = tmask - wmask    ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt
-         !                             ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf)
-         !                             ! 0.5 where jk = mikt
-!!gm ???????   BUG ?  gdept(:,:,:,Kmm) as well as gde3w  does not include the thickness of ISF ??
-         zcoef = ( tmask(ji,jj,jk) - wmask(ji,jj,jk) )
-         gdepw(ji,jj,jk,Kmm) = gdepw(ji,jj,jk-1,Kmm) + e3t(ji,jj,jk-1,Kmm)
-         gdept(ji,jj,jk,Kmm) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm) + 0.5 * e3w(ji,jj,jk,Kmm))  &
-            &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm))
-         gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm) - ssh(ji,jj,Kmm)
-         gdepw(ji,jj,jk,Kbb) = gdepw(ji,jj,jk-1,Kbb) + e3t(ji,jj,jk-1,Kbb)
-         gdept(ji,jj,jk,Kbb) =      zcoef  * ( gdepw(ji,jj,jk  ,Kbb) + 0.5 * e3w(ji,jj,jk,Kbb))  &
-            &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kbb) +       e3w(ji,jj,jk,Kbb))
-      END_3D
-      !
-      !                    !==  thickness of the water column  !!   (ocean portion only)
-      ht(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1)   !!gm  BUG  :  this should be 1/2 * e3w(k=1) ....
-      hu(:,:,Kbb) = e3u(:,:,1,Kbb) * umask(:,:,1)
-      hu(:,:,Kmm) = e3u(:,:,1,Kmm) * umask(:,:,1)
-      hv(:,:,Kbb) = e3v(:,:,1,Kbb) * vmask(:,:,1)
-      hv(:,:,Kmm) = e3v(:,:,1,Kmm) * vmask(:,:,1)
-      DO jk = 2, jpkm1
-         ht(:,:) = ht(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-         hu(:,:,Kbb) = hu(:,:,Kbb) + e3u(:,:,jk,Kbb) * umask(:,:,jk)
-         hu(:,:,Kmm) = hu(:,:,Kmm) + e3u(:,:,jk,Kmm) * umask(:,:,jk)
-         hv(:,:,Kbb) = hv(:,:,Kbb) + e3v(:,:,jk,Kbb) * vmask(:,:,jk)
-         hv(:,:,Kmm) = hv(:,:,Kmm) + e3v(:,:,jk,Kmm) * vmask(:,:,jk)
-      END DO
-      !
-      !                    !==  inverse of water column thickness   ==!   (u- and v- points)
-      r1_hu(:,:,Kbb) = ssumask(:,:) / ( hu(:,:,Kbb) + 1._wp - ssumask(:,:) )    ! _i mask due to ISF
-      r1_hu(:,:,Kmm) = ssumask(:,:) / ( hu(:,:,Kmm) + 1._wp - ssumask(:,:) )
-      r1_hv(:,:,Kbb) = ssvmask(:,:) / ( hv(:,:,Kbb) + 1._wp - ssvmask(:,:) )
-      r1_hv(:,:,Kmm) = ssvmask(:,:) / ( hv(:,:,Kmm) + 1._wp - ssvmask(:,:) )
-
-      !                    !==   z_tilde coordinate case  ==!   (Restoring frequencies)
-      IF( ln_vvl_ztilde ) THEN
-!!gm : idea: add here a READ in a file of custumized restoring frequency
-         !                                   ! Values in days provided via the namelist
-         !                                   ! use rsmall to avoid possible division by zero errors with faulty settings
-         frq_rst_e3t(:,:) = 2._wp * rpi / ( MAX( rn_rst_e3t  , rsmall ) * 86400.0_wp )
-         frq_rst_hdv(:,:) = 2._wp * rpi / ( MAX( rn_lf_cutoff, rsmall ) * 86400.0_wp )
-         !
-         IF( ln_vvl_ztilde_as_zstar ) THEN   ! z-star emulation using z-tile
-            frq_rst_e3t(:,:) = 0._wp               !Ignore namelist settings
-            frq_rst_hdv(:,:) = 1._wp / rn_Dt
-         ENDIF
-         IF ( ln_vvl_zstar_at_eqtor ) THEN   ! use z-star in vicinity of the Equator
-            DO_2D( 1, 1, 1, 1 )
-!!gm  case |gphi| >= 6 degrees is useless   initialized just above by default
-               IF( ABS(gphit(ji,jj)) >= 6.) THEN
-                  ! values outside the equatorial band and transition zone (ztilde)
-                  frq_rst_e3t(ji,jj) =  2.0_wp * rpi / ( MAX( rn_rst_e3t  , rsmall ) * 86400.e0_wp )
-                  frq_rst_hdv(ji,jj) =  2.0_wp * rpi / ( MAX( rn_lf_cutoff, rsmall ) * 86400.e0_wp )
-               ELSEIF( ABS(gphit(ji,jj)) <= 2.5) THEN    ! Equator strip ==> z-star
-                  ! values inside the equatorial band (ztilde as zstar)
-                  frq_rst_e3t(ji,jj) =  0.0_wp
-                  frq_rst_hdv(ji,jj) =  1.0_wp / rn_Dt
-               ELSE                                      ! transition band (2.5 to 6 degrees N/S)
-                  !                                      ! (linearly transition from z-tilde to z-star)
-                  frq_rst_e3t(ji,jj) = 0.0_wp + (frq_rst_e3t(ji,jj)-0.0_wp)*0.5_wp   &
-                     &            * (  1.0_wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  &
-                     &                                          * 180._wp / 3.5_wp ) )
-                  frq_rst_hdv(ji,jj) = (1.0_wp / rn_Dt)                                &
-                     &            + (  frq_rst_hdv(ji,jj)-(1.e0_wp / rn_Dt) )*0.5_wp   &
-                     &            * (  1._wp  - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  &
-                     &                                          * 180._wp / 3.5_wp ) )
-               ENDIF
-            END_2D
-            IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN
-               IF( nn_cfg == 3 ) THEN   ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2
-                  ii0 = 103 + nn_hls - 1   ;   ii1 = 111 + nn_hls - 1
-                  ij0 = 128 + nn_hls       ;   ij1 = 135 + nn_hls
-                  frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp
-                  frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rn_Dt
-               ENDIF
-            ENDIF
-         ENDIF
-      ENDIF
-      !
-   END SUBROUTINE dom_vvl_zgr
-
-
-   SUBROUTINE dom_vvl_sf_nxt( kt, Kbb, Kmm, Kaa, kcall )
-      !!----------------------------------------------------------------------
-      !!                ***  ROUTINE dom_vvl_sf_nxt  ***
-      !!
-      !! ** Purpose :  - compute the after scale factors used in tra_zdf, dynnxt,
-      !!                 tranxt and dynspg routines
-      !!
-      !! ** Method  :  - z_star case:  Repartition of ssh INCREMENT proportionnaly to the level thickness.
-      !!               - z_tilde_case: after scale factor increment =
-      !!                                    high frequency part of horizontal divergence
-      !!                                  + retsoring towards the background grid
-      !!                                  + thickness difusion
-      !!                               Then repartition of ssh INCREMENT proportionnaly
-      !!                               to the "baroclinic" level thickness.
-      !!
-      !! ** Action  :  - hdiv_lf    : restoring towards full baroclinic divergence in z_tilde case
-      !!               - tilde_e3t_a: after increment of vertical scale factor
-      !!                              in z_tilde case
-      !!               - e3(t/u/v)_a
-      !!
-      !! Reference  : Leclair, M., and Madec, G. 2011, Ocean Modelling.
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT( in )           ::   kt             ! time step
-      INTEGER, INTENT( in )           ::   Kbb, Kmm, Kaa  ! time step
-      INTEGER, INTENT( in ), OPTIONAL ::   kcall          ! optional argument indicating call sequence
-      !
-      INTEGER                ::   ji, jj, jk            ! dummy loop indices
-      INTEGER , DIMENSION(3) ::   ijk_max, ijk_min      ! temporary integers
-      REAL(wp)               ::   z_tmin, z_tmax        ! local scalars
-      LOGICAL                ::   ll_do_bclinic         ! local logical
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3t
-      LOGICAL , DIMENSION(:,:,:), ALLOCATABLE ::   llmsk
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_linssh )   RETURN      ! No calculation in linear free surface
-      !
-      IF( ln_timing )   CALL timing_start('dom_vvl_sf_nxt')
-      !
-      IF( kt == nit000 ) THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'dom_vvl_sf_nxt : compute after scale factors'
-         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~'
-      ENDIF
-
-      ll_do_bclinic = .TRUE.
-      IF( PRESENT(kcall) ) THEN
-         IF( kcall == 2 .AND. ln_vvl_ztilde )   ll_do_bclinic = .FALSE.
-      ENDIF
-
-      ! ******************************* !
-      ! After acale factors at t-points !
-      ! ******************************* !
-      !                                                ! --------------------------------------------- !
-      !                                                ! z_star coordinate and barotropic z-tilde part !
-      !                                                ! --------------------------------------------- !
-      !
-      z_scale(:,:) = ( ssh(:,:,Kaa) - ssh(:,:,Kbb) ) * ssmask(:,:) / ( ht_0(:,:) + ssh(:,:,Kmm) + 1. - ssmask(:,:) )
-      DO jk = 1, jpkm1
-         ! formally this is the same as e3t(:,:,:,Kaa) = e3t_0*(1+ssha/ht_0)
-         e3t(:,:,jk,Kaa) = e3t(:,:,jk,Kbb) + e3t(:,:,jk,Kmm) * z_scale(:,:) * tmask(:,:,jk)
-      END DO
-      !
-      IF( (ln_vvl_ztilde .OR. ln_vvl_layer) .AND. ll_do_bclinic ) THEN   ! z_tilde or layer coordinate !
-         !                                                               ! ------baroclinic part------ !
-         ! I - initialization
-         ! ==================
-
-         ! 1 - barotropic divergence
-         ! -------------------------
-         zhdiv(:,:) = 0._wp
-         zht(:,:)   = 0._wp
-         DO jk = 1, jpkm1
-            zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk)
-            zht  (:,:) = zht  (:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-         END DO
-         zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask_i(:,:) )
-
-         ! 2 - Low frequency baroclinic horizontal divergence  (z-tilde case only)
-         ! --------------------------------------------------
-         IF( ln_vvl_ztilde ) THEN
-            IF( kt > nit000 ) THEN
-               DO jk = 1, jpkm1
-                  hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rn_Dt * frq_rst_hdv(:,:)   &
-                     &          * ( hdiv_lf(:,:,jk) - e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) )
-               END DO
-            ENDIF
-         ENDIF
-
-         ! II - after z_tilde increments of vertical scale factors
-         ! =======================================================
-         tilde_e3t_a(:,:,:) = 0._wp  ! tilde_e3t_a used to store tendency terms
-
-         ! 1 - High frequency divergence term
-         ! ----------------------------------
-         IF( ln_vvl_ztilde ) THEN     ! z_tilde case
-            DO jk = 1, jpkm1
-               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - ( e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) - hdiv_lf(:,:,jk) )
-            END DO
-         ELSE                         ! layer case
-            DO jk = 1, jpkm1
-               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) * tmask(:,:,jk)
-            END DO
-         ENDIF
-
-         ! 2 - Restoring term (z-tilde case only)
-         ! ------------------
-         IF( ln_vvl_ztilde ) THEN
-            DO jk = 1, jpk
-               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - frq_rst_e3t(:,:) * tilde_e3t_b(:,:,jk)
-            END DO
-         ENDIF
-
-         ! 3 - Thickness diffusion term
-         ! ----------------------------
-         zwu(:,:) = 0._wp
-         zwv(:,:) = 0._wp
-         DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )       ! a - first derivative: diffusive fluxes
-            un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj)           &
-               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) )
-            vn_td(ji,jj,jk) = rn_ahe3 * vmask(ji,jj,jk) * e1_e2v(ji,jj)           &
-               &            * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji  ,jj+1,jk) )
-            zwu(ji,jj) = zwu(ji,jj) + un_td(ji,jj,jk)
-            zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk)
-         END_3D
-         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )                 ! b - correction for last oceanic u-v points
-            un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj)
-            vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj)
-         END_2D
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! c - second derivative: divergence of diffusive fluxes
-            tilde_e3t_a(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) + (   un_td(ji-1,jj  ,jk) - un_td(ji,jj,jk)    &
-               &                                          +     vn_td(ji  ,jj-1,jk) - vn_td(ji,jj,jk)    &
-               &                                            ) * r1_e1e2t(ji,jj)
-         END_3D
-         !                               ! d - thickness diffusion transport: boundary conditions
-         !                             (stored for tracer advction and continuity equation)
-         IF( nn_hls == 1 ) CALL lbc_lnk( 'domvvl', un_td , 'U' , -1._wp, vn_td , 'V' , -1._wp)
-         ! 4 - Time stepping of baroclinic scale factors
-         ! ---------------------------------------------
-         CALL lbc_lnk( 'domvvl', tilde_e3t_a(:,:,:), 'T', 1._wp )
-         tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + rDt * tmask(:,:,:) * tilde_e3t_a(:,:,:)
-
-         ! Maximum deformation control
-         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-         ALLOCATE( ze3t(jpi,jpj,jpk), llmsk(jpi,jpj,jpk) )
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            ze3t(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) / e3t_0(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)
-         END_3D
-         !
-         llmsk(     1:nn_hls,:,:) = .FALSE.   ! exclude halos from the checked region
-         llmsk(Nie0+1:   jpi,:,:) = .FALSE.
-         llmsk(:,     1:nn_hls,:) = .FALSE.
-         llmsk(:,Nje0+1:   jpj,:) = .FALSE.
-         !
-         llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp                  ! define only the inner domain
-         z_tmax = MAXVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_max( 'domvvl', z_tmax )   ! max over the global domain
-         z_tmin = MINVAL( ze3t(:,:,:), mask = llmsk )   ;   CALL mpp_min( 'domvvl', z_tmin )   ! min over the global domain
-         ! - ML - test: for the moment, stop simulation for too large e3_t variations
-         IF( ( z_tmax >  rn_zdef_max ) .OR. ( z_tmin < - rn_zdef_max ) ) THEN
-            CALL mpp_maxloc( 'domvvl', ze3t, llmsk, z_tmax, ijk_max )
-            CALL mpp_minloc( 'domvvl', ze3t, llmsk, z_tmin, ijk_min )
-            IF (lwp) THEN
-               WRITE(numout, *) 'MAX( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmax
-               WRITE(numout, *) 'at i, j, k=', ijk_max
-               WRITE(numout, *) 'MIN( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmin
-               WRITE(numout, *) 'at i, j, k=', ijk_min
-               CALL ctl_stop( 'STOP', 'MAX( ABS( tilde_e3t_a(:,:,: ) ) / e3t_0(:,:,:) ) too high')
-            ENDIF
-         ENDIF
-         DEALLOCATE( ze3t, llmsk )
-         ! - ML - end test
-         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below
-         tilde_e3t_a(:,:,:) = MIN( tilde_e3t_a(:,:,:),   rn_zdef_max * e3t_0(:,:,:) )
-         tilde_e3t_a(:,:,:) = MAX( tilde_e3t_a(:,:,:), - rn_zdef_max * e3t_0(:,:,:) )
-
-         !
-         ! "tilda" change in the after scale factor
-         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-         DO jk = 1, jpkm1
-            dtilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - tilde_e3t_b(:,:,jk)
-         END DO
-         ! III - Barotropic repartition of the sea surface height over the baroclinic profile
-         ! ==================================================================================
-         ! add ( ssh increment + "baroclinicity error" ) proportionly to e3t(n)
-         ! - ML - baroclinicity error should be better treated in the future
-         !        i.e. locally and not spread over the water column.
-         !        (keep in mind that the idea is to reduce Eulerian velocity as much as possible)
-         zht(:,:) = 0.
-         DO jk = 1, jpkm1
-            zht(:,:)  = zht(:,:) + tilde_e3t_a(:,:,jk) * tmask(:,:,jk)
-         END DO
-         z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + ssh(:,:,Kmm) + 1. - ssmask(:,:) )
-         DO jk = 1, jpkm1
-            dtilde_e3t_a(:,:,jk) = dtilde_e3t_a(:,:,jk) + e3t(:,:,jk,Kmm) * z_scale(:,:) * tmask(:,:,jk)
-         END DO
-
-      ENDIF
-
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer )  THEN   ! z_tilde or layer coordinate !
-      !                                           ! ---baroclinic part--------- !
-         DO jk = 1, jpkm1
-            e3t(:,:,jk,Kaa) = e3t(:,:,jk,Kaa) + dtilde_e3t_a(:,:,jk) * tmask(:,:,jk)
-         END DO
-      ENDIF
-
-      IF( ln_vvl_dbg .AND. .NOT. ll_do_bclinic ) THEN   ! - ML - test: control prints for debuging
-         !
-         IF( lwp ) WRITE(numout, *) 'kt =', kt
-         IF ( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN
-            z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( zht(:,:) ) )
-            CALL mpp_max( 'domvvl', z_tmax )                             ! max over the global domain
-            IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(SUM(tilde_e3t_a))) =', z_tmax
-         END IF
-         !
-         zht(:,:) = 0.0_wp
-         DO jk = 1, jpkm1
-            zht(:,:) = zht(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-         END DO
-         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + ssh(:,:,Kmm) - zht(:,:) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+sshn-SUM(e3t(:,:,:,Kmm)))) =', z_tmax
-         !
-         zht(:,:) = 0.0_wp
-         DO jk = 1, jpkm1
-            zht(:,:) = zht(:,:) + e3t(:,:,jk,Kaa) * tmask(:,:,jk)
-         END DO
-         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + ssh(:,:,Kaa) - zht(:,:) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+ssha-SUM(e3t(:,:,:,Kaa)))) =', z_tmax
-         !
-         zht(:,:) = 0.0_wp
-         DO jk = 1, jpkm1
-            zht(:,:) = zht(:,:) + e3t(:,:,jk,Kbb) * tmask(:,:,jk)
-         END DO
-         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + ssh(:,:,Kbb) - zht(:,:) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+sshb-SUM(e3t(:,:,:,Kbb)))) =', z_tmax
-         !
-         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( ssh(:,:,Kbb) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ssh(:,:,Kbb)))) =', z_tmax
-         !
-         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( ssh(:,:,Kmm) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ssh(:,:,Kmm)))) =', z_tmax
-         !
-         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( ssh(:,:,Kaa) ) )
-         CALL mpp_max( 'domvvl', z_tmax )                                ! max over the global domain
-         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ssh(:,:,Kaa)))) =', z_tmax
-      END IF
-
-#if defined key_agrif
-      ! *********************************** !
-      ! After scale factors at w- points    !
-      ! *********************************** !
-      ! At some point, "after" depths at T-points may be required 
-      ! for AGRIF vertical remap. To prevent from saving an
-      ! additional array, re-compute depths from e3w when needed
-      CALL dom_vvl_interpol( e3t(:,:,:,Kaa), e3w(:,:,:,Kaa), 'W'  )
-#endif
-      ! *********************************** !
-      ! After scale factors at u- v- points !
-      ! *********************************** !
-
-      CALL dom_vvl_interpol( e3t(:,:,:,Kaa), e3u(:,:,:,Kaa), 'U' )
-      CALL dom_vvl_interpol( e3t(:,:,:,Kaa), e3v(:,:,:,Kaa), 'V' )
-
-      ! *********************************** !
-      ! After depths at u- v points         !
-      ! *********************************** !
-
-      hu(:,:,Kaa) = e3u(:,:,1,Kaa) * umask(:,:,1)
-      hv(:,:,Kaa) = e3v(:,:,1,Kaa) * vmask(:,:,1)
-      DO jk = 2, jpkm1
-         hu(:,:,Kaa) = hu(:,:,Kaa) + e3u(:,:,jk,Kaa) * umask(:,:,jk)
-         hv(:,:,Kaa) = hv(:,:,Kaa) + e3v(:,:,jk,Kaa) * vmask(:,:,jk)
-      END DO
-      !                                        ! Inverse of the local depth
-!!gm BUG ?  don't understand the use of umask_i here .....
-      r1_hu(:,:,Kaa) = ssumask(:,:) / ( hu(:,:,Kaa) + 1._wp - ssumask(:,:) )
-      r1_hv(:,:,Kaa) = ssvmask(:,:) / ( hv(:,:,Kaa) + 1._wp - ssvmask(:,:) )
-      !
-      IF( ln_timing )   CALL timing_stop('dom_vvl_sf_nxt')
-      !
-   END SUBROUTINE dom_vvl_sf_nxt
-
-
-   SUBROUTINE dom_vvl_sf_update( kt, Kbb, Kmm, Kaa )
-      !!----------------------------------------------------------------------
-      !!                ***  ROUTINE dom_vvl_sf_update  ***
-      !!
-      !! ** Purpose :  for z tilde case: compute time filter and swap of scale factors
-      !!               compute all depths and related variables for next time step
-      !!               write outputs and restart file
-      !!
-      !! ** Method  :  - swap of e3t with trick for volume/tracer conservation (ONLY FOR Z TILDE CASE)
-      !!               - reconstruct scale factor at other grid points (interpolate)
-      !!               - recompute depths and water height fields
-      !!
-      !! ** Action  :  - tilde_e3t_(b/n) ready for next time step
-      !!               - Recompute:
-      !!                    e3(u/v)_b
-      !!                    e3w(:,:,:,Kmm)
-      !!                    e3(u/v)w_b
-      !!                    e3(u/v)w_n
-      !!                    gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm)  and gde3w
-      !!                    h(u/v) and h(u/v)r
-      !!
-      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
-      !!              Leclair, M., and G. Madec, 2011, Ocean Modelling.
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT( in ) ::   kt              ! time step
-      INTEGER, INTENT( in ) ::   Kbb, Kmm, Kaa   ! time level indices
-      !
-      INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zcoef        ! local scalar
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_linssh )   RETURN      ! No calculation in linear free surface
-      !
-      IF( ln_timing )   CALL timing_start('dom_vvl_sf_update')
-      !
-      IF( kt == nit000 )   THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'dom_vvl_sf_update : - interpolate scale factors and compute depths for next time step'
-         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~'
-      ENDIF
-      !
-      ! Time filter and swap of scale factors
-      ! =====================================
-      ! - ML - e3(t/u/v)_b are allready computed in dynnxt.
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN
-         IF( l_1st_euler ) THEN
-            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:)
-         ELSE
-            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &
-            &         + rn_atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) )
-         ENDIF
-         tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:)
-      ENDIF
-
-      ! Compute all missing vertical scale factor and depths
-      ! ====================================================
-      ! Horizontal scale factor interpolations
-      ! --------------------------------------
-      ! - ML - e3u(:,:,:,Kbb) and e3v(:,:,:,Kbb) are already computed in dynnxt
-      ! - JC - hu(:,:,:,Kbb), hv(:,:,:,:,Kbb), hur_b, hvr_b also
-
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F'  )
-
-      ! Vertical scale factor interpolations
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm),  e3w(:,:,:,Kmm), 'W'  )
-      CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3uw(:,:,:,Kmm), 'UW' )
-      CALL dom_vvl_interpol( e3v(:,:,:,Kmm), e3vw(:,:,:,Kmm), 'VW' )
-      CALL dom_vvl_interpol( e3t(:,:,:,Kbb),  e3w(:,:,:,Kbb), 'W'  )
-      CALL dom_vvl_interpol( e3u(:,:,:,Kbb), e3uw(:,:,:,Kbb), 'UW' )
-      CALL dom_vvl_interpol( e3v(:,:,:,Kbb), e3vw(:,:,:,Kbb), 'VW' )
-
-      ! t- and w- points depth (set the isf depth as it is in the initial step)
-      gdept(:,:,1,Kmm) = 0.5_wp * e3w(:,:,1,Kmm)
-      gdepw(:,:,1,Kmm) = 0.0_wp
-      gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm)
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk )
-        !    zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))   ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt
-                                                           ! 1 for jk = mikt
-         zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
-         gdepw(ji,jj,jk,Kmm) = gdepw(ji,jj,jk-1,Kmm) + e3t(ji,jj,jk-1,Kmm)
-         gdept(ji,jj,jk,Kmm) =    zcoef  * ( gdepw(ji,jj,jk  ,Kmm) + 0.5 * e3w(ji,jj,jk,Kmm) )  &
-             &             + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) +       e3w(ji,jj,jk,Kmm) )
-         gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm) - ssh(ji,jj,Kmm)
-      END_3D
-
-      ! Local depth and Inverse of the local depth of the water
-      ! -------------------------------------------------------
-      !
-      ht(:,:) = e3t(:,:,1,Kmm) * tmask(:,:,1)
-      DO jk = 2, jpkm1
-         ht(:,:) = ht(:,:) + e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-      END DO
-
-      ! write restart file
-      ! ==================
-      IF( lrst_oce  )   CALL dom_vvl_rst( kt, Kbb, Kmm, 'WRITE' )
-      !
-      IF( ln_timing )   CALL timing_stop('dom_vvl_sf_update')
-      !
-   END SUBROUTINE dom_vvl_sf_update
-
-
-   SUBROUTINE dom_vvl_interpol( pe3_in, pe3_out, pout )
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE dom_vvl__interpol  ***
-      !!
-      !! ** Purpose :   interpolate scale factors from one grid point to another
-      !!
-      !! ** Method  :   e3_out = e3_0 + interpolation(e3_in - e3_0)
-      !!                - horizontal interpolation: grid cell surface averaging
-      !!                - vertical interpolation: simple averaging
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::  pe3_in    ! input e3 to be interpolated
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::  pe3_out   ! output interpolated e3
-      CHARACTER(LEN=*)                , INTENT(in   ) ::  pout      ! grid point of out scale factors
-      !                                                             !   =  'U', 'V', 'W, 'F', 'UW' or 'VW'
-      !
-      INTEGER ::   ji, jj, jk                                       ! dummy loop indices
-      INTEGER ::   iku, ikum1, ikv, ikvm1, ikf, ikfm1
-      REAL(wp) ::  zlnwd                                            ! =1./0. when ln_wd_il = T/F
-      REAL(wp), DIMENSION(jpi,jpj) :: zssh                          ! work array to retrieve ssh (nn_vvl_interp > 1)
-      !!----------------------------------------------------------------------
-      !
-      IF(ln_wd_il) THEN
-        zlnwd = 1.0_wp
-      ELSE
-        zlnwd = 0.0_wp
-      END IF
-      !
-      SELECT CASE ( pout )    !==  type of interpolation  ==!
-         !
-      CASE( 'U' )                   !* from T- to U-point : hor. surface weighted mean
-         SELECT CASE ( nn_vvl_interp )
-         CASE ( 0 ) 
-            !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2u(ji,jj)   &
-                  &                       * (   e1e2t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) )     &
-                  &                           + e1e2t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) )
-            END_3D
-            !
-         CASE ( 1 )
-            !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2u(ji,jj)   &
-                  &                       * (   e1e2t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) )     &
-                  &                           + e1e2t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) )
-            END_3D
-            !
-            ! Bottom correction:
-            DO_2D( 1, 0, 1, 0 )
-               iku    = mbku(ji  ,jj)
-               ikum1  = iku - 1
-               pe3_out(ji,jj,iku) = ( umask(ji,jj,iku) * (1.0_wp - zlnwd) + zlnwd )    & 
-                  &     * ( 0.5_wp *  r1_e1e2u(ji,jj)                                  &
-                  &     * (    e1e2t(ji  ,jj) * ( SUM(tmask(ji  ,jj,:)*(pe3_in(ji  ,jj,:) - e3t_0(ji  ,jj,:))) )   &               
-                  &          + e1e2t(ji+1,jj) * ( SUM(tmask(ji+1,jj,:)*(pe3_in(ji+1,jj,:) - e3t_0(ji+1,jj,:))) ) ) &
-                  &     - SUM(pe3_out(ji,jj,1:ikum1)))
-            END_2D
-            !
-         CASE ( 2 ) 
-            zssh(:,:) = SUM(tmask(:,:,:)*(pe3_in(:,:,:)-e3t_0(:,:,:)), DIM=3)
-            !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2u(ji,jj)    &
-                  &                       * (   e1e2t(ji  ,jj) * zssh(ji  ,jj) + e1e2t(ji+1,jj) * zssh(ji+1,jj)) &
-                  &                       * e3u_0(ji,jj,jk) / ( hu_0(ji,jj) + 1._wp - ssumask(ji,jj) )
-            END_3D   
-            !
-         END SELECT
-         !
-         CALL lbc_lnk( 'domvvl', pe3_out(:,:,:), 'U', 1._wp )
-         pe3_out(:,:,:) = pe3_out(:,:,:) + e3u_0(:,:,:)
-         !
-      CASE( 'V' )                   !* from T- to V-point : hor. surface weighted mean
-         SELECT CASE ( nn_vvl_interp )
-         CASE ( 0 ) 
-            !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * ( vmask(ji,jj,jk)  * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2v(ji,jj)   &
-                  &                       * (   e1e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) )     &
-                  &                           + e1e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) )
-            END_3D
-            !
-         CASE ( 1 )
-                        !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * ( vmask(ji,jj,jk)  * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2v(ji,jj)   &
-                  &                       * (   e1e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) )     &
-                  &                           + e1e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) )
-            END_3D
-            !
-            ! Bottom correction:
-            DO_2D( 1, 0, 1, 0 )
-               ikv    = mbkv(ji  ,jj)
-               ikvm1  = ikv - 1
-               pe3_out(ji,jj,ikv) = ( vmask(ji,jj,ikv) * (1.0_wp - zlnwd) + zlnwd )    & 
-                  &     * ( 0.5_wp *  r1_e1e2v(ji,jj)                                  &
-                  &     * (    e1e2t(ji,jj  ) * ( SUM(tmask(ji,jj  ,:)*(pe3_in(ji,jj  ,:) - e3t_0(ji,jj  ,:))) )   &               
-                  &          + e1e2t(ji,jj+1) * ( SUM(tmask(ji,jj+1,:)*(pe3_in(ji,jj+1,:) - e3t_0(ji,jj+1,:))) ) ) &
-                  &     - SUM(pe3_out(ji,jj,1:ikvm1)))
-            END_2D
-            !
-            CASE ( 2 ) 
-            zssh(:,:) = SUM(tmask(:,:,:)*(pe3_in(:,:,:)-e3t_0(:,:,:)), DIM=3)
-            !
-            DO_3D( 1, 0, 1, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  vmask(ji,jj,jk) * (1.0_wp - zlnwd) + zlnwd ) * r1_e1e2v(ji,jj)    &
-                  &                       * (   e1e2t(ji  ,jj) * zssh(ji  ,jj) + e1e2t(ji,jj+1) * zssh(ji,jj+1)) &
-                  &                       * e3v_0(ji,jj,jk) / ( hv_0(ji,jj) + 1._wp - ssvmask(ji,jj) )
-            END_3D 
-            !
-         END SELECT
-         !
-         CALL lbc_lnk( 'domvvl', pe3_out(:,:,:), 'V', 1._wp )
-         pe3_out(:,:,:) = pe3_out(:,:,:) + e3v_0(:,:,:)
-         !
-      CASE( 'F' )                   !* from U-point to F-point : hor. surface weighted mean
-         SELECT CASE ( nn_vvl_interp )
-         CASE ( 0 )
-            !
-            DO_3D( 0, 0, 0, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * umask(ji,jj+1,jk) * (1.0_wp - zlnwd) + zlnwd ) &
-                  &                       *    r1_e1e2f(ji,jj)                                                  &
-                  &                       * (   e1e2u(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3u_0(ji,jj  ,jk) )     &
-                  &                           + e1e2u(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3u_0(ji,jj+1,jk) ) )
-            END_3D
-            !
-         CASE ( 1 )
-            !
-            DO_3D( 0, 0, 0, 0, 1, jpk )
-               pe3_out(ji,jj,jk) = 0.5_wp * (  umask(ji,jj,jk) * umask(ji,jj+1,jk) * (1.0_wp - zlnwd) + zlnwd ) &
-                  &                       *    r1_e1e2f(ji,jj)                                                  &
-                  &                       * (   e1e2u(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3u_0(ji,jj  ,jk) )     &
-                  &                           + e1e2u(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3u_0(ji,jj+1,jk) ) )
-            END_3D
-            !
-            ! Bottom correction:
-            DO_2D( 0, 0, 0, 0 )
-               ikf    = MIN(mbku(ji  ,jj),mbku(ji,jj+1))
-               ikfm1  = ikf - 1
-               pe3_out(ji,jj,ikf) = ( umask(ji,jj,ikf) * umask(ji,jj+1,ikf) * (1.0_wp - zlnwd) + zlnwd )           & 
-                  &     * ( 0.5_wp *  r1_e1e2f(ji,jj)                                                              &
-                  &     * (    e1e2u(ji,jj  ) * ( SUM(umask(ji,jj  ,:)*(pe3_in(ji,jj  ,:) - e3u_0(ji,jj  ,:))) )   &               
-                  &          + e1e2u(ji,jj+1) * ( SUM(umask(ji,jj+1,:)*(pe3_in(ji,jj+1,:) - e3u_0(ji,jj+1,:))) ) ) &
-                  &     - SUM(pe3_out(ji,jj,1:ikfm1)))
-            END_2D
-            !
-         CASE ( 2 ) 
-            zssh(:,:) = SUM(umask(:,:,:)*(pe3_in(:,:,:)-e3u_0(:,:,:)), DIM=3)
-            !
-            DO_3D( 0, 0, 0, 0, 1, jpk )
-               pe3_out(ji,jj,jk) =  (  umask(ji,jj,jk)* umask(ji,jj+1,jk) * (1.0_wp - zlnwd) + zlnwd )   &
-                  &                 * 0.5_wp * r1_e1e2f(ji,jj)                                           &
-                  &                 * (e1e2u(ji  ,jj) * zssh(ji  ,jj) + e1e2u(ji,jj+1) * zssh(ji,jj+1))  &
-                  &                 * e3f_0(ji,jj,jk) / ( hf_0(ji,jj) + 1._wp - ssumask(ji,jj)*ssumask(ji,jj+1) )
-            END_3D
-            !
-         END SELECT
-         !
-         CALL lbc_lnk( 'domvvl', pe3_out(:,:,:), 'F', 1._wp )
-         pe3_out(:,:,:) = pe3_out(:,:,:) + e3f_0(:,:,:)
-         !
-      CASE( 'W' )                   !* from T- to W-point : vertical simple mean
-         !
-         pe3_out(:,:,1) = e3w_0(:,:,1) + pe3_in(:,:,1) - e3t_0(:,:,1)
-         ! - ML - The use of mask in this formulea enables the special treatment of the last w-point without indirect adressing
-!!gm BUG? use here wmask in case of ISF ?  to be checked
-         DO jk = 2, jpk
-            pe3_out(:,:,jk) = e3w_0(:,:,jk) + ( 1.0_wp - 0.5_wp * ( tmask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd ) )   &
-               &                            * ( pe3_in(:,:,jk-1) - e3t_0(:,:,jk-1) )                               &
-               &                            +            0.5_wp * ( tmask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd )     &
-               &                            * ( pe3_in(:,:,jk  ) - e3t_0(:,:,jk  ) )
-         END DO
-         !
-      CASE( 'UW' )                  !* from U- to UW-point : vertical simple mean
-         !
-         pe3_out(:,:,1) = e3uw_0(:,:,1) + pe3_in(:,:,1) - e3u_0(:,:,1)
-         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing
-!!gm BUG? use here wumask in case of ISF ?  to be checked
-         DO jk = 2, jpk
-            pe3_out(:,:,jk) = e3uw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * ( umask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd ) )  &
-               &                             * ( pe3_in(:,:,jk-1) - e3u_0(:,:,jk-1) )                              &
-               &                             +            0.5_wp * ( umask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd )    &
-               &                             * ( pe3_in(:,:,jk  ) - e3u_0(:,:,jk  ) )
-         END DO
-         !
-      CASE( 'VW' )                  !* from V- to VW-point : vertical simple mean
-         !
-         pe3_out(:,:,1) = e3vw_0(:,:,1) + pe3_in(:,:,1) - e3v_0(:,:,1)
-         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing
-!!gm BUG? use here wvmask in case of ISF ?  to be checked
-         DO jk = 2, jpk
-            pe3_out(:,:,jk) = e3vw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * ( vmask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd ) )  &
-               &                             * ( pe3_in(:,:,jk-1) - e3v_0(:,:,jk-1) )                              &
-               &                             +            0.5_wp * ( vmask(:,:,jk) * (1.0_wp - zlnwd) + zlnwd )    &
-               &                             * ( pe3_in(:,:,jk  ) - e3v_0(:,:,jk  ) )
-         END DO
-      END SELECT
-      !
-   END SUBROUTINE dom_vvl_interpol
-
-
-   SUBROUTINE dom_vvl_rst( kt, Kbb, Kmm, cdrw )
-      !!---------------------------------------------------------------------
-      !!                   ***  ROUTINE dom_vvl_rst  ***
-      !!
-      !! ** Purpose :   Read or write VVL file in restart file
-      !!
-      !! ** Method  : * restart comes from a linear ssh simulation :
-      !!                   an attempt to read e3t_n stops simulation
-      !!              * restart comes from a z-star, z-tilde, or layer :
-      !!                   read e3t_n and e3t_b
-      !!              * restart comes from a z-star :
-      !!                   set tilde_e3t_n, tilde_e3t_n, and hdiv_lf to 0
-      !!              * restart comes from layer :
-      !!                   read tilde_e3t_n and tilde_e3t_b
-      !!                   set hdiv_lf to 0
-      !!              * restart comes from a z-tilde:
-      !!                   read tilde_e3t_n, tilde_e3t_b, and hdiv_lf
-      !!
-      !!              NB: if l_1st_euler = T (ln_1st_euler or ssh_b not found)
-      !!                   Kbb fields set to Kmm ones
-      !!----------------------------------------------------------------------
-      INTEGER         , INTENT(in) ::   kt        ! ocean time-step
-      INTEGER         , INTENT(in) ::   Kbb, Kmm  ! ocean time level indices
-      CHARACTER(len=*), INTENT(in) ::   cdrw      ! "READ"/"WRITE" flag
-      !
-      INTEGER ::   ji, jj, jk      ! dummy loop indices
-      INTEGER ::   id2, id3, id4, id5   ! local integers
-      !!----------------------------------------------------------------------
-      !
-      !                                      !=====================!
-      IF( TRIM(cdrw) == 'READ' ) THEN        !  Read / initialise  !
-         !                                   !=====================!
-         !
-         IF( ln_rstart ) THEN                   !==  Read the restart file  ==!
-            !
-            CALL rst_read_open                                          !*  open the restart file if necessary
-            !                                         ! --------- !
-            !                                         ! all cases !
-            !                                         ! --------- !
-            !
-            id2 = iom_varid( numror, 'e3t_n'      , ldstop = .FALSE. )  !*  check presence
-            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. )
-            id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. )
-            id5 = iom_varid( numror, 'hdiv_lf'    , ldstop = .FALSE. )
-            !
-            !                                                           !*  scale factors
-            !  hot restart case with zstar coordinate:
-            IF ( id2 > 0 ) THEN
-               IF(lwp) WRITE(numout,*)    '          Kmm scale factor read in the restart file'
-               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm) )
-               WHERE ( tmask(:,:,:) == 0.0_wp )
-                  e3t(:,:,:,Kmm) = e3t_0(:,:,:)
-               END WHERE
-            ELSE
-               DO jk = 1, jpk
-                  e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm) * r1_ht_0(:,:) * tmask(:,:,jk) )
-               END DO
-            ENDIF
-
-            IF( l_1st_euler ) THEN                       ! euler
-               IF(lwp) WRITE(numout,*) '          Euler first time step : e3t(Kbb) = e3t(Kmm)'
-               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-            ELSE                                         ! leap frog
-               IF(lwp) WRITE(numout,*) '          Kbb scale factor read in the restart file'
-               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb) )
-               WHERE ( tmask(:,:,:) == 0.0_wp )
-                  e3t(:,:,:,Kbb) = e3t_0(:,:,:)
-               END WHERE
-            ENDIF
-            !                                         ! ------------ !
-            IF( ln_vvl_zstar ) THEN                   !  z_star case !
-               !                                      ! ------------ !
-               IF( MIN( id3, id4 ) > 0 ) THEN
-                  CALL ctl_stop( 'dom_vvl_rst: z_star cannot restart from a z_tilde or layer run' )
-               ENDIF
-               !                                      ! ------------------------ !
-            ELSE                                      !  z_tilde and layer cases !
-               !                                      ! ------------------------ !
-               !
-               IF( id4 > 0 ) THEN                                       !*  scale factor increments
-                  IF(lwp) WRITE(numout,*)    '          Kmm scale factor increments read in the restart file'
-                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:) )
-                  IF( l_1st_euler ) THEN                 ! euler
-                     IF(lwp) WRITE(numout,*) '          Euler first time step : tilde_e3t(Kbb) = tilde_e3t(Kmm)'
-                     tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:)
-                  ELSE                                   ! leap frog
-                     IF(lwp) WRITE(numout,*) '          Kbb scale factor increments read in the restart file'
-                     CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:) )
-                  ENDIF
-               ELSE
-                  tilde_e3t_b(:,:,:) = 0.0_wp
-                  tilde_e3t_n(:,:,:) = 0.0_wp
-               ENDIF
-               !                                      ! ------------ !
-               IF( ln_vvl_ztilde ) THEN               ! z_tilde case !
-                  !                                   ! ------------ !
-                  IF( id5 > 0 ) THEN  ! required array exists
-                     CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:) )
-                  ELSE                ! array is missing
-                     hdiv_lf(:,:,:) = 0.0_wp
-                  ENDIF
-               ENDIF
-            ENDIF
-            !
-         ELSE                                   !==  Initialize at "rest" with ssh  ==!
-            !
-            DO jk = 1, jpk
-               e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm) * r1_ht_0(:,:) * tmask(:,:,jk) )
-            END DO
-            e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-            !
-            IF( ln_vvl_ztilde .OR. ln_vvl_layer) THEN
-               tilde_e3t_b(:,:,:) = 0._wp
-               tilde_e3t_n(:,:,:) = 0._wp
-               IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0._wp
-            ENDIF
-         ENDIF
-         !                                       !=======================!
-      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN       !  Create restart file  !
-         !                                       !=======================!
-         !
-         IF(lwp) WRITE(numout,*) '---- dom_vvl_rst ----'
-         !                                           ! --------- !
-         !                                           ! all cases !
-         !                                           ! --------- !
-         CALL iom_rstput( kt, nitrst, numrow, 'e3t_b', e3t(:,:,:,Kbb) )
-         CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t(:,:,:,Kmm) )
-         !                                           ! ----------------------- !
-         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN  ! z_tilde and layer cases !
-            !                                        ! ----------------------- !
-            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_b', tilde_e3t_b(:,:,:))
-            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_n', tilde_e3t_n(:,:,:))
-         END IF
-         !                                           ! -------------!
-         IF( ln_vvl_ztilde ) THEN                    ! z_tilde case !
-            !                                        ! ------------ !
-            CALL iom_rstput( kt, nitrst, numrow, 'hdiv_lf', hdiv_lf(:,:,:))
-         ENDIF
-         !
-      ENDIF
-      !
-   END SUBROUTINE dom_vvl_rst
-
-
-   SUBROUTINE dom_vvl_ctl
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE dom_vvl_ctl  ***
-      !!
-      !! ** Purpose :   Control the consistency between namelist options
-      !!                for vertical coordinate
-      !!----------------------------------------------------------------------
-      INTEGER ::   ioptio, ios
-      !!
-      NAMELIST/nam_vvl/ ln_vvl_zstar, ln_vvl_ztilde, ln_vvl_layer, ln_vvl_ztilde_as_zstar, &
-         &              ln_vvl_zstar_at_eqtor      , rn_ahe3     , rn_rst_e3t            , &
-         &              rn_lf_cutoff               , rn_zdef_max , ln_vvl_dbg            , &  ! not yet implemented: ln_vvl_kepe
-         &              nn_vvl_interp
-      !!----------------------------------------------------------------------
-      !
-      READ  ( numnam_ref, nam_vvl, IOSTAT = ios, ERR = 901)
-901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nam_vvl in reference namelist' )
-      READ  ( numnam_cfg, nam_vvl, IOSTAT = ios, ERR = 902 )
-902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nam_vvl in configuration namelist' )
-      IF(lwm) WRITE ( numond, nam_vvl )
-      !
-      IF(lwp) THEN                    ! Namelist print
-         WRITE(numout,*)
-         WRITE(numout,*) 'dom_vvl_ctl : choice/control of the variable vertical coordinate'
-         WRITE(numout,*) '~~~~~~~~~~~'
-         WRITE(numout,*) '   Namelist nam_vvl : chose a vertical coordinate'
-         WRITE(numout,*) '      zstar                      ln_vvl_zstar   = ', ln_vvl_zstar
-         WRITE(numout,*) '      ztilde                     ln_vvl_ztilde  = ', ln_vvl_ztilde
-         WRITE(numout,*) '      layer                      ln_vvl_layer   = ', ln_vvl_layer
-         WRITE(numout,*) '      ztilde as zstar   ln_vvl_ztilde_as_zstar  = ', ln_vvl_ztilde_as_zstar
-         WRITE(numout,*) '      ztilde near the equator    ln_vvl_zstar_at_eqtor  = ', ln_vvl_zstar_at_eqtor
-         WRITE(numout,*) '      !'
-         WRITE(numout,*) '      thickness diffusion coefficient                      rn_ahe3      = ', rn_ahe3
-         WRITE(numout,*) '      maximum e3t deformation fractional change            rn_zdef_max  = ', rn_zdef_max
-         IF( ln_vvl_ztilde_as_zstar ) THEN
-            WRITE(numout,*) '      ztilde running in zstar emulation mode (ln_vvl_ztilde_as_zstar=T) '
-            WRITE(numout,*) '         ignoring namelist timescale parameters and using:'
-            WRITE(numout,*) '            hard-wired : z-tilde to zstar restoration timescale (days)'
-            WRITE(numout,*) '                         rn_rst_e3t     = 0.e0'
-            WRITE(numout,*) '            hard-wired : z-tilde cutoff frequency of low-pass filter (days)'
-            WRITE(numout,*) '                         rn_lf_cutoff   = 1.0/rn_Dt'
-         ELSE
-            WRITE(numout,*) '      z-tilde to zstar restoration timescale (days)        rn_rst_e3t   = ', rn_rst_e3t
-            WRITE(numout,*) '      z-tilde cutoff frequency of low-pass filter (days)   rn_lf_cutoff = ', rn_lf_cutoff
-         ENDIF
-         WRITE(numout,*) '         debug prints flag                                 ln_vvl_dbg   = ', ln_vvl_dbg
-         WRITE(numout,*) '         Method to compute scale factors anomaly at U/V/F points  nn_vvl_interp   = ', nn_vvl_interp
-      ENDIF
-      !
-      ioptio = 0                      ! Parameter control
-      IF( ln_vvl_ztilde_as_zstar )   ln_vvl_ztilde = .true.
-      IF( ln_vvl_zstar           )   ioptio = ioptio + 1
-      IF( ln_vvl_ztilde          )   ioptio = ioptio + 1
-      IF( ln_vvl_layer           )   ioptio = ioptio + 1
-      !
-      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE vertical coordinate in namelist nam_vvl' )
-      !
-      IF( .NOT. ln_vvl_zstar .AND. (nn_vvl_interp==2 ) )  CALL ctl_stop( 'nn_vvl_interp must be < 2 if ln_vvl_zstar=F' )
-      !
-      IF(lwp) THEN                   ! Print the choice
-         WRITE(numout,*)
-         IF( ln_vvl_zstar           ) WRITE(numout,*) '      ==>>>   zstar vertical coordinate is used'
-         IF( ln_vvl_ztilde          ) WRITE(numout,*) '      ==>>>   ztilde vertical coordinate is used'
-         IF( ln_vvl_layer           ) WRITE(numout,*) '      ==>>>   layer vertical coordinate is used'
-         IF( ln_vvl_ztilde_as_zstar ) WRITE(numout,*) '      ==>>>   to emulate a zstar coordinate'
-      ENDIF
-      !
-#if defined key_agrif
-      IF( (.NOT.Agrif_Root()).AND.(.NOT.ln_vvl_zstar) )   CALL ctl_stop( 'AGRIF is implemented with zstar coordinate only' )
-#endif
-      !
-   END SUBROUTINE dom_vvl_ctl
-
-#endif
-
-   !!======================================================================
-END MODULE domvvl
diff --git a/src/OCE/DOM/domwri.F90 b/src/OCE/DOM/domwri.F90
index 9e797e24..1616f18e 100644
--- a/src/OCE/DOM/domwri.F90
+++ b/src/OCE/DOM/domwri.F90
@@ -33,6 +33,7 @@ MODULE domwri
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: domwri.F90 15033 2021-06-21 10:24:45Z smasson $ 
@@ -80,9 +81,9 @@ CONTAINS
       CALL iom_putatt( inum,    'NFold', COUNT( (/l_NFold /) ) )
       CALL iom_putatt( inum,   'NFtype',          c_NFtype     )
       !                                                         ! type of vertical coordinate
-      IF(ln_zco)   CALL iom_putatt( inum, 'VertCoord', 'zco' )
-      IF(ln_zps)   CALL iom_putatt( inum, 'VertCoord', 'zps' )
-      IF(ln_sco)   CALL iom_putatt( inum, 'VertCoord', 'sco' )
+      IF(l_zco)   CALL iom_putatt( inum, 'VertCoord', 'zco' )
+      IF(l_zps)   CALL iom_putatt( inum, 'VertCoord', 'zps' )
+      IF(l_sco)   CALL iom_putatt( inum, 'VertCoord', 'sco' )
       !                                                         ! ocean cavities under iceshelves
       CALL iom_putatt( inum,   'IsfCav', COUNT( (/ln_isfcav/) ) )  
       !                                                         ! masks
@@ -146,26 +147,30 @@ CONTAINS
       CALL iom_rstput( 0, 0, inum, 'mbathy', zprt, ktype = jp_i4 )     !    ! nb of ocean T-points
       zprt(:,:) = REAL( mikt(:,:) , wp )
       CALL iom_rstput( 0, 0, inum, 'misf', zprt, ktype = jp_i4 )       !    ! nb of ocean T-points
-      !															             ! vertical mesh
-      CALL iom_rstput( 0, 0, inum, 'e3t_1d', e3t_1d, ktype = jp_r8  )    !    ! scale factors
-      CALL iom_rstput( 0, 0, inum, 'e3w_1d', e3w_1d, ktype = jp_r8  )
       
-      CALL iom_rstput( 0, 0, inum, 'e3t_0' , e3t_0 , ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3u_0' , e3u_0 , ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3v_0' , e3v_0 , ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3f_0' , e3f_0 , ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3w_0' , e3w_0 , ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3uw_0', e3uw_0, ktype = jp_r8  )
-      CALL iom_rstput( 0, 0, inum, 'e3vw_0', e3vw_0, ktype = jp_r8  )
+      !						                ! vertical mesh
+      CALL iom_rstput( 0, 0, inum, 'e3t_1d', e3t_1d, ktype = jp_r8  )  !    ! 1d scale factors
+      CALL iom_rstput( 0, 0, inum, 'e3w_1d', e3w_1d, ktype = jp_r8  )
       !
       CALL iom_rstput( 0, 0, inum, 'gdept_1d' , gdept_1d , ktype = jp_r8 )  ! stretched system
       CALL iom_rstput( 0, 0, inum, 'gdepw_1d' , gdepw_1d , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'gdept_0'  , gdept_0  , ktype = jp_r8 )
-      CALL iom_rstput( 0, 0, inum, 'gdepw_0'  , gdepw_0  , ktype = jp_r8 )
       !
-      IF( ln_sco ) THEN                                         ! s-coordinate stiffness
+      IF( lk_vco_1d3d .OR. lk_vco_3d ) THEN                                         ! 3d scale factors
+         CALL iom_rstput( 0, 0, inum, 'e3t_0' , e3t_3d , ktype = jp_r8  )
+         CALL iom_rstput( 0, 0, inum, 'e3u_0' , e3u_3d , ktype = jp_r8  )
+         CALL iom_rstput( 0, 0, inum, 'e3v_0' , e3v_3d , ktype = jp_r8  )
+         CALL iom_rstput( 0, 0, inum, 'e3f_0' , e3f_3d , ktype = jp_r8  )
+      ENDIF
+      IF( lk_vco_3d ) THEN
+         CALL iom_rstput( 0, 0, inum, 'e3w_0' , e3w_3d , ktype = jp_r8  )
+         CALL iom_rstput( 0, 0, inum, 'e3uw_0', e3uw_3d, ktype = jp_r8  )
+         CALL iom_rstput( 0, 0, inum, 'e3vw_0', e3vw_3d, ktype = jp_r8  )
+         !
+         CALL iom_rstput( 0, 0, inum, 'gdept_0', gdept_3d, ktype = jp_r8 )  ! 3d depth
+         CALL iom_rstput( 0, 0, inum, 'gdepw_0', gdepw_3d, ktype = jp_r8 )
+         !                                                      ! s-coordinate stiffness
          CALL dom_stiff( zprt )
-         CALL iom_rstput( 0, 0, inum, 'stiffness', zprt )       ! Max. grid stiffness ratio
+         CALL iom_rstput( 0, 0, inum, 'stiffness', zprt )                   ! Max. grid stiffness ratio
       ENDIF
       !
       IF( ll_wd ) CALL iom_rstput( 0, 0, inum, 'ht_0'   , ht_0   , ktype = jp_r8 )
diff --git a/src/OCE/DOM/domzgr.F90 b/src/OCE/DOM/domzgr.F90
index 85f89ed2..a151f2f4 100644
--- a/src/OCE/DOM/domzgr.F90
+++ b/src/OCE/DOM/domzgr.F90
@@ -62,9 +62,9 @@ CONTAINS
       !!              - read/set ocean depth and ocean levels (bathy, mbathy)
       !!              - vertical coordinate (gdep., e3.) depending on the 
       !!                coordinate chosen :
-      !!                   ln_zco=T   z-coordinate   
-      !!                   ln_zps=T   z-coordinate with partial steps
-      !!                   ln_zco=T   s-coordinate 
+      !!                   l_zco=T   z-coordinate   
+      !!                   l_zps=T   z-coordinate with partial steps
+      !!                   l_zco=T   s-coordinate 
       !!
       !! ** Action  :   define gdep., e3., mbathy and bathy
       !!----------------------------------------------------------------------
@@ -72,10 +72,12 @@ CONTAINS
       !
       INTEGER  ::   ji,jj,jk            ! dummy loop index
       INTEGER  ::   ikt, ikb            ! top/bot index
-      INTEGER  ::   ioptio, ibat, ios   ! local integer
+      INTEGER  ::   ioptio, inum, iatt  ! local integer
       INTEGER  ::   is_mbkuvf           ! ==0 if mbku, mbkv, mbkf to be computed
       REAL(wp) ::   zrefdep             ! depth of the reference level (~10m)
-      REAL(wp), DIMENSION(jpi,jpj  ) ::   zmsk
+      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
+      CHARACTER(len=7) ::   catt        ! 'zco', 'zps, 'sco' or 'UNKNOWN'
+      REAL(wp), DIMENSION(jpi,jpj)   ::   zmsk, z2d
       REAL(wp), DIMENSION(jpi,jpj,2) ::   ztopbot
       !!----------------------------------------------------------------------
       !
@@ -83,40 +85,192 @@ CONTAINS
          WRITE(numout,*)
          WRITE(numout,*) 'dom_zgr : vertical coordinate'
          WRITE(numout,*) '~~~~~~~'
+         IF( ln_linssh ) WRITE(numout,*) '          linear free surface: the vertical mesh does not change in time'
       ENDIF
-
-      IF( ln_linssh .AND. lwp) WRITE(numout,*) '   linear free surface: the vertical mesh does not change in time'
-
-
-      IF( ln_read_cfg ) THEN        !==  read in mesh_mask.nc file  ==!
+CALL FLUSH(numout)
+      !                             !==============================!
+      IF( ln_read_cfg ) THEN        !==  read in domcfg.nc file  ==!
+         !                          !==============================!
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   Read vertical mesh in ', TRIM( cn_domcfg ), ' file'
+         is_mbkuvf = 0         
+         !
+         CALL iom_open( cn_domcfg, inum )    ! open domcfg file
+         !
+!!st set ln_isfcav
+         IF( lk_isf ) THEN 
+            CALL iom_getatt( inum,    'IsfCav', iatt )   ! returns -999 if not found
+            ln_isfcav = iatt == 1           ! default = .false.
+            !
+            ! ------- keep compatibility with OLD VERSION... start -------
+            IF( iatt == -999 ) THEN
+               CALL iom_get( inum, 'ln_isfcav', z_cav )   ;   ln_isfcav = z_cav /= 0._wp
+            ENDIF
+         ENDIF
+         !                                         !* type of vertical coordinate
+         CALL iom_getatt( inum, 'VertCoord', catt )   ! returns 'UNKNOWN' if not found
+         l_zco = catt == 'zco'          ! default = .false.
+         l_zps = catt == 'zps'          ! default = .false.
+         l_sco = catt == 'sco'          ! default = .false.
+         !
+         ! ------- keep compatibility with OLD VERSION... start -------
+         IF( catt == 'UNKNOWN' ) THEN
+            CALL iom_get( inum,    'ln_zco', z_zco )   ;   l_zco = z_zco /= 0._wp
+            CALL iom_get( inum,    'ln_zps', z_zps )   ;   l_zps = z_zps /= 0._wp
+            CALL iom_get( inum,    'ln_sco', z_sco )   ;   l_sco = z_sco /= 0._wp
+         ENDIF
+         !                                !------------------------------!
+         !                                !--  all coordinate systems  --!   1D depth and e3   (needed in netcdf files)
+         !                                !------------------------------!
+         !
+         CALL iom_get( inum, jpdom_unknown, 'e3t_1d'  , e3t_1d  )   ! 1D reference coordinate
+         CALL iom_get( inum, jpdom_unknown, 'e3w_1d'  , e3w_1d  )
+         CALL e3_to_depth( e3t_1d, e3w_1d, gdept_1d, gdepw_1d )     ! 1D reference depth deduced from e3
+!!st NEED to deduce e3 from gdep 
+!!st         CALL iom_get( inum, jpdom_unknown, 'gdept_1d', gdept_1d )   ! 1D depth read
+!!st         CALL iom_get( inum, jpdom_unknown, 'gdepw_1d', gdepw_1d )
+!!st         CALL depth_to_e3( gdept_1d, gdepw_1d, e3t_1d, e3w_1d )      ! 1D e3 deduced from depth
+         !
+         !                                   !- ocean top and bottom k-indices
+         CALL iom_get( inum, jpdom_global, 'top_level'    , z2d(:,:)   )   ! 1st wet T-points (ISF)
+         k_top(:,:) = NINT( z2d(:,:) )
+         CALL iom_get( inum, jpdom_global, 'bottom_level' , z2d(:,:)   )   ! last wet T-points
+         k_bot(:,:) = NINT( z2d(:,:) )
          !
-         CALL zgr_read   ( ln_zco  , ln_zps  , ln_sco, ln_isfcav,   & 
-            &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth
-            &              gdept_0 , gdepw_0                    ,   &    ! gridpoints depth 
-            &              e3t_0   , e3u_0   , e3v_0 , e3f_0    ,   &    ! vertical scale factors
-            &              e3w_0   , e3uw_0  , e3vw_0           ,   &    ! vertical scale factors
-            &              k_top   , k_bot                      ,   &    ! 1st & last ocean level
-            &              is_mbkuvf, mbku, mbkv, mbkf )                 ! U/V/F points bottom levels
+         !                                !--------------------!
+         IF(     lk_vco_1d ) THEN         !--  z-coordinate  --!   use only 1D arrays for all gdep and e3 fields
+            !                             !--------------------!
+            l_zco = .TRUE.                     ! old logical   ==> to be removed
+            l_zps = .FALSE.
+            l_sco = .FALSE.
+            !
+            !                             !-----------------------!
+         ELSEIF( lk_vco_1d3d ) THEN       !--  z-partial cells  --!   use 3D t-level e3
+            !                             !-----------------------!
+            l_zco = .TRUE.
+            l_zps = .FALSE.                    ! old logical   ==> to be removed
+            l_sco = .FALSE.
+            !
+            !                                   ! t-level: 3D reference   (include partial cell)
+            CALL iom_get( inum, jpdom_global, 'e3t_0'  , e3t_3d, cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3u_0'  , e3u_3d, cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3v_0'  , e3v_3d, cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3f_0'  , e3f_3d, cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
+            !
+            !                             !--------------------!               
+         ELSEIF( lk_vco_3d ) THEN         !--  s-coordinate  --!   use 3D for all gdep and e3 fields
+            !                             !--------------------!
+            l_zco = .FALSE.
+            l_zps = .FALSE.
+            l_sco = .TRUE.                     ! old logical   ==> to be removed
+            !
+            !                                   !* depth         : 3D reference   (without partial cell)
+!!st no gdep._0 in ORCA_domcfg.nc from sette
+!!st            CALL iom_get( inum, jpdom_global , 'gdept_0' , gdept_0, kfill = jpfillcopy )
+!!st            CALL iom_get( inum, jpdom_global , 'gdepw_0' , gdepw_0, kfill = jpfillcopy )
+            !
+            !                                   !* scale factors : 3D reference   (can include partial cell)
+            CALL iom_get( inum, jpdom_global, 'e3t_0'  , e3t_3d , cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3u_0'  , e3u_3d , cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3v_0'  , e3v_3d , cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3f_0'  , e3f_3d , cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3w_0'  , e3w_3d , cd_type = 'W', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3uw_0' , e3uw_3d, cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+            CALL iom_get( inum, jpdom_global, 'e3vw_0' , e3vw_3d, cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
+            !
+!!st PATCH for ORCA see above no gdep._0 in ORCA_domcfg.nc
+            IF(  iom_varid( inum, 'gdept_0' , ldstop = .FALSE. ) > 0  .AND.  &
+               & iom_varid( inum, 'gdepw_0' , ldstop = .FALSE. ) > 0    ) THEN
+               CALL ctl_warn( 'zgr_read : old definition of depths and scale factors used ', & 
+                  &           '           depths at t- and w-points read in the domain configuration file')
+               CALL iom_get( inum, jpdom_global , 'gdept_0' , gdept_3d, kfill = jpfillcopy )
+               CALL iom_get( inum, jpdom_global , 'gdepw_0' , gdepw_3d, kfill = jpfillcopy )
+               !
+            ELSE                                !- depths computed from e3. scale factors
+               CALL e3_to_depth( e3t_3d   , e3w_3d   , gdept_3d   , gdepw_3d    )    ! 3D depths
+            ENDIF
+!!st
+            !                                   !* reference depth for negative bathy (wetting and drying only)
+            IF( ll_wd )   CALL iom_get( inum,  'rn_wd_ref_depth' , ssh_ref   )
             !
+            !                             !----------------------!               
+         ELSEIF( lk_ALE ) THEN            !--  ALE-coordinate  --!   combine time & space variations
+            !                             !----------------------!               
+            !!gm 
+            !    to be done : no restart read the 3D ref coord in domcfg to set coordinate at Nbb (and Nnn in MLF case) 
+            !               :    restart read the 3D ref coord when restart at Nbb (and Nnn in MLF case) 
+            !
+            ! Initialisation only (NO restart)
+            !                                   !* depth         :  4D fields   (without partial cell)
+!             CALL iom_get( inum, jpdom_global , 'gdept' , gdept(:,:,:,Kbb), kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global , 'gdepw' , gdepw, kfill = jpfillcopy )
+!             !
+!             !                                 !* scale factors :  4D fields   (can include partial cell)
+!             CALL iom_get( inum, jpdom_global, 'e3t_0'  ,  e3t(:,:,:,Kbb), cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3u_0'  ,  e3u(:,:,:,Kbb), cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3v_0'  ,  e3v(:,:,:,Kbb), cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3f_0'  ,  e3f(:,:,:,Kbb), cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3w_0'  ,  e3w(:,:,:,Kbb), cd_type = 'W', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3uw_0' , e3uw(:,:,:,Kbb), cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+!             CALL iom_get( inum, jpdom_global, 'e3vw_0' , e3vw(:,:,:,Kbb), cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
+            !!gm
+         ENDIF
+         !
+         CALL iom_close( inum )        ! close domcfg file
+         !
+         !                          !==================================!
       ELSE                          !==  User defined configuration  ==!
+         !                          !==================================!
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '          User defined vertical mesh (usr_def_zgr)'
          is_mbkuvf = 0
          !
-         CALL usr_def_zgr( ln_zco  , ln_zps  , ln_sco, ln_isfcav,   & 
-            &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth
-            &              gdept_0 , gdepw_0                    ,   &    ! gridpoints depth 
-            &              e3t_0   , e3u_0   , e3v_0 , e3f_0    ,   &    ! vertical scale factors
-            &              e3w_0   , e3uw_0  , e3vw_0           ,   &    ! vertical scale factors
-            &              k_top   , k_bot            )                  ! 1st & last ocean level
-         !
-         ! make sure that periodicities are properly applied 
-         CALL lbc_lnk( 'dom_zgr', gdept_0, 'T', 1._wp, gdepw_0, 'W', 1._wp,                                         &
-            &                       e3t_0, 'T', 1._wp,   e3u_0, 'U', 1._wp,  e3v_0, 'V', 1._wp, e3f_0, 'F', 1._wp,   &
-            &                       e3w_0, 'W', 1._wp,  e3uw_0, 'U', 1._wp, e3vw_0, 'V', 1._wp,   &   
-            &                     kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+         IF( lk_linssh .OR. lk_qco ) THEN
+            !                                !--------------------!
+            IF( lk_vco_1d ) THEN             !--  z-coordinate  --!   use only 1D arrays for all gdep and e3 fields
+               !                             !--------------------!
+               l_zco = .TRUE.                     ! old logical   ==> to be removed
+               l_zps = .FALSE.
+               l_sco = .FALSE.
+               !
+               CALL usr_def_zgr( l_zco  , l_zps  , l_sco, ln_isfcav,   &
+                  &              k_top   , k_bot                      ,   &    ! 1st & last ocean level
+                  &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   )        ! 1D gridpoints depth
+               !                             !-----------------------!
+            ELSEIF( lk_vco_1d3d ) THEN       !--  z-partial cells  --!   use 3D t-level e3
+               !                             !-----------------------!
+               l_zco = .FALSE.                     ! old logical   ==> to be removed
+               l_zps = .TRUE.
+               l_sco = .FALSE.
+               !
+               CALL usr_def_zgr( l_zco  , l_zps  , l_sco, ln_isfcav,   &
+                  &              k_top   , k_bot                      ,   &    ! 1st & last ocean level
+                  &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth
+                  &              e3t_3d  , e3u_3d  , e3v_3d, e3f_3d    )        ! vertical scale factors
+               !
+               ! make sure that periodicities are properly applied 
+               CALL lbc_lnk( 'dom_zgr', e3t_3d, 'T', 1._wp,   e3u_3d, 'U', 1._wp,  e3v_3d, 'V', 1._wp, e3f_3d, 'F', 1._wp,   &
+                    &                     kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+
+               !                             !--------------------!               
+            ELSEIF( lk_vco_3d ) THEN         !--  s-coordinate  --!   use 3D for all gdep and e3 fields
+               !                             !--------------------!
+               l_zco = .FALSE.                     ! old logical   ==> to be removed
+               l_zps = .FALSE.
+               l_sco = .TRUE.
+               !
+               CALL usr_def_zgr( l_zco  , l_zps  , l_sco, ln_isfcav,   &
+               &              k_top   , k_bot                      ,   &    ! 1st & last ocean level
+               &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth
+               &              e3t_3d  , e3u_3d  , e3v_3d, e3f_3d    ,   &    ! vertical scale factors
+               &              gdept_3d, gdepw_3d                    ,   &    ! gridpoints depth 
+               &              e3w_3d  , e3uw_3d , e3vw_3d           )        ! vertical scale factors
+               CALL lbc_lnk( 'dom_zgr', gdept_3d, 'T', 1._wp, gdepw_3d, 'W', 1._wp,                                          &
+               &                          e3t_3d, 'T', 1._wp,   e3u_3d, 'U', 1._wp,  e3v_3d, 'V', 1._wp, e3f_3d, 'F', 1._wp,   &
+               &                          e3w_3d, 'W', 1._wp,  e3uw_3d, 'U', 1._wp, e3vw_3d, 'V', 1._wp,   &   
+               &                     kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+            ENDIF
+         ENDIF
          ztopbot(:,:,1) = REAL(k_top, wp)
          ztopbot(:,:,2) = REAL(k_bot, wp)
          CALL lbc_lnk( 'dom_zgr', ztopbot, 'T', 1._wp, kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
@@ -130,30 +284,18 @@ CONTAINS
       !
       zmsk(:,:) = 1._wp                                       ! default: no closed boundaries
       IF( .NOT. l_Iperio ) THEN                                    ! E-W closed:
-         zmsk(  mi0(     1+nn_hls):mi1(     1+nn_hls),:) = 0._wp   ! first column of inner global domain at 0
-         zmsk(  mi0(jpiglo-nn_hls):mi1(jpiglo-nn_hls),:) = 0._wp   ! last  column of inner global domain at 0 
+         zmsk(  mi0(     1+nn_hls,nn_hls):mi1(     1+nn_hls,nn_hls),:) = 0._wp   ! first column of inner global domain at 0
+         zmsk(  mi0(jpiglo-nn_hls,nn_hls):mi1(jpiglo-nn_hls,nn_hls),:) = 0._wp   ! last  column of inner global domain at 0 
       ENDIF
       IF( .NOT. l_Jperio ) THEN                                    ! S closed:
-         zmsk(:,mj0(     1+nn_hls):mj1(     1+nn_hls)  ) = 0._wp   ! first   line of inner global domain at 0
+         zmsk(:,mj0(     1+nn_hls,nn_hls):mj1(     1+nn_hls,nn_hls)  ) = 0._wp   ! first   line of inner global domain at 0
       ENDIF
       IF( .NOT. ( l_Jperio .OR. l_NFold ) ) THEN                   ! N closed:
-         zmsk(:,mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)  ) = 0._wp   ! last    line of inner global domain at 0
+         zmsk(:,mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)  ) = 0._wp   ! last    line of inner global domain at 0
       ENDIF
       CALL lbc_lnk( 'usrdef_zgr', zmsk, 'T', 1. )             ! set halos
       k_top(:,:) = k_top(:,:) * NINT( zmsk(:,:) )
       !
-#if ! defined key_qco && ! defined key_linssh
-      ! OLD implementation of coordinate (not with 'key_qco' or 'key_linssh')
-      ! gde3w_0 has to be defined
-!!gm to be remove when removing the OLD definition of e3 scale factors so that gde3w_0=gdept_0
-!!gm therefore gde3w_0 disappears 
-      ! Compute gde3w_0 (vertical sum of e3w)
-      gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1)
-      DO jk = 2, jpk
-         gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk)
-      END DO
-#endif
-      !
       ! Any closed seas (defined by closea_mask > 0 in domain_cfg file) to be filled 
       ! in at runtime if ln_closea=.false.
       IF( ln_closea ) THEN
@@ -170,29 +312,39 @@ CONTAINS
       IF(lwp) THEN                     ! Control print
          WRITE(numout,*)
          WRITE(numout,*) '   Type of vertical coordinate (read in ', TRIM( cn_domcfg ), ' file or set in userdef_nam) :'
-         WRITE(numout,*) '      z-coordinate - full steps      ln_zco    = ', ln_zco
-         WRITE(numout,*) '      z-coordinate - partial steps   ln_zps    = ', ln_zps
-         WRITE(numout,*) '      s- or hybrid z-s-coordinate    ln_sco    = ', ln_sco
+         WRITE(numout,*) '      z-coordinate - full steps      l_zco    = ', l_zco
+         WRITE(numout,*) '      z-coordinate - partial steps   l_zps    = ', l_zps
+         WRITE(numout,*) '      s- or hybrid z-s-coordinate    l_sco    = ', l_sco
          WRITE(numout,*) '      ice shelf cavities             ln_isfcav = ', ln_isfcav
       ENDIF
 
       ioptio = 0                       ! Check Vertical coordinate options
-      IF( ln_zco      )   ioptio = ioptio + 1
-      IF( ln_zps      )   ioptio = ioptio + 1
-      IF( ln_sco      )   ioptio = ioptio + 1
+      IF( l_zco      )   ioptio = ioptio + 1
+      IF( l_zps      )   ioptio = ioptio + 1
+      IF( l_sco      )   ioptio = ioptio + 1
       IF( ioptio /= 1 )   CALL ctl_stop( ' none or several vertical coordinate options used' )
 
 
       !                                ! top/bottom ocean level indices for t-, u- and v-points (f-point also for top)
       CALL zgr_top_bot( k_top, k_bot, is_mbkuvf )      ! with a minimum value set to 1
       !
-      !                                ! ice shelf draft and bathymetry
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ikt = mikt(ji,jj)
-         ikb = mbkt(ji,jj)
-         bathy  (ji,jj) = gdepw_0(ji,jj,ikb+1)
-         risfdep(ji,jj) = gdepw_0(ji,jj,ikt  )
-      END_2D
+      IF( lk_vco_3d ) THEN
+         !                                ! ice shelf draft and bathymetry
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            ikt = mikt(ji,jj)
+            ikb = mbkt(ji,jj)
+            bathy  (ji,jj) = gdepw_3d(ji,jj,ikb+1)
+            risfdep(ji,jj) = gdepw_3d(ji,jj,ikt  )
+         END_2D
+      ELSE
+         !                                ! ice shelf draft and bathymetry
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            ikt = mikt(ji,jj)
+            ikb = mbkt(ji,jj)
+            bathy  (ji,jj) = gdepw_1d(ikb+1)
+            risfdep(ji,jj) = gdepw_1d(ikt  )
+         END_2D
+      ENDIF
       !
       !                                ! deepest/shallowest W level Above/Below ~10m
 !!gm BUG in s-coordinate this does not work!
@@ -204,25 +356,25 @@ CONTAINS
       IF( lwp )   THEN
          WRITE(numout,*) ' MIN val k_top   ', MINVAL(   k_top(:,:) ), ' MAX ', MAXVAL( k_top(:,:) )
          WRITE(numout,*) ' MIN val k_bot   ', MINVAL(   k_bot(:,:) ), ' MAX ', MAXVAL( k_bot(:,:) )
-         WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ),   &
-#if ! defined key_qco && ! defined key_linssh
-            &                          '3w ', MINVAL( gde3w_0(:,:,:) ),   &
-#endif
-            &                          ' w ', MINVAL( gdepw_0(:,:,:) )
-         WRITE(numout,*) ' MIN val e3    t ', MINVAL(   e3t_0(:,:,:) ), ' f ', MINVAL(   e3f_0(:,:,:) ),  &
-            &                          ' u ', MINVAL(   e3u_0(:,:,:) ), ' u ', MINVAL(   e3v_0(:,:,:) ),  &
-            &                          ' uw', MINVAL(  e3uw_0(:,:,:) ), ' vw', MINVAL(  e3vw_0(:,:,:)),   &
-            &                          ' w ', MINVAL(   e3w_0(:,:,:) )
-
-         WRITE(numout,*) ' MAX val depth t ', MAXVAL( gdept_0(:,:,:) ),   &
-#if ! defined key_qco && ! defined key_linssh
-            &                          '3w ', MINVAL( gde3w_0(:,:,:) ),   &
-#endif
-            &                          ' w ', MINVAL( gdepw_0(:,:,:) )
-         WRITE(numout,*) ' MAX val e3    t ', MAXVAL(   e3t_0(:,:,:) ), ' f ', MAXVAL(   e3f_0(:,:,:) ),  &
-            &                          ' u ', MAXVAL(   e3u_0(:,:,:) ), ' u ', MAXVAL(   e3v_0(:,:,:) ),  &
-            &                          ' uw', MAXVAL(  e3uw_0(:,:,:) ), ' vw', MAXVAL(  e3vw_0(:,:,:) ),  &
-            &                          ' w ', MAXVAL(   e3w_0(:,:,:) )
+         IF( lk_vco_1d3d ) THEN
+            WRITE(numout,*) ' MIN val e3    t ', MINVAL(   e3t_3d(:,:,:) ), ' f ', MINVAL(   e3f_3d(:,:,:) ),  &
+               &                          ' u ', MINVAL(   e3u_3d(:,:,:) ), ' u ', MINVAL(   e3v_3d(:,:,:) )
+            WRITE(numout,*) ' MAX val e3    t ', MAXVAL(   e3t_3d(:,:,:) ), ' f ', MAXVAL(   e3f_3d(:,:,:) ),  &
+               &                          ' u ', MAXVAL(   e3u_3d(:,:,:) ), ' u ', MAXVAL(   e3v_3d(:,:,:) )
+         ELSEIF( lk_vco_3d ) THEN
+            WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_3d(:,:,:) ),   &
+               &                          ' w ', MINVAL( gdepw_3d(:,:,:) )
+            WRITE(numout,*) ' MIN val e3    t ', MINVAL(   e3t_3d(:,:,:) ), ' f ', MINVAL(   e3f_3d(:,:,:) ),  &
+               &                          ' u ', MINVAL(   e3u_3d(:,:,:) ), ' u ', MINVAL(   e3v_3d(:,:,:) ),  &
+               &                          ' uw', MINVAL(  e3uw_3d(:,:,:) ), ' vw', MINVAL(  e3vw_3d(:,:,:)),   &
+               &                          ' w ', MINVAL(   e3w_3d(:,:,:) )
+            WRITE(numout,*) ' MAX val depth t ', MAXVAL( gdept_3d(:,:,:) ),   &
+               &                          ' w ', MINVAL( gdepw_3d(:,:,:) )
+            WRITE(numout,*) ' MAX val e3    t ', MAXVAL(   e3t_3d(:,:,:) ), ' f ', MAXVAL(   e3f_3d(:,:,:) ),  &
+               &                          ' u ', MAXVAL(   e3u_3d(:,:,:) ), ' u ', MAXVAL(   e3v_3d(:,:,:) ),  &
+               &                          ' uw', MAXVAL(  e3uw_3d(:,:,:) ), ' vw', MAXVAL(  e3vw_3d(:,:,:) ),  &
+               &                          ' w ', MAXVAL(   e3w_3d(:,:,:) )
+         ENDIF
       ENDIF
       !
    END SUBROUTINE dom_zgr
diff --git a/src/OCE/DOM/domzgr_substitute.h90 b/src/OCE/DOM/domzgr_substitute.h90
index 35173ccb..333e231c 100644
--- a/src/OCE/DOM/domzgr_substitute.h90
+++ b/src/OCE/DOM/domzgr_substitute.h90
@@ -1,3 +1,5 @@
+#if defined show_comments
+! These comments are not intended to be retained during preprocessing; i.e. do not define "show_comments"
 !!----------------------------------------------------------------------
 !!                    ***  domzgr_substitute.h90   ***
 !!----------------------------------------------------------------------
@@ -5,49 +7,753 @@
 !!      factors depending on the vertical coord. used, using CPP macro.
 !!----------------------------------------------------------------------
 !! History :  4.2  !  2020-02  (S. Techene, G. Madec)  star coordinate
+!!            4.5  !  2022-08  (S. Techene, G. Madec)  simplified formulation
 !!----------------------------------------------------------------------
 !! NEMO/OCE 4.2 , NEMO Consortium (2020)
 !! $Id$
 !! Software governed by the CeCILL license (see ./LICENSE)
 !!----------------------------------------------------------------------
-#if defined key_qco
-#   define  e3t(i,j,k,t)   (e3t_0(i,j,k)*(1._wp+r3t(i,j,t)*tmask(i,j,k)))
-#   define  e3u(i,j,k,t)   (e3u_0(i,j,k)*(1._wp+r3u(i,j,t)*umask(i,j,k)))
-#   define  e3v(i,j,k,t)   (e3v_0(i,j,k)*(1._wp+r3v(i,j,t)*vmask(i,j,k)))
-#   define  e3f(i,j,k)     (e3f_0(i,j,k)*(1._wp+r3f(i,j)*fe3mask(i,j,k)))
-#   define  e3f_vor(i,j,k) (e3f_0vor(i,j,k)*(1._wp+r3f(i,j)*fe3mask(i,j,k)))
-#   define  e3w(i,j,k,t)   (e3w_0(i,j,k)*(1._wp+r3t(i,j,t)))
-#   define  e3uw(i,j,k,t)  (e3uw_0(i,j,k)*(1._wp+r3u(i,j,t)))
-#   define  e3vw(i,j,k,t)  (e3vw_0(i,j,k)*(1._wp+r3v(i,j,t)))
-#   define  ht(i,j)        (ht_0(i,j)*(1._wp+r3t(i,j,Kmm)))
-#   define  hu(i,j,t)      (hu_0(i,j)*(1._wp+r3u(i,j,t)))
-#   define  hv(i,j,t)      (hv_0(i,j)*(1._wp+r3v(i,j,t)))
-#   define  r1_hu(i,j,t)   (r1_hu_0(i,j)/(1._wp+r3u(i,j,t)))
-#   define  r1_hv(i,j,t)   (r1_hv_0(i,j)/(1._wp+r3v(i,j,t)))
-# if defined key_isf
-#   define  gdept(i,j,k,t) ((gdept_0(i,j,k)-risfdep(i,j))*(1._wp+r3t(i,j,t))+risfdep(i,j)) 
-#   define  gdepw(i,j,k,t) ((gdepw_0(i,j,k)-risfdep(i,j))*(1._wp+r3t(i,j,t))+risfdep(i,j))
-# else
-#   define  gdept(i,j,k,t) (gdept_0(i,j,k)*(1._wp+r3t(i,j,t)))
-#   define  gdepw(i,j,k,t) (gdepw_0(i,j,k)*(1._wp+r3t(i,j,t)))
+!
+! key_qco :   e3#(i,j,k,t) = (E3#_0(i,j,k)*(1._wp+r3#(i,j,t)#mask(i,j,k))) = (E3#_0(i,j,k) Tmsk(r3#,#mask))
+!
+! key_lin :   e3#(i,j,k,t) = (E3#_0(i,j,k))
+!
+! key_qco : gdep#(i,j,k,t) =  (gdep#_0(i,j,k)*(1._wp+r3#(i,j,t))) = (gdep#_0(i,j,k) Time(r3#)
+!   + isf   gdep#(i,j,k,t) = ((gdept_0(i,j,k)-risfdep(i,j))*(1._wp+r3#(i,j,t))+risfdep(i,j)) = ((gdep#_0(i,j,k) Tisf(r3#,risfdep) 
+!
+! key_lin : gdep#(i,j,k,t) = (gdep#_0(i,j,k))
+!
+! NEW keys
+!
+! key_zco :     E3#_0(i,j,k) =  e3#_1d(k)
+!              DEP#_0(i,j,k) = gdep#_0(k)
+! key_zps : At a T-level partial-step point e3 are reduced (use 3D fields), not at a W-level (use 1D fields)
+!                E3#_0(i,j,k) =   e3#_0(i,j,k) for t-,u-,v-,f-points    
+!                E3#_0(i,j,k) =  e3#_1d(k)   for # = w-,uw-,vw-points
+!           but both gdept, gdepw remain at the 1D reference depth:
+!              DEP#_0(i,j,k) = gdep#_1d(k)
+! key_sco : gdep# and e3# vary with ocean depth : use 3D fields
+!               E3#_0(i,j,k) =  e3#_1d(i,j,k)
+!              DEP#_0(i,j,k) = gdep#_0(i,j,k)
+! key_ALE : gdep# and e3# vary in space AND time thus no substitution is required
+!           NB: key_ALE currently not available (and thus key_ztilde)
+!
+!
+! CAUTION e3fvor calculation at each timestep ==>>>   not in a DO_3D ....
+!!----------------------------------------------------------------------
+#endif
+
+# if defined   key_qco
+#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!st - this should desapear (a terme r3f aura un indice temporel)
+#      define  Tmskf(r3,msk,i,j,k,t)     *(1._wp+r3(i,j)*msk(i,j,k))
+!st
+#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+#  if defined   key_isf
+#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+#  else
+#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+#  endif
+# elif defined key_linssh
+#      define  Tmsk(r3,msk,i,j,k,t)
+#      define  Tmskf(r3,msk,i,j,k,t)
+#      define  Time(r3,i,j,t)
+#      define  Divi(r3,i,j,t)        
+#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+#  if defined   key_isf
+#      define  Tisf(r3,isf,i,j,t)
+#  else
+#      define  Tisf(r3,isf,i,j,t)      )
+#  endif
+# endif
+
+#if defined key_vco_1d   ||   defined key_vco_1d3d
+#     define  E3w_0(i,j,k)    e3w_1d(k)
+#     define  E3uw_0(i,j,k)   e3w_1d(k)
+#     define  E3vw_0(i,j,k)   e3w_1d(k)
+#     define  DEPt_0(i,j,k)   gdept_1d(k)
+#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+#     define  E3fv_0(i,j,k)   e3f_0vor(i,j,k)
+#     define  gdept_0(i,j,k)  gdept_1d(k)
+#     define  gdepw_0(i,j,k)  gdepw_1d(k)
+#     define  e3w_0(i,j,k)    e3w_1d(k)
+#     define  e3uw_0(i,j,k)   e3w_1d(k)
+#     define  e3vw_0(i,j,k)   e3w_1d(k)
+# if defined key_vco_1d
+#     define  E3t_0(i,j,k)    e3t_1d(k)
+#     define  E3u_0(i,j,k)    e3t_1d(k)
+#     define  E3v_0(i,j,k)    e3t_1d(k)
+#     define  E3f_0(i,j,k)    e3t_1d(k)
+#     define  e3t_0(i,j,k)    e3t_1d(k)
+#     define  e3u_0(i,j,k)    e3t_1d(k)
+#     define  e3v_0(i,j,k)    e3t_1d(k)
+#     define  e3f_0(i,j,k)    e3t_1d(k)
+# elif defined key_vco_1d3d
+#     define  E3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  E3u_0(i,j,k)    e3u_3d(i,j,k)
+#     define  E3v_0(i,j,k)    e3v_3d(i,j,k)
+#     define  E3f_0(i,j,k)    e3f_3d(i,j,k)
+#     define  e3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3u_0(i,j,k)    e3u_3d(i,j,k)
+#     define  e3v_0(i,j,k)    e3v_3d(i,j,k)
+#     define  e3f_0(i,j,k)    e3f_3d(i,j,k)
 # endif
-#   define  gde3w(i,j,k)   (gdept(i,j,k,Kmm)-ssh(i,j,Kmm))
-#elif defined key_linssh
-#   define  e3t(i,j,k,t)   e3t_0(i,j,k)
-#   define  e3u(i,j,k,t)   e3u_0(i,j,k)
-#   define  e3v(i,j,k,t)   e3v_0(i,j,k)
-#   define  e3f(i,j,k)     e3f_0(i,j,k)
-#   define  e3f_vor(i,j,k) e3f_0vor(i,j,k)
-#   define  e3w(i,j,k,t)   e3w_0(i,j,k)
-#   define  e3uw(i,j,k,t)  e3uw_0(i,j,k)
-#   define  e3vw(i,j,k,t)  e3vw_0(i,j,k)
-#   define  ht(i,j)        ht_0(i,j)
-#   define  hu(i,j,t)      hu_0(i,j)
-#   define  hv(i,j,t)      hv_0(i,j)
-#   define  r1_hu(i,j,t)   r1_hu_0(i,j)
-#   define  r1_hv(i,j,t)   r1_hv_0(i,j)
-#   define  gdept(i,j,k,t) gdept_0(i,j,k)
-#   define  gdepw(i,j,k,t) gdepw_0(i,j,k)
-#   define  gde3w(i,j,k)   gdept_0(i,j,k)
+#elif defined key_vco_3d
+#     define  E3w_0(i,j,k)    e3w_3d(i,j,k)
+#     define  E3uw_0(i,j,k)   e3uw_3d(i,j,k)
+#     define  E3vw_0(i,j,k)   e3vw_3d(i,j,k)
+#     define  DEPt_0(i,j,k)   gdept_3d(i,j,k)
+#     define  DEPw_0(i,j,k)   gdepw_3d(i,j,k)
+#     define  e3w_0(i,j,k)    e3w_3d(i,j,k)
+#     define  e3uw_0(i,j,k)   e3uw_3d(i,j,k)
+#     define  e3vw_0(i,j,k)   e3vw_3d(i,j,k)
+#     define  gdept_0(i,j,k)   gdept_3d(i,j,k)
+#     define  gdepw_0(i,j,k)   gdepw_3d(i,j,k)
+!
+#     define  E3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  E3u_0(i,j,k)    e3u_3d(i,j,k)
+#     define  E3v_0(i,j,k)    e3v_3d(i,j,k)
+#     define  E3f_0(i,j,k)    e3f_3d(i,j,k)
+#     define  E3fv_0(i,j,k)   e3f_0vor(i,j,k)
+#     define  e3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3u_0(i,j,k)    e3u_3d(i,j,k)
+#     define  e3v_0(i,j,k)    e3v_3d(i,j,k)
+#     define  e3f_0(i,j,k)    e3f_3d(i,j,k)
+#endif
+!
+#if   defined key_qco   ||   defined key_linssh   ||   defined key_vco_1d   ||   defined key_vco_1d3d   ||   defined key_vco_3d
+# define  e3t(i,j,k,t)      (E3t_0(i,j,k) Tmsk(r3t,tmask,i,j,k,t))
+# define  e3u(i,j,k,t)      (E3u_0(i,j,k) Tmsk(r3u,umask,i,j,k,t))
+# define  e3v(i,j,k,t)      (E3v_0(i,j,k) Tmsk(r3v,vmask,i,j,k,t))
+# define  e3f(i,j,k)        (E3f_0(i,j,k) Tmskf(r3f,fe3mask,i,j,k,t))
+# define  e3f_vor(i,j,k)    (E3fv_0(i,j,k) Tmskf(r3f,fe3mask,i,j,k,t))
+# define  e3w(i,j,k,t)      (E3w_0(i,j,k) Time(r3t,i,j,t))
+# define  e3uw(i,j,k,t)     (E3uw_0(i,j,k) Time(r3u,i,j,t))
+# define  e3vw(i,j,k,t)     (E3vw_0(i,j,k) Time(r3v,i,j,t))
+# define  ht(i,j,t)         (ht_0(i,j) Time(r3t,i,j,t))
+# define  hu(i,j,t)         (hu_0(i,j) Time(r3u,i,j,t))
+# define  hv(i,j,t)         (hv_0(i,j) Time(r3v,i,j,t))
+# define  r1_hu(i,j,t)      (r1_hu_0(i,j) Divi(r3u,i,j,t))
+# define  r1_hv(i,j,t)      (r1_hv_0(i,j) Divi(r3v,i,j,t))
+# define  gdept(i,j,k,t)    ((DEPt_0(i,j,k) Tisf(r3t,risfdep,i,j,t))
+# define  gdepw(i,j,k,t)    ((DEPw_0(i,j,k) Tisf(r3t,risfdep,i,j,t))
+#endif
+# define  gdept_z0(i,j,k,t) (gdept(i,j,k,t)-ssh(i,j,t))
+
+#if defined show_comments
+!!!!----------------------------------------------------------------------
+!!!!----------------------------------------------------------------------
+!!!
+!!! zps + qco
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!!
+!!#undef key_zps
+!!#define key_zco
+!!!
+!!! zco + qco
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!!
+!!#undef key_zco
+!!#define key_sco
+!!!
+!!! sco + qco
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!!----------------------------------------------------------------------
+!!#undef key_qco
+!!#define key_linssh
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!!
+!!#undef key_sco
+!!#define key_zps
+!!!
+!!! zps + linssh
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!!
+!!#undef key_zps
+!!#define key_zco
+!!!
+!!! zco + linssh
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!!
+!!#undef key_zco
+!!#define key_sco
+!!!
+!!! sco + linssh
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+!!!
+!!#undef Tmsk
+!!#undef Time
+!!#undef Divi
+!!#undef DEPT_z0
+!!#undef Tisf
+!!#undef E3w_0
+!!#undef E3uw_0
+!!#undef E3vw_0
+!!#undef E3t_0
+!!#undef E3u_0
+!!#undef E3v_0
+!!#undef E3f_0
+!!#undef DEPt_0
+!!#undef DEPw_0
+!!#undef E3fv_0
+!!#undef e3w
+!!#undef e3uw
+!!#undef e3vw
+!!#undef e3t
+!!#undef e3u
+!!#undef e3v
+!!#undef e3f
+!!#undef e3f_vor
+!!#undef ht
+!!#undef hu
+!!#undef hv
+!!#undef r1_hu
+!!#undef r1_hv
+!!#undef gdept
+!!#undef gdepw
+!!!
+!!#undef key_sco
+!!#undef key_linssh
+!!!
+!!! default case
+!!!
+!!# if defined   key_qco
+!!#      define  Tmsk(r3,msk,i,j,k,t)      *(1._wp+r3(i,j,t)*msk(i,j,k))
+!!#      define  Time(r3,i,j,t)            *(1._wp+r3(i,j,t))
+!!#      define  Divi(r3,i,j,t)          /(1._wp+r3(i,j,t))
+!!#      define  DEPT_z0(i,j,k,t)           gdept(i,j,k,t)-ssh(i,j,t)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)      -isf(i,j)) Time(r3,i,j,t)+isf(i,j)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      ) Time(r3,i,j,t)
+!!#  endif
+!!# elif defined key_linssh
+!!#      define  Tmsk(r3,msk,i,j,k,t)
+!!#      define  Time(r3,i,j,t)
+!!#      define  Divi(r3,i,j,t)        
+!!#      define  DEPT_z0(i,j,k,t)          gdept(i,j,k,Kmm)
+!!#  if defined   key_isf
+!!#      define  Tisf(r3,isf,i,j,t)
+!!#  else
+!!#      define  Tisf(r3,isf,i,j,t)      )
+!!#  endif
+!!# endif
+!!
+!!#if defined key_zco   ||   defined key_zps
+!!#     define  E3w_0(i,j,k)    e3w_1d(k)
+!!#     define  E3uw_0(i,j,k)   e3uw_1d(k)
+!!#     define  E3vw_0(i,j,k)   e3vw_1d(k)
+!!#     define  DEPt_0(i,j,k)   gdept_1d(k)
+!!#     define  DEPw_0(i,j,k)   gdepw_1d(k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!# if defined key_zco
+!!#     define  E3t_0(i,j,k)    e3t_1d(k)
+!!#     define  E3u_0(i,j,k)    e3t_1d(k)
+!!#     define  E3v_0(i,j,k)    e3t_1d(k)
+!!#     define  E3f_0(i,j,k)    e3t_1d(k)
+!!# elif defined key_zps
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!# endif
+!!#elif defined key_sco
+!!#     define  E3w_0(i,j,k)    e3w_0(i,j,k)
+!!#     define  E3uw_0(i,j,k)   e3uw_0(i,j,k)
+!!#     define  E3vw_0(i,j,k)   e3vw_0(i,j,k)
+!!#     define  DEPt_0(i,j,k)   gdept_0(i,j,k)
+!!#     define  DEPw_0(i,j,k)   gdepw_0(i,j,k)
+!!      !
+!!#     define  E3t_0(i,j,k)    e3t_0(i,j,k)
+!!#     define  E3u_0(i,j,k)    e3u_0(i,j,k)
+!!#     define  E3v_0(i,j,k)    e3v_0(i,j,k)
+!!#     define  E3f_0(i,j,k)    e3f_0(i,j,k)
+!!#     define  E3fv_0(i,j,k)   e3fvor_0(i,j,k)
+!!#endif
+!!#if   defined key_qco   ||   defined key_linssh   ||   defined key_zco   ||   defined key_zps   ||   defined key_sco
+!!# define  e3t(i,j,k,t)      (E3t_0(i,j,k) Tmsk(r3t,tmask,i,j,k,t))
+!!# define  e3u(i,j,k,t)      (E3u_0(i,j,k) Tmsk(r3u,umask,i,j,k,t))
+!!# define  e3v(i,j,k,t)      (E3v_0(i,j,k) Tmsk(r3v,vmask,i,j,k,t))
+!!# define  e3f(i,j,k)        (E3f_0(i,j,k) Tmsk(r3f,fe3mask,i,j,k,t))
+!!# define  e3f_vor(i,j,k)    (E3fv_0(i,j,k) Tmsk(r3f,fe3mask,i,j,k,t))
+!!# define  e3w(i,j,k,t)      (E3w_0(i,j,k) Time(r3t,i,j,t))
+!!# define  e3uw(i,j,k,t)     (E3uw_0(i,j,k) Time(r3u,i,j,t))
+!!# define  e3vw(i,j,k,t)     (E3vw_0(i,j,k) Time(r3v,i,j,t))
+!!# define  ht(i,j,t)         (ht_0(i,j) Time(r3t,i,j,t))
+!!# define  hu(i,j,t)         (hu_0(i,j) Time(r3u,i,j,t))
+!!# define  hv(i,j,t)         (hv_0(i,j) Time(r3v,i,j,t))
+!!# define  r1_hu(i,j,t)      (r1_hu_0(i,j) Divi(r3u,i,j,t))
+!!# define  r1_hv(i,j,t)      (r1_hv_0(i,j) Divi(r3v,i,j,t))
+!!# define  gdept(i,j,k,t)    ((DEPt_0(i,j,k) Tisf(r3t,risfdep,i,j,t))
+!!# define  gdepw(i,j,k,t)    ((DEPw_0(i,j,k) Tisf(r3t,risfdep,i,j,t))
+!!#endif
+!!# define  gdept_z0(i,j,k,t) (gdept(i,j,k,t)-ssh(i,j,t))
+!!!
+!!e3t(ji,jj,jk,kt)      
+!!e3u(ji,jj,jk,kt)      
+!!e3v(ji,jj,jk,kt)      
+!!e3f(ji,jj,jk)        
+!!e3f_vor(ji,jj,jk)    
+!!e3w(ji,jj,jk,kt)      
+!!e3uw(ji,jj,jk,kt)     
+!!e3vw(ji,jj,jk,kt)     
+!!ht(ji,jj,kt)          
+!!hu(ji,jj,kt)         
+!!hv(ji,jj,kt)  
+!!r1_hu(ji,jj,kt)      
+!!r1_hv(ji,jj,kt)      
+!!gdept(ji,jj,jk,kt)    
+!!gdepw(ji,jj,jk,kt)    
+!!gdept_z0(ji,jj,jk,kt)
+
+
+
+
 #endif
-!!----------------------------------------------------------------------
diff --git a/src/OCE/DOM/dtatsd.F90 b/src/OCE/DOM/dtatsd.F90
index 5863789c..bc00b222 100644
--- a/src/OCE/DOM/dtatsd.F90
+++ b/src/OCE/DOM/dtatsd.F90
@@ -37,6 +37,7 @@ MODULE dtatsd
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: dtatsd.F90 14834 2021-05-11 09:24:44Z hadcv $
@@ -135,7 +136,7 @@ CONTAINS
       !! ** Action  :   ptsd   T-S data on medl mesh and interpolated at time-step kt
       !!----------------------------------------------------------------------
       INTEGER                          , INTENT(in   ) ::   kt     ! ocean time-step
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
       !
       INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
       INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1   ! local integers
@@ -161,8 +162,8 @@ CONTAINS
                ij0 = 101 + nn_hls       ;   ij1 = 109 + nn_hls                       ! Reduced T & S in the Alboran Sea
                ii0 = 141 + nn_hls - 1   ;   ii1 = 155 + nn_hls - 1
                IF( sf_tsd(jp_tem)%ln_tint .OR. irec_n(jp_tem) /= irec_b(jp_tem) ) THEN
-                  DO jj = mj0(ij0), mj1(ij1)
-                     DO ji = mi0(ii0), mi1(ii1)
+                  DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+                     DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
                         sf_tsd(jp_tem)%fnow(ji,jj,13:13) = sf_tsd(jp_tem)%fnow(ji,jj,13:13) - 0.20_wp
                         sf_tsd(jp_tem)%fnow(ji,jj,14:15) = sf_tsd(jp_tem)%fnow(ji,jj,14:15) - 0.35_wp
                         sf_tsd(jp_tem)%fnow(ji,jj,16:25) = sf_tsd(jp_tem)%fnow(ji,jj,16:25) - 0.40_wp
@@ -172,8 +173,8 @@ CONTAINS
                ENDIF
                !
                IF( sf_tsd(jp_sal)%ln_tint .OR. irec_n(jp_sal) /= irec_b(jp_sal) ) THEN
-                  DO jj = mj0(ij0), mj1(ij1)
-                     DO ji = mi0(ii0), mi1(ii1)
+                  DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+                     DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
                         sf_tsd(jp_sal)%fnow(ji,jj,13:13) = sf_tsd(jp_sal)%fnow(ji,jj,13:13) - 0.15_wp
                         sf_tsd(jp_sal)%fnow(ji,jj,14:15) = sf_tsd(jp_sal)%fnow(ji,jj,14:15) - 0.25_wp
                         sf_tsd(jp_sal)%fnow(ji,jj,16:17) = sf_tsd(jp_sal)%fnow(ji,jj,16:17) - 0.30_wp
@@ -185,9 +186,9 @@ CONTAINS
                !
                ij0 =  87 + nn_hls       ;   ij1 =  96 + nn_hls                       ! Reduced temperature in Red Sea
                ii0 = 148 + nn_hls - 1   ;   ii1 = 160 + nn_hls - 1
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ,  4:10 ) = 7.0_wp
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 ) = 6.5_wp
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 ) = 6.0_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) ,  4:10 ) = 7.0_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 11:13 ) = 6.5_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 14:20 ) = 6.0_wp
             ENDIF
          ENDIF
 !!gm end
@@ -199,7 +200,7 @@ CONTAINS
          ptsd(ji,jj,jk,jp_sal) = sf_tsd(jp_sal)%fnow(ji,jj,jk)
       END_3D
       !
-      IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
+      IF( l_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
          !
          IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
             IF( kt == nit000 .AND. lwp )THEN
@@ -210,7 +211,7 @@ CONTAINS
          !
          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                  ! vertical interpolation of T & S
             DO jk = 1, jpk                        ! determines the intepolated T-S profiles at each (i,j) points
-               zl = gdept_0(ji,jj,jk)
+               zl = gdept_3d(ji,jj,jk)
                IF(     zl < gdept_1d(1  ) ) THEN          ! above the first level of data
                   ztp(jk) =  ptsd(ji,jj,1    ,jp_tem)
                   zsp(jk) =  ptsd(ji,jj,1    ,jp_sal)
@@ -218,7 +219,7 @@ CONTAINS
                   ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem)
                   zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal)
                ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1
-                  DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1)
+                  DO jkk = 1, jpkm1                                  ! when  gdept_jkk < zl < gdept_jkk+1
                      IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN
                         zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk))
                         ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi
@@ -246,23 +247,6 @@ CONTAINS
             ptsd(ji,jj,jk,jp_sal) = ptsd(ji,jj,jk,jp_sal) * tmask(ji,jj,jk)
          END_3D
          !
-         IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-               ik = mbkt(ji,jj)
-               IF( ik > 1 ) THEN
-                  zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
-                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik-1,jp_tem)
-                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal)
-               ENDIF
-               ik = mikt(ji,jj)
-               IF( ik > 1 ) THEN
-                  zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) )
-                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem)
-                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal)
-               END IF
-            END_2D
-         ENDIF
-         !
       ENDIF
       !
       IF( .NOT.ln_tsd_dmp ) THEN                   !==   deallocate T & S structure   ==!
diff --git a/src/OCE/DOM/istate.F90 b/src/OCE/DOM/istate.F90
index a8ea487a..307de7bd 100644
--- a/src/OCE/DOM/istate.F90
+++ b/src/OCE/DOM/istate.F90
@@ -25,7 +25,6 @@ MODULE istate
    USE daymod         ! calendar
    USE dtatsd         ! data temperature and salinity   (dta_tsd routine)
    USE dtauvd         ! data: U & V current             (dta_uvd routine)
-   USE domvvl          ! varying vertical mesh
    USE wet_dry         ! wetting and drying (needed for wad_istate)
    USE usrdef_istate   ! User defined initial state
    !
diff --git a/src/OCE/DYN/divhor.F90 b/src/OCE/DYN/divhor.F90
index 2cdf53d1..3c2cabc2 100644
--- a/src/OCE/DYN/divhor.F90
+++ b/src/OCE/DYN/divhor.F90
@@ -78,17 +78,16 @@ CONTAINS
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) 'div_hor_RK3 : thickness weighted horizontal divergence '
          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
-         hdiv    (:,:,:) = 0._wp    ! initialize hdiv & pe3divUh for the halos and jpk level at the first time step
+         hdiv(:,:,:) = 0._wp    ! initialize hdiv & pe3divUh for the halos and jpk level at the first time step
+         pe3divUh(:,:,jpk) = 0._wp
       ENDIF
       ! 
-      pe3divUh(:,:,:) = 0._wp    !!gm to be applied to the halos only
-      !
-      DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )
-         hdiv(ji,jj,jk) = (   e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * puu(ji  ,jj,jk)      &
-            &               - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * puu(ji-1,jj,jk)      &
-            &               + e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * pvv(ji,jj  ,jk)      &
-            &               - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * pvv(ji,jj-1,jk)  )   &
-            &            * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         hdiv(ji,jj,jk) = (  (  e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * puu(ji  ,jj,jk)       &   ! add () for NP repro
+            &                 - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * puu(ji-1,jj,jk) )     &
+            &              + (  e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * pvv(ji,jj  ,jk)       &
+            &                 - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * pvv(ji,jj-1,jk) )     &
+            &             ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
       END_3D
       !
       IF( ln_rnf )   CALL sbc_rnf_div( hdiv, Kmm )             !==  + runoffs divergence  ==!
@@ -100,7 +99,7 @@ CONTAINS
       !
       IF( ln_isf )   CALL isf_hdiv( kt, Kmm, hdiv )            !==  + ice-shelf mass exchange ==!
       !
-      IF( nn_hls==1 )   CALL lbc_lnk( 'divhor', hdiv, 'T', 1._wp )   !   (no sign change)
+      CALL lbc_lnk( 'divhor', hdiv, 'T', 1._wp )   !   (no sign change)
       !
 !!gm Patch before suppression of hdiv from all modules that use it
 !      DO_3D( 0, 0, 0, 0, 1, jpkm1 )                            !==  e3t * Horizontal divergence  ==!
@@ -143,22 +142,17 @@ CONTAINS
             IF(lwp) WRITE(numout,*)
             IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence '
             IF(lwp) WRITE(numout,*) '~~~~~~~   '
+
+            hdiv(:,:,:) = 0._wp    ! initialize hdiv for the halos at the first time step
          ENDIF
-         DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
-            hdiv(ji,jj,jk) = 0._wp    ! initialize hdiv for the halos at the first time step
-         END_3D
       ENDIF
       !
-      DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )                                          !==  Horizontal divergence  ==!
-         ! round brackets added to fix the order of floating point operations
-         ! needed to ensure halo 1 - halo 2 compatibility
-         hdiv(ji,jj,jk) = (  ( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * uu(ji  ,jj,jk,Kmm)     &
-            &                - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm)     &
-            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility
-            &              + ( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vv(ji,jj  ,jk,Kmm)     &
-            &                - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm)     &
-            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility
-            &             )  * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                          !==  Horizontal divergence  ==!
+         hdiv(ji,jj,jk) = (  (  e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * uu(ji  ,jj,jk,Kmm)     &   ! add () for NP repro
+            &                 - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm) )   &
+            &              + (  e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vv(ji,jj  ,jk,Kmm)     &
+            &                 - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm) )   &
+            &             ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
       END_3D
       !
       IF( ln_rnf )   CALL sbc_rnf_div( hdiv, Kmm )                               !==  runoffs    ==!   (update hdiv field)
@@ -167,10 +161,14 @@ CONTAINS
       IF( ln_sshinc .AND. ln_asmiau )   CALL ssh_asm_div( kt, Kbb, Kmm, hdiv )   !==  SSH assimilation  ==!   (update hdiv field)
       ! 
 #endif
-      IF( ln_isf )                      CALL isf_hdiv( kt, Kmm, hdiv )           !==  ice shelf         ==!   (update hdiv field)
+      IF( ln_isf )   CALL isf_hdiv( kt, Kmm, hdiv )                              !==  ice shelf  ==!   (update hdiv field)
       !
-      IF( nn_hls==1 )   CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   !   (no sign change)
-      !                                                               ! needed for ww in sshwzv
+      ! hdiv is needed on haloes by wzv and ssh_nxt, but these are not called in the same tiling
+      ! loop as div_hor, so we can keep this lbc_lnk here and call it after all tiles are finished
+      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                           ! Do only on the last tile
+         CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   ! needed for ww in sshwzv  (no sign change)
+      ENDIF
+      ! 
       IF( ln_timing )   CALL timing_stop('div_hor')
       !
    END SUBROUTINE div_hor_old
diff --git a/src/OCE/DYN/dynadv.F90 b/src/OCE/DYN/dynadv.F90
index bda2c3a4..1c5afaa6 100644
--- a/src/OCE/DYN/dynadv.F90
+++ b/src/OCE/DYN/dynadv.F90
@@ -7,6 +7,7 @@ MODULE dynadv
    !!            3.3  !  2010-10  (C. Ethe, G. Madec)  reorganisation of initialisation phase
    !!            3.6  !  2015-05  (N. Ducousso, G. Madec)  add Hollingsworth scheme as an option 
    !!            4.0  !  2017-07  (G. Madec)  add a linear dynamics option
+   !!            4.5  !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -50,7 +51,7 @@ MODULE dynadv
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE dyn_adv( kt, Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw, no_zad )
+   SUBROUTINE dyn_adv( kt, Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE dyn_adv  ***
       !!                
@@ -64,7 +65,6 @@ CONTAINS
       !!      (see dynvor module).
       !!----------------------------------------------------------------------
       INTEGER                                     , INTENT(in   ) ::   kt , Kbb, Kmm, Krhs   ! ocean time step and level indices
-      INTEGER                   , OPTIONAL        , INTENT(in   ) ::   no_zad                ! no vertical advection compotation
       REAL(wp), DIMENSION(:,:,:), OPTIONAL, TARGET, INTENT(in   ) ::   pau, pav, paw         ! advective velocity
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), TARGET, INTENT(inout) ::   puu, pvv              ! ocean velocities and RHS of momentum Eq.
       !!----------------------------------------------------------------------
@@ -73,12 +73,15 @@ CONTAINS
       !
       SELECT CASE( n_dynadv )    !==  compute advection trend and add it to general trend  ==!
       CASE( np_VEC_c2  )                                                         != vector form =!
-         CALL dyn_keg     ( kt, nn_dynkeg     , Kmm, puu, pvv, Krhs )                          ! horizontal gradient of kinetic energy
-         CALL dyn_zad     ( kt                , Kmm, puu, pvv, Krhs )                          ! vertical advection
+         !                                                                             !* horizontal gradient of kinetic energy
+         CALL dyn_keg     ( kt, nn_dynkeg     , Kmm, puu, pvv, Krhs )
+         CALL dyn_zad     ( kt                , Kmm, puu, pvv, Krhs )                  !* vertical advection
+         !
       CASE( np_FLX_c2  )                                                         !=  flux form  =!
-         CALL dyn_adv_cen2( kt                , Kmm, puu, pvv, Krhs, pau, pav, paw, no_zad )   ! 2nd order centered scheme
-      CASE( np_FLX_ubs )   
-         CALL dyn_adv_ubs ( kt           , Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw, no_zad )   ! 3rd order UBS      scheme (UP3)
+         CALL dyn_adv_cen2( kt                , Kmm, puu, pvv, Krhs, pau, pav, paw )   !* 2nd order centered scheme
+         !
+      CASE( np_FLX_ubs )                                                               !* 3rd order UBS      scheme (UP3)
+         CALL dyn_adv_ubs     ( kt       , Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw )
       END SELECT
       !
       IF( ln_timing )   CALL timing_stop( 'dyn_adv' )
diff --git a/src/OCE/DYN/dynadv_cen2.F90 b/src/OCE/DYN/dynadv_cen2.F90
index 7fd7f65f..c318d6ae 100644
--- a/src/OCE/DYN/dynadv_cen2.F90
+++ b/src/OCE/DYN/dynadv_cen2.F90
@@ -6,6 +6,7 @@ MODULE dynadv_cen2
    !!======================================================================
    !! History :  2.0  ! 2006-08  (G. Madec, S. Theetten)  Original code
    !!            3.2  ! 2009-07  (R. Benshila)  Suppression of rigid-lid option
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -35,7 +36,7 @@ MODULE dynadv_cen2
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs, pau, pav, paw, no_zad )
+   SUBROUTINE dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs, pau, pav, paw )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE dyn_adv_cen2  ***
       !!
@@ -51,15 +52,17 @@ CONTAINS
       !! ** Action  :   (puu,pvv)(:,:,:,Krhs)   updated with the advective trend
       !!----------------------------------------------------------------------
       INTEGER                                     , INTENT(in   ) ::   kt , Kmm, Krhs   ! ocean time-step and level indices
-      INTEGER                   , OPTIONAL        , INTENT(in   ) ::   no_zad                ! no vertical advection computation
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), TARGET, INTENT(inout) ::   puu, pvv         ! ocean velocities and RHS of momentum equation
       REAL(wp), DIMENSION(:,:,:), OPTIONAL, TARGET, INTENT(in   ) ::   pau, pav, paw    ! advective velocity
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zzu, zzv     ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zfu_t, zfu_f, zfu_uw, zfu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zfv_t, zfv_f, zfv_vw, zfv, zfw
+      REAL(wp) ::   zzu, zzfu_kp1     ! local scalars
+      REAL(wp) ::   zzv, zzfv_kp1     !   -      -
+      REAL(wp), DIMENSION(T2D(1)) ::   zfu_t, zfu_f, zfu
+      REAL(wp), DIMENSION(T2D(1)) ::   zfv_t, zfv_f, zfv
+      REAL(wp), DIMENSION(T2D(1)) ::   zfu_uw, zfv_vw, zfw
       REAL(wp), DIMENSION(:,:,:) , POINTER ::   zpt_u, zpt_v, zpt_w
+      REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE ::   zu_trd, zv_trd
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -71,8 +74,9 @@ CONTAINS
       ENDIF
       !
       IF( l_trddyn ) THEN           ! trends: store the input trends
-         zfu_uw(:,:,:) = puu(:,:,:,Krhs)
-         zfv_vw(:,:,:) = pvv(:,:,:,Krhs)
+         ALLOCATE( zu_trd(A2D(0),jpkm1), zv_trd(A2D(0),jpkm1) )
+         zu_trd(:,:,:) = puu(A2D(0),:,Krhs)
+         zv_trd(:,:,:) = pvv(A2D(0),:,Krhs)
       ENDIF
       !
       IF( PRESENT( pau ) ) THEN     ! RK3: advective velocity (pau,pav,paw) /= advected velocity (puu,pvv,ww)
@@ -89,85 +93,88 @@ CONTAINS
       !
       DO jk = 1, jpkm1                    ! horizontal transport
          DO_2D( 1, 1, 1, 1 )
-            zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zpt_u(ji,jj,jk)
-            zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zpt_v(ji,jj,jk)
+            zfu(ji,jj) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zpt_u(ji,jj,jk)
+            zfv(ji,jj) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zpt_v(ji,jj,jk)
          END_2D
          DO_2D( 1, 0, 1, 0 )              ! horizontal momentum fluxes (at T- and F-point)
-            zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) )
-            zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )
-            zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )
-            zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) )
+            zfu_t(ji+1,jj  ) = ( zfu(ji,jj) + zfu(ji+1,jj) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) )
+            zfv_f(ji  ,jj  ) = ( zfv(ji,jj) + zfv(ji+1,jj) ) * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )
+            zfu_f(ji  ,jj  ) = ( zfu(ji,jj) + zfu(ji,jj+1) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )
+            zfv_t(ji  ,jj+1) = ( zfv(ji,jj) + zfv(ji,jj+1) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) )
          END_2D
          DO_2D( 0, 0, 0, 0 )              ! divergence of horizontal momentum fluxes
-            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    &
-               &                                       + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj)   &
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  ( zfu_t(ji+1,jj) - zfu_t(ji,jj  ) )    &   ! add () for NP repro
+               &                                       + ( zfv_f(ji  ,jj) - zfv_f(ji,jj-1) )  ) * r1_e1e2u(ji,jj)   &
                &                                    / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    &
-               &                                       + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj)   &
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  ( zfu_f(ji,jj  ) - zfu_f(ji-1,jj) )    &   ! add () for NP repro
+               &                                       + ( zfv_t(ji,jj+1) - zfv_t(ji  ,jj) )  ) * r1_e1e2v(ji,jj)   &
                &                                    / e3v(ji,jj,jk,Kmm)
          END_2D
       END DO
       !
       IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic
-         zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:)
-         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:)
-         CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm )
-         zfu_t(:,:,:) = puu(:,:,:,Krhs)
-         zfv_t(:,:,:) = pvv(:,:,:,Krhs)
+         zu_trd(:,:,:) = puu(A2D(0),:,Krhs) - zu_trd(:,:,:)
+         zv_trd(:,:,:) = pvv(A2D(0),:,Krhs) - zv_trd(:,:,:)
+         CALL trd_dyn( zu_trd, zv_trd, jpdyn_keg, kt, Kmm )
+         zu_trd(:,:,:) = puu(A2D(0),:,Krhs)
+         zv_trd(:,:,:) = pvv(A2D(0),:,Krhs)
       ENDIF
       !
-      IF( PRESENT( no_zad ) ) THEN  !==  No vertical advection  ==!   (except if linear free surface)
-         !                               ==
-         IF( ln_linssh ) THEN                ! linear free surface: advection through the surface z=0
-            DO_2D( 0, 0, 0, 0 )
-               zzu = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
-               zzv = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
-               puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) - zzu * r1_e1e2u(ji,jj)   &
-                  &                                        / e3u(ji,jj,1,Kmm)
-               pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) - zzv * r1_e1e2v(ji,jj)   &
-                  &                                        / e3v(ji,jj,1,Kmm)
-            END_2D
-         ENDIF
-         !
-      ELSE                          !==  Vertical advection  ==!
+      !                          !==  Vertical advection  ==!
+      !
+      !                              ! surface vertical fluxes
+      !
+      IF( ln_linssh ) THEN                ! linear free surface: advection through the surface z=0
+         DO_2D( 0, 0, 0, 0 )
+            zfu_uw(ji,jj) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
+            zfv_vw(ji,jj) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
+         END_2D
+      ELSE                                ! non linear free: surface advective fluxes set to zero
+         DO_2D( 0, 0, 0, 0 )
+            zfu_uw(ji,jj) = 0._wp
+            zfv_vw(ji,jj) = 0._wp
+         END_2D
+      ENDIF
+      !
+      DO jk = 1, jpk-2               !  divergence of advective fluxes
          !
-         DO_2D( 0, 0, 0, 0 )                 ! surface/bottom advective fluxes set to zero
-            zfu_uw(ji,jj,jpk) = 0._wp   ;   zfv_vw(ji,jj,jpk) = 0._wp
-            zfu_uw(ji,jj, 1 ) = 0._wp   ;   zfv_vw(ji,jj, 1 ) = 0._wp
+         DO_2D( 0, 1, 0, 1 )                  ! 1/4 * Vertical transport at level k+1
+            zfw(ji,jj) = 0.25_wp * e1e2t(ji,jj) * zpt_w(ji,jj,jk+1)
          END_2D
-         IF( ln_linssh ) THEN                ! linear free surface: advection through the surface z=0
-            DO_2D( 0, 0, 0, 0 )
-               zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
-               zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
-            END_2D
-         ENDIF
-         DO jk = 2, jpkm1                    ! interior advective fluxes
-            DO_2D( 0, 1, 0, 1 )                  ! 1/4 * Vertical transport
-               zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * zpt_w(ji,jj,jk)
-            END_2D
-            DO_2D( 0, 0, 0, 0 )
-               zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj  ,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) )
-               zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji  ,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) )
-            END_2D
-         END DO
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )       ! divergence of vertical momentum flux divergence
-            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   &
+         DO_2D( 0, 0, 0, 0 )
+            !                                       ! vertical flux at level k+1
+            zzfu_kp1 = ( zfw(ji,jj) + zfw(ji+1,jj  ) ) * ( puu(ji,jj,jk+1,Kmm) + puu(ji,jj,jk,Kmm) )
+            zzfv_kp1 = ( zfw(ji,jj) + zfw(ji  ,jj+1) ) * ( pvv(ji,jj,jk+1,Kmm) + pvv(ji,jj,jk,Kmm) )
+            !                                       ! divergence of vertical momentum flux
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj) - zzfu_kp1 ) * r1_e1e2u(ji,jj)   &
                &                                      / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   &
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj) - zzfv_kp1 ) * r1_e1e2v(ji,jj)   &
                &                                      / e3v(ji,jj,jk,Kmm)
-         END_3D
-         !
-         IF( l_trddyn ) THEN                 ! trends: send trend to trddyn for diagnostic
-            zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:)
-            zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:)
-            CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm )
-         ENDIF
-         !                                   ! Control print
-         IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' cen2 adv - Ua: ', mask1=umask,   &
-            &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' )
-         !
+            !                                       ! store vertical flux for next level calculation
+            zfu_uw(ji,jj) = zzfu_kp1
+            zfv_vw(ji,jj) = zzfv_kp1
+         END_2D
+      END DO
+      !
+      jk = jpkm1
+      DO_2D( 0, 0, 0, 0 )
+         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - zfu_uw(ji,jj) * r1_e1e2u(ji,jj)   &
+            &                                      / e3u(ji,jj,jk,Kmm)
+         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - zfv_vw(ji,jj) * r1_e1e2v(ji,jj)   &
+            &                                      / e3v(ji,jj,jk,Kmm)
+      END_2D
+      !
+      IF( l_trddyn ) THEN                 ! trends: send trend to trddyn for diagnostic
+         zu_trd(:,:,:) = puu(A2D(0),:,Krhs) - zu_trd(:,:,:)
+         zv_trd(:,:,:) = pvv(A2D(0),:,Krhs) - zv_trd(:,:,:)
+         CALL trd_dyn( zu_trd, zv_trd, jpdyn_zad, kt, Kmm )
+         DEALLOCATE( zu_trd, zv_trd )
       ENDIF
+      !                                   ! Control print
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' cen2 adv - Ua: ', mask1=umask,   &
+         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' )
       !
+         !
    END SUBROUTINE dyn_adv_cen2
 
    !!==============================================================================
diff --git a/src/OCE/DYN/dynadv_ubs.F90 b/src/OCE/DYN/dynadv_ubs.F90
index 645f6fa8..23a88d51 100644
--- a/src/OCE/DYN/dynadv_ubs.F90
+++ b/src/OCE/DYN/dynadv_ubs.F90
@@ -6,6 +6,7 @@ MODULE dynadv_ubs
    !!======================================================================
    !! History :  2.0  ! 2006-08  (R. Benshila, L. Debreu)  Original code
    !!            3.2  ! 2009-07  (R. Benshila)  Suppression of rigid-lid option
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -29,7 +30,7 @@ MODULE dynadv_ubs
    REAL(wp), PARAMETER :: gamma1 = 1._wp/3._wp  ! =1/4 quick      ; =1/3  3rd order UBS
    REAL(wp), PARAMETER :: gamma2 = 1._wp/32._wp ! =0   2nd order  ; =1/32 4th order centred
 
-   PUBLIC   dyn_adv_ubs   ! routine called by step.F90
+   PUBLIC   dyn_adv_ubs        ! routine called by dynadv.F90
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -41,7 +42,7 @@ MODULE dynadv_ubs
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE dyn_adv_ubs( kt, Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw, no_zad )
+   SUBROUTINE dyn_adv_ubs( kt, Kbb, Kmm, puu, pvv, Krhs, pau, pav, paw )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE dyn_adv_ubs  ***
       !!
@@ -73,17 +74,18 @@ CONTAINS
       !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling. 
       !!----------------------------------------------------------------------
       INTEGER                                     , INTENT(in   ) ::   kt , Kbb, Kmm, Krhs   ! ocean time-step and level indices
-      INTEGER                   , OPTIONAL        , INTENT(in   ) ::   no_zad                ! no vertical advection compotation
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), TARGET, INTENT(inout) ::   puu, pvv              ! ocean velocities and RHS of momentum equation
       REAL(wp), DIMENSION(:,:,:), OPTIONAL, TARGET, INTENT(in   ) ::   pau, pav, paw         ! advective velocity
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zui, zvj, zfuj, zfvi, zl_u, zl_v, zzu, zzv   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfu_t, zfu_f, zfu_uw, zfu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfv_t, zfv_f, zfv_vw, zfv, zfw
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlu_uu, zlu_uv
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlv_vv, zlv_vu
-      REAL(wp), DIMENSION(:,:,:), POINTER ::   zpt_u, zpt_v, zpt_w
+      REAL(wp) ::   zzu, zui, zfuj, zl_u, zzfu_kp1     ! local scalars
+      REAL(wp) ::   zzv, zvj, zfvi, zl_v, zzfv_kp1     !   -      -
+      REAL(wp), DIMENSION(T2D(2))   ::   zfu_t, zfu_f, zfu
+      REAL(wp), DIMENSION(T2D(2))   ::   zfv_t, zfv_f, zfv
+      REAL(wp), DIMENSION(T2D(2),2) ::   zlu_uu, zlu_uv
+      REAL(wp), DIMENSION(T2D(2),2) ::   zlv_vv, zlv_vu
+      REAL(wp), DIMENSION(:,:,:) , POINTER ::   zpt_u, zpt_v, zpt_w
+      REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE ::   zu_trd, zv_trd
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -94,19 +96,10 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      zfu_t(:,:,:) = 0._wp
-      zfv_t(:,:,:) = 0._wp
-      zfu_f(:,:,:) = 0._wp
-      zfv_f(:,:,:) = 0._wp
-      !
-      zlu_uu(:,:,:,:) = 0._wp
-      zlv_vv(:,:,:,:) = 0._wp 
-      zlu_uv(:,:,:,:) = 0._wp 
-      zlv_vu(:,:,:,:) = 0._wp 
-      !
-      IF( l_trddyn ) THEN           ! trends: store the input trends
-         zfu_uw(:,:,:) = puu(:,:,:,Krhs)
-         zfv_vw(:,:,:) = pvv(:,:,:,Krhs)
+      IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic  
+         ALLOCATE( zu_trd(A2D(0),jpkm1), zv_trd(A2D(0),jpkm1) )
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs)
       ENDIF
       !
       IF( PRESENT( pau ) ) THEN     ! RK3: advective velocity (pau,pav,paw) /= advected velocity (puu,pvv,ww)
@@ -123,169 +116,147 @@ CONTAINS
       DO jk = 1, jpkm1                       !  Laplacian of the velocity  !
          !                                   ! =========================== !
          !                                         ! horizontal volume fluxes
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zfu(ji,jj,jk) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zpt_u(ji,jj,jk)
-            zfv(ji,jj,jk) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zpt_v(ji,jj,jk)
+         DO_2D( 2, 2, 2, 2 )
+            zfu(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zpt_u(ji,jj,jk)
+            zfv(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zpt_v(ji,jj,jk)
          END_2D
          !            
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                       ! laplacian
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            zlu_uu(ji,jj,jk,1) = ( ( puu (ji+1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 + ( puu (ji-1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 ) * umask(ji  ,jj  ,jk)
-            zlv_vv(ji,jj,jk,1) = ( ( pvv (ji  ,jj+1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 + ( pvv (ji  ,jj-1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 ) * vmask(ji  ,jj  ,jk)
-            zlu_uv(ji,jj,jk,1) = (  puu (ji  ,jj+1,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb)  ) * fmask(ji  ,jj  ,jk)   &
-               &               - (  puu (ji  ,jj  ,jk,Kbb) - puu (ji  ,jj-1,jk,Kbb)  ) * fmask(ji  ,jj-1,jk)
-            zlv_vu(ji,jj,jk,1) = (  pvv (ji+1,jj  ,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb)  ) * fmask(ji  ,jj  ,jk)   &
-               &               - (  pvv (ji  ,jj  ,jk,Kbb) - pvv (ji-1,jj  ,jk,Kbb)  ) * fmask(ji-1,jj  ,jk)
+         DO_2D( 1, 1, 1, 1 )                       ! laplacian
+            zlu_uu(ji,jj,1) = ( ( puu (ji+1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) ) &                      ! add () for NP repro
+               &              + ( puu (ji-1,jj  ,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) ) ) * umask(ji  ,jj  ,jk)
+            zlv_vv(ji,jj,1) = ( ( pvv (ji  ,jj+1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) ) &                      ! add () for NP repro
+               &              + ( pvv (ji  ,jj-1,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) ) ) * vmask(ji  ,jj  ,jk)
+            zlu_uv(ji,jj,1) = (    puu(ji  ,jj+1,jk,Kbb) - puu(ji  ,jj  ,jk,Kbb)    ) * fmask(ji  ,jj  ,jk)   &
+               &            - (    puu(ji  ,jj  ,jk,Kbb) - puu(ji  ,jj-1,jk,Kbb)    ) * fmask(ji  ,jj-1,jk)
+            zlv_vu(ji,jj,1) = (    pvv(ji+1,jj  ,jk,Kbb) - pvv(ji  ,jj  ,jk,Kbb)    ) * fmask(ji  ,jj  ,jk)   &
+               &            - (    pvv(ji  ,jj  ,jk,Kbb) - pvv(ji-1,jj  ,jk,Kbb)    ) * fmask(ji-1,jj  ,jk)
             !
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            zlu_uu(ji,jj,jk,2) = ( ( zfu(ji+1,jj  ,jk) - zfu(ji  ,jj  ,jk)           &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 + ( zfu(ji-1,jj  ,jk) - zfu(ji  ,jj  ,jk)           &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 ) * umask(ji  ,jj  ,jk)
-            zlv_vv(ji,jj,jk,2) = ( ( zfv(ji  ,jj+1,jk) - zfv(ji  ,jj  ,jk)           &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 + ( zfv(ji  ,jj-1,jk) - zfv(ji  ,jj  ,jk)           &
-               &                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-               &                 ) * vmask(ji  ,jj  ,jk)
-            zlu_uv(ji,jj,jk,2) = (  zfu(ji  ,jj+1,jk) - zfu(ji  ,jj  ,jk)  ) * fmask(ji  ,jj  ,jk)             &
-               &               - (  zfu(ji  ,jj  ,jk) - zfu(ji  ,jj-1,jk)  ) * fmask(ji  ,jj-1,jk)
-            zlv_vu(ji,jj,jk,2) = (  zfv(ji+1,jj  ,jk) - zfv(ji  ,jj  ,jk)  ) * fmask(ji  ,jj  ,jk)             &
-               &               - (  zfv(ji  ,jj  ,jk) - zfv(ji-1,jj  ,jk)  ) * fmask(ji-1,jj  ,jk)
+            zlu_uu(ji,jj,2) = ( ( zfu(ji+1,jj  ) - zfu(ji  ,jj  ) ) &                      ! add () for NP repro
+               &              + ( zfu(ji-1,jj  ) - zfu(ji  ,jj  ) ) ) * umask(ji  ,jj  ,jk)
+            zlv_vv(ji,jj,2) = ( ( zfv(ji  ,jj+1) - zfv(ji  ,jj  ) ) &                      ! add () for NP repro
+               &              + ( zfv(ji  ,jj-1) - zfv(ji  ,jj  ) ) ) * vmask(ji  ,jj  ,jk)
+            zlu_uv(ji,jj,2) = (   zfu(ji  ,jj+1) - zfu(ji  ,jj  )   ) * fmask(ji  ,jj  ,jk)             &
+               &            - (   zfu(ji  ,jj  ) - zfu(ji  ,jj-1)   ) * fmask(ji  ,jj-1,jk)
+            zlv_vu(ji,jj,2) = (   zfv(ji+1,jj  ) - zfv(ji  ,jj  )   ) * fmask(ji  ,jj  ,jk)             &
+               &            - (   zfv(ji  ,jj  ) - zfv(ji-1,jj  )   ) * fmask(ji-1,jj  ,jk)
          END_2D
-      END DO
-      IF( nn_hls == 1 ) CALL lbc_lnk( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', -1.0_wp , zlu_uv(:,:,:,1), 'U', -1.0_wp,  &
-                                              &   zlu_uu(:,:,:,2), 'U', -1.0_wp , zlu_uv(:,:,:,2), 'U', -1.0_wp,  &
-                                              &   zlv_vv(:,:,:,1), 'V', -1.0_wp , zlv_vu(:,:,:,1), 'V', -1.0_wp,  &
-                                              &   zlv_vv(:,:,:,2), 'V', -1.0_wp , zlv_vu(:,:,:,2), 'V', -1.0_wp   )
-      !
-      !                                      ! ====================== !
-      !                                      !  Horizontal advection  !
-      DO jk = 1, jpkm1                       ! ====================== !
+         !
+         !                                      ! ====================== !
+         !                                      !  Horizontal advection  !
+         !                                      ! ====================== !
          !                                         ! horizontal volume fluxes
          DO_2D( 1, 1, 1, 1 )
-            zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zpt_u(ji,jj,jk)
-            zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zpt_v(ji,jj,jk)
+            zfu(ji,jj) = 0.25_wp * zfu(ji,jj)
+            zfv(ji,jj) = 0.25_wp * zfv(ji,jj)
          END_2D
          !
          DO_2D( 1, 0, 1, 0 )                       ! horizontal momentum fluxes at T- and F-point
             zui = ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) )
             zvj = ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) )
             !
-            IF( zui > 0 ) THEN   ;   zl_u = zlu_uu(ji  ,jj,jk,1)
-            ELSE                 ;   zl_u = zlu_uu(ji+1,jj,jk,1)
+            IF( zui > 0 ) THEN   ;   zl_u = zlu_uu(ji  ,jj,1)
+            ELSE                 ;   zl_u = zlu_uu(ji+1,jj,1)
             ENDIF
-            IF( zvj > 0 ) THEN   ;   zl_v = zlv_vv(ji,jj  ,jk,1)
-            ELSE                 ;   zl_v = zlv_vv(ji,jj+1,jk,1)
+            IF( zvj > 0 ) THEN   ;   zl_v = zlv_vv(ji,jj  ,1)
+            ELSE                 ;   zl_v = zlv_vv(ji,jj+1,1)
             ENDIF
             !
-            zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj  ,jk)                               &
-               &                    - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj  ,jk,2) )  )   &
-               &                * ( zui - gamma1 * zl_u)
-            zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji  ,jj+1,jk)                               &
-               &                    - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji  ,jj+1,jk,2) )  )   &
-               &                * ( zvj - gamma1 * zl_v)
+            zfu_t(ji+1,jj  ) = (            (    zfu(ji,jj  ) +    zfu(ji+1,jj    ) )      &   ! add () for NP repro
+               &                 - gamma2 * ( zlu_uu(ji,jj,2) + zlu_uu(ji+1,jj,  2) )  ) * ( zui - gamma1 * zl_u )
+            zfv_t(ji  ,jj+1) = (            (    zfv(ji,jj  ) +    zfv(ji  ,jj+1  ) )      &   ! add () for NP repro
+               &                 - gamma2 * ( zlv_vv(ji,jj,2) + zlv_vv(ji  ,jj+1,2) )  ) * ( zvj - gamma1 * zl_v )
             !
-            zfuj = ( zfu(ji,jj,jk) + zfu(ji  ,jj+1,jk) )
-            zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj  ,jk) )
-            IF( zfuj > 0 ) THEN   ;    zl_v = zlv_vu( ji  ,jj  ,jk,1)
-            ELSE                  ;    zl_v = zlv_vu( ji+1,jj,jk,1)
+            zfuj = ( zfu(ji,jj) + zfu(ji  ,jj+1) )
+            zfvi = ( zfv(ji,jj) + zfv(ji+1,jj  ) )
+            IF( zfuj > 0 ) THEN   ;    zl_v = zlv_vu(ji  ,jj,1)
+            ELSE                  ;    zl_v = zlv_vu(ji+1,jj,1)
             ENDIF
-            IF( zfvi > 0 ) THEN   ;    zl_u = zlu_uv( ji,jj  ,jk,1)
-            ELSE                  ;    zl_u = zlu_uv( ji,jj+1,jk,1)
+            IF( zfvi > 0 ) THEN   ;    zl_u = zlu_uv(ji,jj  ,1)
+            ELSE                  ;    zl_u = zlu_uv(ji,jj+1,1)
             ENDIF
             !
-            zfv_f(ji  ,jj  ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj  ,jk,2) )  )   &
-               &                * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) - gamma1 * zl_u )
-            zfu_f(ji  ,jj  ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji  ,jj+1,jk,2) )  )   &
-               &                * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) - gamma1 * zl_v )
+            zfv_f(ji  ,jj  ) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,2) + zlv_vu(ji+1,jj  ,2) )  )   &
+               &             * ( ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) - gamma1 * zl_u )   ! add () for NP repro
+            zfu_f(ji  ,jj  ) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,2) + zlu_uv(ji  ,jj+1,2) )  )   &
+               &             * ( ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) - gamma1 * zl_v )   ! add () for NP repro
          END_2D
          DO_2D( 0, 0, 0, 0 )                       ! divergence of horizontal momentum fluxes
-            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    &
-               &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj)   &
-               &                           / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    &
-               &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj)   &
-               &                           / e3v(ji,jj,jk,Kmm)
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  ( zfu_t(ji+1,jj) - zfu_t(ji,jj  ) )    &   ! add () for NP repro
+               &                                       + ( zfv_f(ji  ,jj) - zfv_f(ji,jj-1) )  ) * r1_e1e2u(ji,jj)   &
+               &                                    / e3u(ji,jj,jk,Kmm)
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  ( zfu_f(ji,jj  ) - zfu_f(ji-1,jj) )    &   ! add () for NP repro
+               &                                       + ( zfv_t(ji,jj+1) - zfv_t(ji  ,jj) )  ) * r1_e1e2v(ji,jj)   &
+               &                                    / e3v(ji,jj,jk,Kmm)
          END_2D
       END DO
-      IF( l_trddyn ) THEN                          ! trends: send trends to trddyn for diagnostic
-         zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:)
-         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:)
-         CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm )
-         zfu_t(:,:,:) = puu(:,:,:,Krhs)
-         zfv_t(:,:,:) = pvv(:,:,:,Krhs)
+      !
+      IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs) - zu_trd(A2D(0),:)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs) - zv_trd(A2D(0),:)
+         CALL trd_dyn( zu_trd, zv_trd, jpdyn_keg, kt, Kmm )
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs)
       ENDIF
       !                                      ! ==================== !
       !                                      !  Vertical advection  !
       !                                      ! ==================== !
       !
-      !                                      ! ======================== !
-      IF( PRESENT( no_zad ) ) THEN           !  No vertical advection   !   (except if linear free surface)
-         !                                   ! ======================== !    ------
-         !
-         IF( ln_linssh ) THEN                      ! linear free surface: advection through the surface z=0
-            DO_2D( 0, 0, 0, 0 )
-               zzu = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
-               zzv = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
-               puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) - zzu * r1_e1e2u(ji,jj)   &
-                  &                                        / e3u(ji,jj,1,Kmm)
-               pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) - zzv * r1_e1e2v(ji,jj)   &
-                  &                                        / e3v(ji,jj,1,Kmm)
-            END_2D
-         ENDIF
-         !                                   ! =================== !
-      ELSE                                   !  Vertical advection !
-         !                                   ! =================== !
-         DO_2D( 0, 0, 0, 0 )                          ! surface/bottom advective fluxes set to zero
-            zfu_uw(ji,jj,jpk) = 0._wp
-            zfv_vw(ji,jj,jpk) = 0._wp
-            zfu_uw(ji,jj, 1 ) = 0._wp
-            zfv_vw(ji,jj, 1 ) = 0._wp
+#define zfu_uw   zfu_t
+#define zfv_vw   zfv_t
+#define zfw      zfu
+      !
+      !                              ! surface vertical fluxes
+      !
+      IF( ln_linssh ) THEN                ! linear free surface: advection through the surface z=0
+         DO_2D( 0, 0, 0, 0 )
+            zfu_uw(ji,jj) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
+            zfv_vw(ji,jj) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
          END_2D
-         IF( ln_linssh ) THEN                         ! constant volume : advection through the surface
-            DO_2D( 0, 0, 0, 0 )
-               zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji+1,jj) * zpt_w(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
-               zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * zpt_w(ji,jj,1) + e1e2t(ji,jj+1) * zpt_w(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
-            END_2D
-         ENDIF
-         DO jk = 2, jpkm1                          ! interior fluxes
-            DO_2D( 0, 1, 0, 1 )
-               zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * zpt_w(ji,jj,jk)
-            END_2D
-            DO_2D( 0, 0, 0, 0 )
-               zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) )
-               zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) )
-            END_2D
-         END DO
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )             ! divergence of vertical momentum flux divergence
-            puu(ji,jj,jk,Krhs) =  puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   &
-               &                                       / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) =  pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   &
-               &                                       / e3v(ji,jj,jk,Kmm)
-         END_3D
-         !
-         IF( l_trddyn ) THEN                       ! save the vertical advection trend for diagnostic
-            zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:)
-            zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:)
-            CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm )
-         ENDIF
-         !                                         ! Control print
-         IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ubs2 adv - Ua: ', mask1=umask,   &
-            &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' )
+      ELSE                                ! non linear free: surface advective fluxes set to zero
+         DO_2D( 0, 0, 0, 0 )
+            zfu_uw(ji,jj) = 0._wp
+            zfv_vw(ji,jj) = 0._wp
+         END_2D
+      ENDIF
+      ! 
+      DO jk = 1, jpk-2               !  divergence of advective fluxes
          !
+         DO_2D( 0, 1, 0, 1 )                  ! 1/4 * Vertical transport at level k+1
+            zfw(ji,jj) = 0.25_wp * e1e2t(ji,jj) * zpt_w(ji,jj,jk+1)
+         END_2D
+         DO_2D( 0, 0, 0, 0 )
+            !                                 ! vertical flux at level k+1
+            zzfu_kp1 = ( zfw(ji,jj) + zfw(ji+1,jj  ) ) * ( puu(ji,jj,jk+1,Kmm) + puu(ji,jj,jk,Kmm) )
+            zzfv_kp1 = ( zfw(ji,jj) + zfw(ji  ,jj+1) ) * ( pvv(ji,jj,jk+1,Kmm) + pvv(ji,jj,jk,Kmm) )
+            !                                 ! divergence of vertical momentum flux
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj) - zzfu_kp1 ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj) - zzfv_kp1 ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) 
+            !                                 ! store vertical flux for next level calculation
+            zfu_uw(ji,jj) = zzfu_kp1
+            zfv_vw(ji,jj) = zzfv_kp1
+         END_2D
+      END DO
+      !
+      jk = jpkm1                              ! compute last level (zzfu_kp1 = 0)
+      DO_2D( 0, 0, 0, 0 )
+         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - zfu_uw(ji,jj) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
+         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - zfv_vw(ji,jj) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) 
+      END_2D
+      !
+      IF( l_trddyn ) THEN                     ! trends: send trend to trddyn for diagnostic
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs) - zu_trd(A2D(0),:)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs) - zv_trd(A2D(0),:)
+         CALL trd_dyn( zu_trd, zv_trd, jpdyn_zad, kt, Kmm )
+         DEALLOCATE( zu_trd, zv_trd )
       ENDIF
       !
+#undef zfu_uw
+#undef zfv_vw
+#undef zfw
+      !                                         ! Control print
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ubs2 adv - Ua: ', mask1=umask,   &
+         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' )
+      !
    END SUBROUTINE dyn_adv_ubs
 
    !!==============================================================================
diff --git a/src/OCE/DYN/dynatf.F90 b/src/OCE/DYN/dynatf.F90
deleted file mode 100644
index 99769269..00000000
--- a/src/OCE/DYN/dynatf.F90
+++ /dev/null
@@ -1,369 +0,0 @@
-MODULE dynatf
-   !!=========================================================================
-   !!                       ***  MODULE  dynatf  ***
-   !! Ocean dynamics: time filtering
-   !!=========================================================================
-   !! History :  OPA  !  1987-02  (P. Andrich, D. L Hostis)  Original code
-   !!                 !  1990-10  (C. Levy, G. Madec)
-   !!            7.0  !  1993-03  (M. Guyon)  symetrical conditions
-   !!            8.0  !  1997-02  (G. Madec & M. Imbard)  opa, release 8.0
-   !!            8.2  !  1997-04  (A. Weaver)  Euler forward step
-   !!             -   !  1997-06  (G. Madec)  lateral boudary cond., lbc routine
-   !!    NEMO    1.0  !  2002-08  (G. Madec)  F90: Free form and module
-   !!             -   !  2002-10  (C. Talandier, A-M. Treguier) Open boundary cond.
-   !!            2.0  !  2005-11  (V. Garnier) Surface pressure gradient organization
-   !!            2.3  !  2007-07  (D. Storkey) Calls to BDY routines.
-   !!            3.2  !  2009-06  (G. Madec, R.Benshila)  re-introduce the vvl option
-   !!            3.3  !  2010-09  (D. Storkey, E.O'Dea) Bug fix for BDY module
-   !!            3.3  !  2011-03  (P. Oddo) Bug fix for time-splitting+(BDY-OBC) and not VVL
-   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes
-   !!            3.6  !  2014-04  (G. Madec) add the diagnostic of the time filter trends
-   !!            3.7  !  2015-11  (J. Chanut) Free surface simplification
-   !!            4.1  !  2019-08  (A. Coward, D. Storkey) Rename dynnxt.F90 -> dynatf.F90. Now just does time filtering.
-   !!-------------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------------------------------
-   !!   dyn_atf       : apply Asselin time filtering to "now" velocities and vertical scale factors
-   !!----------------------------------------------------------------------------------------------
-   USE oce            ! ocean dynamics and tracers
-   USE dom_oce        ! ocean space and time domain
-   USE sbc_oce        ! Surface boundary condition: ocean fields
-   USE sbcrnf         ! river runoffs
-   USE phycst         ! physical constants
-   USE dynadv         ! dynamics: vector invariant versus flux form
-   USE dynspg_ts      ! surface pressure gradient: split-explicit scheme
-   USE domvvl         ! variable volume
-   USE bdy_oce , ONLY : ln_bdy
-   USE bdydta         ! ocean open boundary conditions
-   USE bdydyn         ! ocean open boundary conditions
-   USE bdyvol         ! ocean open boundary condition (bdy_vol routines)
-   USE trd_oce        ! trends: ocean variables
-   USE trddyn         ! trend manager: dynamics
-   USE trdken         ! trend manager: kinetic energy
-   USE isf_oce   , ONLY: ln_isf     ! ice shelf
-   USE isfdynatf , ONLY: isf_dynatf ! ice shelf volume filter correction subroutine
-   !
-   USE in_out_manager ! I/O manager
-   USE iom            ! I/O manager library
-   USE lbclnk         ! lateral boundary condition (or mpp link)
-   USE lib_mpp        ! MPP library
-   USE prtctl         ! Print control
-   USE timing         ! Timing
-   USE zdfdrg ,  ONLY : ln_drgice_imp, rCdU_top
-#if defined key_agrif
-   USE agrif_oce_interp
-#endif
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC    dyn_atf   ! routine called by step.F90
-
-#if defined key_qco   ||   defined key_linssh
-   !!----------------------------------------------------------------------
-   !!   'key_qco'                        Quasi-Eulerian vertical coordinate
-   !!       OR         EMPTY MODULE
-   !!   'key_linssh'                        Fix in time vertical coordinate
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE dyn_atf( kt, Kbb, Kmm, Kaa, puu, pvv, pe3t, pe3u, pe3v )
-      INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index
-      INTEGER                             , INTENT(in   ) :: Kbb, Kmm, Kaa    ! before and after time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: pe3t, pe3u, pe3v ! scale factors to be time filtered
-
-      WRITE(*,*) 'dyn_atf: You should not have seen this print! error?', kt
-   END SUBROUTINE dyn_atf
-
-#else
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: dynatf.F90 14834 2021-05-11 09:24:44Z hadcv $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE dyn_atf ( kt, Kbb, Kmm, Kaa, puu, pvv, pe3t, pe3u, pe3v )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE dyn_atf  ***
-      !!
-      !! ** Purpose :   Finalize after horizontal velocity. Apply the boundary
-      !!             condition on the after velocity and apply the Asselin time
-      !!             filter to the now fields.
-      !!
-      !! ** Method  : * Ensure after velocities transport matches time splitting
-      !!             estimate (ln_dynspg_ts=T)
-      !!
-      !!              * Apply lateral boundary conditions on after velocity
-      !!             at the local domain boundaries through lbc_lnk call,
-      !!             at the one-way open boundaries (ln_bdy=T),
-      !!             at the AGRIF zoom   boundaries (lk_agrif=T)
-      !!
-      !!              * Apply the Asselin time filter to the now fields
-      !!             arrays to start the next time step:
-      !!                (puu(Kmm),pvv(Kmm)) = (puu(Kmm),pvv(Kmm))
-      !!                                    + rn_atfp [ (puu(Kbb),pvv(Kbb)) + (puu(Kaa),pvv(Kaa)) - 2 (puu(Kmm),pvv(Kmm)) ]
-      !!             Note that with flux form advection and non linear free surface,
-      !!             the time filter is applied on thickness weighted velocity.
-      !!             As a result, dyn_atf MUST be called after tra_atf.
-      !!
-      !! ** Action :   puu(Kmm),pvv(Kmm)   filtered now horizontal velocity
-      !!----------------------------------------------------------------------
-      INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index
-      INTEGER                             , INTENT(in   ) :: Kbb, Kmm, Kaa    ! before and after time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: pe3t, pe3u, pe3v ! scale factors to be time filtered
-      !
-      INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zue3a, zue3n, zue3b, zcoef    ! local scalars
-      REAL(wp) ::   zve3a, zve3n, zve3b           !   -      -
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve, zwfld
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zutau, zvtau
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ze3t_f, ze3u_f, ze3v_f, zua, zva
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing    )   CALL timing_start('dyn_atf')
-      IF( ln_dynspg_ts )   ALLOCATE( zue(jpi,jpj)     , zve(jpi,jpj)     )
-      IF( l_trddyn     )   ALLOCATE( zua(jpi,jpj,jpk) , zva(jpi,jpj,jpk) )
-      !
-      IF( kt == nit000 ) THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'dyn_atf : Asselin time filtering'
-         IF(lwp) WRITE(numout,*) '~~~~~~~'
-      ENDIF
-
-      IF ( ln_dynspg_ts ) THEN
-         ! Ensure below that barotropic velocities match time splitting estimate
-         ! Compute actual transport and replace it with ts estimate at "after" time step
-         zue(:,:) = pe3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1)
-         zve(:,:) = pe3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1)
-         DO jk = 2, jpkm1
-            zue(:,:) = zue(:,:) + pe3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk)
-            zve(:,:) = zve(:,:) + pe3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk)
-         END DO
-         DO jk = 1, jpkm1
-            puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zue(:,:) * r1_hu(:,:,Kaa) + uu_b(:,:,Kaa) ) * umask(:,:,jk)
-            pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zve(:,:) * r1_hv(:,:,Kaa) + vv_b(:,:,Kaa) ) * vmask(:,:,jk)
-         END DO
-         !
-         IF( .NOT.ln_bt_fw ) THEN
-            ! Remove advective velocity from "now velocities"
-            ! prior to asselin filtering
-            ! In the forward case, this is done below after asselin filtering
-            ! so that asselin contribution is removed at the same time
-            DO jk = 1, jpkm1
-               puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm) + uu_b(:,:,Kmm) )*umask(:,:,jk)
-               pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm) + vv_b(:,:,Kmm) )*vmask(:,:,jk)
-            END DO
-         ENDIF
-      ENDIF
-
-      ! Update after velocity on domain lateral boundaries
-      ! --------------------------------------------------
-# if defined key_agrif
-      CALL Agrif_dyn( kt )             !* AGRIF zoom boundaries
-# endif
-      !
-      CALL lbc_lnk( 'dynatf', puu(:,:,:,Kaa), 'U', -1.0_wp, pvv(:,:,:,Kaa), 'V', -1.0_wp )     !* local domain boundaries
-      !
-      !                                !* BDY open boundaries
-      IF( ln_bdy .AND. ln_dynspg_exp )   CALL bdy_dyn( kt, Kbb, puu, pvv, Kaa )
-      IF( ln_bdy .AND. ln_dynspg_ts  )   CALL bdy_dyn( kt, Kbb, puu, pvv, Kaa, dyn3d_only=.true. )
-
-!!$   Do we need a call to bdy_vol here??
-      !
-      IF( l_trddyn ) THEN             ! prepare the atf trend computation + some diagnostics
-         !
-         !                                  ! Kinetic energy and Conversion
-         IF( ln_KE_trd  )   CALL trd_dyn( puu(:,:,:,Kaa), pvv(:,:,:,Kaa), jpdyn_ken, kt, Kmm )
-         !
-         IF( ln_dyn_trd ) THEN              ! 3D output: total momentum trends
-            zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * r1_Dt
-            zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * r1_Dt
-            CALL iom_put( "utrd_tot", zua )        ! total momentum trends, except the asselin time filter
-            CALL iom_put( "vtrd_tot", zva )
-         ENDIF
-         !
-         zua(:,:,:) = puu(:,:,:,Kmm)             ! save the now velocity before the asselin filter
-         zva(:,:,:) = pvv(:,:,:,Kmm)             ! (caution: there will be a shift by 1 timestep in the
-         !                                  !  computation of the asselin filter trends)
-      ENDIF
-
-      ! Time filter and swap of dynamics arrays
-      ! ------------------------------------------
-
-      IF( .NOT. l_1st_euler ) THEN    !* Leap-Frog : Asselin time filter
-         !                                ! =============!
-         IF( ln_linssh ) THEN             ! Fixed volume !
-            !                             ! =============!
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-               puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )
-               pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )
-            END_3D
-            !                             ! ================!
-         ELSE                             ! Variable volume !
-            !                             ! ================!
-            ! Time-filtered scale factor at t-points
-            ! ----------------------------------------------------
-            ALLOCATE( ze3t_f(jpi,jpj,jpk), zwfld(jpi,jpj) )
-            DO jk = 1, jpkm1
-               ze3t_f(:,:,jk) = pe3t(:,:,jk,Kmm) + rn_atfp * ( pe3t(:,:,jk,Kbb) - 2._wp * pe3t(:,:,jk,Kmm) + pe3t(:,:,jk,Kaa) )
-            END DO
-            ! Add volume filter correction: compatibility with tracer advection scheme
-            ! => time filter + conservation correction
-            zcoef = rn_atfp * rn_Dt * r1_rho0
-            zwfld(:,:) = emp_b(:,:) - emp(:,:)
-            IF ( ln_rnf ) zwfld(:,:) =  zwfld(:,:) - ( rnf_b(:,:) - rnf(:,:) )
-
-            DO jk = 1, jpkm1
-               ze3t_f(:,:,jk) = ze3t_f(:,:,jk) - zcoef * zwfld(:,:) * tmask(:,:,jk) &
-                              &                        * pe3t(:,:,jk,Kmm) / ( ht(:,:) + 1._wp - ssmask(:,:) )
-            END DO
-            !
-            ! ice shelf melting (deal separately as it can be in depth)
-            ! PM: we could probably define a generic subroutine to do the in depth correction
-            !     to manage rnf, isf and possibly in the futur icb, tide water glacier (...)
-            !     ...(kt, coef, ktop, kbot, hz, fwf_b, fwf)
-            IF ( ln_isf ) CALL isf_dynatf( kt, Kmm, ze3t_f, rn_atfp * rn_Dt )
-            !
-            pe3t(:,:,1:jpkm1,Kmm) = ze3t_f(:,:,1:jpkm1)        ! filtered scale factor at T-points
-            !
-            IF( ln_dynadv_vec ) THEN      ! Asselin filter applied on velocity
-               ! Before filtered scale factor at (u/v)-points
-               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3u(:,:,:,Kmm), 'U' )
-               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3v(:,:,:,Kmm), 'V' )
-               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-                  puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + rn_atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )
-                  pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + rn_atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )
-               END_3D
-               !
-            ELSE                          ! Asselin filter applied on thickness weighted velocity
-               !
-               ALLOCATE( ze3u_f(jpi,jpj,jpk) , ze3v_f(jpi,jpj,jpk) )
-               ! Now filtered scale factor at (u/v)-points stored in ze3u_f, ze3v_f
-               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3u_f, 'U' )
-               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3v_f, 'V' )
-               DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-                  zue3a = pe3u(ji,jj,jk,Kaa) * puu(ji,jj,jk,Kaa)
-                  zve3a = pe3v(ji,jj,jk,Kaa) * pvv(ji,jj,jk,Kaa)
-                  zue3n = pe3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm)
-                  zve3n = pe3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm)
-                  zue3b = pe3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb)
-                  zve3b = pe3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb)
-                  !
-                  puu(ji,jj,jk,Kmm) = ( zue3n + rn_atfp * ( zue3b - 2._wp * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk)
-                  pvv(ji,jj,jk,Kmm) = ( zve3n + rn_atfp * ( zve3b - 2._wp * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk)
-               END_3D
-               pe3u(:,:,1:jpkm1,Kmm) = ze3u_f(:,:,1:jpkm1)
-               pe3v(:,:,1:jpkm1,Kmm) = ze3v_f(:,:,1:jpkm1)
-               !
-               DEALLOCATE( ze3u_f , ze3v_f )
-            ENDIF
-            !
-            DEALLOCATE( ze3t_f, zwfld )
-         ENDIF
-         !
-         IF( ln_dynspg_ts .AND. ln_bt_fw ) THEN
-            ! Revert filtered "now" velocities to time split estimate
-            ! Doing it here also means that asselin filter contribution is removed
-            zue(:,:) = pe3u(:,:,1,Kmm) * puu(:,:,1,Kmm) * umask(:,:,1)
-            zve(:,:) = pe3v(:,:,1,Kmm) * pvv(:,:,1,Kmm) * vmask(:,:,1)
-            DO jk = 2, jpkm1
-               zue(:,:) = zue(:,:) + pe3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk)
-               zve(:,:) = zve(:,:) + pe3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk)
-            END DO
-            DO jk = 1, jpkm1
-               puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) - (zue(:,:) * r1_hu(:,:,Kmm) - uu_b(:,:,Kmm)) * umask(:,:,jk)
-               pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) - (zve(:,:) * r1_hv(:,:,Kmm) - vv_b(:,:,Kmm)) * vmask(:,:,jk)
-            END DO
-         ENDIF
-         !
-      ENDIF ! .NOT. l_1st_euler
-      !
-      ! This is needed for dyn_ldf_blp to be restartable
-      IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatf', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp )
-      ! Set "now" and "before" barotropic velocities for next time step:
-      ! JC: Would be more clever to swap variables than to make a full vertical
-      ! integration
-      !
-      IF(.NOT.ln_linssh ) THEN
-         hu(:,:,Kmm) = pe3u(:,:,1,Kmm ) * umask(:,:,1)
-         hv(:,:,Kmm) = pe3v(:,:,1,Kmm ) * vmask(:,:,1)
-         DO jk = 2, jpkm1
-            hu(:,:,Kmm) = hu(:,:,Kmm) + pe3u(:,:,jk,Kmm ) * umask(:,:,jk)
-            hv(:,:,Kmm) = hv(:,:,Kmm) + pe3v(:,:,jk,Kmm ) * vmask(:,:,jk)
-         END DO
-         r1_hu(:,:,Kmm) = ssumask(:,:) / ( hu(:,:,Kmm) + 1._wp - ssumask(:,:) )
-         r1_hv(:,:,Kmm) = ssvmask(:,:) / ( hv(:,:,Kmm) + 1._wp - ssvmask(:,:) )
-      ENDIF
-      !
-      uu_b(:,:,Kaa) = pe3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1)
-      uu_b(:,:,Kmm) = pe3u(:,:,1,Kmm) * puu(:,:,1,Kmm) * umask(:,:,1)
-      vv_b(:,:,Kaa) = pe3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1)
-      vv_b(:,:,Kmm) = pe3v(:,:,1,Kmm) * pvv(:,:,1,Kmm) * vmask(:,:,1)
-      DO jk = 2, jpkm1
-         uu_b(:,:,Kaa) = uu_b(:,:,Kaa) + pe3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk)
-         uu_b(:,:,Kmm) = uu_b(:,:,Kmm) + pe3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk)
-         vv_b(:,:,Kaa) = vv_b(:,:,Kaa) + pe3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk)
-         vv_b(:,:,Kmm) = vv_b(:,:,Kmm) + pe3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk)
-      END DO
-      uu_b(:,:,Kaa) = uu_b(:,:,Kaa) * r1_hu(:,:,Kaa)
-      vv_b(:,:,Kaa) = vv_b(:,:,Kaa) * r1_hv(:,:,Kaa)
-      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * r1_hu(:,:,Kmm)
-      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * r1_hv(:,:,Kmm)
-      !
-      IF( .NOT.ln_dynspg_ts ) THEN        ! output the barotropic currents
-         CALL iom_put(  "ubar", uu_b(:,:,Kmm) )
-         CALL iom_put(  "vbar", vv_b(:,:,Kmm) )
-      ENDIF
-      IF( l_trddyn ) THEN                ! 3D output: asselin filter trends on momentum
-         zua(:,:,:) = ( puu(:,:,:,Kmm) - zua(:,:,:) ) * r1_Dt
-         zva(:,:,:) = ( pvv(:,:,:,Kmm) - zva(:,:,:) ) * r1_Dt
-         CALL trd_dyn( zua, zva, jpdyn_atf, kt, Kmm )
-      ENDIF
-      !
-      IF ( iom_use("utau") ) THEN
-         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN
-            ALLOCATE(zutau(jpi,jpj))
-            DO_2D( 0, 0, 0, 0 )
-               jk = miku(ji,jj)
-               zutau(ji,jj) = utau(ji,jj) + 0.5_wp * rho0 * ( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * puu(ji,jj,jk,Kaa)
-            END_2D
-            CALL iom_put(  "utau", zutau(:,:) )
-            DEALLOCATE(zutau)
-         ELSE
-            CALL iom_put(  "utau", utau(:,:) )
-         ENDIF
-      ENDIF
-      !
-      IF ( iom_use("vtau") ) THEN
-         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN
-            ALLOCATE(zvtau(jpi,jpj))
-            DO_2D( 0, 0, 0, 0 )
-               jk = mikv(ji,jj)
-               zvtau(ji,jj) = vtau(ji,jj) + 0.5_wp * rho0 * ( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * pvv(ji,jj,jk,Kaa)
-            END_2D
-            CALL iom_put(  "vtau", zvtau(:,:) )
-            DEALLOCATE(zvtau)
-         ELSE
-            CALL iom_put(  "vtau", vtau(:,:) )
-         ENDIF
-      ENDIF
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Kaa), clinfo1=' nxt  - puu(:,:,:,Kaa): ', mask1=umask,   &
-         &                                  tab3d_2=pvv(:,:,:,Kaa), clinfo2=' pvv(:,:,:,Kaa): '       , mask2=vmask )
-      !
-      IF( ln_dynspg_ts )   DEALLOCATE( zue, zve )
-      IF( l_trddyn     )   DEALLOCATE( zua, zva )
-      IF( ln_timing    )   CALL timing_stop('dyn_atf')
-      !
-   END SUBROUTINE dyn_atf
-
-#endif
-
-   !!=========================================================================
-END MODULE dynatf
diff --git a/src/OCE/DYN/dynatf_qco.F90 b/src/OCE/DYN/dynatf_qco.F90
index f9ed9f46..f8a64ee9 100644
--- a/src/OCE/DYN/dynatf_qco.F90
+++ b/src/OCE/DYN/dynatf_qco.F90
@@ -32,11 +32,6 @@ MODULE dynatf_qco
    USE phycst         ! physical constants
    USE dynadv         ! dynamics: vector invariant versus flux form
    USE dynspg_ts      ! surface pressure gradient: split-explicit scheme
-   USE domvvl         ! variable volume
-   USE bdy_oce   , ONLY: ln_bdy
-   USE bdydta         ! ocean open boundary conditions
-   USE bdydyn         ! ocean open boundary conditions
-   USE bdyvol         ! ocean open boundary condition (bdy_vol routines)
    USE trd_oce        ! trends: ocean variables
    USE trddyn         ! trend manager: dynamics
    USE trdken         ! trend manager: kinetic energy
@@ -78,9 +73,7 @@ CONTAINS
       !!             estimate (ln_dynspg_ts=T)
       !!
       !!              * Apply lateral boundary conditions on after velocity
-      !!             at the local domain boundaries through lbc_lnk call,
-      !!             at the one-way open boundaries (ln_bdy=T),
-      !!             at the AGRIF zoom   boundaries (lk_agrif=T)
+      !!             at the local domain boundaries through lbc_lnk call
       !!
       !!              * Apply the Asselin time filter to the now fields
       !!             arrays to start the next time step:
@@ -245,10 +238,11 @@ CONTAINS
       !
       IF ( iom_use("utau") ) THEN
          IF ( ln_drgice_imp.OR.ln_isfcav ) THEN
-            ALLOCATE(zutau(jpi,jpj))
+            ! TEMP: Declared with halo points so there is a consistent shape for XIOS
+            ALLOCATE(zutau(A2D(nn_hls)))
             DO_2D( 0, 0, 0, 0 )
                jk = miku(ji,jj)
-               zutau(ji,jj) = utau(ji,jj) + 0.5_wp * rho0 * ( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * puu(ji,jj,jk,Kaa)
+               zutau(ji,jj) = utau(ji,jj) + 0.5_wp * rho0 * rCdU_top(ji,jj) * ( puu(ji-1,jj,jk,Kaa) + puu(ji,jj,jk,Kaa) )
             END_2D
             CALL iom_put(  "utau", zutau(:,:) )
             DEALLOCATE(zutau)
@@ -259,10 +253,11 @@ CONTAINS
       !
       IF ( iom_use("vtau") ) THEN
          IF ( ln_drgice_imp.OR.ln_isfcav ) THEN
-            ALLOCATE(zvtau(jpi,jpj))
+            ! TEMP: Declared with halo points so there is a consistent shape for XIOS
+            ALLOCATE(zvtau(A2D(nn_hls)))
             DO_2D( 0, 0, 0, 0 )
                jk = mikv(ji,jj)
-               zvtau(ji,jj) = vtau(ji,jj) + 0.5_wp * rho0 * ( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * pvv(ji,jj,jk,Kaa)
+               zvtau(ji,jj) = vtau(ji,jj) + 0.5_wp * rho0 * rCdU_top(ji,jj) * ( pvv(ji,jj-1,jk,Kaa) + pvv(ji,jj,jk,Kaa) )
             END_2D
             CALL iom_put(  "vtau", zvtau(:,:) )
             DEALLOCATE(zvtau)
diff --git a/src/OCE/DYN/dynhpg.F90 b/src/OCE/DYN/dynhpg.F90
index 145c7f9e..ffc642b7 100644
--- a/src/OCE/DYN/dynhpg.F90
+++ b/src/OCE/DYN/dynhpg.F90
@@ -24,7 +24,6 @@ MODULE dynhpg
    !!                  gradient of the hydrostatic pressure
    !!   dyn_hpg_init : initialisation and control of options
    !!       hpg_zco  : z-coordinate scheme
-   !!       hpg_zps  : z-coordinate plus partial steps (interpolation)
    !!       hpg_sco  : s-coordinate (standard jacobian formulation)
    !!       hpg_isf  : s-coordinate (sco formulation) adapted to ice shelf
    !!       hpg_djc  : s-coordinate (Density Jacobian with Cubic polynomial)
@@ -39,7 +38,6 @@ MODULE dynhpg
    USE phycst          ! physical constants
    USE trd_oce         ! trends: ocean variables
    USE trddyn          ! trend manager: dynamics
-   USE zpshde          ! partial step: hor. derivative     (zps_hde routine)
    !
    USE in_out_manager  ! I/O manager
    USE prtctl          ! Print control
@@ -115,7 +113,6 @@ CONTAINS
       !
       SELECT CASE ( nhpg )      ! Hydrostatic pressure gradient computation
       CASE ( np_zco )   ;   CALL hpg_zco    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate
-      CASE ( np_zps )   ;   CALL hpg_zps    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate plus partial steps (interpolation)
       CASE ( np_sco )   ;   CALL hpg_sco    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (standard jacobian formulation)
       CASE ( np_djc )   ;   CALL hpg_djc    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Density Jacobian with Cubic polynomial)
       CASE ( np_prj )   ;   CALL hpg_prj    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Pressure Jacobian scheme)
@@ -260,7 +257,7 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk       ! dummy loop indices
       REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::  zhpi, zhpj
+      REAL(wp), DIMENSION(T2D(nn_hls)) ::  zhpi, zhpj
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -299,90 +296,6 @@ CONTAINS
    END SUBROUTINE hpg_zco
 
 
-   SUBROUTINE hpg_zps( kt, Kmm, puu, pvv, Krhs )
-      !!---------------------------------------------------------------------
-      !!                 ***  ROUTINE hpg_zps  ***
-      !!
-      !! ** Method  :   z-coordinate plus partial steps case.  blahblah...
-      !!
-      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend
-      !!----------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
-      !!
-      INTEGER  ::   ji, jj, jk                       ! dummy loop indices
-      INTEGER  ::   iku, ikv                         ! temporary integers
-      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) :: zgtsu, zgtsv
-      REAL(wp), DIMENSION(A2D(nn_hls)     ) :: zgru, zgrv
-      !!----------------------------------------------------------------------
-      !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == nit000 ) THEN
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend'
-            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate with partial steps - vector optimization'
-         ENDIF
-      ENDIF
-
-      ! Partial steps: Compute NOW horizontal gradient of t, s, rd at the last ocean level
-      CALL zps_hde( kt, jpts, ts(:,:,:,:,Kmm), zgtsu, zgtsv, rhd, zgru , zgrv )
-
-      ! Local constant initialization
-      zcoef0 = - grav * 0.5_wp
-
-      !  Surface value (also valid in partial step case)
-      DO_2D( 0, 0, 0, 0 )
-         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm)
-         ! hydrostatic pressure gradient
-         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj)
-         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj)
-         ! add to the general momentum trend
-         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1)
-         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1)
-      END_2D
-
-      ! interior value (2=<jk=<jpkm1)
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm)
-         ! hydrostatic pressure gradient
-         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   &
-            &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   &
-            &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj)
-
-         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   &
-            &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   &
-            &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj)
-         ! add to the general momentum trend
-         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk)
-         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk)
-      END_3D
-
-      ! partial steps correction at the last level  (use zgru & zgrv computed in zpshde.F90)
-      DO_2D( 0, 0, 0, 0 )
-         iku = mbku(ji,jj)
-         ikv = mbkv(ji,jj)
-         zcoef2 = zcoef0 * MIN( e3w(ji,jj,iku,Kmm), e3w(ji+1,jj  ,iku,Kmm) )
-         zcoef3 = zcoef0 * MIN( e3w(ji,jj,ikv,Kmm), e3w(ji  ,jj+1,ikv,Kmm) )
-         IF( iku > 1 ) THEN            ! on i-direction (level 2 or more)
-            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) - zhpi(ji,jj,iku)         ! subtract old value
-            zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one
-               &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj)
-            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend
-         ENDIF
-         IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more)
-            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) - zhpj(ji,jj,ikv)         ! subtract old value
-            zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one
-               &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj)
-            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend
-         ENDIF
-      END_2D
-      !
-   END SUBROUTINE hpg_zps
-
-
    SUBROUTINE hpg_sco( kt, Kmm, puu, pvv, Krhs )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE hpg_sco  ***
@@ -391,7 +304,7 @@ CONTAINS
       !!      The now hydrostatic pressure gradient at a given level, jk,
       !!      is computed by taking the vertical integral of the in-situ
       !!      density gradient along the model level from the suface to that
-      !!      level. s-coordinates (ln_sco): a corrective term is added
+      !!      level. s-coordinates (l_sco): a corrective term is added
       !!      to the horizontal pressure gradient :
       !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
       !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
@@ -401,18 +314,18 @@ CONTAINS
       !!
       !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
+      INTEGER                             , INTENT(in   ) ::  kt          ! ocean time-step index
+      INTEGER                             , INTENT(in   ) ::  Kmm, Krhs   ! ocean time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk, jii, jjj           ! dummy loop indices
       REAL(wp) ::   zcoef0, zuap, zvap, ztmp       ! local scalars
       LOGICAL  ::   ll_tmp1, ll_tmp2               ! local logical variables
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  ::   zhpi, zhpj
+      REAL(wp), DIMENSION(T2D(0))           ::   zhpi, zhpj
       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter
       !!----------------------------------------------------------------------
       !
-      IF( ln_wd_il ) ALLOCATE(zcpx(A2D(nn_hls)), zcpy(A2D(nn_hls)))
+      IF( ln_wd_il ) ALLOCATE(zcpx(T2D(0)), zcpy(T2D(0)))
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == nit000 ) THEN
@@ -456,8 +369,8 @@ CONTAINS
             zcpy(ji,jj) = 1.0_wp
           ELSE IF(ll_tmp2) THEN
             ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here
-            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) &
-                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) )
+            zcpy(ji,jj) = ABS( ( ( ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) - ( ssh(ji,jj,Kmm) + ht_0(ji,jj) ) ) &   ! add () for NP repro
+                        &      / ( ssh(ji,jj+1,Kmm)                   -   ssh(ji,jj,Kmm)                 ) )
           ELSE
             zcpy(ji,jj) = 0._wp
           END IF
@@ -466,54 +379,56 @@ CONTAINS
       !
       DO_2D( 0, 0, 0, 0 )              ! Surface value
          !                                   ! hydrostatic pressure gradient along s-surfaces
-         zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj)                      &
-            &          * (  e3w(ji+1,jj  ,1,Kmm) * rhd(ji+1,jj  ,1)  &
-            &             - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  )
-         zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj)                      &
-            &          * (  e3w(ji  ,jj+1,1,Kmm) * rhd(ji  ,jj+1,1)  &
-            &             - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  )
+         zhpi(ji,jj) = zcoef0 * r1_e1u(ji,jj)                      &
+            &        * (  e3w(ji+1,jj  ,1,Kmm) * rhd(ji+1,jj  ,1)  &
+            &           - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  )
+         zhpj(ji,jj) = zcoef0 * r1_e2v(ji,jj)                      &
+            &        * (  e3w(ji  ,jj+1,1,Kmm) * rhd(ji  ,jj+1,1)  &
+            &           - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  )
          !                                   ! s-coordinate pressure gradient correction
-         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) )   &
-            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj)
-         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) )   &
-            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj)
+         zuap = -zcoef0 * ( rhd     (ji+1,jj,1)     + rhd     (ji,jj,1) )   &
+            &           * ( gdept_z0(ji+1,jj,1,Kmm) - gdept_z0(ji,jj,1,Kmm) ) * r1_e1u(ji,jj)
+         zvap = -zcoef0 * ( rhd     (ji,jj+1,1)     + rhd     (ji,jj,1) )   &
+            &           * ( gdept_z0(ji,jj+1,1,Kmm) - gdept_z0(ji,jj,1,Kmm) ) * r1_e2v(ji,jj)
          !
          IF( ln_wd_il ) THEN
-            zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj)
-            zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 
+            zhpi(ji,jj) = zhpi(ji,jj) * zcpx(ji,jj)
+            zhpj(ji,jj) = zhpj(ji,jj) * zcpy(ji,jj)
             zuap = zuap * zcpx(ji,jj)
             zvap = zvap * zcpy(ji,jj)
          ENDIF
          !                                   ! add to the general momentum trend
-         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap
-         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap
+         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj) + zuap
+         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj) + zvap
       END_2D
       !
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )    ! interior value (2=<jk=<jpkm1)
-         !                                   ! hydrostatic pressure gradient along s-surfaces
-         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)                         &
-            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )  &
-            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  )
-         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)                         &
-            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )  &
-            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  )
-         !                                   ! s-coordinate pressure gradient correction
-         zuap = -zcoef0 * ( rhd  (ji+1,jj  ,jk) + rhd  (ji,jj,jk) ) &
-            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj)
-         zvap = -zcoef0 * ( rhd  (ji  ,jj+1,jk) + rhd  (ji,jj,jk) ) &
-            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj)
-         !
-         IF( ln_wd_il ) THEN
-            zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj)
-            zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 
-            zuap = zuap * zcpx(ji,jj)
-            zvap = zvap * zcpy(ji,jj)
-         ENDIF
-         !
-         ! add to the general momentum trend
-         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) + zuap
-         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) + zvap
-      END_3D
+      DO jk= 2, jpkm1
+         DO_2D( 0, 0, 0, 0 )    ! interior value (2=<jk=<jpkm1)
+            !                                   ! hydrostatic pressure gradient along s-surfaces
+            zhpi(ji,jj) = zhpi(ji,jj) + zcoef0 * r1_e1u(ji,jj)                         &
+               &        * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )  &
+               &           - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  )
+            zhpj(ji,jj) = zhpj(ji,jj) + zcoef0 * r1_e2v(ji,jj)                         &
+               &        * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )  &
+               &           - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  )
+            !                                   ! s-coordinate pressure gradient correction
+            zuap = -zcoef0 * ( rhd     (ji+1,jj  ,jk)     + rhd     (ji,jj,jk)     ) &
+               &           * ( gdept_z0(ji+1,jj  ,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) * r1_e1u(ji,jj)
+            zvap = -zcoef0 * ( rhd     (ji  ,jj+1,jk)     + rhd     (ji,jj,jk)     ) &
+               &           * ( gdept_z0(ji  ,jj+1,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) * r1_e2v(ji,jj)
+            !
+            IF( ln_wd_il ) THEN
+               zhpi(ji,jj) = zhpi(ji,jj) * zcpx(ji,jj)
+               zhpj(ji,jj) = zhpj(ji,jj) * zcpy(ji,jj)
+               zuap = zuap * zcpx(ji,jj)
+               zvap = zvap * zcpy(ji,jj)
+            ENDIF
+            !
+            ! add to the general momentum trend
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj) + zuap
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj) + zvap
+         END_2D
+      END DO
       !
       IF( ln_wd_il )  DEALLOCATE( zcpx , zcpy )
       !
@@ -528,7 +443,7 @@ CONTAINS
       !!      The now hydrostatic pressure gradient at a given level, jk,
       !!      is computed by taking the vertical integral of the in-situ
       !!      density gradient along the model level from the suface to that
-      !!      level. s-coordinates (ln_sco): a corrective term is added
+      !!      level. s-coordinates (l_sco): a corrective term is added
       !!      to the horizontal pressure gradient :
       !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ]
       !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ]
@@ -539,34 +454,35 @@ CONTAINS
       !!      
       !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
+      INTEGER                             , INTENT(in   ) ::  kt          ! ocean time-step index
+      INTEGER                             , INTENT(in   ) ::  Kmm, Krhs   ! ocean time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk             ! dummy loop indices
       INTEGER  ::   ikt ,  ikti1,  iktj1   ! local integer
       REAL(wp) ::   ze3w, ze3wi1, ze3wj1   ! local scalars
       REAL(wp) ::   zcoef0, zuap, zvap     !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk ) ::  zhpi, zhpj
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::  zts_top
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::  zrhd_top, zdep_top
+      REAL(wp), DIMENSION(T2D(1),jpts) ::  zts_top
+      REAL(wp), DIMENSION(T2D(1))      ::  zrhd_top, zdep_top
+      REAL(wp), DIMENSION(T2D(0))      ::  zhpi, zhpj
       !!----------------------------------------------------------------------
       !
       zcoef0 = - grav * 0.5_wp   ! Local constant initialization
       !
-      !                          ! iniitialised to 0. zhpi zhpi 
-      zhpi(:,:,:) = 0._wp   ;   zhpj(:,:,:) = 0._wp
+      !                          ! iniitialised to 0. zhpi zhpi   !!st is it necessary ???
+      zhpi(:,:) = 0._wp   ;   zhpj(:,:) = 0._wp
 
       ! compute rhd at the ice/oce interface (ocean side)
       ! usefull to reduce residual current in the test case ISOMIP with no melting
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 1, 1, 1, 1 )
          ikt = mikt(ji,jj)
          zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm)
          zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm)
          zdep_top(ji,jj)  = MAX( risfdep(ji,jj) , gdept(ji,jj,1,Kmm) )
       END_2D
-      CALL eos( zts_top, zdep_top, zrhd_top )
-
+      ! eos 2D interface
+      CALL eos( zts_top, zdep_top, zrhd_top, kbnd=1 )
+      !
       !                     !===========================!
       !                     !=====  surface value  =====!
       !                     !===========================!
@@ -576,45 +492,47 @@ CONTAINS
          iktj1 = mikt(ji  ,jj+1)   ;   ze3wj1 = e3w(ji  ,jj+1,iktj1,Kmm)
          !                          ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure
          !                          ! we assume ISF is in isostatic equilibrium
-         zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj) * (   risfload(ji+1,jj) - risfload(ji,jj)  &
-            &                                       + 0.5_wp * ( ze3wi1 * ( rhd(ji+1,jj,ikti1) + zrhd_top(ji+1,jj) )     &
-            &                                                  - ze3w   * ( rhd(ji  ,jj,ikt  ) + zrhd_top(ji  ,jj) ) )   )
-         zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj) * (   risfload(ji,jj+1) - risfload(ji,jj)  &
-            &                                       + 0.5_wp * ( ze3wj1 * ( rhd(ji,jj+1,iktj1) + zrhd_top(ji,jj+1) )      &
-            &                                                  - ze3w   * ( rhd(ji,jj  ,ikt  ) + zrhd_top(ji,jj  ) ) )   )
+         zhpi(ji,jj) = zcoef0 * r1_e1u(ji,jj) * (   risfload(ji+1,jj) - risfload(ji,jj)  &
+            &                                     + 0.5_wp * ( ze3wi1 * ( rhd(ji+1,jj,ikti1) + zrhd_top(ji+1,jj) )     &
+            &                                                - ze3w   * ( rhd(ji  ,jj,ikt  ) + zrhd_top(ji  ,jj) ) )   )
+         zhpj(ji,jj) = zcoef0 * r1_e2v(ji,jj) * (   risfload(ji,jj+1) - risfload(ji,jj)  &
+            &                                     + 0.5_wp * ( ze3wj1 * ( rhd(ji,jj+1,iktj1) + zrhd_top(ji,jj+1) )      &
+            &                                                - ze3w   * ( rhd(ji,jj  ,ikt  ) + zrhd_top(ji,jj  ) ) )   )
          !                          ! s-coordinate pressure gradient correction (=0 if z coordinate)
-         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) )   &
-            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj)
-         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) )   &
-            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj)
+         zuap = -zcoef0 * ( rhd     (ji+1,jj,1)     + rhd     (ji,jj,1)     )   &
+            &           * ( gdept_z0(ji+1,jj,1,Kmm) - gdept_z0(ji,jj,1,Kmm) ) * r1_e1u(ji,jj)
+         zvap = -zcoef0 * ( rhd     (ji,jj+1,1)     + rhd     (ji,jj,1)     )   &
+            &           * ( gdept_z0(ji,jj+1,1,Kmm) - gdept_z0(ji,jj,1,Kmm) ) * r1_e2v(ji,jj)
          !                          ! add to the general momentum trend
-         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1)
-         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1)
+         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj) + zuap) * umask(ji,jj,1)
+         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj) + zvap) * vmask(ji,jj,1)
       END_2D
       !   
       !                     !=============================!
       !                     !=====  interior values  =====!
       !                     !=============================!
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-         ze3w   = e3w(ji  ,jj  ,jk,Kmm)
-         ze3wi1 = e3w(ji+1,jj  ,jk,Kmm)
-         ze3wj1 = e3w(ji  ,jj+1,jk,Kmm)
-         !                          ! hydrostatic pressure gradient along s-surfaces
-         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   &
-            &           * (  ze3wi1 * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) ) * wmask(ji+1,jj,jk)   &
-            &              - ze3w   * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) ) * wmask(ji  ,jj,jk)   )
-         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   &
-            &           * (  ze3wj1 * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) ) * wmask(ji,jj+1,jk)   &
-            &              - ze3w   * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) ) * wmask(ji,jj  ,jk)   )
-         !                          ! s-coordinate pressure gradient correction
-         zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) )   &
-            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj)
-         zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) )   &
-            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj)
-         !                          ! add to the general momentum trend
-         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk)
-         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk)
-      END_3D
+      DO jk=2, jpkm1
+         DO_2D( 0, 0, 0, 0 )
+            ze3w   = e3w(ji  ,jj  ,jk,Kmm)
+            ze3wi1 = e3w(ji+1,jj  ,jk,Kmm)
+            ze3wj1 = e3w(ji  ,jj+1,jk,Kmm)
+            !                          ! hydrostatic pressure gradient along s-surfaces
+            zhpi(ji,jj) = zhpi(ji,jj) + zcoef0 / e1u(ji,jj)   &
+               &        * (  ze3wi1 * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) ) * wmask(ji+1,jj,jk)   &
+               &           - ze3w   * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) ) * wmask(ji  ,jj,jk)   )
+            zhpj(ji,jj) = zhpj(ji,jj) + zcoef0 / e2v(ji,jj)   &
+               &        * (  ze3wj1 * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) ) * wmask(ji,jj+1,jk)   &
+               &           - ze3w   * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) ) * wmask(ji,jj  ,jk)   )
+            !                          ! s-coordinate pressure gradient correction
+            zuap = -zcoef0 * ( rhd     (ji+1,jj  ,jk)     + rhd     (ji,jj,jk) )   &
+               &           * ( gdept_z0(ji+1,jj  ,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) / e1u(ji,jj)
+            zvap = -zcoef0 * ( rhd     (ji  ,jj+1,jk)     + rhd     (ji,jj,jk) )   &
+               &           * ( gdept_z0(ji  ,jj+1,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) / e2v(ji,jj)
+            !                          ! add to the general momentum trend
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj) + zuap) * umask(ji,jj,jk)
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj) + zvap) * vmask(ji,jj,jk)
+         END_2D
+      END DO
       !
    END SUBROUTINE hpg_isf
 
@@ -638,19 +556,19 @@ CONTAINS
       REAL(wp) ::   cffu, cffx          !    "         "
       REAL(wp) ::   cffv, cffy          !    "         "
       LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zhpj
-
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz')
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz')
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho')
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho')
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zhpi, zhpj
+
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz')
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz')
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho')
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho')
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals
+      REAL(wp), DIMENSION(T2D(nn_hls))     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays
       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter
       !!----------------------------------------------------------------------
       !
       IF( ln_wd_il ) THEN
-         ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) )
+         ALLOCATE( zcpx(T2D(nn_hls)) , zcpy(T2D(nn_hls)) )
         DO_2D( 0, 0, 0, 0 )
           ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                &
                &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            &
@@ -663,8 +581,8 @@ CONTAINS
             zcpx(ji,jj) = 1.0_wp
           ELSE IF(ll_tmp2) THEN
             ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here
-            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) &
-                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) )
+            zcpx(ji,jj) = ABS( ( ( ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) - ( ssh(ji,jj,Kmm) + ht_0(ji,jj) ) ) &  ! add () for NP repro
+                        &    / (   ssh(ji+1,jj,Kmm)                     - ssh(ji,jj,Kmm)                 ) )
           ELSE
             zcpx(ji,jj) = 0._wp
           END IF
@@ -681,8 +599,8 @@ CONTAINS
             zcpy(ji,jj) = 1.0_wp
           ELSE IF(ll_tmp2) THEN
             ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here
-            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) &
-                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) )
+            zcpy(ji,jj) = ABS( ( ( ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) - ( ssh(ji,jj,Kmm) + ht_0(ji,jj) ) ) &  ! add () for NP repro
+                        &    / (   ssh(ji,jj+1,Kmm)                   -   ssh(ji,jj,Kmm)                 ) )
           ELSE
             zcpy(ji,jj) = 0._wp
           END IF
@@ -709,8 +627,8 @@ CONTAINS
 !!bug gm   Not a true bug, but... zdzz=e3w  for zdzx, zdzy verify what it is really
 
       DO_3D( 1, 1, 1, 1, 2, jpkm1 )  
-         zdrhoz(ji,jj,jk) =   rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1)
-         zdzz  (ji,jj,jk) = - gde3w(ji  ,jj  ,jk) + gde3w(ji,jj,jk-1)
+         zdrhoz(ji,jj,jk) =   rhd     (ji,jj,jk    ) - rhd     (ji,jj,jk-1    )
+         zdzz  (ji,jj,jk) = - gdept_z0(ji,jj,jk,Kmm) + gdept_z0(ji,jj,jk-1,Kmm)
       END_3D
 
       !-------------------------------------------------------------------------
@@ -727,7 +645,7 @@ CONTAINS
          z1_cff = zdrhoz(ji,jj,jk) + zdrhoz(ji,jj,jk+1)
          zdrho_k(ji,jj,jk) = cffw / SIGN( MAX( ABS(z1_cff), zep ), z1_cff )
          zdz_k(ji,jj,jk) = 2._wp *   zdzz(ji,jj,jk) * zdzz(ji,jj,jk+1)   &
-            &                  / ( zdzz(ji,jj,jk) + zdzz(ji,jj,jk+1) )
+            &                    / ( zdzz(ji,jj,jk) + zdzz(ji,jj,jk+1) )
       END_3D
 
       !----------------------------------------------------------------------------------
@@ -736,15 +654,15 @@ CONTAINS
 
 ! mb for sea-ice shelves we will need to re-write this upper boundary condition in the same form as the lower boundary condition
       DO_2D( 1, 1, 1, 1 )
-         zdrho_k(ji,jj,1) = aco_bc_vrt * ( rhd  (ji,jj,2) - rhd  (ji,jj,1) ) - bco_bc_vrt * zdrho_k(ji,jj,2)
-         zdz_k  (ji,jj,1) = aco_bc_vrt * (-gde3w(ji,jj,2) + gde3w(ji,jj,1) ) - bco_bc_vrt * zdz_k  (ji,jj,2)
+         zdrho_k(ji,jj,1) = aco_bc_vrt * ( rhd     (ji,jj,2    ) - rhd     (ji,jj,1    ) ) - bco_bc_vrt * zdrho_k(ji,jj,2)
+         zdz_k  (ji,jj,1) = aco_bc_vrt * (-gdept_z0(ji,jj,2,Kmm) + gdept_z0(ji,jj,1,Kmm) ) - bco_bc_vrt * zdz_k  (ji,jj,2)
       END_2D
 
       DO_2D( 1, 1, 1, 1 )
          IF ( mbkt(ji,jj)>1 ) THEN
             iktb = mbkt(ji,jj)
-            zdrho_k(ji,jj,iktb) = aco_bc_vrt * (     rhd(ji,jj,iktb) -     rhd(ji,jj,iktb-1) ) - bco_bc_vrt * zdrho_k(ji,jj,iktb-1)
-            zdz_k  (ji,jj,iktb) = aco_bc_vrt * (-gde3w(ji,jj,iktb) + gde3w(ji,jj,iktb-1) ) - bco_bc_vrt * zdz_k  (ji,jj,iktb-1) 
+            zdrho_k(ji,jj,iktb) = aco_bc_vrt * (      rhd(ji,jj,iktb    ) -      rhd(ji,jj,iktb-1    ) ) - bco_bc_vrt * zdrho_k(ji,jj,iktb-1)
+            zdz_k  (ji,jj,iktb) = aco_bc_vrt * (-gdept_z0(ji,jj,iktb,Kmm) + gdept_z0(ji,jj,iktb-1,Kmm) ) - bco_bc_vrt * zdz_k  (ji,jj,iktb-1)
          END IF
       END_2D
 
@@ -772,14 +690,14 @@ CONTAINS
       !-------------------------------------------------------------
 
       DO_3D( 0, 1, 0, 1, 2, jpkm1 )
-         z_rho_k(ji,jj,jk) = zcoef0 * (   rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   &
-            &                       * ( - gde3w(ji,jj,jk) + gde3w(ji,jj,jk-1) )                                               &
+         z_rho_k(ji,jj,jk) = zcoef0 * (   rhd     (ji,jj,jk    ) + rhd     (ji,jj,jk-1    ) )                                 &
+            &                       * ( - gdept_z0(ji,jj,jk,Kmm) + gdept_z0(ji,jj,jk-1,Kmm) )                                 &
             &                       + z_grav_10 * (                                                                           &
-            &     (   zdrho_k  (ji,jj,jk) - zdrho_k  (ji,jj,jk-1) )                                                           &
-            &   * ( - gde3w(ji,jj,jk) + gde3w(ji,jj,jk-1) - z1_12 * ( zdz_k  (ji,jj,jk) + zdz_k  (ji,jj,jk-1) ) )             &
-            &   - ( zdz_k    (ji,jj,jk) - zdz_k    (ji,jj,jk-1) )                                                             &
-            &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( zdrho_k(ji,jj,jk) + zdrho_k(ji,jj,jk-1) ) )   &
-            &                             )
+            &     (     zdrho_k (ji,jj,jk    ) - zdrho_k (ji,jj,jk-1    ) )                                                   &
+            &   * ( - ( gdept_z0(ji,jj,jk,Kmm) - gdept_z0(ji,jj,jk-1,Kmm) ) - z1_12 * ( zdz_k  (ji,jj,jk) + zdz_k  (ji,jj,jk-1) ) )   &
+            &   - (     zdz_k   (ji,jj,jk)     - zdz_k   (ji,jj,jk-1)     )                                                           &
+            &   * (   ( rhd     (ji,jj,jk)     - rhd     (ji,jj,jk-1)     ) - z1_12 * ( zdrho_k(ji,jj,jk) + zdrho_k(ji,jj,jk-1) ) )   &
+            &                                      )
       END_3D
 
       !----------------------------------------------------------------------------------------
@@ -791,10 +709,10 @@ CONTAINS
       zdzy  (:,:,:) = 0._wp
 
       DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
-         zdrhox(ji,jj,jk) = rhd  (ji+1,jj  ,jk) - rhd  (ji  ,jj  ,jk)
-         zdzx  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji+1,jj  ,jk)
-         zdrhoy(ji,jj,jk) = rhd  (ji  ,jj+1,jk) - rhd  (ji  ,jj  ,jk)
-         zdzy  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji  ,jj+1,jk)
+         zdrhox(ji,jj,jk) = rhd     (ji+1,jj  ,jk    ) - rhd     (ji  ,jj  ,jk)
+         zdzx  (ji,jj,jk) = gdept_z0(ji  ,jj  ,jk,Kmm) - gdept_z0(ji+1,jj  ,jk,Kmm)
+         zdrhoy(ji,jj,jk) = rhd     (ji  ,jj+1,jk    ) - rhd     (ji  ,jj  ,jk)
+         zdzy  (ji,jj,jk) = gdept_z0(ji  ,jj  ,jk,Kmm) - gdept_z0(ji  ,jj+1,jk,Kmm)
       END_3D
 
       IF( nn_hls == 1 ) CALL lbc_lnk( 'dynhpg', zdrhox, 'U', -1._wp, zdzx, 'U', -1._wp, zdrhoy, 'V', -1._wp, zdzy, 'V', -1._wp )
@@ -836,28 +754,28 @@ CONTAINS
          DO_2D( 0, 0, 0, 1 )
             IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp)  THEN
                zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk)
-               zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i  (ji+1,jj,jk)
+               zz_dz_i  (ji,jj) = aco_bc_hor * (-gdept_z0(ji+1,jj,jk,Kmm) + gdept_z0(ji,jj,jk,Kmm) ) - bco_bc_hor * zdz_i  (ji+1,jj,jk)
             END IF
          END_2D
          ! Walls coming from right: should check from 3 to jpi (and jpj=2-jpj)
          DO_2D( -1, 1, 0, 1 )
             IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN
-               zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)
-               zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i  (ji-1,jj,jk)
+               zz_drho_i(ji,jj) = aco_bc_hor * ( rhd     (ji,jj,jk    ) - rhd     (ji-1,jj,jk    ) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)
+               zz_dz_i  (ji,jj) = aco_bc_hor * (-gdept_z0(ji,jj,jk,Kmm) + gdept_z0(ji-1,jj,jk,Kmm) ) - bco_bc_hor * zdz_i  (ji-1,jj,jk)
             END IF
          END_2D
          ! Walls coming from left: should check from 2 to jpj-1 (and jpi=2-jpi)
          DO_2D( 0, 1, 0, 0 )
             IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp)  THEN
-               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk)
-               zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j  (ji,jj+1,jk)
+               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd     (ji,jj+1,jk    ) - rhd     (ji,jj,jk    ) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk)
+               zz_dz_j  (ji,jj) = aco_bc_hor * (-gdept_z0(ji,jj+1,jk,Kmm) + gdept_z0(ji,jj,jk,Kmm) ) - bco_bc_hor * zdz_j  (ji,jj+1,jk)
             END IF
          END_2D
          ! Walls coming from right: should check from 3 to jpj (and jpi=2-jpi)
          DO_2D( 0, 1, -1, 1 )
             IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN
-               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)
-               zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j  (ji,jj-1,jk)
+               zz_drho_j(ji,jj) = aco_bc_hor * ( rhd     (ji,jj,jk    ) - rhd     (ji,jj-1,jk    ) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)
+               zz_dz_j  (ji,jj) = aco_bc_hor * (-gdept_z0(ji,jj,jk,Kmm) + gdept_z0(ji,jj-1,jk,Kmm) ) - bco_bc_hor * zdz_j  (ji,jj-1,jk)
             END IF
          END_2D
          zdrho_i(:,:,jk) = zz_drho_i(:,:)
@@ -872,26 +790,26 @@ CONTAINS
 
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
 ! two -ve signs cancel in next two lines (within zcoef0 and because gde3w is a depth not a height)
-         z_rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                       &
-             &                    * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) )                                    
+         z_rho_i(ji,jj,jk) = zcoef0 * ( rhd   (ji+1,jj,jk    ) + rhd     (ji,jj,jk    ) )                                       &
+             &                    * ( gdept_z0(ji+1,jj,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) )
          IF ( umask(ji-1, jj, jk) > 0.5 .OR. umask(ji+1, jj, jk) > 0.5 ) THEN
             z_rho_i(ji,jj,jk) = z_rho_i(ji,jj,jk) - z_grav_10 * (                                                               &
-             &     (   zdrho_i  (ji+1,jj,jk) - zdrho_i  (ji,jj,jk) )                                                            &
-             &   * ( - gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) - z1_12 * ( zdz_i  (ji+1,jj,jk) + zdz_i  (ji,jj,jk) ) )              &
-             &   - (   zdz_i    (ji+1,jj,jk) - zdz_i    (ji,jj,jk) )                                                            &
-             &   * (   rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( zdrho_i(ji+1,jj,jk) + zdrho_i(ji,jj,jk) ) )  &
-             &                                               )
+             &     (     zdrho_i  (ji+1,jj,jk)    - zdrho_i  (ji,jj,jk) )                                                            &
+             &   * ( - ( gdept_z0(ji+1,jj,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) - z1_12 * ( zdz_i  (ji+1,jj,jk) + zdz_i  (ji,jj,jk) ) ) &
+             &   - (     zdz_i    (ji+1,jj,jk)    - zdz_i    (ji,jj,jk) )                                                            &
+             &   * (   ( rhd    (ji+1,jj,jk)      - rhd    (ji,jj,jk)      ) - z1_12 * ( zdrho_i(ji+1,jj,jk) + zdrho_i(ji,jj,jk) ) ) &
+             &                                                  )
          END IF
   
-         z_rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                       &
-             &                    * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) )                                  
+         z_rho_j(ji,jj,jk) = zcoef0 * ( rhd   (ji,jj+1,jk    ) + rhd     (ji,jj,jk    ) )                                       &
+             &                    * ( gdept_z0(ji,jj+1,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) )
          IF ( vmask(ji, jj-1, jk) > 0.5 .OR. vmask(ji, jj+1, jk) > 0.5 ) THEN
             z_rho_j(ji,jj,jk) = z_rho_j(ji,jj,jk) - z_grav_10 * (                                                               &
-             &     (   zdrho_j  (ji,jj+1,jk) - zdrho_j  (ji,jj,jk) )                                                            &
-             &   * ( - gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) - z1_12 * ( zdz_j  (ji,jj+1,jk) + zdz_j  (ji,jj,jk) ) )              &
-             &   - (   zdz_j    (ji,jj+1,jk) - zdz_j    (ji,jj,jk) )                                                            &
-             &   * (   rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( zdrho_j(ji,jj+1,jk) + zdrho_j(ji,jj,jk) ) )  &
-             &                                                 )
+             &     (     zdrho_j (ji,jj+1,jk)     - zdrho_j (ji,jj,jk)       )                                                        &
+             &   * ( - ( gdept_z0(ji,jj+1,jk,Kmm) - gdept_z0(ji,jj,jk,Kmm) ) - z1_12 * ( zdz_j  (ji,jj+1,jk) + zdz_j  (ji,jj,jk) ) )  &
+             &   - (        zdz_j(ji,jj+1,jk)     -    zdz_j(ji,jj,jk)       )                                                        &
+             &   * (   (      rhd(ji,jj+1,jk)     -      rhd(ji,jj,jk)     ) - z1_12 * ( zdrho_j(ji,jj+1,jk) + zdrho_j(ji,jj,jk) ) )  &
+             &                                                  )
          END IF
       END_3D
 
@@ -903,8 +821,8 @@ CONTAINS
       !  Surface value
       ! ---------------
       DO_2D( 0, 0, 0, 0 )
-         zhpi(ji,jj,1) = ( z_rho_k(ji,jj,1) - z_rho_k(ji+1,jj  ,1) - z_rho_i(ji,jj,1) ) * r1_e1u(ji,jj)
-         zhpj(ji,jj,1) = ( z_rho_k(ji,jj,1) - z_rho_k(ji  ,jj+1,1) - z_rho_j(ji,jj,1) ) * r1_e2v(ji,jj)
+         zhpi(ji,jj,1) = ( ( z_rho_k(ji,jj,1) - z_rho_k(ji+1,jj  ,1) ) - z_rho_i(ji,jj,1) ) * r1_e1u(ji,jj)   ! add () for NP repro
+         zhpj(ji,jj,1) = ( ( z_rho_k(ji,jj,1) - z_rho_k(ji  ,jj+1,1) ) - z_rho_j(ji,jj,1) ) * r1_e2v(ji,jj)
          IF( ln_wd_il ) THEN
            zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj)
            zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 
@@ -964,10 +882,10 @@ CONTAINS
       REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps
       REAL(wp) :: zrhdt1
       REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zpgu, zpgv   ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zsshu_n, zsshv_n
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdept, zrhh
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp
+      REAL(wp), DIMENSION(T2D(nn_hls))     ::   zpgu, zpgv   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls))     ::   zsshu_n, zsshv_n
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdept, zrhh
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp
       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter
       !!----------------------------------------------------------------------
       !
@@ -993,7 +911,7 @@ CONTAINS
       END_2D
       !
       IF( ln_wd_il ) THEN
-         ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) )
+         ALLOCATE( zcpx(T2D(nn_hls)) , zcpy(T2D(nn_hls)) )
          DO_2D( 0, 0, 0, 0 )
             ll_tmp1 = MIN(   ssh(ji,jj,Kmm)              ,   ssh(ji+1,jj,Kmm)                 ) >       &
                &      MAX( -ht_0(ji,jj)                  , -ht_0(ji+1,jj)                     ) .AND.   &
@@ -1007,8 +925,8 @@ CONTAINS
                zcpx(ji,jj) = 1.0_wp
             ELSE IF(ll_tmp2) THEN
                ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here
-               zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) &
-                           &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) )
+               zcpx(ji,jj) = ABS( ( ( ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) - ( ssh(ji,jj,Kmm) + ht_0(ji,jj) ) ) &
+                  &             / (   ssh(ji+1,jj,Kmm)                   -  ssh(ji,jj,Kmm)                  ) )
                zcpx(ji,jj) = MAX(MIN( zcpx(ji,jj) , 1.0_wp),0.0_wp)
             ELSE
                zcpx(ji,jj) = 0._wp
@@ -1026,8 +944,8 @@ CONTAINS
                zcpy(ji,jj) = 1.0_wp
             ELSE IF(ll_tmp2) THEN
                ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here
-               zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) &
-                           &    / (ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm)) )
+               zcpy(ji,jj) = ABS( ( ( ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) - ( ssh(ji,jj,Kmm) + ht_0(ji,jj) ) ) &
+                           &    / (   ssh(ji,jj+1,Kmm)                   -   ssh(ji,jj,Kmm)                 ) )
                zcpy(ji,jj) = MAX(MIN( zcpy(ji,jj) , 1.0_wp),0.0_wp)
             ELSE
                zcpy(ji,jj) = 0._wp
@@ -1037,7 +955,7 @@ CONTAINS
 
       ! Clean 3-D work arrays
       zhpi(:,:,:) = 0._wp
-      zrhh(:,:,:) = rhd(A2D(nn_hls),:)
+      zrhh(:,:,:) = rhd(T2D(nn_hls),:)
 
       ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate
       DO_2D( 1, 1, 1, 1 )
@@ -1046,8 +964,8 @@ CONTAINS
          ELSEIF( jk ==  2   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk)
          ELSEIF( jk < jpkm1 ) THEN
             DO jkk = jk+1, jpk
-               zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   &
-                  &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2))
+               zrhh(ji,jj,jkk) = interp1(gdept_z0(ji,jj,jkk  ,Kmm), gdept_z0(ji,jj,jkk-1,Kmm),   &
+                  &                      gdept_z0(ji,jj,jkk-2,Kmm), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2))
             END DO
          ENDIF
       END_2D
@@ -1263,8 +1181,8 @@ CONTAINS
       !!
       !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   fsp, xsp           ! value and coordinate
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   fsp, xsp           ! value and coordinate
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function
       INTEGER                             , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear
       !
       INTEGER  ::   ji, jj, jk                 ! dummy loop indices
diff --git a/src/OCE/DYN/dynkeg.F90 b/src/OCE/DYN/dynkeg.F90
index d751899d..cb8697b9 100644
--- a/src/OCE/DYN/dynkeg.F90
+++ b/src/OCE/DYN/dynkeg.F90
@@ -6,7 +6,8 @@ MODULE dynkeg
    !! History :  1.0  !  1987-09  (P. Andrich, M.-A. Foujols)  Original code
    !!            7.0  !  1997-05  (G. Madec)  Split dynber into dynkeg and dynhpg
    !!  NEMO      1.0  !  2002-07  (G. Madec)  F90: Free form and module
-   !!            3.6  !  2015-05  (N. Ducousso, G. Madec)  add Hollingsworth scheme as an option 
+   !!            3.6  !  2015-05  (N. Ducousso, G. Madec)  add Hollingsworth scheme as an option
+   !!            4.5  !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
    
    !!----------------------------------------------------------------------
@@ -27,7 +28,7 @@ MODULE dynkeg
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC   dyn_keg    ! routine called by step module
+   PUBLIC   dyn_keg        ! routine called by step module
    
    INTEGER, PARAMETER, PUBLIC  ::   nkeg_C2  = 0   !: 2nd order centered scheme (standard scheme)
    INTEGER, PARAMETER, PUBLIC  ::   nkeg_HW  = 1   !: Hollingsworth et al., QJRMS, 1983
@@ -70,15 +71,15 @@ CONTAINS
       !! ** References : Arakawa, A., International Geophysics 2001.
       !!                 Hollingsworth et al., Quart. J. Roy. Meteor. Soc., 1983.
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  kscheme          ! =0/1   type of KEG scheme 
-      INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      INTEGER                             , INTENT(in   ) ::   kt          ! ocean time-step index
+      INTEGER                             , INTENT(in   ) ::   kscheme     ! =0/1   type of KEG scheme 
+      INTEGER                             , INTENT(in   ) ::   Kmm, Krhs   ! ocean time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! ocean velocities and RHS of momentum equation
       !
-      INTEGER  ::   ji, jj, jk             ! dummy loop indices
-      REAL(wp) ::   zu, zv                   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    ::   zhke
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
+      INTEGER  ::   ji, jj, jk   ! dummy loop indices
+      REAL(wp) ::   zu, zv       ! local scalars
+      REAL(wp), DIMENSION(:,:  ) , ALLOCATABLE ::   zhke
+      REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE ::   zu_trd, zv_trd
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_keg')
@@ -90,56 +91,66 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '~~~~~~~'
          ENDIF
       ENDIF
-
-      IF( l_trddyn ) THEN           ! Save the input trends
-         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )
-         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
-         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
+      !
+      IF( l_trddyn ) THEN                       ! Save the input trends
+         ALLOCATE( zu_trd(A2D(0),jpk), zv_trd(A2D(0),jpk) )
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs)
       ENDIF
-      
-      zhke(:,:,jpk) = 0._wp
-
-      SELECT CASE ( kscheme )             !== Horizontal kinetic energy at T-point  ==!
       !
-      CASE ( nkeg_C2 )                          !--  Standard scheme  --!
-         DO_3D( 0, 1, 0, 1, 1, jpkm1 )
-            zu =    puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)   &
-               &  + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm)
-            zv =    pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)   &
-               &  + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm)
-            zhke(ji,jj,jk) = 0.25_wp * ( zv + zu )
-         END_3D
-      CASE ( nkeg_HW )                          !--  Hollingsworth scheme  --!
-         DO_3D( 0, nn_hls-1, 0, nn_hls-1, 1, jpkm1 )
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            zu = 8._wp * ( puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)    &
-               &         + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm) )  &
-               &   +     ( ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) * ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) )   &
-               &   +       ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) * ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )   &
-               &         )                                                               ! bracket for halo 1 - halo 2 compatibility
-               !
-            zv = 8._wp * ( pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)    &
-               &         + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm) )  &
-               &  +      ( ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) )  &
-               &  +        ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )  &
-               &         )                                                               ! bracket for halo 1 - halo 2 compatibility
-            zhke(ji,jj,jk) = r1_48 * ( zv + zu )
-         END_3D
-         IF (nn_hls==1) CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp )
-         !
-      END SELECT 
+      SELECT CASE ( kscheme )
       !
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )       !==  grad( KE ) added to the general momentum trends  ==!
-         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)
-         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)
-      END_3D
+      CASE ( nkeg_C2 )                    !==  Standard scheme  ==!
+         ALLOCATE( zhke(T2D(1)) )
+         DO jk = 1, jpkm1
+            DO_2D( 0, 1, 0, 1 )                 !* Horizontal kinetic energy at T-point
+               zu =    puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)   &
+                  &  + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm)
+               zv =    pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)   &
+                  &  + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm)
+               zhke(ji,jj) = 0.25_wp * ( zv + zu )
+            END_2D
+            !
+            DO_2D( 0, 0, 0, 0 )                  !* grad( KE ) added to the general momentum trends
+               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj  ) - zhke(ji,jj) ) * r1_e1u(ji,jj)
+               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji  ,jj+1) - zhke(ji,jj) ) * r1_e2v(ji,jj)
+            END_2D
+         END DO
+         DEALLOCATE( zhke )
+         !
+      CASE ( nkeg_HW )                           !* Hollingsworth scheme
+         ALLOCATE( zhke(T2D(1)) )
+         DO jk = 1, jpkm1
+            DO_2D( 0, 1, 0, 1 )
+               ! round brackets added to fix the order of floating point operations
+               ! needed to ensure halo 1 - halo 2 compatibility
+               zu =   (   puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)               &
+                  &     + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm)   ) * 8._wp   &
+                  & + ( ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) * ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) )   &
+                  & +   ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) * ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )   &
+                  &   )                                                    ! bracket for halo 1 - halo 2 compatibility
+               zv =   (   pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)               &
+                  &     + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm)   ) * 8._wp   &
+                  & + ( ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) )   &
+                  & +   ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )   &
+                  &   )                                                    ! bracket for halo 1 - halo 2 compatibility
+               zhke(ji,jj) = r1_48 * ( zv + zu )
+            END_2D
+            !
+            DO_2D( 0, 0, 0, 0 )                  !* grad( KE ) added to the general momentum trends
+               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj  ) - zhke(ji,jj) ) * r1_e1u(ji,jj)
+               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji  ,jj+1) - zhke(ji,jj) ) * r1_e2v(ji,jj)
+            END_2D
+         END DO
+         DEALLOCATE( zhke )
+         !
+      END SELECT
       !
-      IF( l_trddyn ) THEN                 ! save the Kinetic Energy trends for diagnostic
-         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:)
-         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:)
-         CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt, Kmm )
-         DEALLOCATE( ztrdu , ztrdv )
+      IF( l_trddyn ) THEN                        ! save the Kinetic Energy trends for diagnostic
+         zu_trd(A2D(0),:) = puu(A2D(0),:,Krhs) - zu_trd(A2D(0),:)
+         zv_trd(A2D(0),:) = pvv(A2D(0),:,Krhs) - zv_trd(A2D(0),:)
+         CALL trd_dyn( zu_trd, zv_trd, jpdyn_keg, kt, Kmm )
+         DEALLOCATE( zu_trd, zv_trd )
       ENDIF
       !
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' keg  - Ua: ', mask1=umask,   &
diff --git a/src/OCE/DYN/dynldf.F90 b/src/OCE/DYN/dynldf.F90
index da8705af..6649da61 100644
--- a/src/OCE/DYN/dynldf.F90
+++ b/src/OCE/DYN/dynldf.F90
@@ -16,7 +16,8 @@ MODULE dynldf
    USE dom_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    USE ldfdyn         ! lateral diffusion: eddy viscosity coef.
-   USE dynldf_lap_blp ! lateral mixing   (dyn_ldf_lap & dyn_ldf_blp routines)
+   USE dynldf_lev     ! lateral mixing   (dynldf_lev_lap & dynldf_lev_blp routines)
+!!st   USE dynldf_lap_blp ! lateral mixing   (dyn_ldf_lap & dyn_ldf_blp routines)
    USE dynldf_iso     ! lateral mixing                 (dyn_ldf_iso routine )
    USE trd_oce        ! trends: ocean variables
    USE trddyn         ! trend manager: dynamics   (trd_dyn      routine)
@@ -64,11 +65,13 @@ CONTAINS
       SELECT CASE ( nldf_dyn )                   ! compute lateral mixing trend and add it to the general trend
       !
       CASE ( np_lap   )  
-         CALL dyn_ldf_lap( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs), 1 ) ! iso-level    laplacian
+!!st         CALL dyn_ldf_lap( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs), 1 ) ! iso-level    laplacian
+         CALL dynldf_lev_lap( kt, Kbb, Kmm, puu, pvv, Krhs )
       CASE ( np_lap_i ) 
          CALL dyn_ldf_iso( kt, Kbb, Kmm, puu, pvv, Krhs    )                                                   ! rotated      laplacian
       CASE ( np_blp   )  
-         CALL dyn_ldf_blp( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs)    ) ! iso-level bi-laplacian
+!!st         CALL dyn_ldf_blp( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs)    ) ! iso-level bi-laplacian
+         CALL dynldf_lev_blp( kt, Kbb, Kmm, puu, pvv, Krhs )
       !
       END SELECT
 
diff --git a/src/OCE/DYN/dynldf_iso.F90 b/src/OCE/DYN/dynldf_iso.F90
index 891d8842..9c8d84f1 100644
--- a/src/OCE/DYN/dynldf_iso.F90
+++ b/src/OCE/DYN/dynldf_iso.F90
@@ -27,9 +27,6 @@ MODULE dynldf_iso
    USE lib_mpp         ! MPP library
    USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
    USE prtctl          ! Print control
-#if defined key_loop_fusion
-   USE dynldf_iso_lf, ONLY: dyn_ldf_iso_lf   ! lateral mixing - loop fusion version (dyn_ldf_iso routine )
-#endif
 
    IMPLICIT NONE
    PRIVATE
@@ -113,16 +110,12 @@ CONTAINS
       REAL(wp) ::   zabe1, zmskt, zmkt, zuav, zuwslpi, zuwslpj   ! local scalars
       REAL(wp) ::   zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj   !   -      -
       REAL(wp) ::   zcof0, zcof1, zcof2, zcof3, zcof4, zaht_0    !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   ziut, zivf, zdku, zdk1u  ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zjuf, zjvt, zdkv, zdk1v  !  -      -
-      REAL(wp), DIMENSION(A1Di(nn_hls),jpk) ::   zfuw, zdiu, zdju, zdj1u  !  -      -
-      REAL(wp), DIMENSION(A1Di(nn_hls),jpk) ::   zfvw, zdiv, zdjv, zdj1v  !  -      -
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   ziut, zivf, zdku, zdk1u  ! 2D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   zjuf, zjvt, zdkv, zdk1v  !  -      -
+      REAL(wp), DIMENSION(T1Di(nn_hls),jpk) ::   zfuw, zdiu, zdju, zdj1u  !  -      -
+      REAL(wp), DIMENSION(T1Di(nn_hls),jpk) ::   zfvw, zdiv, zdjv, zdj1v  !  -      -
       !!----------------------------------------------------------------------
       !
-#if defined key_loop_fusion
-      CALL dyn_ldf_iso_lf( kt, Kbb, Kmm, puu, pvv, Krhs    )
-#else
-
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == nit000 ) THEN
             IF(lwp) WRITE(numout,*)
@@ -131,7 +124,7 @@ CONTAINS
             !                                      ! allocate dyn_ldf_iso arrays
             IF( dyn_ldf_iso_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays')
             !
-            DO_2D_OVR( 0, 0, 0, 0 )
+            DO_2D( 0, 0, 0, 0 )
                akzu(ji,jj,1)   = 0._wp
                akzu(ji,jj,jpk) = 0._wp
                akzv(ji,jj,1)   = 0._wp
@@ -188,7 +181,7 @@ CONTAINS
          !                                    |  
          ! i-flux at t-point             -----f-----
 
-         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u)
+         IF( l_zps ) THEN       ! z-coordinate - partial steps : min(e3u)
             DO_2D( 0, 1, 0, 0 )
                zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj)   &
                   &    * MIN( e3u(ji  ,jj,jk,Kmm),                &
@@ -200,8 +193,8 @@ CONTAINS
                zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) )
 
                ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )    &
-                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      &
-                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk)
+                  &           + zcof1 * ( ( zdku (ji,jj) + zdk1u(ji-1,jj) )            & ! add () for NP repro
+                  &                      +( zdk1u(ji,jj) + zdku (ji-1,jj) ) )  ) * tmask(ji,jj,jk)
             END_2D
          ELSE                   ! other coordinate system (zco or sco) : e3t
             DO_2D( 0, 1, 0, 0 )
@@ -214,8 +207,8 @@ CONTAINS
                zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) )
 
                ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )   &
-                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     &
-                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk)
+                  &           + zcof1 * ( ( zdku (ji,jj) + zdk1u(ji-1,jj) )           & ! add () for NP repro
+                  &                      +( zdk1u(ji,jj) + zdku (ji-1,jj) ) )  ) * tmask(ji,jj,jk)
             END_2D
          ENDIF
 
@@ -230,8 +223,8 @@ CONTAINS
             zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) )
 
             zjuf(ji,jj) = (  zabe2 * ( puu(ji,jj+1,jk,Kbb) - puu(ji,jj,jk,Kbb) )   &
-               &           + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj)     &
-               &                      +zdk1u(ji,jj+1) + zdku (ji,jj) )  ) * fmask(ji,jj,jk)
+               &           + zcof2 * ( ( zdku (ji,jj+1) + zdk1u(ji,jj) )           & ! add () for NP repro
+               &                      +( zdk1u(ji,jj+1) + zdku (ji,jj) ) )  ) * fmask(ji,jj,jk)
          END_2D
 
          !                                |   t   |
@@ -250,12 +243,12 @@ CONTAINS
             zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) )
 
             zivf(ji,jj) = (  zabe1 * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji,jj,jk,Kbb) )    &
-               &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      &
-               &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk)
+               &           + zcof1 * (  ( zdkv (ji,jj) + zdk1v(ji+1,jj) )           & ! add () for NP repro
+               &                      + ( zdk1v(ji,jj) + zdkv (ji+1,jj) ) )  ) * fmask(ji,jj,jk)
          END_2D
 
          ! j-flux at t-point
-         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u)
+         IF( l_zps ) THEN       ! z-coordinate - partial steps : min(e3u)
             DO_2D( 1, 0, 0, 1 )
                zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj)   &
                   &     * MIN( e3v(ji,jj  ,jk,Kmm),                 &
@@ -267,8 +260,8 @@ CONTAINS
                zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) )
 
                zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )    &
-                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      &
-                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk)
+                  &           + zcof2 * ( ( zdkv (ji,jj-1) + zdk1v(ji,jj) )            & ! add () for NP repro
+                  &                      +( zdk1v(ji,jj-1) + zdkv (ji,jj) ) )  ) * tmask(ji,jj,jk)
             END_2D
          ELSE                   ! other coordinate system (zco or sco) : e3t
             DO_2D( 1, 0, 0, 1 )
@@ -281,8 +274,8 @@ CONTAINS
                zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) )
 
                zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )   &
-                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     &
-                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk)
+                  &           + zcof2 * ( ( zdkv (ji,jj-1) + zdk1v(ji,jj) )           & ! add () for NP repro
+                  &                      +( zdk1v(ji,jj-1) + zdkv (ji,jj) ) )  ) * tmask(ji,jj,jk)
             END_2D
          ENDIF
 
@@ -290,12 +283,10 @@ CONTAINS
          ! Second derivative (divergence) and add to the general trend
          ! -----------------------------------------------------------
          DO_2D( 0, 0, 0, 0 )      !!gm Question vectop possible??? !!bug
-            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (  ziut(ji+1,jj) - ziut(ji,jj  )    &
-               &                           + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) * r1_e1e2u(ji,jj)   &
-               &                           / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (  zivf(ji,jj  ) - zivf(ji-1,jj)    &
-               &                           + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) * r1_e1e2v(ji,jj)   &
-               &                           / e3v(ji,jj,jk,Kmm)
+            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (  ( ziut(ji+1,jj) - ziut(ji,jj  ) )    &   ! add () for NP repro
+               &                                       + ( zjuf(ji  ,jj) - zjuf(ji,jj-1) )  ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
+            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (  ( zivf(ji,jj  ) - zivf(ji-1,jj) )    &   ! add () for NP repro
+               &                                       + ( zjvt(ji,jj+1) - zjvt(ji,jj  ) )  ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
          END_2D
          !                                             ! ===============
       END DO                                           !   End of slab
@@ -366,10 +357,10 @@ CONTAINS
                zcof3 = - e2u(ji,jj) * zmkt * zuwslpi
                zcof4 = - e1u(ji,jj) * zmkf * zuwslpj
                ! vertical flux on u field
-               zfuw(ji,jk) = zcof3 * (  zdiu (ji,jk-1) + zdiu (ji+1,jk-1)      &
-                  &                   + zdiu (ji,jk  ) + zdiu (ji+1,jk  )  )   &
-                  &        + zcof4 * (  zdj1u(ji,jk-1) + zdju (ji  ,jk-1)      &
-                  &                   + zdj1u(ji,jk  ) + zdju (ji  ,jk  )  )
+               zfuw(ji,jk) = zcof3 * (  ( zdiu (ji,jk-1) + zdiu (ji+1,jk-1) )      &  ! add () for  NP repro
+                  &                   + ( zdiu (ji,jk  ) + zdiu (ji+1,jk  ) )  )   &
+                  &        + zcof4 * (  ( zdj1u(ji,jk-1) + zdju (ji  ,jk-1) )      &  ! add () for  NP repro
+                  &                   + ( zdj1u(ji,jk  ) + zdju (ji  ,jk  ) )  )
                ! vertical mixing coefficient (akzu)
                ! Note: zcof0 include zaht_0, so divided by zaht_0 to obtain slp^2 * zaht_0
                akzu(ji,jj,jk) = ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / zaht_0
@@ -392,10 +383,10 @@ CONTAINS
                zcof3 = - e2v(ji,jj) * zmkf * zvwslpi
                zcof4 = - e1v(ji,jj) * zmkt * zvwslpj
                ! vertical flux on v field
-               zfvw(ji,jk) = zcof3 * (  zdiv (ji,jk-1) + zdiv (ji-1,jk-1)      &
-                  &                   + zdiv (ji,jk  ) + zdiv (ji-1,jk  )  )   &
-                  &        + zcof4 * (  zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)      &
-                  &                   + zdjv (ji,jk  ) + zdj1v(ji  ,jk  )  )
+               zfvw(ji,jk) = zcof3 * (  ( zdiv (ji,jk-1) + zdiv (ji-1,jk-1) )      &  ! add () for  NP repro
+                  &                   + ( zdiv (ji,jk  ) + zdiv (ji-1,jk  ) )  )   &
+                  &        + zcof4 * (  ( zdjv (ji,jk-1) + zdj1v(ji  ,jk-1) )      &  ! add () for  NP repro
+                  &                   + ( zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) )  )
                ! vertical mixing coefficient (akzv)
                ! Note: zcof0 include zaht_0, so divided by zaht_0 to obtain slp^2 * zaht_0
                akzv(ji,jj,jk) = ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / zaht_0
@@ -407,16 +398,13 @@ CONTAINS
          ! -------------------------------------------------------------------
          DO jk = 1, jpkm1
             DO ji = ntsi, ntei
-               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj)   &
-                  &               / e3u(ji,jj,jk,Kmm)
-               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj)   &
-                  &               / e3v(ji,jj,jk,Kmm)
+               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
+               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
             END DO
          END DO
          !                                             ! ===============
       END DO                                           !   End of slab
       !                                                ! ===============
-#endif
    END SUBROUTINE dyn_ldf_iso
 
    !!======================================================================
diff --git a/src/OCE/DYN/dynldf_iso_lf.F90 b/src/OCE/DYN/dynldf_iso_lf.F90
deleted file mode 100644
index 07b38792..00000000
--- a/src/OCE/DYN/dynldf_iso_lf.F90
+++ /dev/null
@@ -1,401 +0,0 @@
-MODULE dynldf_iso_lf
-   !!======================================================================
-   !!                     ***  MODULE  dynldf_iso  ***
-   !! Ocean dynamics:   lateral viscosity trend (rotated laplacian operator)
-   !!======================================================================
-   !! History :  OPA  !  97-07  (G. Madec)  Original code
-   !!  NEMO      1.0  !  2002-08  (G. Madec)  F90: Free form and module
-   !!             -   !  2004-08  (C. Talandier) New trends organization
-   !!            2.0  !  2005-11  (G. Madec)  s-coordinate: horizontal diffusion
-   !!            3.7  !  2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification,
-   !!                 !                                   add velocity dependent coefficient and optional read in file
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   dyn_ldf_iso  : update the momentum trend with the horizontal part
-   !!                  of the lateral diffusion using isopycnal or horizon-
-   !!                  tal s-coordinate laplacian operator.
-   !!----------------------------------------------------------------------
-   USE oce             ! ocean dynamics and tracers
-   USE dom_oce         ! ocean space and time domain
-   USE ldfdyn          ! lateral diffusion: eddy viscosity coef.
-   USE ldftra          ! lateral physics: eddy diffusivity
-   USE zdf_oce         ! ocean vertical physics
-   USE ldfslp          ! iso-neutral slopes 
-   !
-   USE in_out_manager  ! I/O manager
-   USE lib_mpp         ! MPP library
-   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
-   USE prtctl          ! Print control
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   dyn_ldf_iso_lf           ! called by step.F90
-   PUBLIC   dyn_ldf_iso_alloc_lf     ! called by nemogcm.F90
-
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   akzu, akzv   !: vertical component of rotated lateral viscosity
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: dynldf_iso.F90 14757 2021-04-27 15:33:44Z francesca $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   INTEGER FUNCTION dyn_ldf_iso_alloc_lf()
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE dyn_ldf_iso_alloc  ***
-      !!----------------------------------------------------------------------
-      dyn_ldf_iso_alloc_lf = 0
-      IF( .NOT. ALLOCATED( akzu ) ) THEN
-         ALLOCATE( akzu(jpi,jpj,jpk), akzv(jpi,jpj,jpk), STAT=dyn_ldf_iso_alloc_lf )
-            !
-         IF( dyn_ldf_iso_alloc_lf /= 0 )   CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.')
-      ENDIF
-   END FUNCTION dyn_ldf_iso_alloc_lf
-
-
-   SUBROUTINE dyn_ldf_iso_lf( kt, Kbb, Kmm, puu, pvv, Krhs )
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE dyn_ldf_iso  ***
-      !!                       
-      !! ** Purpose :   Compute the before trend of the rotated laplacian
-      !!      operator of lateral momentum diffusion except the diagonal
-      !!      vertical term that will be computed in dynzdf module. Add it
-      !!      to the general trend of momentum equation.
-      !!
-      !! ** Method :
-      !!        The momentum lateral diffusive trend is provided by a 2nd
-      !!      order operator rotated along neutral or geopotential surfaces
-      !!      (in s-coordinates).
-      !!      It is computed using before fields (forward in time) and isopyc-
-      !!      nal or geopotential slopes computed in routine ldfslp.
-      !!      Here, u and v components are considered as 2 independent scalar
-      !!      fields. Therefore, the property of splitting divergent and rota-
-      !!      tional part of the flow of the standard, z-coordinate laplacian
-      !!      momentum diffusion is lost.
-      !!      horizontal fluxes associated with the rotated lateral mixing:
-      !!      u-component:
-      !!         ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t  di[ uu ]
-      !!               -  ahmt              e2t * mi-1(uslp) dk[ mi(mk(uu)) ]
-      !!         zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f  dj[ uu ]
-      !!               -  ahmf              e1f * mi(vslp)   dk[ mj(mk(uu)) ]
-      !!      v-component:
-      !!         zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t  di[ vv ]
-      !!               -  ahmf              e2t * mj(uslp)   dk[ mi(mk(vv)) ]
-      !!         zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f  dj[ vv ]
-      !!               -  ahmt              e1f * mj-1(vslp) dk[ mj(mk(vv)) ]
-      !!      take the horizontal divergence of the fluxes:
-      !!         diffu = 1/(e1u*e2u*e3u) {  di  [ ziut ] + dj-1[ zjuf ]  }
-      !!         diffv = 1/(e1v*e2v*e3v) {  di-1[ zivf ] + dj  [ zjvt ]  }
-      !!      Add this trend to the general trend (uu(rhs),vv(rhs)):
-      !!         uu(rhs) = uu(rhs) + diffu
-      !!      CAUTION: here the isopycnal part is with a coeff. of aht. This
-      !!      should be modified for applications others than orca_r2 (!!bug)
-      !!
-      !! ** Action :
-      !!       -(puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the before geopotential harmonic mixing trend
-      !!       -(akzu,akzv) to accompt for the diagonal vertical component
-      !!                    of the rotated operator in dynzdf module
-      !!----------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
-      !
-      INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zabe1, zmskt, zmkt, zuav, zuwslpi, zuwslpj   ! local scalars
-      REAL(wp) ::   zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj   !   -      -
-      REAL(wp) ::   zcof0, zcof1, zcof2, zcof3, zcof4, zaht_0    !   -      -
-      REAL(wp) ::   zdiu, zdiu_km1, zdiu_ip1, zdiu_ip1_km1       !   -      -
-      REAL(wp) ::   zdju, zdju_km1, zdj1u, zdj1u_km1
-      REAL(wp) ::   zdjv, zdjv_km1, zdj1v, zdj1v_km1
-      REAL(wp) ::   zdiv_im1_km1, zdiv, zdiv_im1, zdiv_km1       !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   ziut, zivf, zdku, zdk1u  ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zjuf, zjvt, zdkv, zdk1v  !  -      -
-      REAL(wp), DIMENSION(A1Di(nn_hls),jpk) ::   zfuw, zfvw
-      !!----------------------------------------------------------------------
-      !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == nit000 ) THEN
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout,*) 'dyn_ldf_iso_lf : iso-neutral laplacian diffusive operator or '
-            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~     s-coordinate horizontal diffusive operator'
-            !                                      ! allocate dyn_ldf_bilap arrays
-            IF( dyn_ldf_iso_alloc_lf() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays')
-         ENDIF
-      ENDIF
-
-!!gm bug is dyn_ldf_iso called before tra_ldf_iso ....   <<<<<===== TO BE CHECKED
-      ! s-coordinate: Iso-level diffusion on momentum but not on tracer
-      IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN
-         !
-         DO_3D_OVR( 1, 1, 1, 1, 1, jpk )      ! set the slopes of iso-level
-            uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk)
-            vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk)
-            wslpi(ji,jj,jk) = - ( gdepw(ji+1,jj,jk,Kbb) - gdepw(ji-1,jj,jk,Kbb) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5
-            wslpj(ji,jj,jk) = - ( gdepw(ji,jj+1,jk,Kbb) - gdepw(ji,jj-1,jk,Kbb) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5
-         END_3D
-         !
-       ENDIF
-         
-      zaht_0 = 0.5_wp * rn_Ud * rn_Ld                  ! aht_0 from namtra_ldf = zaht_max
-      
-      !                                                ! ===============
-      DO jk = 1, jpkm1                                 ! Horizontal slab
-         !                                             ! ===============
-
-         ! Vertical u- and v-shears at level jk and jk+1
-         ! ---------------------------------------------
-         ! surface boundary condition: zdku(jk=1)=zdku(jk=2)
-         !                             zdkv(jk=1)=zdkv(jk=2)
-
-         DO_2D( 1, 1, 1, 1 )
-            zdk1u(ji,jj) = ( puu(ji,jj,jk,Kbb) -puu(ji,jj,jk+1,Kbb) ) * umask(ji,jj,jk+1)
-            zdk1v(ji,jj) = ( pvv(ji,jj,jk,Kbb) -pvv(ji,jj,jk+1,Kbb) ) * vmask(ji,jj,jk+1)
-         END_2D
-
-         IF( jk == 1 ) THEN
-            zdku(:,:) = zdk1u(:,:)
-            zdkv(:,:) = zdk1v(:,:)
-         ELSE
-            DO_2D( 1, 1, 1, 1 )
-               zdku(ji,jj) = ( puu(ji,jj,jk-1,Kbb) - puu(ji,jj,jk,Kbb) ) * umask(ji,jj,jk)
-               zdkv(ji,jj) = ( pvv(ji,jj,jk-1,Kbb) - pvv(ji,jj,jk,Kbb) ) * vmask(ji,jj,jk)
-            END_2D
-         ENDIF
-
-         !                               -----f-----
-         ! Horizontal fluxes on U             |  
-         ! --------------------===        t   u   t
-         !                                    |  
-         ! i-flux at t-point             -----f-----
-
-         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u)
-            DO_2D( 0, 1, 0, 0 )
-               zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj)   &
-                  &    * MIN( e3u(ji  ,jj,jk,Kmm),                &
-                  &           e3u(ji-1,jj,jk,Kmm) ) * r1_e1t(ji,jj)
-
-               zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     &
-                  &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp )
-
-               zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) )
-
-               ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )    &
-                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      &
-                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk)
-            END_2D
-         ELSE                   ! other coordinate system (zco or sco) : e3t
-            DO_2D( 0, 1, 0, 0 )
-               zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b )   &
-                  &     * e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e1t(ji,jj)
-
-               zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     &
-                  &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp )
-
-               zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) )
-
-               ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )   &
-                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     &
-                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk)
-            END_2D
-         ENDIF
-
-         ! j-flux at f-point
-         DO_2D( 1, 0, 1, 0 )
-            zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b )   &
-               &     * e1f(ji,jj) * e3f(ji,jj,jk) * r1_e2f(ji,jj)
-
-            zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     &
-               &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp )
-
-            zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) )
-
-            zjuf(ji,jj) = (  zabe2 * ( puu(ji,jj+1,jk,Kbb) - puu(ji,jj,jk,Kbb) )   &
-               &           + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj)     &
-               &                      +zdk1u(ji,jj+1) + zdku (ji,jj) )  ) * fmask(ji,jj,jk)
-
-            !                                |   t   |
-            ! Horizontal fluxes on V         |       |
-            ! --------------------===        f---v---f
-            !                                |       |
-            ! i-flux at f-point              |   t   |
-
-            zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b )   &
-               &     * e2f(ji,jj) * e3f(ji,jj,jk) * r1_e1f(ji,jj)
-
-            zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     &
-               &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp )
-
-            zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) )
-
-            zivf(ji,jj) = (  zabe1 * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji,jj,jk,Kbb) )    &
-               &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      &
-               &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk)
-         END_2D
-
-         ! j-flux at t-point
-         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u)
-            DO_2D( 1, 0, 0, 1 )
-               zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj)   &
-                  &     * MIN( e3v(ji,jj  ,jk,Kmm),                 &
-                  &            e3v(ji,jj-1,jk,Kmm) ) * r1_e2t(ji,jj)
-
-               zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     &
-                  &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp )
-
-               zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) )
-
-               zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )    &
-                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      &
-                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk)
-            END_2D
-         ELSE                   ! other coordinate system (zco or sco) : e3t
-            DO_2D( 1, 0, 0, 1 )
-               zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b )   &
-                  &     * e1t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e2t(ji,jj)
-
-               zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   &
-                  &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. )
-
-               zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) )
-
-               zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )   &
-                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     &
-                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk)
-            END_2D
-         ENDIF
-
-
-         ! Second derivative (divergence) and add to the general trend
-         ! -----------------------------------------------------------
-         DO_2D( 0, 0, 0, 0 )      !!gm Question vectop possible??? !!bug
-            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (  ziut(ji+1,jj) - ziut(ji,jj  )    &
-               &                           + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) * r1_e1e2u(ji,jj)   &
-               &                           / e3u(ji,jj,jk,Kmm)
-            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (  zivf(ji,jj  ) - zivf(ji-1,jj)    &
-               &                           + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) * r1_e1e2v(ji,jj)   &
-               &                           / e3v(ji,jj,jk,Kmm)
-         END_2D
-         !                                             ! ===============
-      END DO                                           !   End of slab
-      !                                                ! ===============
-
-      ! print sum trends (used for debugging)
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldfh - Ua: ', mask1=umask, &
-         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
-
-
-      !                                                ! ===============
-      DO jj = ntsj, ntej                               !  Vertical slab
-         !                                             ! ===============
-
- 
-         ! I. vertical trends associated with the lateral mixing
-         ! =====================================================
-         !  (excluding the vertical flux proportional to dk[t]
-
-         ! I.2 Vertical fluxes
-         ! -------------------
-
-         ! Surface and bottom vertical fluxes set to zero
-         DO ji = ntsi - nn_hls, ntei + nn_hls
-            zfuw(ji, 1 ) = 0.e0
-            zfvw(ji, 1 ) = 0.e0
-            zfuw(ji,jpk) = 0.e0
-            zfvw(ji,jpk) = 0.e0
-         END DO
-
-         ! interior (2=<jk=<jpk-1) on U and V fields
-         DO jk = 2, jpkm1
-            DO ji = ntsi, ntei
-               ! I.1 horizontal momentum gradient
-               ! --------------------------------
-               ! i-gradient of u at jj
-               zdiu = tmask(ji,jj,jk) * ( puu(ji,jj  ,jk,Kbb) - puu(ji-1,jj ,jk,Kbb) )
-               zdiu_km1 = tmask(ji,jj,jk-1) * ( puu(ji,jj,jk-1,Kbb) - puu(ji-1,jj,jk-1,Kbb) )
-               zdiu_ip1 = tmask(ji+1,jj,jk) * ( puu(ji+1,jj,jk,Kbb) - puu(ji,jj,jk,Kbb) )
-               zdiu_ip1_km1 = tmask(ji+1,jj,jk-1) * ( puu(ji+1,jj,jk-1,Kbb) - puu(ji,jj,jk-1,Kbb) )
-               ! j-gradient of u and v at jj
-               zdju = fmask(ji,jj,jk) * ( puu(ji,jj+1,jk,Kbb) - puu(ji,jj,jk,Kbb) )
-               zdju_km1 = fmask(ji,jj,jk-1) * ( puu(ji,jj+1,jk-1,Kbb) - puu(ji,jj,jk-1,Kbb) )
-               ! j-gradient of u and v at jj+1
-               zdj1u = fmask(ji,jj-1,jk) * ( puu(ji,jj,jk,Kbb) - puu(ji,jj-1,jk,Kbb) )
-               zdj1u_km1 = fmask(ji,jj-1,jk-1) * ( puu(ji,jj,jk-1,Kbb) - puu(ji,jj-1,jk-1,Kbb) )
-               !
-               zcof0 = 0.5_wp * zaht_0 * umask(ji,jj,jk)
-               !
-               zuwslpi = zcof0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) )
-               zuwslpj = zcof0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) )
-               !
-               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1)      &
-                             + tmask(ji,jj,jk  )+tmask(ji+1,jj,jk  ) , 1. )
-               zmkf = 1./MAX(  fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1)      &
-                             + fmask(ji,jj-1,jk  ) + fmask(ji,jj,jk  ) , 1. )
-
-               zcof3 = - e2u(ji,jj) * zmkt * zuwslpi
-               zcof4 = - e1u(ji,jj) * zmkf * zuwslpj
-               ! vertical flux on u field
-               zfuw(ji,jk) = zcof3 * (  zdiu_km1 + zdiu_ip1_km1 + zdiu + zdiu_ip1 )   &
-                  &        + zcof4 * (  zdj1u_km1 + zdju_km1 + zdj1u + zdju )
-               ! vertical mixing coefficient (akzu)
-               ! Note: zcof0 include zaht_0, so divided by zaht_0 to obtain slp^2 * zaht_0
-               akzu(ji,jj,jk) = ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / zaht_0
-
-               ! I.1 horizontal momentum gradient
-               ! --------------------------------
-               ! j-gradient of u and v at jj
-               zdjv     = tmask(ji,jj  ,jk) * ( pvv(ji,jj  ,jk,Kbb) - pvv(ji ,jj-1,jk,Kbb) )
-               zdjv_km1 = tmask(ji,jj,jk-1) * ( pvv(ji,jj,jk-1,Kbb) - pvv(ji,jj-1,jk-1,Kbb) )
-               ! i-gradient of v at jj
-               zdiv = fmask(ji,jj,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji,jj,jk,Kbb) )
-               zdiv_im1 = fmask(ji-1,jj,jk) * ( pvv(ji,jj,jk,Kbb) - pvv(ji-1,jj,jk,Kbb) )
-               zdiv_km1 = fmask(ji,jj,jk-1) * ( pvv(ji+1,jj,jk-1,Kbb) - pvv(ji,jj,jk-1,Kbb) )
-               zdiv_im1_km1 = fmask(ji-1,jj,jk-1) * ( pvv(ji,jj,jk-1,Kbb) - pvv(ji-1,jj,jk-1,Kbb) )
-               ! j-gradient of u and v at jj+1
-               zdj1v = tmask(ji,jj+1,jk) * ( pvv(ji,jj+1,jk,Kbb) - pvv(ji,jj,jk,Kbb) )
-               zdj1v_km1 = tmask(ji,jj+1,jk-1) * ( pvv(ji,jj+1,jk-1,Kbb) - pvv(ji,jj,jk-1,Kbb) )
-               !
-               zcof0 = 0.5_wp * zaht_0 * vmask(ji,jj,jk)
-               !
-               zvwslpi = zcof0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) )
-               zvwslpj = zcof0 * ( wslpj(ji,jj+1,jk) + wslpj(ji,jj,jk) )
-               !
-               zmkf = 1./MAX(  fmask(ji-1,jj,jk-1)+fmask(ji,jj,jk-1)      &
-                  &          + fmask(ji-1,jj,jk  )+fmask(ji,jj,jk  ) , 1. )
-               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji,jj+1,jk-1)      &
-                  &          + tmask(ji,jj,jk  )+tmask(ji,jj+1,jk  ) , 1. )
-
-               zcof3 = - e2v(ji,jj) * zmkf * zvwslpi
-               zcof4 = - e1v(ji,jj) * zmkt * zvwslpj
-               ! vertical flux on v field
-               zfvw(ji,jk) = zcof3 * (  zdiv_km1 + zdiv_im1_km1 + zdiv + zdiv_im1 )   &
-                  &        + zcof4 * (  zdjv_km1 + zdj1v_km1 + zdjv + zdj1v )
-               ! vertical mixing coefficient (akzv)
-               ! Note: zcof0 include zaht_0, so divided by zaht_0 to obtain slp^2 * zaht_0
-               akzv(ji,jj,jk) = ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / zaht_0
-            END DO
-         END DO
-
-
-         ! I.3 Divergence of vertical fluxes added to the general tracer trend
-         ! -------------------------------------------------------------------
-         DO jk = 1, jpkm1
-            DO ji = ntsi, ntei
-               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj)   &
-                  &               / e3u(ji,jj,jk,Kmm)
-               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj)   &
-                  &               / e3v(ji,jj,jk,Kmm)
-            END DO
-         END DO
-         !                                             ! ===============
-      END DO                                           !   End of slab
-      !                                                ! ===============
-   END SUBROUTINE dyn_ldf_iso_lf
-
-   !!======================================================================
-END MODULE dynldf_iso_lf
diff --git a/src/OCE/DYN/dynldf_lap_blp.F90 b/src/OCE/DYN/dynldf_lap_blp.F90
deleted file mode 100644
index 09ae6fe7..00000000
--- a/src/OCE/DYN/dynldf_lap_blp.F90
+++ /dev/null
@@ -1,230 +0,0 @@
-MODULE dynldf_lap_blp
-   !!======================================================================
-   !!                   ***  MODULE  dynldf_lap_blp  ***
-   !! Ocean dynamics:  lateral viscosity trend (laplacian and bilaplacian)
-   !!======================================================================
-   !! History : 3.7  ! 2014-01  (G. Madec, S. Masson)  Original code, re-entrant laplacian
-   !!           4.0  ! 2020-04  (A. Nasser, G. Madec)  Add symmetric mixing tensor 
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   dyn_ldf_lap   : update the momentum trend with the lateral viscosity using an iso-level   laplacian operator
-   !!   dyn_ldf_blp   : update the momentum trend with the lateral viscosity using an iso-level bilaplacian operator
-   !!----------------------------------------------------------------------
-   USE oce            ! ocean dynamics and tracers
-   USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
-   USE ldfdyn         ! lateral diffusion: eddy viscosity coef.
-   USE ldfslp         ! iso-neutral slopes 
-   USE zdf_oce        ! ocean vertical physics
-   !
-   USE in_out_manager ! I/O manager
-   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
-   USE lib_mpp
-#if defined key_loop_fusion
-   USE dynldf_lap_blp_lf
-#endif
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC dyn_ldf_lap  ! called by dynldf.F90
-   PUBLIC dyn_ldf_blp  ! called by dynldf.F90
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: dynldf_lap_blp.F90 15033 2021-06-21 10:24:45Z smasson $ 
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass )
-      !!
-      INTEGER                   , INTENT(in   ) ::   kt               ! ocean time-step index
-      INTEGER                   , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices
-      INTEGER                   , INTENT(in   ) ::   kpass            ! =1/2 first or second passage
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
-      !!
-#if defined key_loop_fusion
-      CALL dyn_ldf_lap_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass )
-#else
-      CALL dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, is_tile(pu), pu_rhs, pv_rhs, is_tile(pu_rhs), kpass )
-#endif
-
-   END SUBROUTINE dyn_ldf_lap
-
-
-   SUBROUTINE dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, ktuv, pu_rhs, pv_rhs, ktuv_rhs, kpass )
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE dyn_ldf_lap  ***
-      !!                       
-      !! ** Purpose :   Compute the before horizontal momentum diffusive 
-      !!      trend and add it to the general trend of momentum equation.
-      !!
-      !! ** Method  :   The Laplacian operator apply on horizontal velocity is 
-      !!      writen as :   grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) ) 
-      !!
-      !! ** Action : - pu_rhs, pv_rhs increased by the harmonic operator applied on pu, pv.
-      !!
-      !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/ 
-      !!----------------------------------------------------------------------
-      INTEGER                                 , INTENT(in   ) ::   kt               ! ocean time-step index
-      INTEGER                                 , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices
-      INTEGER                                 , INTENT(in   ) ::   kpass            ! =1/2 first or second passage
-      INTEGER                                 , INTENT(in   ) ::   ktuv, ktuv_rhs
-      REAL(wp), DIMENSION(A2D_T(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
-      REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
-      !
-      INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      INTEGER  ::   iij
-      REAL(wp) ::   zsign        ! local scalars
-      REAL(wp) ::   zua, zva     ! local scalars
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zcur, zdiv
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zten, zshe   ! tension (diagonal) and shearing (anti-diagonal) terms
-      !!----------------------------------------------------------------------
-      !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == nit000 .AND. lwp ) THEN
-            WRITE(numout,*)
-            WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass
-            WRITE(numout,*) '~~~~~~~ '
-         ENDIF
-      ENDIF
-      !
-      ! Define pu_rhs/pv_rhs halo points for multi-point haloes in bilaplacian case
-      IF( nldf_dyn == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls
-      ELSE                                           ; iij = 1
-      ENDIF
-      !
-      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign
-      ELSE                    ;   zsign = -1._wp      !  (eddy viscosity coef. >0)
-      ENDIF
-      !
-      SELECT CASE( nn_dynldf_typ )  
-      !              
-      CASE ( np_typ_rot )       !==  Vorticity-Divergence operator  ==!
-         !
-         ALLOCATE( zcur(A2D(nn_hls)) , zdiv(A2D(nn_hls)) )
-         !
-         DO jk = 1, jpkm1                                 ! Horizontal slab
-            !
-            DO_2D( iij-1, iij, iij-1, iij )
-               !                                      ! ahm * e3 * curl  (warning: computed for ji-1,jj-1)
-               zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       &   ! ahmf already * by fmask
-                  &     * (  e2v(ji  ,jj-1) * pv(ji  ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk)  &
-                  &        - e1u(ji-1,jj  ) * pu(ji-1,jj  ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk)  )
-               !                                      ! ahm * div        (warning: computed for ji,jj)
-               zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb)               &   ! ahmt already * by tmask
-                  &     * (  e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kbb) * pu(ji-1,jj,jk)  &
-                  &        + e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kbb) * pv(ji,jj-1,jk)  )
-            END_2D
-            !
-            DO_2D( iij-1, iij-1, iij-1, iij-1 )   ! - curl( curl) + grad( div )
-               pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * umask(ji,jj,jk) * (    &    ! * by umask is mandatory for dyn_ldf_blp use
-                  &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   &
-                  &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                      )
-               !
-               pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * vmask(ji,jj,jk) * (    &    ! * by vmask is mandatory for dyn_ldf_blp use
-                  &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm)   &
-                  &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                      )
-            END_2D
-            !
-         END DO                                           !   End of slab
-         !
-         DEALLOCATE( zcur , zdiv )
-         !
-      CASE ( np_typ_sym )       !==  Symmetric operator  ==!
-         !
-         ALLOCATE( zten(A2D(nn_hls)) , zshe(A2D(nn_hls)) )
-         !
-         DO jk = 1, jpkm1                                 ! Horizontal slab
-            !
-            DO_2D( iij-1, iij, iij-1, iij )
-               !                                      ! shearing stress component (F-point)   NB : ahmf has already been multiplied by fmask
-               zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk)                                                              &
-                  &     * (    e1f(ji-1,jj-1)    * r1_e2f(ji-1,jj-1)                                             &
-                  &         * ( pu(ji-1,jj  ,jk) * r1_e1u(ji-1,jj  )  - pu(ji-1,jj-1,jk) * r1_e1u(ji-1,jj-1) )   &
-                  &         +  e2f(ji-1,jj-1)    * r1_e1f(ji-1,jj-1)                                             &
-                  &         * ( pv(ji  ,jj-1,jk) * r1_e2v(ji  ,jj-1)  - pv(ji-1,jj-1,jk) * r1_e2v(ji-1,jj-1) )   ) 
-               !                                      ! tension stress component (T-point)   NB : ahmt has already been multiplied by tmask
-               zten(ji,jj)    = ahmt(ji,jj,jk)                                                       &
-                  &     * (    e2t(ji,jj)    * r1_e1t(ji,jj)                                         &
-                  &         * ( pu(ji,jj,jk) * r1_e2u(ji,jj)  - pu(ji-1,jj,jk) * r1_e2u(ji-1,jj) )   &
-                  &         -  e1t(ji,jj)    * r1_e2t(ji,jj)                                         &
-                  &         * ( pv(ji,jj,jk) * r1_e1v(ji,jj)  - pv(ji,jj-1,jk) * r1_e1v(ji,jj-1) )   )   
-            END_2D
-            !
-            DO_2D( iij-1, iij-1, iij-1, iij-1 )
-               pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)                               &
-                  &    * (   (   zten(ji+1,jj  ) * e2t(ji+1,jj  )*e2t(ji+1,jj  ) * e3t(ji+1,jj  ,jk,Kmm)                       &
-                  &            - zten(ji  ,jj  ) * e2t(ji  ,jj  )*e2t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm) ) * r1_e2u(ji,jj)     &                                                    
-                  &        + (   zshe(ji  ,jj  ) * e1f(ji  ,jj  )*e1f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                           &
-                  &            - zshe(ji  ,jj-1) * e1f(ji  ,jj-1)*e1f(ji  ,jj-1) * e3f(ji  ,jj-1,jk)     ) * r1_e1u(ji,jj) )   
-               !
-               pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)                               &
-                  &    * (   (   zshe(ji  ,jj  ) * e2f(ji  ,jj  )*e2f(ji  ,jj  ) * e3f(ji  ,jj  ,jk)                           &
-                  &            - zshe(ji-1,jj  ) * e2f(ji-1,jj  )*e2f(ji-1,jj  ) * e3f(ji-1,jj  ,jk)     ) * r1_e2v(ji,jj)     &
-                  &        - (   zten(ji  ,jj+1) * e1t(ji  ,jj+1)*e1t(ji  ,jj+1) * e3t(ji  ,jj+1,jk,Kmm)                       &
-                  &            - zten(ji  ,jj  ) * e1t(ji  ,jj  )*e1t(ji  ,jj  ) * e3t(ji  ,jj  ,jk,Kmm) ) * r1_e1v(ji,jj) )
-               !
-            END_2D
-            !
-         END DO
-         !
-         DEALLOCATE( zten , zshe )
-         !
-      END SELECT
-      !
-   END SUBROUTINE dyn_ldf_lap_t
-
-
-   SUBROUTINE dyn_ldf_blp( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE dyn_ldf_blp  ***
-      !!                    
-      !! ** Purpose :   Compute the before lateral momentum viscous trend 
-      !!              and add it to the general trend of momentum equation.
-      !!
-      !! ** Method  :   The lateral viscous trends is provided by a bilaplacian
-      !!      operator applied to before field (forward in time).
-      !!      It is computed by two successive calls to dyn_ldf_lap routine
-      !!
-      !! ** Action :   pt(:,:,:,:,Krhs)   updated with the before rotated bilaplacian diffusion
-      !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend
-      !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point
-      !!----------------------------------------------------------------------
-      !
-#if defined key_loop_fusion
-      CALL dyn_ldf_blp_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs )
-#else
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == nit000 )  THEN
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum '
-            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
-         ENDIF
-      ENDIF
-      !
-      zulap(:,:,:) = 0._wp
-      zvlap(:,:,:) = 0._wp
-      !
-      CALL dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, zulap, zvlap, 1 )   ! rotated laplacian applied to pt (output in zlap,Kbb)
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp )             ! Lateral boundary conditions
-      !
-      CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 )   ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs))
-      !
-#endif
-   END SUBROUTINE dyn_ldf_blp
-
-   !!======================================================================
-END MODULE dynldf_lap_blp
diff --git a/src/OCE/DYN/dynldf_lap_blp_lf.F90 b/src/OCE/DYN/dynldf_lap_blp_lf.F90
index 75d66fdb..0e169ea0 100644
--- a/src/OCE/DYN/dynldf_lap_blp_lf.F90
+++ b/src/OCE/DYN/dynldf_lap_blp_lf.F90
@@ -13,7 +13,7 @@ MODULE dynldf_lap_blp_lf
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and tracers
    USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
+   USE domutl, ONLY : lbnd_ij
    USE ldfdyn         ! lateral diffusion: eddy viscosity coef.
    USE ldfslp         ! iso-neutral slopes 
    USE zdf_oce        ! ocean vertical physics
@@ -45,7 +45,7 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
       !!
-      CALL dyn_ldf_lap_lf_t( kt, Kbb, Kmm, pu, pv, is_tile(pu), pu_rhs, pv_rhs, is_tile(pu_rhs), kpass )
+      CALL dyn_ldf_lap_lf_t( kt, Kbb, Kmm, pu, pv, lbnd_ij(pu), pu_rhs, pv_rhs, lbnd_ij(pu_rhs), kpass )
 
    END SUBROUTINE dyn_ldf_lap_lf
   
@@ -63,12 +63,12 @@ CONTAINS
       !!
       !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/ 
       !!----------------------------------------------------------------------
-      INTEGER                                 , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                                 , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices
-      INTEGER                                 , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                                 , INTENT(in   ) ::   ktuv, ktuv_rhs
-      REAL(wp), DIMENSION(A2D_T(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv ! before velocity  [m/s]
-      REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
+      INTEGER                                , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices
+      INTEGER                                , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
+      INTEGER, DIMENSION(2)                  , INTENT(in   ) ::   ktuv, ktuv_rhs
+      REAL(wp), DIMENSION(AB2D(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv ! before velocity  [m/s]
+      REAL(wp), DIMENSION(AB2D(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   iij
@@ -203,7 +203,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity fields
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend
       !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point
       !!----------------------------------------------------------------------
       !
       IF( kt == nit000 )  THEN
diff --git a/src/OCE/DYN/dynldf_lev.F90 b/src/OCE/DYN/dynldf_lev.F90
new file mode 100644
index 00000000..863151cb
--- /dev/null
+++ b/src/OCE/DYN/dynldf_lev.F90
@@ -0,0 +1,222 @@
+MODULE dynldf_lev
+   !!======================================================================
+   !!                   ***  MODULE  dynldf_lev  ***
+   !! Ocean dynamics:  lateral viscosity trend (laplacian and bilaplacian)
+   !!======================================================================
+   !! History : 3.7  ! 2014-01  (G. Madec, S. Masson)  Original code, re-entrant laplacian
+   !!           4.0  ! 2020-04  (A. Nasser, G. Madec)  Add symmetric mixing tensor
+   !!           4.5  ! 2022-10  (S. Techene, G, Madec)  refactorization to reduce local memory usage
+   !!                !                                + removal of old partial-step treatment
+   !!----------------------------------------------------------------------
+
+   !!----------------------------------------------------------------------
+   !!   dynldf_lev_lap   : update the momentum trend with the lateral viscosity using an iso-level   laplacian operator
+   !!   dynldf_lev_blp   : update the momentum trend with the lateral viscosity using an iso-level bilaplacian operator
+   !!----------------------------------------------------------------------
+   USE oce            ! ocean dynamics and tracers
+   USE dom_oce        ! ocean space and time domain
+   USE domutl, ONLY : is_tile
+   USE ldfdyn         ! lateral diffusion: eddy viscosity coef.
+   USE ldfslp         ! iso-neutral slopes 
+   USE zdf_oce        ! ocean vertical physics
+   !
+   USE in_out_manager ! I/O manager
+   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
+   USE lib_mpp
+
+   IMPLICIT NONE
+   PRIVATE
+
+   PUBLIC dynldf_lev_lap  ! called by dynldf.F90
+   PUBLIC dynldf_lev_blp  ! called by dynldf.F90
+
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
+   !!----------------------------------------------------------------------
+   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
+   !! $Id: dynldf_lap_blp.F90 15033 2021-06-21 10:24:45Z smasson $ 
+   !! Software governed by the CeCILL license (see ./LICENSE)
+   !!----------------------------------------------------------------------
+CONTAINS
+
+   SUBROUTINE dynldf_lev_lap( kt, Kbb, Kmm, pu, pv, Krhs )
+      !!----------------------------------------------------------------------
+      !!                     ***  ROUTINE dynldf_lev_lap  ***
+      !!                       
+      !! ** Purpose :   Compute the before horizontal momentum diffusive 
+      !!      trend and add it to the general trend of momentum equation.
+      !!
+      !! ** Method  :   The Laplacian operator apply on horizontal velocity is 
+      !!      writen as :   grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) ) 
+      !!
+      !! ** Action : - pu(Krhs), pv(Krhs) increased by the harmonic operator applied on pu(Kbb), pv(Kbb).
+      !!
+      !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/ 
+      !!----------------------------------------------------------------------
+      INTEGER                     , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step index and time-level indices
+      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pu, pv               ! velocity [m/s2]
+      !
+      INTEGER  ::   ji, jj, jk   ! dummy loop indices
+      REAL(wp), DIMENSION(T2D(1)) ::   zwf, zwt
+      !!----------------------------------------------------------------------
+      !
+      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
+         IF( kt == nit000 )  THEN
+            IF(lwp) WRITE(numout,*)
+            IF(lwp) WRITE(numout,*) 'dynldf_lev_lap : laplacian operator momentum '
+            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~'
+         ENDIF
+      ENDIF
+      !
+#     define   lap
+#     define   INN              0
+#     define   pu_in(i,j,k,t)   pu(i,j,k,t)
+#     define   pv_in(i,j,k,t)   pv(i,j,k,t)
+      !
+      SELECT CASE( nn_dynldf_typ )  
+      !              
+      CASE ( np_typ_rot )       !==  Vorticity-Divergence operator  ==!
+         !
+#        define zcur   zwf
+#        define zdiv   zwt
+         !
+         DO jk = 1, jpkm1                                 ! Horizontal slab
+#           include "dynldf_lev_rot_scheme.h90"
+         END DO
+         !
+#        undef  zcur   
+#        undef  zdiv
+         !
+      CASE ( np_typ_sym )       !==  Symmetric operator  ==!
+         !
+#        define zshe   zwf
+#        define zten   zwt
+         !
+         DO jk = 1, jpkm1                                 ! Horizontal slab
+#           include "dynldf_lev_sym_scheme.h90"
+         END DO
+         !
+#        undef  zshe  
+#        undef  zten
+         !
+      END SELECT
+      ! 
+#     undef    lap
+#     undef    INN
+#     undef    pu_in
+#     undef    pv_in
+      !
+    END SUBROUTINE dynldf_lev_lap
+
+
+    SUBROUTINE dynldf_lev_blp( kt, Kbb, Kmm, pu, pv, Krhs )
+      !!----------------------------------------------------------------------
+      !!                 ***  ROUTINE dynldf_lev_blp  ***
+      !!                    
+      !! ** Purpose :   Compute the before lateral momentum viscous trend 
+      !!              and add it to the general trend of momentum equation.
+      !!
+      !! ** Method  :   The lateral viscous trends is provided by a bilaplacian
+      !!      operator applied to before field (forward in time).
+      !!      It is computed by two successive calls to dyn_ldf_lap routine
+      !!
+      !! ** Action :   pt(:,:,:,:,Krhs)   updated with the before rotated bilaplacian diffusion
+      !!----------------------------------------------------------------------
+      !!
+      INTEGER                         , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step index and time-level indices
+      REAL(wp), DIMENSION(:,:,:,:)    , INTENT(inout) ::   pu, pv               ! velocity [m/s2]
+      !
+      INTEGER  ::   ji, jj, jk   ! dummy loop indices
+      REAL(wp), DIMENSION(T2D(2)) ::   zulap   ! laplacian at u-point
+      REAL(wp), DIMENSION(T2D(2)) ::   zvlap   ! laplacian at v-point
+      REAL(wp), DIMENSION(T2D(2)) ::   zwf, zwt
+      !!----------------------------------------------------------------------
+      !
+      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
+         IF( kt == nit000 )  THEN
+            IF(lwp) WRITE(numout,*)
+            IF(lwp) WRITE(numout,*) 'dynldf_lev_blp : bilaplacian operator momentum '
+            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
+         ENDIF
+      ENDIF
+      !
+      SELECT CASE( nn_dynldf_typ )  
+      !              
+      CASE ( np_typ_rot )       !==  Vorticity-Divergence operator  ==!
+         !
+#        define zcur   zwf
+#        define zdiv   zwt
+         !
+         DO jk = 1, jpkm1                                 ! Horizontal slab
+            !                                                   !-  1st pass 
+#           define   blp_p1
+#           define   INN                1
+#           define   pu_in(i,j,k,t)   pu(i,j,k,t)
+#           define   pv_in(i,j,k,t)   pv(i,j,k,t)
+!
+#           include "dynldf_lev_rot_scheme.h90"
+!
+#           undef    blp_p1
+#           undef    INN
+#           undef    pu_in
+#           undef    pv_in
+
+            !                                                   !-  2nd pass 
+#           define   blp_p2
+#           define   INN                0
+#           define   pu_in(i,j,k,t)   zulap(i,j)
+#           define   pv_in(i,j,k,t)   zvlap(i,j)
+!
+#           include "dynldf_lev_rot_scheme.h90"
+!
+#           undef    blp_p2
+#           undef    INN
+#           undef    pu_in
+#           undef    pv_in
+         END DO
+         !
+#        undef  zcur 
+#        undef  zdiv
+         !
+      CASE ( np_typ_sym )       !==  Symmetric operator  ==!
+         !
+#        define zshe   zwf
+#        define zten   zwt
+         !
+         DO jk = 1, jpkm1                                 ! Horizontal slab
+            !                                                   !-  1st pass 
+#           define   blp_p1
+#           define   INN                1
+#           define   pu_in(i,j,k,t)   pu(i,j,k,t)
+#           define   pv_in(i,j,k,t)   pv(i,j,k,t)
+!
+#           include "dynldf_lev_sym_scheme.h90"
+!
+#           undef    blp_p1
+#           undef    INN
+#           undef    pu_in
+#           undef    pv_in
+
+            !                                                   !-  2nd pass 
+#           define   blp_p2
+#           define   INN                0
+#           define   pu_in(i,j,k,t)   zulap(i,j)
+#           define   pv_in(i,j,k,t)   zvlap(i,j)
+!
+#           include "dynldf_lev_sym_scheme.h90"
+!
+#           undef    blp_p2
+#           undef    INN
+#           undef    pu_in
+#           undef    pv_in
+         END DO
+         !
+#        undef  zshe  
+#        undef  zten
+      END SELECT
+      !
+   END SUBROUTINE dynldf_lev_blp
+
+   !!======================================================================
+END MODULE dynldf_lev
diff --git a/src/OCE/DYN/dynldf_lev_rot_scheme.h90 b/src/OCE/DYN/dynldf_lev_rot_scheme.h90
new file mode 100644
index 00000000..81a3841e
--- /dev/null
+++ b/src/OCE/DYN/dynldf_lev_rot_scheme.h90
@@ -0,0 +1,53 @@
+   !!======================================================================
+   !!                   ***  dynldf_lev_rot_scheme.h90  ***
+   !! dynldf_lev:   divergence the lateral iso-neutral fluxes
+#if defined lap
+   !!                             laplacian
+#elif defined blp_p1
+   !!                        bilaplacian: 1st pass
+#elif defined blp_p2
+   !!                        bilaplacian: 2nd pass
+#endif
+   !!======================================================================
+   !! History :  4.5  ! 2022-10  (S. Techene, G, Madec) refactorization to reduce local memory usage
+   !!                                                 + no more re-entering lap with dynldf_lev_blp creation
+   !!----------------------------------------------------------------------
+
+	    
+            !!======================================================================
+            !!  masked tracer gradient : (zdit, zdjt, zdkt) at both jk and jk+1
+            !!======================================================================
+            !
+            DO_2D( INN, INN+1, INN, INN+1 )
+               !                                      ! ahm * e3 * curl  (warning: computed for ji-1,jj-1)
+               zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       &   ! ahmf already * by fmask
+                  &     * (  ( e2v(ji  ,jj-1) * pv_in(ji  ,jj-1,jk,Kbb) - e2v(ji-1,jj-1) * pv_in(ji-1,jj-1,jk,Kbb) )  &
+                  &        - ( e1u(ji-1,jj  ) * pu_in(ji-1,jj  ,jk,Kbb) - e1u(ji-1,jj-1) * pu_in(ji-1,jj-1,jk,Kbb) )  )
+               !                                      ! ahm * div        (warning: computed for ji,jj)
+               zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb)               &   ! ahmt already * by tmask
+                  &     * (  ( e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu_in(ji,jj,jk,Kbb) - e2u(ji-1,jj)*e3u(ji-1,jj  ,jk,Kbb) * pu_in(ji-1,jj  ,jk,Kbb) )  &
+                  &        + ( e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv_in(ji,jj,jk,Kbb) - e1v(ji,jj-1)*e3v(ji  ,jj-1,jk,Kbb) * pv_in(ji  ,jj-1,jk,Kbb) )  )
+            END_2D
+            !
+            DO_2D( INN, INN, INN, INN )   ! - curl( curl) + grad( div )
+#if   defined lap
+               pu(ji,jj,jk,Krhs) = pu(ji,jj,jk,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined blp_p1
+               zulap(ji,jj)      =                                   &   ! store in zulap
+#elif defined blp_p2
+               pu(ji,jj,jk,Krhs) = pu(ji,jj,jk,Krhs) -               &   ! added to RHS with MINUS sign (blp)
+#endif
+                  &     umask(ji,jj,jk) * (    &    ! * by umask is mandatory for dyn_ldf_blp use
+                  &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   &
+                  &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                      )
+#if   defined lap
+               pv(ji,jj,jk,Krhs) = pv(ji,jj,jk,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined blp_p1
+               zvlap(ji,jj)      =                                   &   ! store in zulap
+#elif defined blp_p2
+               pv(ji,jj,jk,Krhs) = pv(ji,jj,jk,Krhs) -               &   ! added to RHS with MINUS sign (blp)
+#endif
+                  &     vmask(ji,jj,jk) * (    &    ! * by vmask is mandatory for dyn_ldf_blp use
+                  &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm)   &
+                  &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                      )
+            END_2D
diff --git a/src/OCE/DYN/dynldf_lev_sym_scheme.h90 b/src/OCE/DYN/dynldf_lev_sym_scheme.h90
new file mode 100644
index 00000000..26d0d4c0
--- /dev/null
+++ b/src/OCE/DYN/dynldf_lev_sym_scheme.h90
@@ -0,0 +1,58 @@
+   !!======================================================================
+   !!                   ***  dynldf_lev_sym_scheme.h90  ***
+   !! dynldf_lev:   divergence the lateral fluxes
+#if defined lap
+   !!                             laplacian
+#elif defined blp_p1
+   !!                        bilaplacian: 1st pass
+#elif defined blp_p2
+   !!                        bilaplacian: 2nd pass
+#endif
+   !!======================================================================
+   !! History :  4.5  ! 2022-10  (S. Techene, G, Madec) refactorization to reduce local memory usage
+   !!                                                 + no more re-entering lap with dynldf_lev_rot_blp creation
+   !!----------------------------------------------------------------------
+
+            !
+            DO_2D( INN, INN+1, INN, INN+1 )
+               !                                      ! shearing stress component (F-point)   NB : ahmf has already been multiplied by fmask
+               zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk)                               &
+                  &     * (    e1f(ji-1,jj-1)*r1_e2f(ji-1,jj-1) * (  pu_in(ji-1,jj  ,jk,Kbb) * r1_e1u(ji-1,jj  )      &
+		  &                                                - pu_in(ji-1,jj-1,jk,Kbb) * r1_e1u(ji-1,jj-1)  )   &
+                  &         +  e2f(ji-1,jj-1)*r1_e1f(ji-1,jj-1) * (  pv_in(ji  ,jj-1,jk,Kbb) * r1_e2v(ji  ,jj-1)      &
+		  &                                                - pv_in(ji-1,jj-1,jk,Kbb) * r1_e2v(ji-1,jj-1)  )   ) 
+               !                                      ! tension stress component (T-point)   NB : ahmt has already been multiplied by tmask
+               zten(ji,jj)    = ahmt(ji,jj,jk)                                                       &
+                  &     * (    e2t(ji,jj)    * r1_e1t(ji,jj)                                         &
+                  &         * ( pu_in(ji,jj,jk,Kbb) * r1_e2u(ji,jj)  - pu_in(ji-1,jj,jk,Kbb) * r1_e2u(ji-1,jj) )   &
+                  &         -  e1t(ji,jj)    * r1_e2t(ji,jj)                                         &
+                  &         * ( pv_in(ji,jj,jk,Kbb) * r1_e1v(ji,jj)  - pv_in(ji,jj-1,jk,Kbb) * r1_e1v(ji,jj-1) )   )   
+            END_2D
+            !
+            DO_2D( INN, INN, INN, INN )
+#if   defined lap
+            pu(ji,jj,jk,Krhs) = pu(ji,jj,jk,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined blp_p1
+            zulap(ji,jj)      =                                   &   ! store in zulap
+#elif defined blp_p2
+            pu(ji,jj,jk,Krhs) = pu(ji,jj,jk,Krhs) -               &   ! added to RHS with MINUS sign (blp) 
+#endif
+                  &  r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)                                                           &
+                  &    * (   (  zten(ji+1,jj) * e2t(ji+1,jj)*e2t(ji+1,jj)*e3t(ji+1,jj,jk,Kmm)                      &
+                  &           - zten(ji  ,jj) * e2t(ji  ,jj)*e2t(ji  ,jj)*e3t(ji  ,jj,jk,Kmm)  ) * r1_e2u(ji,jj)   &
+                  &        + (  zshe(ji,jj  ) * e1f(ji,jj  )*e1f(ji,jj  )*e3f(ji,jj  ,jk)                          &
+                  &           - zshe(ji,jj-1) * e1f(ji,jj-1)*e1f(ji,jj-1)*e3f(ji,jj-1,jk)      ) * r1_e1u(ji,jj)   )
+#if   defined lap
+            pv(ji,jj,jk,Krhs) = pv(ji,jj,jk,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined blp_p1
+            zvlap(ji,jj)      =                                   &   ! store in zulap
+#elif defined blp_p2
+            pv(ji,jj,jk,Krhs) = pv(ji,jj,jk,Krhs) -               &   ! added to RHS with MINUS sign (blp) 
+#endif            
+                  &    r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)                                                         &
+                  &    * (   (  zshe(ji  ,jj) * e2f(ji  ,jj)*e2f(ji  ,jj)*e3f(ji  ,jj,jk)                          &
+                  &           - zshe(ji-1,jj) * e2f(ji-1,jj)*e2f(ji-1,jj)*e3f(ji-1,jj,jk)      ) * r1_e2v(ji,jj)   &
+                  &        - (  zten(ji,jj+1) * e1t(ji,jj+1)*e1t(ji,jj+1)*e3t(ji,jj+1,jk,Kmm)                      &
+                  &           - zten(ji,jj  ) * e1t(ji,jj  )*e1t(ji,jj  )*e3t(ji,jj  ,jk,Kmm)  ) * r1_e1v(ji,jj)   )
+               !
+            END_2D
diff --git a/src/OCE/DYN/dynspg.F90 b/src/OCE/DYN/dynspg.F90
index ffd2219a..3d635744 100644
--- a/src/OCE/DYN/dynspg.F90
+++ b/src/OCE/DYN/dynspg.F90
@@ -107,10 +107,10 @@ CONTAINS
          IF( ln_apr_dyn .AND. .NOT.ln_dynspg_ts ) THEN   !==  Atmospheric pressure gradient (added later in time-split case) ==!
             zg_2 = grav * 0.5
             DO_2D( 0, 0, 0, 0 )                       ! gradient of Patm using inverse barometer ssh
-               zpgu(ji,jj) = zpgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    &
-                  &                                + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj)
-               zpgv(ji,jj) = zpgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    &
-                  &                                + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj)
+               zpgu(ji,jj) = zpgu(ji,jj) + zg_2 * (  ( ssh_ib (ji+1,jj) - ssh_ib (ji,jj) )    &   ! add () for NP repro
+                  &                                + ( ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj) )  ) * r1_e1u(ji,jj)
+               zpgv(ji,jj) = zpgv(ji,jj) + zg_2 * (  ( ssh_ib (ji,jj+1) - ssh_ib (ji,jj) )    &   ! add () for NP repro
+                  &                                + ( ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj) )  ) * r1_e2v(ji,jj)
             END_2D
          ENDIF
          !
diff --git a/src/OCE/DYN/dynspg_exp.F90 b/src/OCE/DYN/dynspg_exp.F90
index 8d59e3f9..29dfa589 100644
--- a/src/OCE/DYN/dynspg_exp.F90
+++ b/src/OCE/DYN/dynspg_exp.F90
@@ -54,12 +54,12 @@ CONTAINS
       !! ** Action :   (puu(:,:,:,Krhs),pvv(:,:,:,Krhs))   trend of horizontal velocity increased by 
       !!                         the surf. pressure gradient trend
       !!---------------------------------------------------------------------
-      INTEGER                             , INTENT( in )  ::  kt        ! ocean time-step index
-      INTEGER                             , INTENT( in )  ::  Kmm, Krhs ! ocean time level indices
+      INTEGER                             , INTENT(in   ) ::  kt        ! ocean time-step index
+      INTEGER                             , INTENT(in   ) ::  Kmm, Krhs ! ocean time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv  ! ocean velocities and RHS of momentum equation
       !!
       INTEGER ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp), DIMENSION(jpi,jpj) ::   zpgu, zpgv   ! 2D workspace
+      REAL(wp), DIMENSION(A2D(0)) ::   zpgu, zpgv   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       IF( kt == nit000 ) THEN
diff --git a/src/OCE/DYN/dynspg_ts.F90 b/src/OCE/DYN/dynspg_ts.F90
index 6e51d97c..85d15a9c 100644
--- a/src/OCE/DYN/dynspg_ts.F90
+++ b/src/OCE/DYN/dynspg_ts.F90
@@ -254,8 +254,8 @@ CONTAINS
       zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:)        ! now fluxes 
       zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:)        ! NB: FULL domain : put a value in last row and column
       !
-      CALL dyn_cor_2D( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
-         &                                                                          zu_trd, zv_trd   )   ! ==>> out
+      CALL dyn_cor_2D( ht(:,:,Kmm), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
+         &                                                                              zu_trd, zv_trd   )   ! ==>> out
       !
       DO_2D( 0, 0, 0, 0 )                          ! Remove coriolis term (and possibly spg) from barotropic trend
          zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj)
@@ -271,9 +271,17 @@ CONTAINS
       !
       !                                   !=  zu_frc =  1/H e3*d/dt(Ua)  =!  (Vertical mean of Ua, the 3D trends)
       !                                   !  ---------------------------  !
-# if defined key_qco 
+# if defined key_qco  || defined key_linssh
+#  if defined key_vco_1d
+      ! e3. are substitute by 1D arrays and can't be used in SUM operand
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         zu_frc(ji,jj) = SUM( e3u_0(ji,jj,:) * puu(ji,jj,:,Krhs) * umask(ji,jj,:) ) * r1_hu_0(ji,jj)
+         zv_frc(ji,jj) = SUM( e3v_0(ji,jj,:) * pvv(ji,jj,:,Krhs) * vmask(ji,jj,:) ) * r1_hv_0(ji,jj)
+      END_2D
+#  else
       zu_frc(:,:) = SUM( e3u_0(:,:,:  ) * puu(:,:,:,Krhs) * umask(:,:,:), DIM=3 ) * r1_hu_0(:,:)
       zv_frc(:,:) = SUM( e3v_0(:,:,:  ) * pvv(:,:,:,Krhs) * vmask(:,:,:), DIM=3 ) * r1_hv_0(:,:)
+#  endif
 # else
       zu_frc(:,:) = SUM( e3u(:,:,:,Kmm) * puu(:,:,:,Krhs) * umask(:,:,:), DIM=3 ) * r1_hu(:,:,Kmm)
       zv_frc(:,:) = SUM( e3v(:,:,:,Kmm) * pvv(:,:,:,Krhs) * vmask(:,:,:), DIM=3 ) * r1_hv(:,:,Kmm)
@@ -298,8 +306,8 @@ CONTAINS
       zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:)        ! now fluxes 
       zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:)        ! NB: FULL domain : put a value in last row and column
       !
-      CALL dyn_cor_2D( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
-         &                                                                          zu_trd, zv_trd   )   ! ==>> out
+      CALL dyn_cor_2D( ht(:,:,Kmm), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
+         &                                                                              zu_trd, zv_trd   )   ! ==>> out
       !
       DO_2D( 0, 0, 0, 0 )                          ! Remove coriolis term (and possibly spg) from barotropic trend
          zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj)
@@ -322,10 +330,10 @@ CONTAINS
          ELSE                                         ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW)
             zztmp = grav * r1_2
             DO_2D( 0, 0, 0, 0 )
-               zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)  &
-                    &                                   + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj)
-               zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)  &
-                    &                                   + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj)
+               zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * (  ( ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) )  &
+                    &                                   + ( ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj) ) ) * r1_e1u(ji,jj)
+               zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * (  ( ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) )  &
+                    &                                   + ( ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj) ) ) * r1_e2v(ji,jj)
             END_2D
          ENDIF
       ENDIF
@@ -334,14 +342,14 @@ CONTAINS
       !                                   !  ------------------  !
       IF( ln_bt_fw ) THEN
          DO_2D( 0, 0, 0, 0 )
-            zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm)
-            zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm)
+            zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utauU(ji,jj) * r1_hu(ji,jj,Kmm)
+            zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtauV(ji,jj) * r1_hv(ji,jj,Kmm)
          END_2D
       ELSE
          zztmp = r1_rho0 * r1_2
          DO_2D( 0, 0, 0, 0 )
-            zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm)
-            zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kmm)
+            zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utauU(ji,jj) ) * r1_hu(ji,jj,Kmm)
+            zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtauV(ji,jj) ) * r1_hv(ji,jj,Kmm)
          END_2D
       ENDIF  
       !
@@ -459,8 +467,6 @@ CONTAINS
       DO jn = 1, icycle                             !  sub-time-step loop  !
          !                                          ! ==================== !
          !
-         l_full_nf_update = jn == icycle   ! false: disable full North fold update (performances) for jn = 1 to icycle-1
-         !
          !                    !==  Update the forcing ==! (BDY and tides)
          !
          IF( ln_bdy      .AND. ln_tide )   CALL bdy_dta_tides( kt, kit=jn, pt_offset= REAL(noffset+1,wp) )
@@ -561,7 +567,7 @@ CONTAINS
          !--        ssh    =  ssh   - delta_t' * [ frc + div( flux      ) ]      --!
          !-------------------------------------------------------------------------!
          DO_2D( 0, 0, 0, 0 )
-            zhdiv = (   zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1)   ) * r1_e1e2t(ji,jj)
+            zhdiv = (   ( zhU(ji,jj) - zhU(ji-1,jj) ) + ( zhV(ji,jj) - zhV(ji,jj-1) )  ) * r1_e1e2t(ji,jj)
             ssha_e(ji,jj) = (  sshn_e(ji,jj) - rDt_e * ( ssh_frc(ji,jj) + zhdiv )  ) * ssmask(ji,jj)
          END_2D
          !
@@ -1255,16 +1261,16 @@ CONTAINS
          SELECT CASE( nn_e3f_typ )                  !* ff_f/e3 at F-point
          CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4)
             DO_2D( 0, 0, 0, 0 )
-               zwz(ji,jj) = ( ht(ji,jj+1) + ht(ji+1,jj+1)   &
-                    &       + ht(ji,jj  ) + ht(ji+1,jj  ) ) * 0.25_wp  
+               zwz(ji,jj) = (  ( ht(ji,jj+1,Kmm) + ht(ji+1,jj+1,Kmm) )   &   ! need additional () for reproducibility around NP
+                    &        + ( ht(ji,jj  ,Kmm) + ht(ji+1,jj  ,Kmm) ) ) * 0.25_wp  
                IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj)
             END_2D
          CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask)
             DO_2D( 0, 0, 0, 0 )
-               zwz(ji,jj) =     (    ht(ji,jj+1) +     ht(ji+1,jj+1)      &
-                    &            +   ht(ji,jj  ) +     ht(ji+1,jj  )  )   &
-                    &    / ( MAX(ssmask(ji,jj+1) + ssmask(ji+1,jj+1)      &
-                    &          + ssmask(ji,jj  ) + ssmask(ji+1,jj  ) , 1._wp  )   )
+               zwz(ji,jj) =     (  ( ht(ji,jj+1,Kmm) +     ht(ji+1,jj+1,Kmm) )      &   ! need additional () for
+                    &            + ( ht(ji,jj  ,Kmm) +     ht(ji+1,jj  ,Kmm) )  )   &   ! reproducibility around NP
+                    &    / ( MAX( ( ssmask(ji,jj+1) + ssmask(ji+1,jj+1) )        &
+                    &          +  ( ssmask(ji,jj  ) + ssmask(ji+1,jj  ) ), 1._wp )  )
                IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj)
             END_2D
          END SELECT
@@ -1285,7 +1291,7 @@ CONTAINS
       CASE( np_EET )                            != EEN scheme using e3t energy conserving scheme
          ftne(1,:) = 0._wp   ;   ftnw(1,:) = 0._wp   ;   ftse(1,:) = 0._wp   ;   ftsw(1,:) = 0._wp
          DO_2D( 0, 1, 0, 1 )
-            z1_ht = ssmask(ji,jj) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) )
+            z1_ht = ssmask(ji,jj) / ( ht(ji,jj,Kmm) + 1._wp - ssmask(ji,jj) )
             ftne(ji,jj) = ( ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) ) * z1_ht
             ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) ) * z1_ht
             ftse(ji,jj) = ( ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht
@@ -1335,24 +1341,24 @@ CONTAINS
          !
       CASE( np_ENS )                ! enstrophy conserving scheme (f-point)
          DO_2D( 0, 0, 0, 0 )
-            zy1 =   r1_8 * ( zhV(ji  ,jj-1) + zhV(ji+1,jj-1) &
-              &            + zhV(ji  ,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj)
-            zx1 = - r1_8 * ( zhU(ji-1,jj  ) + zhU(ji-1,jj+1) &
-              &            + zhU(ji  ,jj  ) + zhU(ji  ,jj+1) ) * r1_e2v(ji,jj)
+            zy1 =   r1_8 * ( ( zhV(ji  ,jj-1) + zhV(ji+1,jj-1) ) &                       ! need additional () for
+              &            + ( zhV(ji  ,jj  ) + zhV(ji+1,jj  ) ) ) * r1_e1u(ji,jj)       ! reproducibility around NP
+            zx1 = - r1_8 * ( ( zhU(ji-1,jj  ) + zhU(ji-1,jj+1) ) &                       ! need additional () for
+              &            + ( zhU(ji  ,jj  ) + zhU(ji  ,jj+1) ) ) * r1_e2v(ji,jj)       ! reproducibility around NP
             zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) )
             zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) )
          END_2D
          !
       CASE( np_EET , np_EEN )      ! energy & enstrophy scheme (using e3t or e3f)         
          DO_2D( 0, 0, 0, 0 )
-            zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zhV(ji  ,jj  ) &
-             &                                         + ftnw(ji+1,jj) * zhV(ji+1,jj  ) &
-             &                                         + ftse(ji,jj  ) * zhV(ji  ,jj-1) &
-             &                                         + ftsw(ji+1,jj) * zhV(ji+1,jj-1) )
-            zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zhU(ji-1,jj+1) &
-             &                                         + ftse(ji,jj+1) * zhU(ji  ,jj+1) &
-             &                                         + ftnw(ji,jj  ) * zhU(ji-1,jj  ) &
-             &                                         + ftne(ji,jj  ) * zhU(ji  ,jj  ) )
+            zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ( ftne(ji,jj  ) * zhV(ji  ,jj  )   &   ! need additional () for
+             &                                           + ftnw(ji+1,jj) * zhV(ji+1,jj  ) ) &   ! reproducibility around NP
+             &                                         + ( ftse(ji,jj  ) * zhV(ji  ,jj-1)   &
+             &                                           + ftsw(ji+1,jj) * zhV(ji+1,jj-1) ) )
+            zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ( ftsw(ji,jj+1) * zhU(ji-1,jj+1)   &
+             &                                           + ftse(ji,jj+1) * zhU(ji  ,jj+1) ) &
+             &                                         + ( ftnw(ji,jj  ) * zhU(ji-1,jj  )   &
+             &                                           + ftne(ji,jj  ) * zhU(ji  ,jj  ) ) )
          END_2D
          !
       END SELECT
@@ -1518,13 +1524,13 @@ CONTAINS
       IF( ln_isfcav.OR.ln_drgice_imp ) THEN          ! top+bottom friction (ocean cavities)
          
          DO_2D( 0, 0, 0, 0 )
-            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) )
-            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) )
+            pCdU_u(ji,jj) = r1_2*( ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) + ( rCdU_top(ji+1,jj) + rCdU_top(ji,jj) ) )
+            pCdU_v(ji,jj) = r1_2*( ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) + ( rCdU_top(ji,jj+1) + rCdU_top(ji,jj) ) )
          END_2D
       ELSE                          ! bottom friction only
          DO_2D( 0, 0, 0, 0 )
-            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) )
-            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) )
+            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) )
+            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) )
          END_2D
       ENDIF
       !
diff --git a/src/OCE/DYN/dynvor.F90 b/src/OCE/DYN/dynvor.F90
index 03dda78c..55fe50cb 100644
--- a/src/OCE/DYN/dynvor.F90
+++ b/src/OCE/DYN/dynvor.F90
@@ -22,6 +22,7 @@ MODULE dynvor
    !!             -   ! 2018-04  (G. Madec)  add pre-computed gradient for metric term calculation
    !!            4.x  ! 2020-03  (G. Madec, A. Nasser)  make ln_dynvor_msk truly efficient on relative vorticity
    !!            4.2  ! 2020-12  (G. Madec, E. Clementi) add vortex force trends (ln_vortex_force=T)
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -173,11 +174,11 @@ CONTAINS
             ENDIF
          CASE( np_EET )                        !* energy conserving scheme (een scheme using e3t)
                              CALL vor_eeT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend
-            IF( ln_stcor .AND. .NOT. ln_vortex_force )  THEN
+               IF( ln_stcor .AND. .NOT. ln_vortex_force )  THEN
                              CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend
-            ELSE IF( ln_stcor .AND. ln_vortex_force )   THEN
+               ELSE IF( ln_stcor .AND. ln_vortex_force )   THEN
                              CALL vor_eeT( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend and vortex force
-            ENDIF
+               ENDIF
          CASE( np_ENE )                        !* energy conserving scheme
                              CALL vor_ene( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend
             IF( ln_stcor .AND. .NOT. ln_vortex_force )  THEN
@@ -200,11 +201,11 @@ CONTAINS
             IF( ln_vortex_force ) CALL vor_ens( kt, Kmm, nrvm, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add vortex force
          CASE( np_EEN )                        !* energy and enstrophy conserving scheme
                              CALL vor_een( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend
-            IF( ln_stcor .AND. .NOT. ln_vortex_force )  THEN
+               IF( ln_stcor .AND. .NOT. ln_vortex_force )  THEN
                              CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend
-            ELSE IF( ln_stcor .AND. ln_vortex_force )   THEN
+               ELSE IF( ln_stcor .AND. ln_vortex_force )   THEN
                              CALL vor_een( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend and vortex force
-            ENDIF
+               ENDIF
          END SELECT
          !
       ENDIF
@@ -320,8 +321,8 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk           ! dummy loop indices
       REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls))        ::   zwx, zwy, zwt   ! 2D workspace
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwz             ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined
+      REAL(wp), DIMENSION(T2D(1))           ::   zwt   ! 2D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zwz   ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -333,28 +334,25 @@ CONTAINS
       ENDIF
       !
       !
-      SELECT CASE( kvor )                 !== relative vorticity considered  ==!
-      !
-      CASE ( np_RVO , np_CRV )                  !* relative vorticity at f-point is used
-         ALLOCATE( zwz(A2D(nn_hls),jpk) )
-         DO jk = 1, jpkm1                                ! Horizontal slab
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  &
-                  &             - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)
+      !                                                ! ===============
+      DO jk = 1, jpkm1                                 ! Horizontal slab
+         !                                             ! ===============
+         !
+         SELECT CASE( kvor )                 !== relative vorticity considered  ==!
+            !
+         CASE ( np_RVO , np_CRV )                  !* relative vorticity at f-point is used
+            ALLOCATE( zwz(T2D(1)) )
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (  ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) )  &                   ! add () for
+                  &          - ( e1u(ji,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj) ! NP repro
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask relative vorticity
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk)
+               DO_2D( 1, 1, 1, 1 )
+                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk)
                END_2D
             ENDIF
-         END DO
-         IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp )
-         !
-      END SELECT
-
-      !                                                ! ===============
-      DO jk = 1, jpkm1                                 ! Horizontal slab
-         !                                             ! ===============
+            !
+         END SELECT
          !
          SELECT CASE( kvor )                 !==  volume weighted vorticity considered  ==!
          !
@@ -364,8 +362,8 @@ CONTAINS
             END_2D
          CASE ( np_RVO )                           !* relative vorticity
             DO_2D( 0, 1, 0, 1 )
-               zwt(ji,jj) = r1_4 * (   zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)       &
-                  &                  + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk)   )   &
+               zwt(ji,jj) = r1_4 * (   ( zwz(ji-1,jj  ) + zwz(ji,jj  ) )      &   ! need additional () for
+                  &                  + ( zwz(ji-1,jj-1) + zwz(ji,jj-1) )  )   &   ! reproducibility around NP
                   &              * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm)
             END_2D
          CASE ( np_MET )                           !* metric term
@@ -376,8 +374,8 @@ CONTAINS
             END_2D
          CASE ( np_CRV )                           !* Coriolis + relative vorticity
             DO_2D( 0, 1, 0, 1 )
-               zwt(ji,jj) = (  ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)        &
-                  &                                 + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) )  )   &
+               zwt(ji,jj) = (  ff_t(ji,jj) + r1_4 * ( ( zwz(ji-1,jj  ) + zwz(ji,jj  ) )        &   ! need additional () for
+                  &                                 + ( zwz(ji-1,jj-1) + zwz(ji,jj-1) ) )  )   &   ! reproducibility around NP
                   &       * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm)
             END_2D
          CASE ( np_CME )                           !* Coriolis + metric
@@ -440,7 +438,7 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk           ! dummy loop indices
       REAL(wp) ::   zx1, zy1, zx2, zy2, ze3f, zmsk   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(1)) ::   zwx, zwy, zwz   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -462,8 +460,8 @@ CONTAINS
             END_2D
          CASE ( np_RVO )                           !* relative vorticity
             DO_2D( 1, 0, 1, 0 )
-               zwz(ji,jj) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    &
-                  &          - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)
+               zwz(ji,jj) = (  ( e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk) )    &                 ! add () for
+                  &          - ( e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj) ! NP repro
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
                DO_2D( 1, 0, 1, 0 )
@@ -477,8 +475,8 @@ CONTAINS
             END_2D
          CASE ( np_CRV )                           !* Coriolis + relative vorticity
             DO_2D( 1, 0, 1, 0 )
-               zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      &
-                  &                        - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)
+               zwz(ji,jj) = ff_f(ji,jj) + (  ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) ) & ! add () for NP repro
+                  &                        - ( e1u(ji,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity (NOT the Coriolis term)
                DO_2D( 1, 0, 1, 0 )
@@ -502,22 +500,22 @@ CONTAINS
          SELECT CASE( nn_e3f_typ  )           !==  potential vorticity  ==!
          CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4)
             DO_2D( 1, 0, 1, 0 )
-               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   &
-                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   &
-                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   &
-                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  )
+               ze3f = (  ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &    +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &    + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &    +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )  )
                IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f
                ELSE                       ;   zwz(ji,jj) = 0._wp
                ENDIF
             END_2D
          CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask)
             DO_2D( 1, 0, 1, 0 )
-               ze3f = (   e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   &
-                  &     + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   &
-                  &     + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   &
-                  &     + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)   )
-               zmsk = (   tmask(ji,jj+1,jk)   + tmask(ji+1,jj+1,jk)   &
-                  &     + tmask(ji,jj  ,jk)   + tmask(ji+1,jj  ,jk)   )
+               ze3f = (   ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &     +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &     + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &     +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )   )
+               zmsk = (   tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk)   &
+                  &     + tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk)   )
                IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f
                ELSE                       ;   zwz(ji,jj) = 0._wp
                ENDIF
@@ -573,7 +571,7 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zuav, zvau, ze3f, zmsk   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(1)) ::   zwx, zwy, zwz   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -594,8 +592,8 @@ CONTAINS
             END_2D
          CASE ( np_RVO )                           !* relative vorticity
             DO_2D( 1, 0, 1, 0 )
-               zwz(ji,jj) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    &
-                  &          - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)
+               zwz(ji,jj) = (  ( e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk) )    &   ! add () for NP repro
+                  &          - ( e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
                DO_2D( 1, 0, 1, 0 )
@@ -609,8 +607,8 @@ CONTAINS
             END_2D
          CASE ( np_CRV )                           !* Coriolis + relative vorticity
             DO_2D( 1, 0, 1, 0 )
-               zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)  &
-                  &                        - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)
+               zwz(ji,jj) = ff_f(ji,jj) + ( ( e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk) ) &! add () for NP repro
+                  &                        -( e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity (NOT the Coriolis term)
                DO_2D( 1, 0, 1, 0 )
@@ -635,22 +633,22 @@ CONTAINS
          SELECT CASE( nn_e3f_typ )           !==  potential vorticity  ==!
          CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4)
             DO_2D( 1, 0, 1, 0 )
-               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   &
-                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   &
-                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   &
-                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  )
+               ze3f = (  ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &    +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &    + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &    +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )  )
                IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f
                ELSE                       ;   zwz(ji,jj) = 0._wp
                ENDIF
             END_2D
          CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask)
             DO_2D( 1, 0, 1, 0 )
-               ze3f = (   e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   &
-                  &     + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   &
-                  &     + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   &
-                  &     + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)   )
-               zmsk = (   tmask(ji,jj+1,jk)   + tmask(ji+1,jj+1,jk)   &
-                  &     + tmask(ji,jj  ,jk)   + tmask(ji+1,jj  ,jk)   )
+               ze3f = (   ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &     +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &     + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &     +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )   )
+               zmsk = (   tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk)   &
+                  &     + tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk)   )
                IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f
                ELSE                       ;   zwz(ji,jj) = 0._wp
                ENDIF
@@ -665,10 +663,10 @@ CONTAINS
          !
          !                                   !==  compute and add the vorticity term trend  =!
          DO_2D( 0, 0, 0, 0 )
-            zuav = r1_8 * r1_e1u(ji,jj) * (  zwy(ji  ,jj-1) + zwy(ji+1,jj-1)  &
-               &                           + zwy(ji  ,jj  ) + zwy(ji+1,jj  )  )
-            zvau =-r1_8 * r1_e2v(ji,jj) * (  zwx(ji-1,jj  ) + zwx(ji-1,jj+1)  &
-               &                           + zwx(ji  ,jj  ) + zwx(ji  ,jj+1)  )
+            zuav = r1_8 * r1_e1u(ji,jj) * (  ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) )  &   ! need additional () for
+               &                           + ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) )  )   ! reproducibility around NP
+            zvau =-r1_8 * r1_e2v(ji,jj) * (  ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) )  &
+               &                           + ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) )  )
             pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) )
             pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) )
          END_2D
@@ -705,16 +703,10 @@ CONTAINS
       INTEGER  ::   ierr         ! local integer
       REAL(wp) ::   zua, zva     ! local scalars
       REAL(wp) ::   zmsk, ze3f   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls))       ::   z1_e3f
-#if defined key_loop_fusion
-      REAL(wp) ::   ztne, ztnw, ztnw_ip1, ztse, ztse_jp1, ztsw_jp1, ztsw_ip1
-      REAL(wp) ::   zwx, zwx_im1, zwx_jp1, zwx_im1_jp1
-      REAL(wp) ::   zwy, zwy_ip1, zwy_jm1, zwy_ip1_jm1
-#else
-      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy
-      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse
-#endif
-      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined
+      REAL(wp), DIMENSION(T2D(1)) ::   z1_e3f
+      REAL(wp), DIMENSION(T2D(1)) ::   zwx , zwy
+      REAL(wp), DIMENSION(T2D(1)) ::   ztnw, ztne, ztsw, ztse
+      REAL(wp), DIMENSION(T2D(1)) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -730,33 +722,29 @@ CONTAINS
          !                                             ! ===============
          !
 #if defined key_qco   ||   defined key_linssh
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                 ! == reciprocal of e3 at F-point (key_qco)
+         DO_2D( 1, 1, 1, 1 )                 ! == reciprocal of e3 at F-point (key_qco)
             z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk)
          END_2D
 #else
          SELECT CASE( nn_e3f_typ )           ! == reciprocal of e3 at F-point
          CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               ze3f = (  (e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)    &
-                  &    +  e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk))   &
-                  &    + (e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)    &
-                  &    +  e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk))  )
+            DO_2D( 1, 1, 1, 1 )
+               ze3f = (  ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &    +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &    + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &    +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )  )
                IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4._wp / ze3f
                ELSE                       ;   z1_e3f(ji,jj) = 0._wp
                ENDIF
             END_2D
          CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               ze3f = (  (e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)    &
-                  &    +  e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk))   &
-                  &    + (e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)    &
-                  &    +  e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk))  )
-               zmsk = (                    tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   &
-                  &                      + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk)  )
+            DO_2D( 1, 1, 1, 1 )
+               ze3f = (  ( e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &    +   e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &    + ( e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)     &
+                  &    +   e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk) )  )
+               zmsk = (tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk)   &
+                  &  + tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk)  )
                IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = zmsk / ze3f
                ELSE                       ;   z1_e3f(ji,jj) = 0._wp
                ENDIF
@@ -767,86 +755,72 @@ CONTAINS
          SELECT CASE( kvor )                 !==  vorticity considered  ==!
          !
          CASE ( np_COR )                           !* Coriolis (planetary vorticity)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = ff_f(ji,jj) * z1_e3f(ji,jj)
             END_2D
          CASE ( np_RVO )                           !* relative vorticity
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  &
-                  &            - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = ( ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) )  &   ! add () for NP repro
+                  &         - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk)
+               DO_2D( 1, 1, 1, 1 )
+                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk)
                END_2D
             ENDIF
          CASE ( np_MET )                           !* metric term
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = (   ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
-                  &              - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (   ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
+                  &           - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
             END_2D
          CASE ( np_CRV )                           !* Coriolis + relative vorticity
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-               zwz(ji,jj,jk) = (  ff_f(ji,jj) + ( ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      &
-                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                             - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)      &
-                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                             ) * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (  ff_f(ji,jj) + ( ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) )   & ! add () for
+                  &                          - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )   & ! NP repro
+                  &                          ) * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj)
+               DO_2D( 1, 1, 1, 1 )
+                  zwz(ji,jj) = ( zwz(ji,jj) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj)
                END_2D
             ENDIF
          CASE ( np_CME )                           !* Coriolis + metric
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = (   ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
-                  &                            - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (   ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
+                  &                         - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj)
             END_2D
          CASE DEFAULT                                             ! error
             CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  )
          END SELECT
-         !                                             ! ===============
-      END DO                                           !   End of slab
-      !                                                ! ===============
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp )
-      !
-      !                                                ! ===============
-      !                                                ! Horizontal slab
-      !                                                ! ===============
-#if defined key_loop_fusion
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-         !                                   !==  horizontal fluxes  ==!
-         zwx         = e2u(ji  ,jj  ) * e3u(ji  ,jj  ,jk,Kmm) * pu(ji  ,jj  ,jk)
-         zwx_im1     = e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * pu(ji-1,jj  ,jk)
-         zwx_jp1     = e2u(ji  ,jj+1) * e3u(ji  ,jj+1,jk,Kmm) * pu(ji  ,jj+1,jk)
-         zwx_im1_jp1 = e2u(ji-1,jj+1) * e3u(ji-1,jj+1,jk,Kmm) * pu(ji-1,jj+1,jk)
-         zwy         = e1v(ji  ,jj  ) * e3v(ji  ,jj  ,jk,Kmm) * pv(ji  ,jj  ,jk)
-         zwy_ip1     = e1v(ji+1,jj  ) * e3v(ji+1,jj  ,jk,Kmm) * pv(ji+1,jj  ,jk)
-         zwy_jm1     = e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * pv(ji  ,jj-1,jk)
-         zwy_ip1_jm1 = e1v(ji+1,jj-1) * e3v(ji+1,jj-1,jk,Kmm) * pv(ji+1,jj-1,jk)
-         !                                   !==  compute and add the vorticity term trend  =!
-         ztne     = zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk)
-         ztnw     = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk)
-         ztnw_ip1 = zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji+1,jj  ,jk)
-         ztse     = zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk)
-         ztse_jp1 = zwz(ji  ,jj+1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk)
-         ztsw_jp1 = zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk) + zwz(ji-1,jj+1,jk)
-         ztsw_ip1 = zwz(ji+1,jj-1,jk) + zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk)
          !
-         zua = + r1_12 * r1_e1u(ji,jj) * (  ztne * zwy + ztnw_ip1 * zwy_ip1   &
-            &                             + ztse * zwy_jm1 + ztsw_ip1 * zwy_ip1_jm1 )
-         zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw_jp1 * zwx_im1_jp1 + ztse_jp1 * zwx_jp1   &
-            &                             + ztnw * zwx_im1 + ztne * zwx )
-         pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua
-         pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva
-      END_3D
+#if defined key_loop_fusion
+         DO_2D( 0, 0, 0, 0 )
+            !                                   !==  horizontal fluxes  ==!
+            zwx         = e2u(ji  ,jj  ) * e3u(ji  ,jj  ,jk,Kmm) * pu(ji  ,jj  ,jk)
+            zwx_im1     = e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * pu(ji-1,jj  ,jk)
+            zwx_jp1     = e2u(ji  ,jj+1) * e3u(ji  ,jj+1,jk,Kmm) * pu(ji  ,jj+1,jk)
+            zwx_im1_jp1 = e2u(ji-1,jj+1) * e3u(ji-1,jj+1,jk,Kmm) * pu(ji-1,jj+1,jk)
+            zwy         = e1v(ji  ,jj  ) * e3v(ji  ,jj  ,jk,Kmm) * pv(ji  ,jj  ,jk)
+            zwy_ip1     = e1v(ji+1,jj  ) * e3v(ji+1,jj  ,jk,Kmm) * pv(ji+1,jj  ,jk)
+            zwy_jm1     = e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * pv(ji  ,jj-1,jk)
+            zwy_ip1_jm1 = e1v(ji+1,jj-1) * e3v(ji+1,jj-1,jk,Kmm) * pv(ji+1,jj-1,jk)
+            !                                   !==  compute and add the vorticity term trend  =!
+            ztne     = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
+            ztnw     = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
+            ztnw_ip1 = zwz(ji  ,jj-1) + zwz(ji  ,jj  ) + zwz(ji+1,jj  )
+            ztse     = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
+            ztse_jp1 = zwz(ji  ,jj+1) + zwz(ji  ,jj  ) + zwz(ji-1,jj  )
+            ztsw_jp1 = zwz(ji  ,jj  ) + zwz(ji-1,jj  ) + zwz(ji-1,jj+1)
+            ztsw_ip1 = zwz(ji+1,jj-1) + zwz(ji  ,jj-1) + zwz(ji  ,jj  )
+            !
+            zua = + r1_12 * r1_e1u(ji,jj) * (  ( ztne * zwy + ztnw_ip1 * zwy_ip1 )              & ! add () for
+               &                             + ( ztse * zwy_jm1 + ztsw_ip1 * zwy_ip1_jm1 ) )      ! NP repro
+            zva = - r1_12 * r1_e2v(ji,jj) * (  ( ztsw_jp1 * zwx_im1_jp1 + ztse_jp1 * zwx_jp1 )  &
+               &                             + ( ztnw * zwx_im1 + ztne * zwx ) )
+            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua
+            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva
+         END_2D
 #else
-      DO jk = 1, jpkm1
-         !
          !                                   !==  horizontal fluxes  ==!
          DO_2D( 1, 1, 1, 1 )
             zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk)
@@ -855,24 +829,24 @@ CONTAINS
          !
          !                                   !==  compute and add the vorticity term trend  =!
          DO_2D( 0, 1, 0, 1 )
-            ztne(ji,jj) = zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk)
-            ztnw(ji,jj) = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk)
-            ztse(ji,jj) = zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk)
-            ztsw(ji,jj) = zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk)
+            ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
+            ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
+            ztse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
+            ztsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
          END_2D
          !
-         DO_2D( 0, 0, 0, 0 )
-            zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   &
-               &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) )
-            zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   &
-               &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) )
+         DO_2D( 0, 0, 0, 0 )   ! add () for NP repro
+            zua = + r1_12 * r1_e1u(ji,jj) * (  ( ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  ) )   & ! add () for
+               &                             + ( ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) )   ! NP repro
+            zva = - r1_12 * r1_e2v(ji,jj) * (  ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1) )   &
+               &                             + ( ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) )
             pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua
             pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva
          END_2D
-      END DO
 #endif
-         !                                             ! ===============
-         !                                             !   End of slab
+      END DO
+      !                                                ! ===============
+      !                                                !   End of slab
       !                                                ! ===============
    END SUBROUTINE vor_een
 
@@ -904,9 +878,9 @@ CONTAINS
       INTEGER  ::   ierr           ! local integer
       REAL(wp) ::   zua, zva       ! local scalars
       REAL(wp) ::   zmsk, z1_e3t   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy
-      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse
-      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined
+      REAL(wp), DIMENSION(T2D(1)) ::   zwx , zwy
+      REAL(wp), DIMENSION(T2D(1)) ::   ztnw, ztne, ztsw, ztse
+      REAL(wp), DIMENSION(T2D(1)) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -924,58 +898,45 @@ CONTAINS
          !
          SELECT CASE( kvor )                 !==  vorticity considered  ==!
          CASE ( np_COR )                           !* Coriolis (planetary vorticity)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = ff_f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = ff_f(ji,jj)
             END_2D
          CASE ( np_RVO )                           !* relative vorticity
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               zwz(ji,jj,jk) = (  (e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk))    &
-                  &             - (e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk))  ) &
-                  &          * r1_e1e2f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (  ( e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk) )    & ! add () for
+                  &          - ( e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) & ! NP reproducibility
+                  &       * r1_e1e2f(ji,jj)
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk)
+               DO_2D( 1, 1, 1, 1 )
+                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk)
                END_2D
             ENDIF
          CASE ( np_MET )                           !* metric term
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
-                  &          - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
+                  &       - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)
             END_2D
          CASE ( np_CRV )                           !* Coriolis + relative vorticity
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  (e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk))    &
-                  &                              - (e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk))  ) &
-                  &                           * r1_e1e2f(ji,jj)    )
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = (  ff_f(ji,jj) + (  ( e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk) )    & ! add () for
+                  &                           - ( e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk) )  ) & ! NP repro
+                  &                        * r1_e1e2f(ji,jj)    )
             END_2D
             IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj)
+               DO_2D( 1, 1, 1, 1 )
+                  zwz(ji,jj) = ( zwz(ji,jj) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj)
                END_2D
             ENDIF
          CASE ( np_CME )                           !* Coriolis + metric
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-               zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
-                  &                        - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)
+            DO_2D( 1, 1, 1, 1 )
+               zwz(ji,jj) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   &
+                  &                     - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)
             END_2D
          CASE DEFAULT                                             ! error
             CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  )
          END SELECT
          !
-         !                                             ! ===============
-      END DO                                           !   End of slab
-      !                                                ! ===============
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp )
-      !
-      !                                                ! ===============
-      DO jk = 1, jpkm1                                 ! Horizontal slab
-         !                                             ! ===============
          !
          !                                   !==  horizontal fluxes  ==!
          DO_2D( 1, 1, 1, 1 )
@@ -986,17 +947,17 @@ CONTAINS
          !                                   !==  compute and add the vorticity term trend  =!
          DO_2D( 0, 1, 0, 1 )
             z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm)
-            ztne(ji,jj) = ( zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) ) * z1_e3t
-            ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) ) * z1_e3t
-            ztse(ji,jj) = ( zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk) ) * z1_e3t
-            ztsw(ji,jj) = ( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) ) * z1_e3t
+            ztne(ji,jj) = ( zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) ) * z1_e3t
+            ztnw(ji,jj) = ( zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) ) * z1_e3t
+            ztse(ji,jj) = ( zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1) ) * z1_e3t
+            ztsw(ji,jj) = ( zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  ) ) * z1_e3t
          END_2D
          !
          DO_2D( 0, 0, 0, 0 )
-            zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   &
-               &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) )
-            zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   &
-               &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) )
+            zua = + r1_12 * r1_e1u(ji,jj) * (  ( ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  ) )   & ! add () for
+               &                             + ( ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) )   ! NP repro
+            zva = - r1_12 * r1_e2v(ji,jj) * (  ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1) )   &
+               &                             + ( ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) )
             pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua
             pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva
          END_2D
@@ -1115,10 +1076,10 @@ CONTAINS
          SELECT CASE( nn_e3f_typ )
          CASE ( 0 )                        ! original formulation  (masked averaging of e3t divided by 4)
             DO_3D( 0, 0, 0, 0, 1, jpk )
-               e3f_0vor(ji,jj,jk) = (   e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)   &
-                  &                   + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   &
-                  &                   + e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)   &
-                  &                   + e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)   ) * 0.25_wp
+               e3f_0vor(ji,jj,jk) = (   ( e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                  &                   +   e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                  &                   + ( e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)     &
+                  &                   +   e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) )   ) * 0.25_wp
             END_3D
          CASE ( 1 )                        ! new formulation  (masked averaging of e3t divided by the sum of mask)
             DO_3D( 0, 0, 0, 0, 1, jpk )
@@ -1126,10 +1087,10 @@ CONTAINS
                   &  + tmask(ji,jj  ,jk) +tmask(ji+1,jj  ,jk)  )
                !
                IF( zmsk /= 0._wp ) THEN
-                  e3f_0vor(ji,jj,jk) = (   e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)   &
-                     &                   + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   &
-                     &                   + e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)   &
-                     &                   + e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)   ) / zmsk
+                  e3f_0vor(ji,jj,jk) = (   ( e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)     &   ! need additional () for
+                     &                   +   e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) )   &   ! reproducibility around NP
+                     &                   + ( e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)     &
+                     &                   +   e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) )   ) / zmsk
                ELSE ; e3f_0vor(ji,jj,jk) = 0._wp
                ENDIF
             END_3D
@@ -1137,7 +1098,13 @@ CONTAINS
          !
          CALL lbc_lnk( 'dynvor', e3f_0vor, 'F', 1._wp )
          !                                 ! insure e3f_0vor /= 0
+# if defined key_vco_1d
+         DO jk = 1, jpk
+            WHERE( e3f_0vor(:,:,jk) == 0._wp )   e3f_0vor(:,:,jk) = e3f_0(:,:,jk)
+         END DO
+# else
          WHERE( e3f_0vor(:,:,:) == 0._wp )   e3f_0vor(:,:,:) = e3f_0(:,:,:)
+# endif
          !
       END SELECT
       !
diff --git a/src/OCE/DYN/dynzad.F90 b/src/OCE/DYN/dynzad.F90
index 5433b956..7871f4bb 100644
--- a/src/OCE/DYN/dynzad.F90
+++ b/src/OCE/DYN/dynzad.F90
@@ -60,7 +60,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zWf, zWfi, zzWfu, zzWdzU   ! local scalars
       REAL(wp) ::        zWfj, zzWfv, zzWdzV   !   -      -
-      REAL(wp), DIMENSION(A2D(0))             ::   zWdzU, zWdzV   ! 2D inner workspace
+      REAL(wp), DIMENSION(T2D(0))             ::   zWdzU, zWdzV   ! 2D inner workspace
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   ! 3D workspace
       !!----------------------------------------------------------------------
       !
@@ -81,8 +81,8 @@ CONTAINS
       !
       !                                !==  vertical momentum advection ==!   at u- and v-points
       !
-      zWdzU(A2D(0)) = 0._wp                  ! set surface (jk=1) vertical advection to zero
-      zWdzV(A2D(0)) = 0._wp
+      zWdzU(T2D(0)) = 0._wp                  ! set surface (jk=1) vertical advection to zero
+      zWdzV(T2D(0)) = 0._wp
       !        
       DO_3D( 0, 0, 0, 0 , 1, jpk-2 )   !=  surface to jpk-2 vertical advection
          !                                ! vertical transport at jk+1 uw/vw-level (x2): 2*mi/j[e1e2t*(We)]
diff --git a/src/OCE/DYN/dynzdf.F90 b/src/OCE/DYN/dynzdf.F90
index 1e026021..5f6f706d 100644
--- a/src/OCE/DYN/dynzdf.F90
+++ b/src/OCE/DYN/dynzdf.F90
@@ -6,6 +6,7 @@ MODULE dynzdf
    !! History :  1.0  !  2005-11  (G. Madec)  Original code
    !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase
    !!            4.0  !  2017-06  (G. Madec) remove the explicit time-stepping option + avm at t-point
+   !!            4.5  !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -18,11 +19,7 @@ MODULE dynzdf
    USE zdf_oce        ! ocean vertical physics variables
    USE zdfdrg         ! vertical physics: top/bottom drag coef.
    USE dynadv    ,ONLY: ln_dynadv_vec    ! dynamics: advection form
-#if defined key_loop_fusion
-   USE dynldf_iso_lf,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing 
-#else
    USE dynldf_iso,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing 
-#endif
    USE ldfdyn         ! lateral diffusion: eddy viscosity coef. and type of operator
    USE trd_oce        ! trends: ocean variables
    USE trddyn         ! trend manager: dynamics
@@ -79,7 +76,7 @@ CONTAINS
       REAL(wp) ::   zWu , zWv            !   -      -
       REAL(wp) ::   zWui, zWvi           !   -      -
       REAL(wp) ::   zWus, zWvs           !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)        ::  zwi, zwd, zws   ! 3D workspace
+      REAL(wp), DIMENSION(T1Di(0),jpk)        ::   zwi, zwd, zws  ! 2D workspace
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   !  -      -
       !!---------------------------------------------------------------------
       !
@@ -105,315 +102,327 @@ CONTAINS
          ztrdv(:,:,:) = pvv(:,:,:,Krhs)
       ENDIF
       !
-      !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in puu(:,:,:,Kaa),pvv(:,:,:,Kaa))
-      !
-      !                    ! time stepping except vertical diffusion
-      IF( ln_dynadv_vec .OR. ln_linssh ) THEN   ! applied on velocity
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kbb) + rDt * puu(ji,jj,jk,Krhs) ) * umask(ji,jj,jk)
-            pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kbb) + rDt * pvv(ji,jj,jk,Krhs) ) * vmask(ji,jj,jk)
-         END_3D
-      ELSE                                      ! applied on thickness weighted velocity
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            puu(ji,jj,jk,Kaa) = (         e3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb )  &
-               &                  + rDt * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Krhs)  ) &
-               &                        / e3u(ji,jj,jk,Kaa) * umask(ji,jj,jk)
-            pvv(ji,jj,jk,Kaa) = (         e3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb )  &
-               &                  + rDt * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Krhs)  ) &
-               &                        / e3v(ji,jj,jk,Kaa) * vmask(ji,jj,jk)
-         END_3D
-      ENDIF
-      !                    ! add top/bottom friction 
-      !     With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom.
-      !     J. Chanut: The bottom stress is computed considering after barotropic velocities, which does 
-      !                not lead to the effective stress seen over the whole barotropic loop. 
-      !     G. Madec : in linear free surface, e3u(:,:,:,Kaa) = e3u(:,:,:,Kmm) = e3u_0, so systematic use of e3u(:,:,:,Kaa)
-      IF( ln_drgimp .AND. ln_dynspg_ts ) THEN
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )      ! remove barotropic velocities
-            puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - uu_b(ji,jj,Kaa) ) * umask(ji,jj,jk)
-            pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - vv_b(ji,jj,Kaa) ) * vmask(ji,jj,jk)
-         END_3D
-         DO_2D( 0, 0, 0, 0 )      ! Add bottom/top stress due to barotropic component only
-            iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points 
-            ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points)
-            puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + zDt_2 *( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa)   &
-               &                                            / e3u(ji,jj,iku,Kaa)
-            pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + zDt_2 *( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa)   &
-               &                                            / e3v(ji,jj,ikv,Kaa)
-         END_2D
-         IF( ln_isfcav.OR.ln_drgice_imp ) THEN    ! Ocean cavities (ISF)
-            DO_2D( 0, 0, 0, 0 )
-               iku = miku(ji,jj)         ! top ocean level at u- and v-points 
-               ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points)
-               puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + zDt_2 *( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa)   &
+      !                                               ! ================= !
+      DO_1Dj( 0, 0 )                                  !  i-k slices loop  !
+         !                                            ! ================= !
+         !
+         !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in puu(:,:,:,Kaa),pvv(:,:,:,Kaa))
+         !
+         !                    ! time stepping except vertical diffusion
+         IF( ln_dynadv_vec .OR. ln_linssh ) THEN   ! applied on velocity
+            DO_2Dik( 0, 0,    1, jpkm1, 1 )
+               puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kbb) + rDt * puu(ji,jj,jk,Krhs) ) * umask(ji,jj,jk)
+               pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kbb) + rDt * pvv(ji,jj,jk,Krhs) ) * vmask(ji,jj,jk)
+            END_2D
+         ELSE                                      ! applied on thickness weighted velocity
+            DO_2Dik( 0, 0,    1, jpkm1, 1 )
+               puu(ji,jj,jk,Kaa) = (         e3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb )  &
+                  &                  + rDt * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Krhs)  ) &
+                  &                        / e3u(ji,jj,jk,Kaa) * umask(ji,jj,jk)
+               pvv(ji,jj,jk,Kaa) = (         e3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb )  &
+                  &                  + rDt * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Krhs)  ) &
+                  &                        / e3v(ji,jj,jk,Kaa) * vmask(ji,jj,jk)
+            END_2D
+         ENDIF
+         !                    ! add top/bottom friction
+         !     With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom.
+         !     J. Chanut: The bottom stress is computed considering after barotropic velocities, which does
+         !                not lead to the effective stress seen over the whole barotropic loop.
+         !     G. Madec : in linear free surface, e3u(:,:,:,Kaa) = e3u(:,:,:,Kmm) = e3u_0, so systematic use of e3u(:,:,:,Kaa)
+         IF( ln_drgimp .AND. ln_dynspg_ts ) THEN
+            DO_2Dik( 0, 0,     1, jpkm1, 1 )      ! remove barotropic velocities
+               puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - uu_b(ji,jj,Kaa) ) * umask(ji,jj,jk)
+               pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - vv_b(ji,jj,Kaa) ) * vmask(ji,jj,jk)
+            END_2D
+            DO_1Di( 0, 0 )      ! Add bottom/top stress due to barotropic component only
+               iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points
+               ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points)
+               puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + zDt_2 * ( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa)   &
                   &                                            / e3u(ji,jj,iku,Kaa)
-               pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + zDt_2 *( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa)   &
+               pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + zDt_2 * ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa)   &
                   &                                            / e3v(ji,jj,ikv,Kaa)
-            END_2D
-         END IF
-      ENDIF
-      !
-      !              !==  Vertical diffusion on u  ==!
-      !
-      !                    !* Matrix construction
-      IF( ln_zad_Aimp ) THEN   !!
-         SELECT CASE( nldf_dyn )
-         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z1_e3ua =  1._wp  / e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point
-               zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   &
-                  &         / e3uw(ji,jj,jk  ,Kmm) * z1_e3ua * wumask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   &
-                  &         / e3uw(ji,jj,jk+1,Kmm) * z1_e3ua * wumask(ji,jj,jk+1)
-               zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) * z1_e3ua
-               zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) * z1_e3ua
-               zwi(ji,jj,jk) = zzwi + zDt_2 * MIN( zWui, 0._wp ) 
-               zws(ji,jj,jk) = zzws - zDt_2 * MAX( zWus, 0._wp )
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zDt_2 * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) )
-            END_3D
-         CASE DEFAULT               ! iso-level lateral mixing
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z1_e3ua =  1._wp  / e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point
-               zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )   &
-                  &         / e3uw(ji,jj,jk  ,Kmm) * z1_e3ua * wumask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )   &
-                  &         / e3uw(ji,jj,jk+1,Kmm) * z1_e3ua * wumask(ji,jj,jk+1)
-               zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) * z1_e3ua
-               zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) * z1_e3ua
-               zwi(ji,jj,jk) = zzwi + zDt_2 * MIN( zWui, 0._wp )
-               zws(ji,jj,jk) = zzws - zDt_2 * MAX( zWus, 0._wp )
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zDt_2 * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) )
-            END_3D
-         END SELECT
-         DO_2D( 0, 0, 0, 0 )     !* Surface boundary conditions
-            zwi(ji,jj,1) = 0._wp
-            zzws = - zDt_2 * ( avm(ji+1,jj,2) + avm(ji  ,jj,2) )   &
-               &         / ( e3u(ji,jj,1,Kaa) * e3uw(ji,jj,2,Kmm) ) * wumask(ji,jj,2)
-            zWus = ( wi(ji  ,jj,2) +  wi(ji+1,jj,2) ) / e3u(ji,jj,1,Kaa)
-            zws(ji,jj,1 ) = zzws - zDt_2 * MAX( zWus, 0._wp )
-            zwd(ji,jj,1 ) = 1._wp - zzws - zDt_2 * ( MIN( zWus, 0._wp ) )
-         END_2D
-      ELSE
-         SELECT CASE( nldf_dyn )
-         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   &
-                  &         / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   &
-                  &         / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1)
-               zwi(ji,jj,jk) = zzwi
-               zws(ji,jj,jk) = zzws
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
-            END_3D
-         CASE DEFAULT               ! iso-level lateral mixing
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )    &
-                  &         / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )    &
-                  &         / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1)
-               zwi(ji,jj,jk) = zzwi
-               zws(ji,jj,jk) = zzws
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
-            END_3D
-         END SELECT
-         DO_2D( 0, 0, 0, 0 )     !* Surface boundary conditions
-            zwi(ji,jj,1) = 0._wp
-            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
-         END_2D
-      ENDIF
-      !
-      !
-      !              !==  Apply semi-implicit bottom friction  ==!
-      !
-      !     Only needed for semi-implicit bottom friction setup. The explicit
-      !     bottom friction has been included in "u(v)a" which act as the R.H.S
-      !     column vector of the tri-diagonal matrix equation
-      !
-      IF ( ln_drgimp ) THEN      ! implicit bottom friction
-         DO_2D( 0, 0, 0, 0 )
-            iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points
-            zwd(ji,jj,iku) = zwd(ji,jj,iku) - zDt_2 *( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) )   &
-               &                                    / e3u(ji,jj,iku,Kaa)
-         END_2D
-         IF ( ln_isfcav.OR.ln_drgice_imp ) THEN   ! top friction (always implicit)
-            DO_2D( 0, 0, 0, 0 )
+            END_1D
+            IF( ln_isfcav.OR.ln_drgice_imp ) THEN    ! Ocean cavities (ISF)
+               DO_1Di( 0, 0 )
+                  iku = miku(ji,jj)         ! top ocean level at u- and v-points
+                  ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points)
+                  puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + zDt_2 * ( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa)   &
+                     &                                            / e3u(ji,jj,iku,Kaa)
+                  pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + zDt_2 * ( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa)   &
+                     &                                            / e3v(ji,jj,ikv,Kaa)
+               END_1D
+            END IF
+         ENDIF
+         !
+         !              !==  Vertical diffusion on u  ==!
+         !
+         !
+         !                    !* Matrix construction
+         IF( ln_zad_Aimp ) THEN      !- including terms associated with partly implicit vertical advection
+            SELECT CASE( nldf_dyn )
+            CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
+               DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                  z1_e3ua =  1._wp  / e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point
+                  zzwi = - zDt_2 * ( ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) + akzu(ji,jj,jk  ) )   &   ! add () for NP repro
+                     &             / e3uw(ji,jj,jk  ,Kmm) * z1_e3ua * wumask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) + akzu(ji,jj,jk+1) )   &   ! add () for NP repro
+                     &             / e3uw(ji,jj,jk+1,Kmm) * z1_e3ua * wumask(ji,jj,jk+1)
+                  zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) * z1_e3ua
+                  zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) * z1_e3ua
+                  zwi(ji,jk) = zzwi + zDt_2 * MIN( zWui, 0._wp )
+                  zws(ji,jk) = zzws - zDt_2 * MAX( zWus, 0._wp )
+                  zwd(ji,jk) = 1._wp - zzwi - zzws + zDt_2 * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) )
+               END_2D
+            CASE DEFAULT               ! iso-level lateral mixing
+               DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                  z1_e3ua =  1._wp  / e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point
+                  zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )   &
+                     &           / e3uw(ji,jj,jk  ,Kmm) * z1_e3ua * wumask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )   &
+                     &           / e3uw(ji,jj,jk+1,Kmm) * z1_e3ua * wumask(ji,jj,jk+1)
+                  zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) * z1_e3ua
+                  zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) * z1_e3ua
+                  zwi(ji,jk) = zzwi + zDt_2 * MIN( zWui, 0._wp )
+                  zws(ji,jk) = zzws - zDt_2 * MAX( zWus, 0._wp )
+                  zwd(ji,jk) = 1._wp - zzwi - zzws + zDt_2 * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) )
+               END_2D
+            END SELECT
+            !
+            zwi(:,1) = 0._wp
+            DO_1Di( 0, 0 )     !* Surface boundary conditions
+               zwi(ji,1) = 0._wp
+               zzws = - zDt_2 * ( avm(ji+1,jj,2) + avm(ji  ,jj,2) )   &
+                  &           / ( e3u(ji,jj,1,Kaa) * e3uw(ji,jj,2,Kmm) ) * wumask(ji,jj,2)
+               zWus = ( wi(ji  ,jj,2) +  wi(ji+1,jj,2) ) / e3u(ji,jj,1,Kaa)
+               zws(ji,1) = zzws - zDt_2 * MAX( zWus, 0._wp )
+               zwd(ji,1) = 1._wp - zzws - zDt_2 * ( MIN( zWus, 0._wp ) )
+            END_1D
+         ELSE                       !- only vertical diffusive terms
+            SELECT CASE( nldf_dyn )
+            CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
+               DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                  zzwi = - zDt_2 * ( ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) + akzu(ji,jj,jk  ) )   &   ! add () for NP repro
+                     &           / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) + akzu(ji,jj,jk+1) )   &   ! add () for NP repro
+                     &           / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1)
+                  zwi(ji,jk) = zzwi
+                  zws(ji,jk) = zzws
+                  zwd(ji,jk) = 1._wp - zzwi - zzws
+               END_2D
+            CASE DEFAULT               ! iso-level lateral mixing
+               DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                  zzwi = - zDt_2 * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )    &
+                     &           / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )    &
+                     &           / ( e3u(ji,jj,jk,Kaa) * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1)
+                  zwi(ji,jk) = zzwi
+                  zws(ji,jk) = zzws
+                  zwd(ji,jk) = 1._wp - zzwi - zzws
+               END_2D
+            END SELECT
+            !
+            zwi(:,1) = 0._wp
+            DO_1Di( 0, 0 )     !* Surface boundary conditions
+               zwd(ji,1) = 1._wp - zws(ji,1)
+            END_1D
+         ENDIF
+         !
+         !
+         !              !==  Apply semi-implicit bottom friction  ==!
+         !
+         !     Only needed for semi-implicit bottom friction setup. The explicit
+         !     bottom friction has been included in "u(v)a" which act as the R.H.S
+         !     column vector of the tri-diagonal matrix equation
+         !
+         IF ( ln_drgimp ) THEN      ! implicit bottom friction
+            DO_1Di( 0, 0 )
+               iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points
+               zwd(ji,iku) = zwd(ji,iku) - zDt_2 *( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / e3u(ji,jj,iku,Kaa)
+            END_1D
+            IF ( ln_isfcav.OR.ln_drgice_imp ) THEN   ! top friction (always implicit)
+               DO_1Di( 0, 0 )
                !!gm   top Cd is masked (=0 outside cavities) no need of test on mik>=2  ==>> it has been suppressed
-               iku = miku(ji,jj)       ! ocean top level at u- and v-points 
-               zwd(ji,jj,iku) = zwd(ji,jj,iku) - zDt_2 *( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) )    &
-                  &                                    / e3u(ji,jj,iku,Kaa)
-            END_2D
-         END IF
-      ENDIF
-      !
-      ! Matrix inversion starting from the first level
-      !-----------------------------------------------------------------------
-      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
-      !
-      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
-      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
-      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
-      !        (        ...               )( ...  ) ( ...  )
-      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
-      !
-      !   m is decomposed in the product of an upper and a lower triangular matrix
-      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
-      !   The solution (the after velocity) is in puu(:,:,:,Kaa)
-      !-----------------------------------------------------------------------
-      !
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )   !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
-         zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
-      END_3D
-      !
-      DO_2D( 0, 0, 0, 0 )             !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
+                  iku = miku(ji,jj)       ! ocean top level at u- and v-points
+                  zwd(ji,iku) = zwd(ji,iku) - zDt_2 *( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / e3u(ji,jj,iku,Kaa)
+               END_1D
+            ENDIF
+         ENDIF
+         !
+         ! Matrix inversion starting from the first level
+         !-----------------------------------------------------------------------
+         !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
+         !
+         !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
+         !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
+         !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
+         !        (        ...               )( ...  ) ( ...  )
+         !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
+         !
+         !   m is decomposed in the product of an upper and a lower triangular matrix
+         !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
+         !   The solution (the after velocity) is in puu(:,:,:,Kaa)
+         !-----------------------------------------------------------------------
+         !
+         DO_2Dik( 0, 0,    2, jpkm1, 1 )   !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
+            zwd(ji,jk) = zwd(ji,jk) - zwi(ji,jk) * zws(ji,jk-1) / zwd(ji,jk-1)
+         END_2D
+         !
+         DO_1Di( 0, 0 )                    !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
 #if defined key_RK3
-         !                                  ! RK3: use only utau (not utau_b)
-         puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + rDt * utau(ji,jj)   &
-              &                                 / ( e3u(ji,jj,1,Kaa) * rho0 ) * umask(ji,jj,1)
+            !                                  ! RK3: use only utau (not utau_b)
+            puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + rDt * utauU(ji,jj)   &
+                 &                                    / ( e3u(ji,jj,1,Kaa) * rho0 ) * umask(ji,jj,1)
 #else
-         puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + zDt_2 * ( utau_b(ji,jj) + utau(ji,jj) )   &
-              &                                 / ( e3u(ji,jj,1,Kaa) * rho0 ) * umask(ji,jj,1)
+            !                                  ! MLF: average of utau and utau_b
+            puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + zDt_2 * ( utau_b(ji,jj) + utauU(ji,jj) )   &
+                 &                                      / ( e3u(ji,jj,1,Kaa) * rho0 ) * umask(ji,jj,1)
 #endif
-      END_2D
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-         puu(ji,jj,jk,Kaa) = puu(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * puu(ji,jj,jk-1,Kaa)
-      END_3D
-      !
-      DO_2D( 0, 0, 0, 0 )             !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==!
-         puu(ji,jj,jpkm1,Kaa) = puu(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1)
-      END_2D
-      DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 )
-         puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - zws(ji,jj,jk) * puu(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk)
-      END_3D
-      !
-      !              !==  Vertical diffusion on v  ==!
-      !
-      !                       !* Matrix construction
-      IF( ln_zad_Aimp ) THEN   !!
-         SELECT CASE( nldf_dyn )
-         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzv)
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z1_e3va = 1._wp / e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point
-               zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   &
-                  &         / e3vw(ji,jj,jk  ,Kmm) * z1_e3va * wvmask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   &
-                  &         / e3vw(ji,jj,jk+1,Kmm) * z1_e3va * wvmask(ji,jj,jk+1)
-               zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) * z1_e3va
-               zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * z1_e3va
-               zwi(ji,jj,jk) = zzwi + zDt_2 * MIN( zWvi, 0._wp )
-               zws(ji,jj,jk) = zzws - zDt_2 * MAX( zWvs, 0._wp )
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zDt_2 * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) )
-            END_3D
-         CASE DEFAULT               ! iso-level lateral mixing
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               z1_e3va = 1._wp / e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point
-               zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    &
-                  &         / e3vw(ji,jj,jk  ,Kmm) * z1_e3va * wvmask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    &
-                  &         / e3vw(ji,jj,jk+1,Kmm) * z1_e3va * wvmask(ji,jj,jk+1)
-               zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) * z1_e3va
-               zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * z1_e3va
-               zwi(ji,jj,jk) = zzwi  + zDt_2 * MIN( zWvi, 0._wp )
-               zws(ji,jj,jk) = zzws  - zDt_2 * MAX( zWvs, 0._wp )
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zDt_2 * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) )
-            END_3D
-         END SELECT
-         DO_2D( 0, 0, 0, 0 )   !* Surface boundary conditions
-            zwi(ji,jj,1) = 0._wp
-            zzws = - zDt_2 * ( avm(ji,jj+1,2) + avm(ji,jj,2) )    &
-               &         / ( e3v(ji,jj,1,Kaa) * e3vw(ji,jj,2,Kmm) ) * wvmask(ji,jj,2)
-            zWvs = ( wi(ji,jj  ,2) +  wi(ji,jj+1,2) ) / e3v(ji,jj,1,Kaa)
-            zws(ji,jj,1 ) = zzws - zDt_2 * MAX( zWvs, 0._wp )
-            zwd(ji,jj,1 ) = 1._wp - zzws - zDt_2 * ( MIN( zWvs, 0._wp ) )
+         END_1D
+         DO_2Dik( 0, 0,     2, jpkm1, 1 )
+            puu(ji,jj,jk,Kaa) = puu(ji,jj,jk,Kaa) - zwi(ji,jk) / zwd(ji,jk-1) * puu(ji,jj,jk-1,Kaa)
          END_2D
-      ELSE
-         SELECT CASE( nldf_dyn )
-         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   &
-                  &         / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   &
-                  &         / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1)
-               zwi(ji,jj,jk) = zzwi
-               zws(ji,jj,jk) = zzws
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
-            END_3D
-         CASE DEFAULT               ! iso-level lateral mixing
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    &
-                  &         / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  )
-               zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    &
-                  &         / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1)
-               zwi(ji,jj,jk) = zzwi
-               zws(ji,jj,jk) = zzws
-               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
-            END_3D
-         END SELECT
-         DO_2D( 0, 0, 0, 0 )        !* Surface boundary conditions
-            zwi(ji,jj,1) = 0._wp
-            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
-         END_2D
-      ENDIF
-      !
-      !              !==  Apply semi-implicit top/bottom friction  ==!
-      !
-      !     Only needed for semi-implicit bottom friction setup. The explicit
-      !     bottom friction has been included in "u(v)a" which act as the R.H.S
-      !     column vector of the tri-diagonal matrix equation
-      !
-      IF( ln_drgimp ) THEN
-         DO_2D( 0, 0, 0, 0 )
-            ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points)
-            zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - zDt_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) )   &
-               &                                   / e3v(ji,jj,ikv,Kaa)
+         !
+         DO_1Di( 0, 0 )                    !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==!
+            puu(ji,jj,jpkm1,Kaa) = puu(ji,jj,jpkm1,Kaa) / zwd(ji,jpkm1)
+         END_1D
+         DO_2Dik( 0, 0,    jpk-2, 1, -1 )
+            puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - zws(ji,jk) * puu(ji,jj,jk+1,Kaa) ) / zwd(ji,jk)
          END_2D
-         IF ( ln_isfcav.OR.ln_drgice_imp ) THEN
-            DO_2D( 0, 0, 0, 0 )
-               ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points)
-               zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - zDt_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) )   &
+         !
+         !
+         !              !==  Vertical diffusion on v  ==!
+         !
+         !                       !* Matrix construction
+         IF( ln_zad_Aimp ) THEN   !!
+            SELECT CASE( nldf_dyn )
+            CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzv)
+               DO_2Dik( 0, 0,    1, jpkm1, 1 )
+                  z1_e3va = 1._wp / e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point
+                  zzwi = - zDt_2 * ( ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) ) + akzv(ji,jj,jk  ) )   &   ! add () for NP repro
+                     &           / e3vw(ji,jj,jk  ,Kmm) * z1_e3va * wvmask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) + akzv(ji,jj,jk+1) )   &   ! add () for NP repro
+                     &           / e3vw(ji,jj,jk+1,Kmm) * z1_e3va * wvmask(ji,jj,jk+1)
+                  zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) * z1_e3va
+                  zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * z1_e3va
+                  zwi(ji,jk) = zzwi + zDt_2 * MIN( zWvi, 0._wp )
+                  zws(ji,jk) = zzws - zDt_2 * MAX( zWvs, 0._wp )
+                  zwd(ji,jk) = 1._wp - zzwi - zzws - zDt_2 * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) )
+               END_2D
+            CASE DEFAULT               ! iso-level lateral mixing
+               DO_2Dik( 0, 0,    1, jpkm1, 1 )
+                  z1_e3va = 1._wp / e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point
+                  zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    &
+                     &           / e3vw(ji,jj,jk  ,Kmm) * z1_e3va * wvmask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    &
+                     &           / e3vw(ji,jj,jk+1,Kmm) * z1_e3va * wvmask(ji,jj,jk+1)
+                  zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) * z1_e3va
+                  zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * z1_e3va
+                  zwi(ji,jk) = zzwi  + zDt_2 * MIN( zWvi, 0._wp )
+                  zws(ji,jk) = zzws  - zDt_2 * MAX( zWvs, 0._wp )
+                  zwd(ji,jk) = 1._wp - zzwi - zzws - zDt_2 * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) )
+               END_2D
+            END SELECT
+            DO_1Di( 0, 0 )   !* Surface boundary conditions
+               zwi(ji,1) = 0._wp
+               zzws = - zDt_2 * ( avm(ji,jj+1,2) + avm(ji,jj,2) )    &
+                  &           / ( e3v(ji,jj,1,Kaa) * e3vw(ji,jj,2,Kmm) ) * wvmask(ji,jj,2)
+               zWvs = ( wi(ji,jj  ,2) +  wi(ji,jj+1,2) ) / e3v(ji,jj,1,Kaa)
+               zws(ji,1 ) = zzws - zDt_2 * MAX( zWvs, 0._wp )
+               zwd(ji,1 ) = 1._wp - zzws - zDt_2 * ( MIN( zWvs, 0._wp ) )
+            END_1D
+         ELSE
+            SELECT CASE( nldf_dyn )
+            CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
+               DO_2Dik( 0, 0,    1, jpkm1, 1 )
+                  zzwi = - zDt_2 * ( ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) ) + akzv(ji,jj,jk  ) )   &   ! add () for NP repro
+                     &           / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) + akzv(ji,jj,jk+1) )   &   ! add () for NP repro
+                     &           / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1)
+                  zwi(ji,jk) = zzwi
+                  zws(ji,jk) = zzws
+                  zwd(ji,jk) = 1._wp - zzwi - zzws
+               END_2D
+            CASE DEFAULT               ! iso-level lateral mixing
+               DO_2Dik( 0, 0,    1, jpkm1, 1 )
+                  zzwi = - zDt_2 * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    &
+                     &           / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  )
+                  zzws = - zDt_2 * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    &
+                     &           / ( e3v(ji,jj,jk,Kaa) * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1)
+                  zwi(ji,jk) = zzwi
+                  zws(ji,jk) = zzws
+                  zwd(ji,jk) = 1._wp - zzwi - zzws
+               END_2D
+            END SELECT
+            DO_1Di( 0, 0 )        !* Surface boundary conditions
+               zwi(ji,1) = 0._wp
+               zwd(ji,1) = 1._wp - zws(ji,1)
+            END_1D
+         ENDIF
+         !
+         !              !==  Apply semi-implicit top/bottom friction  ==!
+         !
+         !     Only needed for semi-implicit bottom friction setup. The explicit
+         !     bottom friction has been included in "u(v)a" which act as the R.H.S
+         !     column vector of the tri-diagonal matrix equation
+         !
+         IF( ln_drgimp ) THEN
+            DO_1Di( 0, 0 )
+               ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points)
+               zwd(ji,ikv) = zwd(ji,ikv) - zDt_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) )   &
                   &                                   / e3v(ji,jj,ikv,Kaa)
-            END_2D
+            END_1D
+            IF ( ln_isfcav.OR.ln_drgice_imp ) THEN
+               DO_1Di( 0, 0 )
+                  ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points)
+                  zwd(ji,ikv) = zwd(ji,ikv) - zDt_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) )   &
+                     &                                   / e3v(ji,jj,ikv,Kaa)
+               END_1D
+            ENDIF
          ENDIF
-      ENDIF
 
-      ! Matrix inversion
-      !-----------------------------------------------------------------------
-      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
-      !
-      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
-      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
-      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
-      !        (        ...               )( ...  ) ( ...  )
-      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
-      !
-      !   m is decomposed in the product of an upper and lower triangular matrix
-      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
-      !   The solution (after velocity) is in 2d array va
-      !-----------------------------------------------------------------------
-      !
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )   !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
-         zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
-      END_3D
-      !
-      DO_2D( 0, 0, 0, 0 )             !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
+         ! Matrix inversion
+         !-----------------------------------------------------------------------
+         !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
+         !
+         !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
+         !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
+         !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
+         !        (        ...               )( ...  ) ( ...  )
+         !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
+         !
+         !   m is decomposed in the product of an upper and lower triangular matrix
+         !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
+         !   The solution (after velocity) is in 2d array va
+         !-----------------------------------------------------------------------
+         !
+         DO_2Dik( 0, 0,    2, jpkm1, 1 )   !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
+            zwd(ji,jk) = zwd(ji,jk) - zwi(ji,jk) * zws(ji,jk-1) / zwd(ji,jk-1)
+         END_2D
+         !
+         DO_1Di( 0, 0 )                    !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
 #if defined key_RK3
-         !                                  ! RK3: use only vtau (not vtau_b)
-         pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + rDt * vtau(ji,jj)   &
-            &                                   / ( e3v(ji,jj,1,Kaa) * rho0 ) * vmask(ji,jj,1)
+            !                                  ! RK3: use only vtau (not vtau_b)
+            pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + rDt * vtauV(ji,jj)   &
+               &                                   / ( e3v(ji,jj,1,Kaa) * rho0 ) * vmask(ji,jj,1)
 #else
-         pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + zDt_2*( vtau_b(ji,jj) + vtau(ji,jj) )   &
-              &                                 / ( e3v(ji,jj,1,Kaa) * rho0 ) * vmask(ji,jj,1)
+            !                                  ! MLF: average of vtau and vtau_b
+            pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + zDt_2*( vtau_b(ji,jj) + vtauV(ji,jj) )   &
+                 &                                 / ( e3v(ji,jj,1,Kaa) * rho0 ) * vmask(ji,jj,1)
 #endif
-      END_2D
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-         pvv(ji,jj,jk,Kaa) = pvv(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * pvv(ji,jj,jk-1,Kaa)
-      END_3D
-      !
-      DO_2D( 0, 0, 0, 0 )             !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==!
-         pvv(ji,jj,jpkm1,Kaa) = pvv(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1)
-      END_2D
-      DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 )
-         pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - zws(ji,jj,jk) * pvv(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk)
-      END_3D
+         END_1D
+         DO_2Dik( 0, 0,    2, jpkm1, 1 )
+            pvv(ji,jj,jk,Kaa) = pvv(ji,jj,jk,Kaa) - zwi(ji,jk) / zwd(ji,jk-1) * pvv(ji,jj,jk-1,Kaa)
+         END_2D
+         !
+         DO_1Di( 0, 0 )                    !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==!
+            pvv(ji,jj,jpkm1,Kaa) = pvv(ji,jj,jpkm1,Kaa) / zwd(ji,jpkm1)
+         END_1D
+         DO_2Dik( 0, 0,   jpk-2, 1, -1 )
+            pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - zws(ji,jk) * pvv(ji,jj,jk+1,Kaa) ) / zwd(ji,jk)
+         END_2D
+         !                                            ! ================= !
+      END_1D                                          !  i-k slices loop  !
+      !                                               ! ================= !
       !
       IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics
          ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) )*r1_Dt - ztrdu(:,:,:)
diff --git a/src/OCE/DYN/sshwzv.F90 b/src/OCE/DYN/sshwzv.F90
index 0e256970..f4c74fb5 100644
--- a/src/OCE/DYN/sshwzv.F90
+++ b/src/OCE/DYN/sshwzv.F90
@@ -24,7 +24,6 @@ MODULE sshwzv
    USE isf_oce        ! ice shelf
    USE dom_oce        ! ocean space and time domain variables 
    USE sbc_oce        ! surface boundary condition: ocean
-   USE domvvl         ! Variable volume
    USE divhor         ! horizontal divergence
    USE phycst         ! physical constants
    USE bdy_oce , ONLY : ln_bdy, bdytmask   ! Open BounDarY
@@ -86,7 +85,6 @@ CONTAINS
       INTEGER  ::   ji, jj, jk      ! dummy loop index
       REAL(wp) ::   zcoef   ! local scalar
       REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv   ! 2D workspace
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z3d   ! 3D workspace
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('ssh_nxt')
@@ -175,40 +173,15 @@ CONTAINS
          IF(lwp) WRITE(numout,*) 'wzv_MLF : now vertical velocity '
          IF(lwp) WRITE(numout,*) '~~~~~~~'
          !
-         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
+         pww(:,:,:) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
+         !                                   ! needed over the halos for the output (ww+wi) in diawri.F90
       ENDIF
       !                                           !------------------------------!
       !                                           !     Now Vertical Velocity    !
       !                                           !------------------------------!
       !
-      !                                               !===============================!
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      !==  z_tilde and layer cases  ==!
-         !                                            !===============================!
-         ALLOCATE( zhdiv(jpi,jpj,jpk) ) 
-         !
-         DO jk = 1, jpkm1
-            ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t)
-            ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way)
-            DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
-               zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) )
-            END_2D
-         END DO
-         IF( nn_hls == 1)   CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions"
-         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells?
-         !                             ! Same question holds for hdiv. Perhaps just for security
-         !                             ! clem: yes it is a problem because ww is used in many other places where we need the halos
-         !
-         DO_3DS( nn_hls-1, nn_hls, nn_hls-1, nn_hls, jpkm1, 1, -1 )     ! integrate from the bottom the hor. divergence
-            ! computation of w
-            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (   e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)   &
-               &                                  +                  zhdiv(ji,jj,jk)   &
-               &                                  + r1_Dt * (  e3t(ji,jj,jk,Kaa)       &
-               &                                             - e3t(ji,jj,jk,Kbb) )   ) * tmask(ji,jj,jk)
-         END_3D
-         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0
-         DEALLOCATE( zhdiv )
-         !                                            !=================================!
-      ELSEIF( ln_linssh )   THEN                      !==  linear free surface cases  ==!
+      !                                               !=================================!
+      IF( ln_linssh )   THEN                          !==  linear free surface cases  ==!
          !                                            !=================================!
          DO_3DS( nn_hls-1, nn_hls, nn_hls-1, nn_hls, jpkm1, 1, -1 )     ! integrate from the bottom the hor. divergence
             pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)  ) * tmask(ji,jj,jk)
@@ -220,11 +193,10 @@ CONTAINS
 #if defined key_qco
 !!gm slightly faster
             pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)    &
-                 &                               + r1_Dt * e3t_0(ji,jj,jk) * ( r3t(ji,jj,Kaa) - r3t(ji,jj,Kbb) )  ) * tmask(ji,jj,jk)
+                 &                               + r1_Dt * e3t_0(ji,jj,jk) * ( r3t(ji,jj,Kaa) - r3t(ji,jj,Kbb) ) ) * tmask(ji,jj,jk)
 #else
             pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)    &
-               &                                 + r1_Dt * (  e3t(ji,jj,jk,Kaa)        &
-               &                                            - e3t(ji,jj,jk,Kbb)  )   ) * tmask(ji,jj,jk)
+               &                                 + r1_Dt * ( e3t(ji,jj,jk,Kaa) - e3t(ji,jj,jk,Kbb) )  ) * tmask(ji,jj,jk)
 #endif
          END_3D
       ENDIF
@@ -244,28 +216,28 @@ CONTAINS
          ! inside computational domain (cosmetic) 
          DO jk = 1, jpkm1
             IF( lk_west ) THEN                             ! --- West --- !
-               DO ji = mi0(2+nn_hls), mi1(2+nn_hls)
+               DO ji = mi0(2+nn_hls,nn_hls), mi1(2+nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp 
                   END DO
                END DO
             ENDIF
             IF( lk_east ) THEN                             ! --- East --- !
-               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls)
+               DO ji = mi0(jpiglo-1-nn_hls,nn_hls), mi1(jpiglo-1-nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_south ) THEN                            ! --- South --- !
-               DO jj = mj0(2+nn_hls), mj1(2+nn_hls)
+               DO jj = mj0(2+nn_hls,nn_hls), mj1(2+nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_north ) THEN                            ! --- North --- !
-               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls)
+               DO jj = mj0(jpjglo-1-nn_hls,nn_hls), mj1(jpjglo-1-nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
@@ -314,7 +286,8 @@ CONTAINS
          IF(lwp) WRITE(numout,*) 'wzv_RK3 : now vertical velocity '
          IF(lwp) WRITE(numout,*) '~~~~~ '
          !
-         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
+         pww(:,:,:) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
+         !                                   ! needed over the halos for the output (ww+wi) in diawri.F90
       ENDIF
       !
       CALL div_hor( kt, Kbb, Kmm, puu, pvv, ze3div )
@@ -322,30 +295,8 @@ CONTAINS
       !                                           !     Now Vertical Velocity    !
       !                                           !------------------------------!
       !
-      !                                               !===============================!
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      !==  z_tilde and layer cases  ==!
-         !                                            !===============================!
-         ALLOCATE( zhdiv(jpi,jpj,jpk) ) 
-         !
-         DO jk = 1, jpkm1
-            ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t)
-            ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way)
-            DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
-               zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) )
-            END_2D
-         END DO
-         IF( nn_hls == 1)   CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions"
-         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells?
-         !                             ! Same question holds for hdiv. Perhaps just for security
-         DO_3DS( nn_hls-1, nn_hls, nn_hls-1, nn_hls, jpkm1, 1, -1 )     ! integrate from the bottom the hor. divergence
-            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (   ze3div(ji,jj,jk) + zhdiv(ji,jj,jk)   &
-                 &                            + r1_Dt * (  e3t(ji,jj,jk,Kaa)       &
-                 &                                       - e3t(ji,jj,jk,Kbb) )   ) * tmask(ji,jj,jk)
-         END_3D
-         !
-         DEALLOCATE( zhdiv ) 
-         !                                            !=================================!
-      ELSEIF( ln_linssh )   THEN                      !==  linear free surface cases  ==!
+      !                                               !=================================!
+      IF( ln_linssh )   THEN                          !==  linear free surface cases  ==!
          !                                            !=================================!
          DO_3DS( nn_hls-1, nn_hls, nn_hls-1, nn_hls, jpkm1, 1, -1 )     ! integrate from the bottom the hor. divergence
             pww(ji,jj,jk) = pww(ji,jj,jk+1) - ze3div(ji,jj,jk) 
@@ -375,28 +326,28 @@ CONTAINS
          ! inside computational domain (cosmetic) 
          DO jk = 1, jpkm1
             IF( lk_west ) THEN                             ! --- West --- !
-               DO ji = mi0(2+nn_hls), mi1(2+nn_hls)
+               DO ji = mi0(2+nn_hls,nn_hls), mi1(2+nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp 
                   END DO
                END DO
             ENDIF
             IF( lk_east ) THEN                             ! --- East --- !
-               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls)
+               DO ji = mi0(jpiglo-1-nn_hls,nn_hls), mi1(jpiglo-1-nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_south ) THEN                            ! --- South --- !
-               DO jj = mj0(2+nn_hls), mj1(2+nn_hls)
+               DO jj = mj0(2+nn_hls,nn_hls), mj1(2+nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_north ) THEN                            ! --- North --- !
-               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls)
+               DO jj = mj0(jpjglo-1-nn_hls,nn_hls), mj1(jpjglo-1-nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
@@ -507,24 +458,6 @@ CONTAINS
       !
       ! Calculate Courant numbers
       zdt = 2._wp * rn_Dt                            ! 2*rn_Dt and not rDt (for restartability)
-      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN
-         DO_3D( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )
-            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm)
-            Cu_adv(ji,jj,jk) =   zdt *                                                         &
-               &  ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )            &
-               &  + ( MAX( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm)                                  &
-               &                        * uu (ji  ,jj,jk,Kmm) + un_td(ji  ,jj,jk), 0._wp ) -   &
-               &      MIN( e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm)                                  &
-               &                        * uu (ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) )   &
-               &                               * r1_e1e2t(ji,jj)                                                                     &
-               &  + ( MAX( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm)                                  &
-               &                        * vv (ji,jj  ,jk,Kmm) + vn_td(ji,jj  ,jk), 0._wp ) -   &
-               &      MIN( e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm)                                  &
-               &                        * vv (ji,jj-1,jk,Kmm) + vn_td(ji,jj-1,jk), 0._wp ) )   &
-               &                               * r1_e1e2t(ji,jj)                                                                     &
-               &                             ) * z1_e3t
-         END_3D
-      ELSE
          DO_3D( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )
             z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm)
             Cu_adv(ji,jj,jk) =   zdt *                                                      &
@@ -537,7 +470,6 @@ CONTAINS
                &                               * r1_e1e2t(ji,jj)                                                 &
                &                             ) * z1_e3t
          END_3D
-      ENDIF
       CALL iom_put("Courant",Cu_adv)
       !
       IF( MAXVAL( Cu_adv(:,:,:) ) > Cu_min ) THEN       ! Quick check if any breaches anywhere
diff --git a/src/OCE/DYN/wet_dry.F90 b/src/OCE/DYN/wet_dry.F90
index 46513450..f1d5e0fd 100644
--- a/src/OCE/DYN/wet_dry.F90
+++ b/src/OCE/DYN/wet_dry.F90
@@ -179,10 +179,10 @@ CONTAINS
          IF( tmask(ji,jj,1)        < 0.5_wp )   CYCLE    ! we don't care about land cells
          IF( ht_0(ji,jj) - ssh_ref > zdepwd )   CYCLE    ! and cells which are unlikely to dry
          !
-         zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   &
-            &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp ) 
-         zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   &
-            &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp ) 
+         zflxp(ji,jj) = ( MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp ) )   &   ! add () for NP repro
+            &         + ( MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp ) ) 
+         zflxn(ji,jj) = ( MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp ) )   &   ! add () for NP repro
+            &         + ( MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp ) ) 
          !
          zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1
          IF( zdep2 <= 0._wp ) THEN     ! add more safty, but not necessary
@@ -217,10 +217,10 @@ CONTAINS
             !
             ztmp = e1e2t(ji,jj)
             !
-            zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj  ) , 0._wp)   &
-               &   + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,  jj-1) , 0._wp) 
-            zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj  ) , 0._wp)   &
-               &   + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,  jj-1) , 0._wp) 
+            zzflxp = ( MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj  ) , 0._wp) )   &   ! add () for NP repro
+               &   + ( MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,  jj-1) , 0._wp) ) 
+            zzflxn = ( MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj  ) , 0._wp) )   &   ! add () for NP repro
+               &   + ( MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,  jj-1) , 0._wp) ) 
             !
             zdep1 = (zzflxp + zzflxn) * z2dt / ztmp
             zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1 - z2dt * psshemp(ji,jj)
@@ -312,10 +312,10 @@ CONTAINS
          IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE   ! we don't care about land cells
          IF( ht_0(ji,jj) > zdepwd )      CYCLE   ! and cells which are unlikely to dry
          !
-         zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   &
-            &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp ) 
-         zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   &
-            &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp ) 
+         zflxp(ji,jj) = ( MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp ) )   &   ! add () for NP repro
+            &         + ( MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp ) )
+         zflxn(ji,jj) = ( MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp ) )   &   ! add () for NP repro
+            &         + ( MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp ) ) 
          !
          zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1
          IF( zdep2 <= 0._wp ) THEN  !add more safety, but not necessary
@@ -340,10 +340,10 @@ CONTAINS
             !
             ztmp = e1e2t(ji,jj)
             !
-            zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj),   0._wp)   &
-               &   + max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji,  jj-1), 0._wp) 
-            zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj),   0._wp)   &
-               &   + min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji,  jj-1), 0._wp) 
+            zzflxp = ( MAX(zflxu1(ji,jj), 0._wp) - MIN(zflxu1(ji-1,jj),   0._wp) )   &   ! add () for NP repro
+               &   + ( MAX(zflxv1(ji,jj), 0._wp) - MIN(zflxv1(ji,  jj-1), 0._wp) ) 
+            zzflxn = ( MIN(zflxu1(ji,jj), 0._wp) - MAX(zflxu1(ji-1,jj),   0._wp) )   &   ! add () for NP repro
+               &   + ( MIN(zflxv1(ji,jj), 0._wp) - MAX(zflxv1(ji,  jj-1), 0._wp) ) 
        
             zdep1 = (zzflxp + zzflxn) * z2dt / ztmp
             zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj)
diff --git a/src/OCE/FLO/floblk.F90 b/src/OCE/FLO/floblk.F90
index 4d745071..95b0682a 100644
--- a/src/OCE/FLO/floblk.F90
+++ b/src/OCE/FLO/floblk.F90
@@ -105,10 +105,10 @@ CONTAINS
       iloop = 0
 222   DO jfl = 1, jpnfl
 # if ! defined key_mpi_off
-         IF( iil(jfl) >= mig(Nis0) .AND. iil(jfl) <= mig(Nie0) .AND.   &
-             ijl(jfl) >= mjg(Njs0) .AND. ijl(jfl) <= mjg(Nje0)   ) THEN
-            iiloc(jfl) = iil(jfl) - mig(1) + 1
-            ijloc(jfl) = ijl(jfl) - mjg(1) + 1
+         IF( iil(jfl) >= mig(Nis0,nn_hls) .AND. iil(jfl) <= mig(Nie0,nn_hls) .AND.   &
+             ijl(jfl) >= mjg(Njs0,nn_hls) .AND. ijl(jfl) <= mjg(Nje0,nn_hls)   ) THEN
+            iiloc(jfl) = iil(jfl) - mig(1,nn_hls) + 1
+            ijloc(jfl) = ijl(jfl) - mjg(1,nn_hls) + 1
 # else 
             iiloc(jfl) = iil(jfl)
             ijloc(jfl) = ijl(jfl)
diff --git a/src/OCE/FLO/flodom.F90 b/src/OCE/FLO/flodom.F90
index e6536bd9..2a0210d4 100644
--- a/src/OCE/FLO/flodom.F90
+++ b/src/OCE/FLO/flodom.F90
@@ -234,8 +234,8 @@ CONTAINS
             zdyad = flo_dstnce( flxx(jfl), flyy(jfl), flxx(jfl), gphif(iimfl(jfl)-1,ijmfl(jfl)-1) )
 
             ! Translation of this distances (in meter) in indexes
-            zgifl(jfl)= (iimfl(jfl)-0.5) + zdxab/e1u(iimfl(jfl)-1,ijmfl(jfl)) + (mig(1)-1)
-            zgjfl(jfl)= (ijmfl(jfl)-0.5) + zdyad/e2v(iimfl(jfl),ijmfl(jfl)-1) + (mjg(1)-1)
+            zgifl(jfl)= (iimfl(jfl)-0.5) + zdxab/e1u(iimfl(jfl)-1,ijmfl(jfl)) + (mig(1,nn_hls)-1)
+            zgjfl(jfl)= (ijmfl(jfl)-0.5) + zdyad/e2v(iimfl(jfl),ijmfl(jfl)-1) + (mjg(1,nn_hls)-1)
             zgkfl(jfl) = (( gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl)+1,Kmm) - flzz(jfl) )* ikmfl(jfl))   &
                &                 / (  gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl)+1,Kmm)                              &
                &                    - gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl) ,Kmm) )                             &
diff --git a/src/OCE/FLO/florst.F90 b/src/OCE/FLO/florst.F90
index 59817e08..c855b1b7 100644
--- a/src/OCE/FLO/florst.F90
+++ b/src/OCE/FLO/florst.F90
@@ -97,10 +97,10 @@ CONTAINS
          !
          IF( lk_mpp ) THEN
             DO jfl = 1, jpnfl
-               IF( (INT(tpifl(jfl)) >= mig(Nis0)) .AND.   &
-                  &(INT(tpifl(jfl)) <= mig(Nie0)) .AND.   &
-                  &(INT(tpjfl(jfl)) >= mjg(Njs0)) .AND.   &
-                  &(INT(tpjfl(jfl)) <= mjg(Nje0)) ) THEN
+               IF( (INT(tpifl(jfl)) >= mig(Nis0,nn_hls)) .AND.   &
+                  &(INT(tpifl(jfl)) <= mig(Nie0,nn_hls)) .AND.   &
+                  &(INT(tpjfl(jfl)) >= mjg(Njs0,nn_hls)) .AND.   &
+                  &(INT(tpjfl(jfl)) <= mjg(Nje0,nn_hls)) ) THEN
                   iperproc(narea) = iperproc(narea)+1
                ENDIF
             END DO
diff --git a/src/OCE/FLO/flowri.F90 b/src/OCE/FLO/flowri.F90
index 7451c1be..9c3473ff 100644
--- a/src/OCE/FLO/flowri.F90
+++ b/src/OCE/FLO/flowri.F90
@@ -103,8 +103,8 @@ CONTAINS
 
          IF( lk_mpp ) THEN
                
-            iafloc = mi1( iafl )
-            ibfloc = mj1( ibfl )
+            iafloc = mi1( iafl, nn_hls )
+            ibfloc = mj1( ibfl, nn_hls )
  
             IF( Nis0 <= iafloc .AND. iafloc <= Nie0 .AND. &
               & Njs0 <= ibfloc .AND. ibfloc <= Nje0       ) THEN 
diff --git a/src/OCE/ICB/icbclv.F90 b/src/OCE/ICB/icbclv.F90
index 0121cbb8..bb26759d 100644
--- a/src/OCE/ICB/icbclv.F90
+++ b/src/OCE/ICB/icbclv.F90
@@ -132,8 +132,8 @@ CONTAINS
                   !
                   newpt%lon = glamt(ji,jj)         ! at t-point (centre of the cell)
                   newpt%lat = gphit(ji,jj)
-                  newpt%xi  = REAL( mig(ji), wp ) - ( nn_hls - 1 )
-                  newpt%yj  = REAL( mjg(jj), wp ) - ( nn_hls - 1 )
+                  newpt%xi  = REAL( mig(ji,nn_hls), wp ) - ( nn_hls - 1 )
+                  newpt%yj  = REAL( mjg(jj,nn_hls), wp ) - ( nn_hls - 1 )
                   !
                   newpt%uvel = 0._wp               ! initially at rest
                   newpt%vvel = 0._wp
diff --git a/src/OCE/ICB/icbdyn.F90 b/src/OCE/ICB/icbdyn.F90
index 323758f4..0de3d453 100644
--- a/src/OCE/ICB/icbdyn.F90
+++ b/src/OCE/ICB/icbdyn.F90
@@ -197,10 +197,10 @@ CONTAINS
       IF( ii == ii0  .AND.  ij == ij0  )   RETURN           ! berg remains in the same cell
       !
       ! map into current processor
-      ii0 = mi1( ii0 )
-      ij0 = mj1( ij0 )
-      ii  = mi1( ii  )
-      ij  = mj1( ij  )
+      ii0 = mi1( ii0, nn_hls )
+      ij0 = mj1( ij0, nn_hls )
+      ii  = mi1( ii , nn_hls )
+      ij  = mj1( ij , nn_hls )
       !
       ! assume icb is grounded if tmask(ii,ij,1) or tmask(ii,ij,ikb), depending of the option is not 0
       IF ( ln_M2016 .AND. ln_icb_grd ) THEN
diff --git a/src/OCE/ICB/icbini.F90 b/src/OCE/ICB/icbini.F90
index d7bd2624..0fd18388 100644
--- a/src/OCE/ICB/icbini.F90
+++ b/src/OCE/ICB/icbini.F90
@@ -140,7 +140,7 @@ CONTAINS
 
       DO_2D( 1, 1, 1, 1 )
          src_calving_hflx(ji,jj) = narea
-         src_calving     (ji,jj) = nicbpack * mjg(jj) + mig(ji)
+         src_calving     (ji,jj) = nicbpack * mjg(jj,nn_hls) + mig(ji,nn_hls)
       END_2D
       CALL lbc_lnk( 'icbini', src_calving_hflx, 'T', 1._wp )
       CALL lbc_lnk( 'icbini', src_calving     , 'T', 1._wp )
@@ -156,7 +156,7 @@ CONTAINS
          i2 = INT( i3/nicbpack )
          i1 = i3 - i2*nicbpack
          i3 = INT( src_calving_hflx(ji,jj) )
-         IF( i1 == mig(ji) .AND. i3 == narea ) THEN
+         IF( i1 == mig(ji,nn_hls) .AND. i3 == narea ) THEN
             IF( nicbdi < 0 ) THEN   ;   nicbdi = ji
             ELSE                    ;   nicbei = ji
             ENDIF
@@ -172,7 +172,7 @@ CONTAINS
          i2 = INT( i3/nicbpack )
          i1 = i3 - i2*nicbpack
          i3 = INT( src_calving_hflx(ji,jj) )
-         IF( i2 == mjg(jj) .AND. i3 == narea ) THEN
+         IF( i2 == mjg(jj,nn_hls) .AND. i3 == narea ) THEN
             IF( nicbdj < 0 ) THEN   ;   nicbdj = jj
             ELSE                    ;   nicbej = jj
             ENDIF
@@ -361,8 +361,8 @@ CONTAINS
                 rn_test_box(1) < glamt(ji,jj) .AND. glamt(ji,jj) < rn_test_box(2) .AND.   &
                 rn_test_box(3) < gphit(ji,jj) .AND. gphit(ji,jj) < rn_test_box(4) ) THEN
                localberg%mass_scaling = rn_mass_scaling(iberg)
-               localpt%xi = REAL( mig(ji) - (nn_hls-1), wp )
-               localpt%yj = REAL( mjg(jj) - (nn_hls-1), wp )
+               localpt%xi = REAL( mig(ji,nn_hls) - (nn_hls-1), wp )
+               localpt%yj = REAL( mjg(jj,nn_hls) - (nn_hls-1), wp )
                CALL icb_utl_interp( localpt%xi, localpt%yj, plat=localpt%lat, plon=localpt%lon )   
                localpt%mass      = rn_initial_mass     (iberg)
                localpt%thickness = rn_initial_thickness(iberg)
diff --git a/src/OCE/ICB/icblbc.F90 b/src/OCE/ICB/icblbc.F90
index fa901486..6a8823f1 100644
--- a/src/OCE/ICB/icblbc.F90
+++ b/src/OCE/ICB/icblbc.F90
@@ -90,9 +90,9 @@ CONTAINS
          this => first_berg
          DO WHILE( ASSOCIATED(this) )
             pt => this%current_point
-            IF( pt%xi > REAL(mig(nicbei),wp) + 0.5_wp ) THEN
+            IF( pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp ) THEN
                pt%xi = ricb_right + MOD(pt%xi, 1._wp ) - 1._wp
-            ELSE IF( pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp ) THEN
+            ELSE IF( pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp ) THEN
                pt%xi = ricb_left + MOD(pt%xi, 1._wp )
             ENDIF
             this => this%next
@@ -125,10 +125,10 @@ CONTAINS
       DO WHILE( ASSOCIATED(this) )
          pt => this%current_point
          ijne = INT( pt%yj + 0.5 )
-         IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp ) THEN
+         IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp ) THEN
             !
             iine = INT( pt%xi + 0.5 )
-            ipts  = nicbfldpts (mi1(iine))
+            ipts  = nicbfldpts (mi1(iine,nn_hls))
             !
             ! moving across the cut line means both position and
             ! velocity must change
@@ -228,7 +228,7 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( ipe_E >= 0 .AND. pt%xi > REAL(mig(nicbei),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( ipe_E >= 0 .AND. pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_e = ibergs_to_send_e + 1
@@ -241,7 +241,7 @@ CONTAINS
                ! now pack it into buffer and delete from list
                CALL icb_pack_into_buffer( tmpberg, obuffer_e, ibergs_to_send_e)
                CALL icb_utl_delete(first_berg, tmpberg)
-            ELSE IF( ipe_W >= 0 .AND. pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp - (nn_hls-1) ) THEN
+            ELSE IF( ipe_W >= 0 .AND. pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_w = ibergs_to_send_w + 1
@@ -320,7 +320,7 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( ipe_N >= 0 .AND. pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( ipe_N >= 0 .AND. pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_n = ibergs_to_send_n + 1
@@ -330,7 +330,7 @@ CONTAINS
                ENDIF
                CALL icb_pack_into_buffer( tmpberg, obuffer_n, ibergs_to_send_n)
                CALL icb_utl_delete(first_berg, tmpberg)
-            ELSE IF( ipe_S >= 0 .AND. pt%yj < REAL(mjg(nicbdj),wp) - 0.5_wp - (nn_hls-1) ) THEN
+            ELSE IF( ipe_S >= 0 .AND. pt%yj < REAL(mjg(nicbdj,nn_hls),wp) - 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_s = ibergs_to_send_s + 1
@@ -441,10 +441,10 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp - (nn_hls-1) .OR. &
-                pt%xi > REAL(mig(nicbei),wp) + 0.5_wp - (nn_hls-1) .OR. &
-                pt%yj < REAL(mjg(nicbdj),wp) - 0.5_wp - (nn_hls-1) .OR. &
-                pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp - (nn_hls-1) .OR. &
+                pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp - (nn_hls-1) .OR. &
+                pt%yj < REAL(mjg(nicbdj,nn_hls),wp) - 0.5_wp - (nn_hls-1) .OR. &
+                pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                i = i + 1
                WRITE(numicb,*) 'berg lost in halo: ', this%number(:)
                WRITE(numicb,*) '                   ', nimpp, njmpp
@@ -514,8 +514,8 @@ CONTAINS
                DO WHILE (ASSOCIATED(this))
                   pt => this%current_point
                   iine = INT( pt%xi + 0.5 ) + (nn_hls-1)
-                  iproc = nicbflddest(mi1(iine))
-                  IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+                  iproc = nicbflddest(mi1(iine,nn_hls))
+                  IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                      IF( iproc == ifldproc ) THEN
                         !
                         IF( iproc /= narea ) THEN
@@ -593,9 +593,9 @@ CONTAINS
                   pt => this%current_point
                   iine = INT( pt%xi + 0.5 ) + (nn_hls-1)
                   ijne = INT( pt%yj + 0.5 ) + (nn_hls-1)
-                  ipts  = nicbfldpts (mi1(iine))
-                  iproc = nicbflddest(mi1(iine))
-                  IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+                  ipts  = nicbfldpts (mi1(iine,nn_hls))
+                  iproc = nicbflddest(mi1(iine,nn_hls))
+                  IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                      IF( iproc == ifldproc ) THEN
                         !
                         ! moving across the cut line means both position and
diff --git a/src/OCE/ICB/icbrst.F90 b/src/OCE/ICB/icbrst.F90
index 092b56e5..9e756019 100644
--- a/src/OCE/ICB/icbrst.F90
+++ b/src/OCE/ICB/icbrst.F90
@@ -90,8 +90,8 @@ CONTAINS
             ii = INT( localpt%xi + 0.5 ) + ( nn_hls-1 )
             ij = INT( localpt%yj + 0.5 ) + ( nn_hls-1 )
             ! Only proceed if this iceberg is on the local processor (excluding halos).
-            IF ( ii >= mig(Nis0) .AND. ii <= mig(Nie0) .AND.   &
-           &     ij >= mjg(Njs0) .AND. ij <= mjg(Nje0) ) THEN           
+            IF ( ii >= mig(Nis0,nn_hls) .AND. ii <= mig(Nie0,nn_hls) .AND.   &
+           &     ij >= mjg(Njs0,nn_hls) .AND. ij <= mjg(Nje0,nn_hls) ) THEN           
 
                CALL iom_get( ncid, jpdom_unknown, 'number', zdata(:) , ktime=jn, kstart=(/1/), kcount=(/nkounts/) )
                localberg%number(:) = INT(zdata(:))
@@ -244,16 +244,16 @@ CONTAINS
          ! global attributes
          IF( lk_mpp ) THEN
             ! Set domain parameters (assume jpdom_local_full)
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                        )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                      )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1         , 2          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo    , Nj0glo     /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0      , Nj_0       /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig0(Nie0), mjg0(Nje0) /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0         , 0          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0         , 0          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                        )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                          )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                        )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1          , 2           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo     , Nj0glo      /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0       , Nj_0        /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig(Nis0,0), mjg(Njs0,0) /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig(Nie0,0), mjg(Nje0,0) /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0          , 0           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0          , 0           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                          )
          ENDIF
          
          IF (associated(first_berg)) then
diff --git a/src/OCE/ICB/icbthm.F90 b/src/OCE/ICB/icbthm.F90
index c39500db..200e915b 100644
--- a/src/OCE/ICB/icbthm.F90
+++ b/src/OCE/ICB/icbthm.F90
@@ -31,6 +31,8 @@ MODULE icbthm
 
    PUBLIC   icb_thm ! routine called in icbstp.F90 module
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"   
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: icbthm.F90 15088 2021-07-06 13:03:34Z acc $
@@ -48,7 +50,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! timestep number, just passed to icb_utl_print_berg
       !
-      INTEGER  ::   ii, ij, jk, ikb
+      INTEGER  ::   ii, ij, ji, jj, jk, ikb
       REAL(wp) ::   zM, zT, zW, zL, zSST, zVol, zLn, zWn, zTn, znVol, zIC, zDn, zD, zvb, zub, ztb
       REAL(wp) ::   zMv, zMe, zMb, zmelt, zdvo, zdvob, zdva, zdM, zSs, zdMe, zdMb, zdMv
       REAL(wp) ::   zSSS, zfzpt
@@ -112,9 +114,9 @@ CONTAINS
          zxi  = pt%xi                                      ! position in (i,j) referential
          zyj  = pt%yj
          ii  = INT( zxi + 0.5 )                            ! T-cell of the berg
-         ii  = mi1( ii + (nn_hls-1) )
+         ii  = mi1( ii + (nn_hls-1), nn_hls )
          ij  = INT( zyj + 0.5 )              
-         ij  = mj1( ij + (nn_hls-1) )
+         ij  = mj1( ij + (nn_hls-1), nn_hls )
          zVol = zT * zW * zL
 
          ! Environment
@@ -287,8 +289,10 @@ CONTAINS
       ! now use melt and associated heat flux in ocean (or not)
       !
       IF(.NOT. ln_passive_mode ) THEN
-         emp (:,:) = emp (:,:) - berg_grid%floating_melt(:,:)
-         qns (:,:) = qns (:,:) + berg_grid%calving_hflx (:,:)  
+         DO_2D( 0, 0, 0, 0 )
+            emp(ji,jj) = emp(ji,jj) - berg_grid%floating_melt(ji,jj)
+            qns(ji,jj) = qns(ji,jj) + berg_grid%calving_hflx (ji,jj)
+         END_2D
       ENDIF
       !
    END SUBROUTINE icb_thm
diff --git a/src/OCE/ICB/icbutl.F90 b/src/OCE/ICB/icbutl.F90
index 873245fc..780d05df 100644
--- a/src/OCE/ICB/icbutl.F90
+++ b/src/OCE/ICB/icbutl.F90
@@ -26,8 +26,8 @@ MODULE icbutl
    USE icb_oce                             ! define iceberg arrays
    USE sbc_oce                             ! ocean surface boundary conditions
 #if defined key_si3
-   USE ice,    ONLY: u_ice, v_ice, hm_i    ! SI3 variables
-   USE icevar                              ! ice_var_sshdyn
+   USE ice,    ONLY: u_ice, v_ice, at_i, vt_i ! SI3 variables
+   USE icevar                                 ! ice_var_sshdyn
    USE sbc_ice, ONLY: snwice_mass, snwice_mass_b
 #endif
 
@@ -57,6 +57,7 @@ MODULE icbutl
    PUBLIC   icb_utl_heat          ! routine called in icbdia module
 
    !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -101,7 +102,11 @@ CONTAINS
       CALL lbc_lnk_icb( 'icbutl', ua_e , 'U', -1._wp, 1, 1 )
       CALL lbc_lnk_icb( 'icbutl', va_e , 'V', -1._wp, 1, 1 )
 #if defined key_si3
-      hi_e(1:jpi, 1:jpj) = hm_i (:,:)  
+      WHERE( at_i(:,:) /= 0._wp )
+         hi_e(1:jpi,1:jpj) = vt_i(:,:) / at_i(:,:)
+      ELSEWHERE
+         hi_e(1:jpi,1:jpj) = 0._wp         
+      ENDWHERE
       ui_e(1:jpi, 1:jpj) = u_ice(:,:)
       vi_e(1:jpi, 1:jpj) = v_ice(:,:)
       !      
@@ -312,18 +317,18 @@ CONTAINS
       !
       IF (TRIM(cd_type) == 'T' ) THEN
          ierr = 0
-         IF    ( kii <  mig( 1 ) ) THEN   ;  ierr = ierr + 1
-         ELSEIF( kii >= mig(jpi) ) THEN   ;  ierr = ierr + 1
+         IF    ( kii <  mig( 1 ,nn_hls) ) THEN   ;  ierr = ierr + 1
+         ELSEIF( kii >= mig(jpi,nn_hls) ) THEN   ;  ierr = ierr + 1
          ENDIF
          !
-         IF    ( kij <  mjg( 1 ) ) THEN   ;   ierr = ierr + 1
-         ELSEIF( kij >= mjg(jpj) ) THEN   ;   ierr = ierr + 1
+         IF    ( kij <  mjg( 1 ,nn_hls) ) THEN   ;   ierr = ierr + 1
+         ELSEIF( kij >= mjg(jpj,nn_hls) ) THEN   ;   ierr = ierr + 1
          ENDIF
          !
          IF ( ierr > 0 ) THEN
             WRITE(numicb,*) 'bottom left corner T point out of bound'
-            WRITE(numicb,*) pi, kii, mig( 1 ), mig(jpi)
-            WRITE(numicb,*) pj, kij, mjg( 1 ), mjg(jpj)
+            WRITE(numicb,*) pi, kii, mig( 1,nn_hls ), mig(jpi,nn_hls)
+            WRITE(numicb,*) pj, kij, mjg( 1,nn_hls ), mjg(jpj,nn_hls)
             WRITE(numicb,*) pmsk
             CALL FLUSH(numicb)
             CALL ctl_stop('STOP','icb_utl_bilin_e: an icebergs coordinates is out of valid range (out of bound error).'       , &
@@ -335,13 +340,13 @@ CONTAINS
       ! find position in this processor. Prevent near edge problems (see #1389)
       ! (PM) will be useless if extra halo is used in NEMO
       !
-      IF    ( kii <= mig(1)-1 ) THEN   ;   kii = 0
-      ELSEIF( kii  > mig(jpi) ) THEN   ;   kii = jpi
-      ELSE                             ;   kii = mi1(kii)
+      IF    ( kii <= mig(1,nn_hls)-1 ) THEN   ;   kii = 0
+      ELSEIF( kii  > mig(jpi,nn_hls) ) THEN   ;   kii = jpi
+      ELSE                                    ;   kii = mi1(kii,nn_hls)
       ENDIF
-      IF    ( kij <= mjg(1)-1 ) THEN   ;   kij = 0
-      ELSEIF( kij  > mjg(jpj) ) THEN   ;   kij = jpj
-      ELSE                             ;   kij = mj1(kij)
+      IF    ( kij <= mjg(1,nn_hls)-1 ) THEN   ;   kij = 0
+      ELSEIF( kij  > mjg(jpj,nn_hls) ) THEN   ;   kij = jpj
+      ELSE                                    ;   kij = mj1(kij,nn_hls)
       ENDIF
       !
       ! define mask array 
@@ -462,8 +467,8 @@ CONTAINS
       zj = pj - REAL(ij,wp)
 
       ! conversion to local domain (no need to do a sanity check already done in icbpos)
-      ii = mi1(ii) + (nn_hls-1)
-      ij = mj1(ij) + (nn_hls-1)
+      ii = mi1(ii,nn_hls) + (nn_hls-1)
+      ij = mj1(ij,nn_hls) + (nn_hls-1)
       !
       IF(    0.0_wp <= zi .AND. zi < 0.5_wp   ) THEN
          IF( 0.0_wp <= zj .AND. zj < 0.5_wp        )   THEN        !  NE quadrant
diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index 8a1b561b..6244df8c 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -469,11 +469,11 @@ CONTAINS
       CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart')
       IF(nxioso.eq.1) THEN
          CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&
-                                       mode="write", output_freq=xios_timestep)
+                                   mode="write", output_freq=xios_timestep)
          IF(lwp) write(numout,*) 'OPEN ', TRIM(cdrst_file), ' in one_file mode'
       ELSE
          CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&
-                                            mode="write", output_freq=xios_timestep)
+                                   mode="write", output_freq=xios_timestep, min_digits=4)
          IF(lwp) write(numout,*) 'OPEN ', TRIM(cdrst_file), ' in multiple_file mode'
       ENDIF
       CALL xios_set_file_attr( "wrestart", name=TRIM(cdrst_file))
@@ -498,6 +498,8 @@ CONTAINS
       REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :)    :: rs2
       REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rd3
       REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rs3
+      CHARACTER(len=30)                                  :: clgsuf
+      INTEGER, DIMENSION(2)                              :: ihls
 #if defined key_xios
       TYPE(xios_field) :: field_hdl
       TYPE(xios_file) :: file_hdl
@@ -506,40 +508,66 @@ CONTAINS
 !define fields for restart context
       CALL xios_add_child(file_hdl, field_hdl, sdfield)
 
+      ! Determine number of halo points
+      IF(     PRESENT(rd3) ) THEN
+         ihls = arr_hls( SIZE(rd3, 1), SIZE(rd3, 2), ldsize=.TRUE. )
+      ELSEIF( PRESENT(rs3) ) THEN
+         ihls = arr_hls( SIZE(rs3, 1), SIZE(rs3, 2), ldsize=.TRUE. )
+      ELSEIF( PRESENT(rd2) ) THEN
+         ihls = arr_hls( SIZE(rd2, 1), SIZE(rd2, 2), ldsize=.TRUE. )
+      ELSEIF( PRESENT(rs2) ) THEN
+         ihls = arr_hls( SIZE(rs2, 1), SIZE(rs2, 2), ldsize=.TRUE. )
+      ELSE
+         ihls(:) = 0
+      ENDIF
+
+      ! Choose horizontal grid based on number of halo points
+      IF(     ihls(1) == 0      .AND. ihls(2) == 0      ) THEN     ! Inner domain only
+         clgsuf = "_inner"
+      ELSEIF( ihls(1) == nn_hls .AND. ihls(2) == nn_hls ) THEN     ! nn_hls halo points
+         clgsuf = ""
+      ELSEIF( ihls(1) == 1      .AND. ihls(2) == 1      ) THEN     ! 1 halo point, nn_hls > 1
+         clgsuf = "_halo1"
+      ELSE
+         WRITE(ctmp1,*) 'iom_set_rstw_active: unsupported array shape with number of i-j halo points:'
+         WRITE(ctmp2,*) ihls(1), 'x', ihls(2)
+         CALL ctl_stop(ctmp1, ctmp2)
+      ENDIF
+
       IF(PRESENT(rd3)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             domain_ref = "grid_N",                       &
-                             axis_ref = iom_axis(size(rd3, 3)),           &
-                             prec = 8, operation = "instant"              )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             domain_ref = "grid_N"//TRIM(clgsuf),           &
+                             axis_ref = iom_axis(size(rd3, 3)),             &
+                             prec = 8, operation = "instant"                )
       ELSEIF(PRESENT(rs3)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             domain_ref = "grid_N",                       &
-                             axis_ref = iom_axis(size(rd3, 3)),           &
-                             prec = 4, operation = "instant"              )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             domain_ref = "grid_N"//TRIM(clgsuf),           &
+                             axis_ref = iom_axis(size(rd3, 3)),             &
+                             prec = 4, operation = "instant"                )
       ELSEIF(PRESENT(rd2)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             domain_ref = "grid_N", prec = 8,             &
-                             operation = "instant"                        )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             domain_ref = "grid_N"//TRIM(clgsuf), prec = 8, &
+                             operation = "instant"                          )
       ELSEIF(PRESENT(rs2)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             domain_ref = "grid_N", prec = 4,             &
-                             operation = "instant"                        )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             domain_ref = "grid_N"//TRIM(clgsuf), prec = 4, &
+                             operation = "instant"                          )
       ELSEIF(PRESENT(rd1)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             axis_ref = iom_axis(size(rd1, 1)),           &
-                             prec = 8, operation = "instant"              )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             axis_ref = iom_axis(size(rd1, 1)),             &
+                             prec = 8, operation = "instant"                )
       ELSEIF(PRESENT(rs1)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             axis_ref = iom_axis(size(rd1, 1)),           &
-                             prec = 4, operation = "instant"              )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             axis_ref = iom_axis(size(rd1, 1)),             &
+                             prec = 4, operation = "instant"                )
       ELSEIF(PRESENT(rd0)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             scalar_ref = "grid_scalar", prec = 8,        &
-                             operation = "instant"                        )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             scalar_ref = "grid_scalar", prec = 8,          &
+                             operation = "instant"                          )
       ELSEIF(PRESENT(rs0)) THEN
-         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, &
-                             scalar_ref = "grid_scalar", prec = 4,        &
-                             operation = "instant"                        )
+         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
+                             scalar_ref = "grid_scalar", prec = 4,          &
+                             operation = "instant"                          )
       ENDIF
 #endif
    END SUBROUTINE iom_set_rstw_active
@@ -615,6 +643,10 @@ CONTAINS
 
       CALL xios_get_handle("domain_definition",domaingroup_hdl)
       CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")
+      CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N_halo1")
+      CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N_inner")
+      CALL xios_set_domain_attr("grid_N_halo1", name="grid_N")
+      CALL xios_set_domain_attr("grid_N_inner", name="grid_N")
       CALL set_grid("N", glamt, gphit, .TRUE., ld_rstr)
 
       CALL xios_get_handle("axis_definition",axisgroup_hdl)
@@ -1203,6 +1235,7 @@ CONTAINS
       INTEGER                        ::   ji, jj      ! loop counters
       INTEGER                        ::   irankpv     !
       INTEGER                        ::   ind1, ind2  ! substring index
+      INTEGER, DIMENSION(2)          ::   ihls        ! halo size determined from array shape (XIOS only)
       INTEGER, DIMENSION(jpmax_dims) ::   istart      ! starting point to read for each axis
       INTEGER, DIMENSION(jpmax_dims) ::   icnt        ! number of value to read along each axis
       INTEGER, DIMENSION(jpmax_dims) ::   idimsz      ! size of the dimensions of the variable
@@ -1217,12 +1250,25 @@ CONTAINS
       LOGICAL                        ::   ll_only3rd  ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension.
       INTEGER                        ::   inlev       ! number of levels for 3D data
       REAL(dp)                       ::   gma, gmi
+      REAL(dp), DIMENSION(:,:),   ALLOCATABLE  ::   zwrk2d  ! temporary arrays for reading into an array
+      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE  ::   zwrk3d  ! smaller than jpi-jpj (XIOS only)
       !---------------------------------------------------------------------
       CHARACTER(LEN=lc)                               ::   context
       !
       CALL set_xios_context(kiomid, context)
+      ! Array shape information
       inlev = -1
-      IF( PRESENT(pv_r3d) )   inlev = SIZE(pv_r3d, 3)
+      IF( PRESENT(pv_r1d) ) THEN
+         irankpv = 1
+         ishape(1:1) = SHAPE(pv_r1d)
+      ELSE IF( PRESENT(pv_r2d) ) THEN
+         irankpv = 2
+         ishape(1:2) = SHAPE(pv_r2d)
+      ELSE IF( PRESENT(pv_r3d) ) THEN
+         irankpv = 3
+         ishape(1:3) = SHAPE(pv_r3d)
+         inlev = ishape(3)
+      ENDIF
       !
       idom = kdom
       istop = nstop
@@ -1264,7 +1310,6 @@ CONTAINS
             itime = 1
             IF( PRESENT(ktime) ) itime = ktime
             !
-            irankpv = 1 * COUNT( (/PRESENT(pv_r1d)/) ) + 2 * COUNT( (/PRESENT(pv_r2d)/) ) + 3 * COUNT( (/PRESENT(pv_r3d)/) )
             WRITE(clrankpv, fmt='(i1)') irankpv
             WRITE(cldmspc , fmt='(i1)') idmspc
             !
@@ -1312,7 +1357,7 @@ CONTAINS
                ENDIF
             ELSE   !   not a 1D array as pv_r1d requires jpdom_unknown
                ! we do not read the overlap and the extra-halos -> from Nis0 to Nie0 and from Njs0 to Nje0
-               IF( idom == jpdom_global )   istart(1:2) = (/ mig0(Nis0), mjg0(Njs0) /)
+               IF( idom == jpdom_global )   istart(1:2) = (/ mig(Nis0,0), mjg(Njs0,0) /)
                icnt(1:2) = (/ Ni_0, Nj_0 /)
                IF( PRESENT(pv_r3d) ) THEN
                   IF( idom == jpdom_auto_xy ) THEN
@@ -1338,17 +1383,24 @@ CONTAINS
             ! check that icnt matches the input array
             !-
             IF( idom == jpdom_unknown ) THEN
-               IF( irankpv == 1 )        ishape(1:1) = SHAPE(pv_r1d)
-               IF( irankpv == 2 )        ishape(1:2) = SHAPE(pv_r2d)
-               IF( irankpv == 3 )        ishape(1:3) = SHAPE(pv_r3d)
+               ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1   ;   iy2 = icnt(2)         ! index of the array to be read
                ctmp1 = 'd'
             ELSE
-               IF( irankpv == 2 ) THEN
-                  ishape(1:2) = SHAPE(pv_r2d(Nis0:Nie0,Njs0:Nje0  ))   ;   ctmp1 = 'd(Nis0:Nie0,Njs0:Nje0)'
-               ENDIF
-               IF( irankpv == 3 ) THEN
-                  ishape(1:3) = SHAPE(pv_r3d(Nis0:Nie0,Njs0:Nje0,:))   ;   ctmp1 = 'd(Nis0:Nie0,Njs0:Nje0,:)'
+               IF(     ishape(1) == Ni_0   .AND. ishape(2) == Nj_0   ) THEN           ! array with 0 halo
+                  ix1 = 1      ;   ix2 = Ni_0     ;   iy1 = 1      ;   iy2 = Nj_0     ! index of the array to be read
+                  ctmp1 = 'd(:,:'
+               ELSEIF( ishape(1) == jpi    .AND. ishape(2) == jpj    ) THEN           ! array with nn_hls halos
+                  ix1 = Nis0   ;   ix2 = Nie0     ;   iy1 = Njs0   ;   iy2 = Nje0     ! index of the array to be read
+                  ctmp1 = 'd(Nis0:Nie0,Njs0:Nje0'
+               ELSEIF( ishape(1) == Ni_0+2 .AND. ishape(2) == Nj_0+2 ) THEN           ! nn_hls = 2 and array with 1 halo
+                  ix1 = 2      ;   ix2 = Ni_0+1   ;   iy1 = 2      ;   iy2 = Nj_0+1   ! index of the array to be read
+                  ctmp1 = 'd(2:Ni_0+1,2:Ni_0+1'
+               ELSE
+                  CALL ctl_stop( 'iom_get_123d: should have been an impossible case...' )
                ENDIF
+               ishape(1:2) = (/ Ni_0, Nj_0 /)   ! update and force ishape to match the inner domain
+               IF( irankpv == 3 )   ctmp1 = TRIM(ctmp1)//',:'
+               ctmp1 = TRIM(ctmp1)//')'
             ENDIF
             DO jl = 1, irankpv
                WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl)
@@ -1361,11 +1413,6 @@ CONTAINS
          !-
          IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point...
             !
-            ! find the right index of the array to be read
-            IF( idom /= jpdom_unknown ) THEN   ;   ix1 = Nis0   ;   ix2 = Nie0      ;   iy1 = Njs0   ;   iy2 = Nje0
-            ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2)
-            ENDIF
-
             CALL iom_nf90_get( kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2, pv_r1d, pv_r2d, pv_r3d )
 
             IF( istop == nstop ) THEN   ! no additional errors until this point...
@@ -1373,13 +1420,15 @@ CONTAINS
 
                cl_type = 'T'
                IF( PRESENT(cd_type) )   cl_type = cd_type
-               zsgn = 1._wp
-               IF( PRESENT(psgn   ) )   zsgn    = psgn
-               !--- overlap areas and extra hallows (mpp)
-               IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-                  CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill )
-               ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-                  CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill )
+               !--- halos and NP folding (NP folding to be done even if no halos)
+               IF( idom /= jpdom_unknown .AND. cl_type /= 'Z' .AND. ( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) ) THEN
+                  zsgn = 1._wp
+                  IF( PRESENT(psgn   ) )   zsgn    = psgn
+                  IF(     PRESENT(pv_r2d) ) THEN
+                     CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
+                  ELSEIF( PRESENT(pv_r3d) ) THEN
+                     CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
+                  ENDIF
                ENDIF
                !
             ELSE
@@ -1401,17 +1450,40 @@ CONTAINS
          cl_type = 'T'
          IF( PRESENT(cd_type) )   cl_type = cd_type
 
+         ! We do not know whether pv_r[23]d will have halo points during context initialisation in iom_set_vars_active,
+         ! so we must always read to an array on the full grid (1:jpi,1:jpj), then copy the correct part to pv_r[23]d
+         IF( irankpv > 1 .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
+            llok = (ishape(1) == jpi) .AND. (ishape(2) == jpj)
+            ihls = arr_hls( ishape(1), ishape(2), ldtile=.FALSE., ldsize=.TRUE. )
+         ELSE
+            llok = .TRUE.
+         ENDIF
+
          IF( PRESENT(pv_r3d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (3D): ',TRIM(cdvar)
-            CALL xios_recv_field( TRIM(cdvar), pv_r3d(:, :, :))
+            IF( .NOT. llok ) THEN
+               ALLOCATE( zwrk3d(jpi,jpj,inlev) )
+               CALL xios_recv_field( trim(cdvar), zwrk3d(:,:,:) )
+               pv_r3d(:,:,:) = zwrk3d(A1Di(ihls(1)),A1Dj(ihls(2)),:)
+               DEALLOCATE( zwrk3d )
+            ELSE
+               CALL xios_recv_field( trim(cdvar), pv_r3d(:,:,:) )
+            ENDIF
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-               CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill)
+               CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
             ENDIF
          ELSEIF( PRESENT(pv_r2d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (2D): ', TRIM(cdvar)
-            CALL xios_recv_field( TRIM(cdvar), pv_r2d(:, :))
+            IF( .NOT. llok ) THEN
+               ALLOCATE( zwrk2d(jpi,jpj) )
+               CALL xios_recv_field( trim(cdvar), zwrk2d(:,:) )
+               pv_r2d(:,:) = zwrk2d(A1Di(ihls(1)),A1Dj(ihls(2)))
+               DEALLOCATE( zwrk2d )
+            ELSE
+               CALL xios_recv_field( trim(cdvar), pv_r2d(:,:) )
+            ENDIF
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-               CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill)
+               CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
             ENDIF
          ELSEIF( PRESENT(pv_r1d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (1D): ', TRIM(cdvar)
@@ -2035,7 +2107,7 @@ CONTAINS
       REAL(sp),     DIMENSION(:,:), INTENT(in) ::   pfield2d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield2d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield2d, 1), SIZE(pfield2d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield2d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield2d )
@@ -2051,7 +2123,7 @@ CONTAINS
       REAL(dp),     DIMENSION(:,:), INTENT(in) ::   pfield2d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield2d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield2d, 1), SIZE(pfield2d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield2d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield2d )
@@ -2067,7 +2139,7 @@ CONTAINS
       REAL(sp),       DIMENSION(:,:,:), INTENT(in) ::   pfield3d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield3d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield3d, 1), SIZE(pfield3d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield3d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield3d )
@@ -2083,7 +2155,7 @@ CONTAINS
       REAL(dp),       DIMENSION(:,:,:), INTENT(in) ::   pfield3d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield3d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield3d, 1), SIZE(pfield3d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield3d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield3d )
@@ -2099,7 +2171,7 @@ CONTAINS
       REAL(sp),       DIMENSION(:,:,:,:), INTENT(in) ::   pfield4d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield4d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield4d, 1), SIZE(pfield4d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield4d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield4d )
@@ -2115,7 +2187,7 @@ CONTAINS
       REAL(dp),       DIMENSION(:,:,:,:), INTENT(in) ::   pfield4d
       IF( iom_use(cdname) ) THEN
 #if defined key_xios
-         IF( is_tile(pfield4d) == 1 ) THEN
+         IF( is_tile(SIZE(pfield4d, 1), SIZE(pfield4d, 2)) ) THEN
             CALL xios_send_field( cdname, pfield4d, ntile - 1 )
          ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
             CALL xios_send_field( cdname, pfield4d )
@@ -2338,18 +2410,24 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plon
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat
       !
-      REAL(wp), DIMENSION(A2D(0),jpk) ::   zmask
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zmask
       INTEGER :: jn
       INTEGER, DIMENSION(nijtile) :: ini, inj, idb
       LOGICAL, INTENT(IN) :: ldxios, ldrxios
       !!----------------------------------------------------------------------
       !
-      CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig0(Nis0)-1,jbegin=mjg0(Njs0)-1,ni=Ni_0,nj=Nj_0)
-      CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = -nn_hls, data_ni=jpi, data_jbegin = -nn_hls, data_nj=jpj)
-
-      CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", ni_glo = Ni0glo, nj_glo = Nj0glo,   &
-         &                     ibegin = mig0(Nis0) - 1, jbegin = mjg0(Njs0) - 1, ni = Ni_0, nj = Nj_0)
-      CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", data_dim=2, data_ibegin = 0, data_ni=Ni_0, data_jbegin = 0, data_nj=Nj_0)
+      ! nn_hls halo points
+      CALL iom_set_domain_attr("grid_"//cdgrd,                                                                             &
+         &                     ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig(Nis0,0)-1, jbegin=mjg(Njs0,0)-1, ni=Ni_0, nj=Nj_0, &
+         &                     data_dim=2, data_ibegin=-nn_hls, data_ni=jpi,    data_jbegin=-nn_hls, data_nj=jpj    )
+      ! 1 halo point, nn_hls > 1
+      CALL iom_set_domain_attr("grid_"//cdgrd//"_halo1",                                                                   &
+         &                     ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig(Nis0,0)-1, jbegin=mjg(Njs0,0)-1, ni=Ni_0, nj=Nj_0, &
+         &                     data_dim=2, data_ibegin=-1,      data_ni=Ni_0+2, data_jbegin=-1,      data_nj=Nj_0+2 )
+      ! Inner domain only
+      CALL iom_set_domain_attr("grid_"//cdgrd//"_inner",                                                                   &
+         &                     ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig(Nis0,0)-1, jbegin=mjg(Njs0,0)-1, ni=Ni_0, nj=Nj_0, &
+         &                     data_dim=2, data_ibegin=0,       data_ni=Ni_0,   data_jbegin=0,       data_nj=Nj_0   )
 
       IF( ln_tile ) THEN
          DO jn = 1, nijtile
@@ -2358,14 +2436,23 @@ CONTAINS
             idb(jn) = -nn_hls                         ! Tile data offset (halo size)
          END DO
 
-         ! Tile_[ij]begin are defined with respect to the processor data domain, so data_[ij]begin is added
+         ! Data includes all halo points
          CALL iom_set_domain_attr("grid_"//cdgrd, ntiles=nijtile,                                     &
-            & tile_ibegin=ntsi_a(1:nijtile) + idb(:) - 1, tile_jbegin=ntsj_a(1:nijtile) + idb(:) - 1, &
+            & tile_ibegin=ntsi_a(1:nijtile) - nn_hls - 1, tile_jbegin=ntsj_a(1:nijtile) - nn_hls - 1, &
+            & tile_ni=ini(:), tile_nj=inj(:),                                                         &
+            & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:),                                       &
+            & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:))
+         ! Data contains one halo point (less than nn_hls)
+         idb(:) = -1
+         CALL iom_set_domain_attr("grid_"//cdgrd//"_halo1", ntiles=nijtile,                           &
+            & tile_ibegin=ntsi_a(1:nijtile) - nn_hls - 1, tile_jbegin=ntsj_a(1:nijtile) - nn_hls - 1, &
             & tile_ni=ini(:), tile_nj=inj(:),                                                         &
             & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:),                                       &
             & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:))
+         ! Data contains no halo points
+         idb(:) = 0
          CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", ntiles=nijtile,                           &
-            & tile_ibegin=ntsi_a(1:nijtile) + idb(:) - 1, tile_jbegin=ntsj_a(1:nijtile) + idb(:) - 1, &
+            & tile_ibegin=ntsi_a(1:nijtile) - nn_hls - 1, tile_jbegin=ntsj_a(1:nijtile) - nn_hls - 1, &
             & tile_ni=ini(:), tile_nj=inj(:),                                                         &
             & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:),                                       &
             & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:))
@@ -2389,8 +2476,10 @@ CONTAINS
          END SELECT
          !
          CALL iom_set_domain_attr( "grid_"//cdgrd             , mask=RESHAPE(zmask(:,:,1),(/Ni_0*Nj_0    /)) /= 0. )
-         CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D"      , mask=RESHAPE(zmask(:,:,:),(/Ni_0,Nj_0,jpk/)) /= 0. )
+         CALL iom_set_domain_attr( "grid_"//cdgrd//"_halo1"   , mask=RESHAPE(zmask(:,:,1),(/Ni_0*Nj_0    /)) /= 0. )
          CALL iom_set_domain_attr( "grid_"//cdgrd//"_inner"   , mask=RESHAPE(zmask(:,:,1),(/Ni_0*Nj_0    /)) /= 0. )
+         CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D"      , mask=RESHAPE(zmask(:,:,:),(/Ni_0,Nj_0,jpk/)) /= 0. )
+         CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D_halo1", mask=RESHAPE(zmask(:,:,:),(/Ni_0,Nj_0,jpk/)) /= 0. )
          CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D_inner", mask=RESHAPE(zmask(:,:,:),(/Ni_0,Nj_0,jpk/)) /= 0. )
       ENDIF
       !
@@ -2428,7 +2517,7 @@ CONTAINS
       END SELECT
       !
       z_fld(:,:) = 1._wp
-      CALL lbc_lnk( 'iom', z_fld, cdgrd, -1.0_wp )    ! Working array for location of northfold
+      CALL lbc_lnk( 'iom', z_fld, cdgrd, -1.0_wp, ldfull = .TRUE. )    ! Working array for location of northfold
       !
       ! Cell vertices that can be defined
       DO_2D( 0, 0, 0, 0 )
@@ -2474,8 +2563,8 @@ CONTAINS
       !
 !      CALL dom_ngb( -168.53_wp, 65.03_wp, ix, iy, 'T' ) !  i-line that passes through Bering Strait: Reference latitude (used in plots)
       CALL dom_ngb( 180.0_wp, 90.0_wp, ix, iy, 'T' ) !  i-line that passes near the North Pole : Reference latitude (used in plots)
-      CALL iom_set_domain_attr("gznl", ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig0(Nis0)-1, jbegin=mjg0(Njs0)-1, ni=Ni_0, nj=Nj_0)
-      CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin = -nn_hls, data_ni = jpi, data_jbegin = -nn_hls, data_nj = jpj)
+      CALL iom_set_domain_attr("gznl", ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig(Nis0,0)-1, jbegin=mjg(Njs0,0)-1, ni=Ni_0, nj=Nj_0)
+      CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin=0, data_ni=Ni_0, data_jbegin=0, data_nj=Nj_0)
       CALL iom_set_domain_attr("gznl", lonvalue = real(zlon, dp),   &
          &                             latvalue = real(RESHAPE(plat(Nis0:Nie0, Njs0:Nje0),(/ Ni_0*Nj_0 /)),dp))
       CALL iom_set_zoom_domain_attr("ptr", ibegin=ix-1, jbegin=0, ni=1, nj=Nj0glo)
diff --git a/src/OCE/IOM/iom_nf90.F90 b/src/OCE/IOM/iom_nf90.F90
index c49d9538..38d9943c 100644
--- a/src/OCE/IOM/iom_nf90.F90
+++ b/src/OCE/IOM/iom_nf90.F90
@@ -40,6 +40,8 @@ MODULE iom_nf90
       MODULE PROCEDURE iom_nf90_rp0123d_dp
    END INTERFACE
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: iom_nf90.F90 14433 2021-02-11 08:06:49Z smasson $
@@ -144,16 +146,16 @@ CONTAINS
             END SELECT
                                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo)
             ! global attributes
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                        ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                      ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1        , 2           /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo    , Nj0glo     /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0      , Nj_0       /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig0(Nie0), mjg0(Nje0) /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0         , 0          /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0         , 0          /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                        ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                          ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_number'         , narea-1                        ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1         , 2            /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo     , Nj0glo      /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0       , Nj_0        /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig(Nis0,0), mjg(Njs0,0) /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig(Nie0,0), mjg(Nje0,0) /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0          , 0           /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0          , 0           /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                          ), clinfo)
          ELSE                          !* the file should be open for read mode so it must exist...
             CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' )
          ENDIF
@@ -544,7 +546,7 @@ CONTAINS
       INTEGER               :: idvar                ! variable id
       INTEGER               :: jd                   ! dimension loop counter
       INTEGER               :: ix1, ix2, iy1, iy2   ! subdomain indexes
-      INTEGER, DIMENSION(4) :: idimsz               ! dimensions size
+      INTEGER, DIMENSION(3) :: ishape               ! dimensions size
       INTEGER, DIMENSION(4) :: idimid               ! dimensions id
       CHARACTER(LEN=256)    :: clinfo               ! info character
       INTEGER               :: if90id               ! nf90 file identifier
@@ -627,11 +629,9 @@ CONTAINS
             itype = NF90_DOUBLE
          ENDIF
          IF( PRESENT(pv_r0d) ) THEN
-            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype,                    &
-               &                              iom_file(kiomid)%nvid(idvar) ), clinfo )
+            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype,                  iom_file(kiomid)%nvid(idvar) ), clinfo )
          ELSE
-            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype, idimid(1:idims),   &
-               &                              iom_file(kiomid)%nvid(idvar) ), clinfo )
+            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype, idimid(1:idims), iom_file(kiomid)%nvid(idvar) ), clinfo )
          ENDIF
          lchunk = .false.
          IF( snc4set%luse .AND. idims == 4 )   lchunk = .true.
@@ -673,23 +673,13 @@ CONTAINS
          ENDIF
          ! on what kind of domain must the data be written?
          IF( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) THEN
-            idimsz(1:2) = iom_file(kiomid)%dimsz(1:2,idvar)
-            IF(     idimsz(1) == Ni_0 .AND. idimsz(2) == Nj_0 ) THEN
-               ix1 = Nis0   ;   ix2 = Nie0   ;   iy1 = Njs0   ;   iy2 = Nje0
-            ELSEIF( idimsz(1) == jpi  .AND. idimsz(2) == jpj  ) THEN
-               ix1 = 1      ;   ix2 = jpi    ;   iy1 = 1      ;   iy2 = jpj
-            ELSEIF( idimsz(1) == jpi  .AND. idimsz(2) == jpj  ) THEN
-               ix1 = 1      ;   ix2 = jpi    ;   iy1 = 1      ;   iy2 = jpj
-            ELSE
-               CALL ctl_stop( 'iom_nf90_rp0123d: should have been an impossible case...' )
-            ENDIF
 
             ! write dimension variables if it is not already done
             ! =============
             ! trick: is defined to 0 => dimension variable are defined but not yet written
             IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN   ! time_counter = 0
-               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 1,                            glamt(ix1:ix2, iy1:iy2) ), clinfo )
-               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 2,                            gphit(ix1:ix2, iy1:iy2) ), clinfo )
+               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 1,                                      glamt(T2D(0)) ), clinfo )
+               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 2,                                      gphit(T2D(0)) ), clinfo )
                SELECT CASE (iom_file(kiomid)%comp)
                CASE ('OCE')
                   CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3,                                           gdept_1d ), clinfo )
@@ -704,6 +694,19 @@ CONTAINS
                iom_file(kiomid)%dimsz(1, 4) = 1   ! so we don't enter this IF case any more...
                IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done'
             ENDIF
+
+            IF( PRESENT(pv_r2d) )  ishape(1:2) = SHAPE(pv_r2d)
+            IF( PRESENT(pv_r3d) )  ishape(1:3) = SHAPE(pv_r3d)
+            IF(     ishape(1) == Ni_0   .AND. ishape(2) == Nj_0   ) THEN           ! array with 0 halo
+               ix1 = 1      ;   ix2 = Ni_0     ;   iy1 = 1      ;   iy2 = Nj_0
+            ELSEIF( ishape(1) == jpi    .AND. ishape(2) == jpj    ) THEN           ! array with nn_hls halos
+               ix1 = Nis0   ;   ix2 = Nie0     ;   iy1 = Njs0   ;   iy2 = Nje0
+            ELSEIF( ishape(1) == Ni_0+2 .AND. ishape(2) == Nj_0+2 ) THEN           ! nn_hls = 2 and array with 1 halo
+               ix1 = 2      ;   ix2 = Ni_0+1   ;   iy1 = 2      ;   iy2 = Nj_0+1
+            ELSE
+               CALL ctl_stop( 'iom_nf90_rp0123d: should have been an impossible case...' )
+            ENDIF
+
          ENDIF
 
          ! write the data
@@ -712,7 +715,7 @@ CONTAINS
             CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r0d                    ), clinfo )
          ELSEIF( PRESENT(pv_r1d) ) THEN
             CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r1d(:)                 ), clinfo )
-         ELSEIF( PRESENT(pv_r2d) ) THEN
+         ELSEIF( PRESENT(pv_r2d) ) THEN     
             CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r2d(ix1:ix2,iy1:iy2)   ), clinfo )
          ELSEIF( PRESENT(pv_r3d) ) THEN
             CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r3d(ix1:ix2,iy1:iy2,:) ), clinfo )
diff --git a/src/OCE/IOM/prtctl.F90 b/src/OCE/IOM/prtctl.F90
index fae7c0d8..74152ddf 100644
--- a/src/OCE/IOM/prtctl.F90
+++ b/src/OCE/IOM/prtctl.F90
@@ -7,7 +7,7 @@ MODULE prtctl
    !!            3.4  !  11-11  (C. Harris) decomposition changes for running with CICE
    !!----------------------------------------------------------------------
    USE dom_oce          ! ocean space and time domain variables
-   USE domutl, ONLY : is_tile
+   USE domutl, ONLY : lbnd_ij
    USE in_out_manager   ! I/O manager
    USE mppini           ! distributed memory computing
    USE lib_mpp          ! distributed memory computing
@@ -50,39 +50,49 @@ CONTAINS
       CHARACTER(len=*)                    , INTENT(in), OPTIONAL ::   clinfo2
       CHARACTER(len=*)                    , INTENT(in), OPTIONAL ::   clinfo3
       INTEGER                             , INTENT(in), OPTIONAL ::   kdim
+      INTEGER,          DIMENSION(2)                             ::   ibndg, ibndm1, ibndm2
       !
+      ibndg(1) = Nis0 ; ibndg(2) = Njs0
+      IF( PRESENT(mask1) ) THEN ; ibndm1 = lbnd_ij(mask1) ; ELSE ; ibndm1 = ibndg ; ENDIF
+      IF( PRESENT(mask2) ) THEN ; ibndm2 = lbnd_ij(mask2) ; ELSE ; ibndm2 = ibndg ; ENDIF
+
       IF(     PRESENT(tab2d_2) ) THEN
-         CALL prt_ctl_t(ktab2d_1 = is_tile(tab2d_1), ktab3d_1 = 0, ktab4d_1 = 0, ktab2d_2 = is_tile(tab2d_2), ktab3d_2 = 0,   &
-            &            tab2d_1 =    REAL(tab2d_1, 2*wp),                        tab2d_2 =    REAL(tab2d_2, 2*wp),           &
-            &           mask1 = mask1, mask2 = mask2, &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo2 = clinfo2, clinfo3 = clinfo3 )
-      ELSEIF( PRESENT(tab3d_2) ) THEN     
-         CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = is_tile(tab3d_1), ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = is_tile(tab3d_2),       &
-            &                          tab3d_1 = REAL(tab3d_1, 2*wp),                           tab3d_2 =    REAL(tab3d_2, 2*wp), &
-            &           mask1 = mask1, mask2 = mask2, &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo2 = clinfo2, clinfo3 = clinfo3, kdim = kdim )
-      ELSEIF( PRESENT(tab2d_1) ) THEN     
-         CALL prt_ctl_t(ktab2d_1 = is_tile(tab2d_1), ktab3d_1 = 0, ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &           tab2d_1 = REAL(tab2d_1,2*wp),  &
-            &           mask1 = mask1,  &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3 )
-      ELSEIF( PRESENT(tab3d_1) ) THEN     
-         CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = is_tile(tab3d_1), ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &                          tab3d_1 =    REAL(tab3d_1, 2*wp),  &
-            &           mask1 = mask1,  &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3, kdim = kdim )
+         CALL prt_ctl_t(ktab2d_1=lbnd_ij(tab2d_1), ktab3d_1=ibndg, ktab4d_1=ibndg, &
+            &           ktab2d_2=lbnd_ij(tab2d_2), ktab3d_2=ibndg,                 &
+            &           tab2d_1=REAL(tab2d_1, 2*wp), tab2d_2=REAL(tab2d_2, 2*wp),  &
+            &           kmask1=ibndm1, kmask2=ibndm2, mask1=mask1, mask2=mask2,    &
+            &           clinfo=clinfo, clinfo1=clinfo1, clinfo2=clinfo2, clinfo3=clinfo3 )
+      ELSEIF( PRESENT(tab3d_2) ) THEN
+         CALL prt_ctl_t(ktab2d_1=ibndg, ktab3d_1=lbnd_ij(tab3d_1), ktab4d_1=ibndg, &
+            &           ktab2d_2=ibndg, ktab3d_2=lbnd_ij(tab3d_2),                 &
+            &           tab3d_1=REAL(tab3d_1, 2*wp), tab3d_2=REAL(tab3d_2, 2*wp),  &
+            &           kmask1=ibndm1, kmask2=ibndm2, mask1=mask1, mask2=mask2,    &
+            &           clinfo=clinfo, clinfo1=clinfo1, clinfo2=clinfo2, clinfo3=clinfo3, kdim=kdim )
+      ELSEIF( PRESENT(tab2d_1) ) THEN
+         CALL prt_ctl_t(ktab2d_1=lbnd_ij(tab2d_1), ktab3d_1=ibndg, ktab4d_1=ibndg, &
+            &           ktab2d_2=ibndg, ktab3d_2=ibndg,                            &
+            &           tab2d_1=REAL(tab2d_1, 2*wp),                               &
+            &           kmask1=ibndm1, kmask2=ibndm2, mask1=mask1,                 &
+            &           clinfo=clinfo, clinfo1=clinfo1, clinfo3=clinfo3 )
+      ELSEIF( PRESENT(tab3d_1) ) THEN
+         CALL prt_ctl_t(ktab2d_1=ibndg, ktab3d_1=lbnd_ij(tab3d_1), ktab4d_1=ibndg, &
+            &           ktab2d_2=ibndg, ktab3d_2=ibndg,                            &
+            &           tab3d_1=REAL(tab3d_1, 2*wp),                               &
+            &           kmask1=ibndm1, kmask2=ibndm2, mask1=mask1,                 &
+            &           clinfo=clinfo, clinfo1=clinfo1, clinfo3=clinfo3, kdim=kdim )
       ELSEIF( PRESENT(tab4d_1) ) THEN     
-         CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = 0, ktab4d_1 = is_tile(tab4d_1), ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &                                        tab4d_1 =    REAL(tab4d_1, 2*wp),  &
-            &           mask1 = mask1,  &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3, kdim = kdim )
+         CALL prt_ctl_t(ktab2d_1=ibndg, ktab3d_1=ibndg, ktab4d_1=lbnd_ij(tab4d_1), &
+            &           ktab2d_2=ibndg, ktab3d_2=ibndg,                            &
+            &           tab4d_1=REAL(tab4d_1, 2*wp),                               &
+            &           kmask1=ibndm1, kmask2=ibndm2, mask1=mask1,                 &
+            &           clinfo=clinfo, clinfo1=clinfo1, clinfo3=clinfo3, kdim=kdim )
       ENDIF
 
    END SUBROUTINE prt_ctl
 
 
    SUBROUTINE prt_ctl_t (tab2d_1, ktab2d_1, tab3d_1, ktab3d_1, tab4d_1, ktab4d_1, tab2d_2, ktab2d_2, tab3d_2, ktab3d_2,  &
-      &                  mask1, mask2, clinfo, clinfo1, clinfo2, clinfo3, kdim )
+      &                  mask1, kmask1, mask2, kmask2, clinfo, clinfo1, clinfo2, clinfo3, kdim )
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE prt_ctl  ***
       !!
@@ -118,22 +128,23 @@ CONTAINS
       !!                    kdim    : k- direction for 3D arrays
       !!                    clinfo3 : additional information
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT(in)           ::   ktab2d_1, ktab3d_1, ktab4d_1, ktab2d_2, ktab3d_2
-      REAL(2*wp),         DIMENSION(A2D_T(ktab2d_1))    , INTENT(in), OPTIONAL ::   tab2d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab3d_1),:)  , INTENT(in), OPTIONAL ::   tab3d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab4d_1),:,:), INTENT(in), OPTIONAL ::   tab4d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab2d_2))    , INTENT(in), OPTIONAL ::   tab2d_2
-      REAL(2*wp),         DIMENSION(A2D_T(ktab3d_2),:)  , INTENT(in), OPTIONAL ::   tab3d_2
-      REAL(wp),           DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask1
-      REAL(wp),           DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask2
+      INTEGER, DIMENSION(2), INTENT(in) :: ktab2d_1, ktab3d_1, ktab4d_1, ktab2d_2, ktab3d_2, kmask1, kmask2
+      REAL(2*wp),         DIMENSION(AB2D(ktab2d_1))     , INTENT(in), OPTIONAL ::   tab2d_1
+      REAL(2*wp),         DIMENSION(AB2D(ktab3d_1),:)   , INTENT(in), OPTIONAL ::   tab3d_1
+      REAL(2*wp),         DIMENSION(AB2D(ktab4d_1),:,:) , INTENT(in), OPTIONAL ::   tab4d_1
+      REAL(2*wp),         DIMENSION(AB2D(ktab2d_2))     , INTENT(in), OPTIONAL ::   tab2d_2
+      REAL(2*wp),         DIMENSION(AB2D(ktab3d_2),:)   , INTENT(in), OPTIONAL ::   tab3d_2
+      REAL(wp),           DIMENSION(AB2D(kmask1),:)     , INTENT(in), OPTIONAL ::   mask1
+      REAL(wp),           DIMENSION(AB2D(kmask2),:)     , INTENT(in), OPTIONAL ::   mask2
       CHARACTER(len=*), DIMENSION(:)      , INTENT(in), OPTIONAL ::   clinfo    ! information about the tab3d array
       CHARACTER(len=*)                    , INTENT(in), OPTIONAL ::   clinfo1
       CHARACTER(len=*)                    , INTENT(in), OPTIONAL ::   clinfo2
       CHARACTER(len=*)                    , INTENT(in), OPTIONAL ::   clinfo3
       INTEGER                             , INTENT(in), OPTIONAL ::   kdim
       !
-      CHARACTER(len=30) :: cl1, cl2
+      CHARACTER(len=30) :: cl1, cl2, cl3
       CHARACTER(len=6) :: clfmt
+      CHARACTER(len=1) :: cli1
       INTEGER ::  jn, jl, kdir
       INTEGER ::  iis, iie, jjs, jje
       INTEGER ::  itra, inum
@@ -158,7 +169,6 @@ CONTAINS
       ! Loop over each sub-domain, i.e. the total number of processors ijsplt
       DO jl = 1, SIZE(nall_ictls)
 
-         ! define shoter names...
          iis = MAX( nall_ictls(jl), ntsi )
          iie = MIN( nall_ictle(jl), ntei )
          jjs = MAX( nall_jctls(jl), ntsj )
@@ -168,7 +178,9 @@ CONTAINS
          ELSE                         ;   inum = numprt_oce(jl)
          ENDIF
 
-         ! Compute the sum control only where the tile domain and control print area overlap
+         ! Compute the sum control only where the inner domain and control print area overlap.
+         ! Note that if tiling is enabled and currently active, the inner domain is that of the current tile.
+         ! Otherwise, the inner domain is that of the current MPI domain (i.e. Nis0:Nie0, Njs0:Nje0)
          IF( iie >= iis .AND. jje >= jjs ) THEN
             DO jn = 1, itra
 
@@ -188,32 +200,32 @@ CONTAINS
 
                ! 2D arrays
                IF( PRESENT(tab2d_1) ) THEN
-                  IF( PRESENT(mask1) ) THEN   ;   zsum1 = SUM( tab2d_1(iis:iie,jjs:jje) * mask1(iis:iie,jjs:jje,1) )
-                  ELSE                        ;   zsum1 = SUM( tab2d_1(iis:iie,jjs:jje)                            )
+                  IF( PRESENT(mask1) ) THEN ; zsum1 = SUM( tab2d_1(iis:iie,jjs:jje) * mask1(iis:iie,jjs:jje,1) )
+                  ELSE                      ; zsum1 = SUM( tab2d_1(iis:iie,jjs:jje)                            )
                   ENDIF
                ENDIF
                IF( PRESENT(tab2d_2) ) THEN
-                  IF( PRESENT(mask2) ) THEN   ;   zsum2 = SUM( tab2d_2(iis:iie,jjs:jje) * mask2(iis:iie,jjs:jje,1) )
-                  ELSE                        ;   zsum2 = SUM( tab2d_2(iis:iie,jjs:jje)                            )
+                  IF( PRESENT(mask2) ) THEN ; zsum2 = SUM( tab2d_2(iis:iie,jjs:jje) * mask2(iis:iie,jjs:jje,1) )
+                  ELSE                      ; zsum2 = SUM( tab2d_2(iis:iie,jjs:jje)                            )
                   ENDIF
                ENDIF
 
                ! 3D arrays
                IF( PRESENT(tab3d_1) ) THEN
-                  IF( PRESENT(mask1) ) THEN   ;   zsum1 = SUM( tab3d_1(iis:iie,jjs:jje,1:kdir) * mask1(iis:iie,jjs:jje,1:kdir) )
-                  ELSE                        ;   zsum1 = SUM( tab3d_1(iis:iie,jjs:jje,1:kdir)                                 )
+                  IF( PRESENT(mask1) ) THEN ; zsum1 = SUM( tab3d_1(iis:iie,jjs:jje,1:kdir) * mask1(iis:iie,jjs:jje,1:kdir) )
+                  ELSE                      ; zsum1 = SUM( tab3d_1(iis:iie,jjs:jje,1:kdir)                                 )
                   ENDIF
                ENDIF
                IF( PRESENT(tab3d_2) ) THEN
-                  IF( PRESENT(mask2) ) THEN   ;   zsum2 = SUM( tab3d_2(iis:iie,jjs:jje,1:kdir) * mask2(iis:iie,jjs:jje,1:kdir) )
-                  ELSE                        ;   zsum2 = SUM( tab3d_2(iis:iie,jjs:jje,1:kdir)                                 )
+                  IF( PRESENT(mask2) ) THEN ; zsum2 = SUM( tab3d_2(iis:iie,jjs:jje,1:kdir) * mask2(iis:iie,jjs:jje,1:kdir) )
+                  ELSE                      ; zsum2 = SUM( tab3d_2(iis:iie,jjs:jje,1:kdir)                                 )
                   ENDIF
                ENDIF
 
                ! 4D arrays
                IF( PRESENT(tab4d_1) ) THEN
-                  IF( PRESENT(mask1) ) THEN   ;   zsum1 = SUM( tab4d_1(iis:iie,jjs:jje,1:kdir,jn) * mask1(iis:iie,jjs:jje,1:kdir) )
-                  ELSE                        ;   zsum1 = SUM( tab4d_1(iis:iie,jjs:jje,1:kdir,jn)                                 )
+                  IF( PRESENT(mask1) ) THEN ; zsum1 = SUM( tab4d_1(iis:iie,jjs:jje,1:kdir,jn) * mask1(iis:iie,jjs:jje,1:kdir) )
+                  ELSE                      ; zsum1 = SUM( tab4d_1(iis:iie,jjs:jje,1:kdir,jn)                                 )
                   ENDIF
                ENDIF
 
@@ -243,8 +255,31 @@ CONTAINS
                   WRITE(inum, "(3x,a,' : ',"//clfmt//",3x,a,' : ',"//clfmt//")") cl1, zsum1, cl2, zsum2
                ELSE
                   WRITE(inum, "(3x,a,' : ',"//clfmt//"                       )") cl1, zsum1
-               ENDIF
 
+               ENDIF
+               ! replace .false. by .true. to switch on theses prints of the last inner line
+               IF( .FALSE. .AND. l_IdoNFold .AND. jje == Nje0 ) THEN
+                  IF( PRESENT(tab2d_1) ) THEN
+                     WRITE(cli1, '(i1)') INT(LOG10(REAL(iie-iis+1,wp))) + 1            ! how many digits to we need to write ?
+                     WRITE(cl3, "(i"//cli1//")") iie-iis+1
+                     WRITE(inum, "(a,"//TRIM(cl3)//clfmt//")") 'Last line '//TRIM(cl1)//' ', tab2d_1(iis:iie,jje)
+                  ENDIF
+                  IF( PRESENT(tab3d_1) ) THEN
+                     WRITE(cli1, '(i1)') INT(LOG10(REAL((iie-iis+1)*kdir,wp))) + 1     ! how many digits to we need to write ?
+                     WRITE(cl3, "(i"//cli1//")") (iie-iis+1)*kdir
+                     WRITE(inum, "(a,"//TRIM(cl3)//clfmt//")") 'Last line '//TRIM(cl1)//' ', tab3d_1(iis:iie,jje,1:kdir)
+                  ENDIF
+                  IF( PRESENT(tab2d_2) ) THEN
+                     WRITE(cli1, '(i1)') INT(LOG10(REAL(iie-iis+1,wp))) + 1            ! how many digits to we need to write ?
+                     WRITE(cl3, "(i"//cli1//")") iie-iis+1
+                     WRITE(inum, "(a,"//TRIM(cl3)//clfmt//")") 'Last line '//TRIM(cl2)//' ', tab2d_2(iis:iie,jje)
+                  ENDIF
+                  IF( PRESENT(tab3d_2) ) THEN
+                     WRITE(cli1, '(i1)') INT(LOG10(REAL((iie-iis+1)*kdir,wp))) + 1     ! how many digits to we need to write ?
+                     WRITE(cl3, "(i"//cli1//")") (iie-iis+1)*kdir
+                     WRITE(inum, "(a,"//TRIM(cl3)//clfmt//")") 'Last line '//TRIM(cl2)//' ', tab3d_2(iis:iie,jje,1:kdir)
+                  ENDIF
+               ENDIF
             END DO
          ENDIF
          IF( jpnij == 1 ) CALL FLUSH(inum)
@@ -460,22 +495,22 @@ CONTAINS
          !
          idg = MAXVAL( (/ nall_ictls(jl), nall_ictle(jl), nall_jctls(jl), nall_jctle(jl) /) )   ! temporary use of idg
          idg = INT(LOG10(REAL(idg,wp))) + 1                                                     ! how many digits do we use?
-         idg2 = MAXVAL( (/ mig0(nall_ictls(jl)), mig0(nall_ictle(jl)), mjg0(nall_jctls(jl)), mjg0(nall_jctle(jl)) /) )
+         idg2 = MAXVAL( (/ mig(nall_ictls(jl),0), mig(nall_ictle(jl),0), mjg(nall_jctls(jl),0), mjg(nall_jctle(jl),0) /) )
          idg2 = INT(LOG10(REAL(idg2,wp))) + 1                                                   ! how many digits do we use?
          WRITE(clfmt2, "('(18x, 13a1, a9, i', i1, ', a2, i',i1,', a2, 13a1)')") idg, idg2
          WRITE(clfmt3, "('(18x, a1, ', i2,'x, a1)')") 13+9+idg+2+idg2+2+13 - 2
          WRITE(clfmt4, "('(', i2,'x, a9, i', i1,', a2, i', i1,', a2, ', i2,'x, a9, i', i1,', a2, i', i1,', a2)')") &
             &          18-7, idg, idg2, 13+9+idg+2+idg2+2+13 - (2+idg+2+idg2+2+8), idg, idg2
-         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctle = ', nall_jctle(jl), ' (', mjg0(nall_jctle(jl)), ') ', ('-', ji=1,13)
+         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctle = ', nall_jctle(jl), ' (', mjg(nall_jctle(jl),0), ') ', ('-', ji=1,13)
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
-         WRITE(inum,clfmt4)                 ' ictls = ', nall_ictls(jl), ' (', mig0(nall_ictls(jl)), ') ',   &
-            &                               ' ictle = ', nall_ictle(jl), ' (', mig0(nall_ictle(jl)), ') '
+         WRITE(inum,clfmt4)                 ' ictls = ', nall_ictls(jl), ' (', mig(nall_ictls(jl),0), ') ',   &
+            &                               ' ictle = ', nall_ictle(jl), ' (', mig(nall_ictle(jl),0), ') '
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
-         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctls = ', nall_jctls(jl), ' (', mjg0(nall_jctls(jl)), ') ', ('-', ji=1,13)
+         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctls = ', nall_jctls(jl), ' (', mjg(nall_jctls(jl),0), ') ', ('-', ji=1,13)
          WRITE(inum,*)
          WRITE(inum,*)
          !
diff --git a/src/OCE/ISF/isf_oce.F90 b/src/OCE/ISF/isf_oce.F90
index eb62d83e..0ac9e8a5 100644
--- a/src/OCE/ISF/isf_oce.F90
+++ b/src/OCE/ISF/isf_oce.F90
@@ -13,8 +13,7 @@ MODULE isf_oce
    !!   isf          : define and allocate ice shelf variables
    !!----------------------------------------------------------------------
 
-   USE par_oce       , ONLY: jpi, jpj, jpk
-   USE in_out_manager, ONLY: wp, jpts ! I/O manager
+   USE par_oce
    USE lib_mpp       , ONLY: ctl_stop, mpp_sum      ! MPP library
    USE fldread        ! read input fields
 
@@ -22,7 +21,7 @@ MODULE isf_oce
 
    PRIVATE
 
-   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl, isf_dealloc_cpl
+   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl
    !
    !-------------------------------------------------------
    ! 0 :              namelist parameter
@@ -79,33 +78,35 @@ MODULE isf_oce
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   fwfisf_oasis
    !
    ! 2.2 -------- ice shelf cavity melt namelist parameter -------------
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_cav                    !:
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_cav   , misfkb_cav     !: shallowest and deepest level of the ice shelf
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_cav, rfrac_tbl_cav  !: thickness and fraction of deepest cell affected by the ice shelf
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
-   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfcav_fwf                 !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_cav                    !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_cav   , misfkb_cav     !: shallowest and deepest level of the ice shelf
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_cav, rfrac_tbl_cav  !: thickness and fraction of deepest cell affected by the ice shelf
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
+   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     ::   sf_isfcav_fwf                 !:
    !
-   REAL(wp) , PUBLIC                                      :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient
+   REAL(wp) , PUBLIC                                      ::   risf_lamb1, risf_lamb2, risf_lamb3  !: freezing point linearization coeficient
    !
    ! 2.3 -------- ice shelf param. melt namelist parameter -------------
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_par                    !:
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_par   , misfkb_par     !:
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_par, rfrac_tbl_par  !: 
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
-   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfpar_fwf                 !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_par                    !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_par   , misfkb_par     !:
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_par, rfrac_tbl_par  !: 
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
+   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     ::   sf_isfpar_fwf                 !:
    !
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf0_tbl_par                !: thickness of tbl (initial value)  [m]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: risfLeff                      !:
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf0_tbl_par                !: thickness of tbl (initial value)  [m]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfLeff                      !:
    !
    ! 2.4 -------- coupling namelist parameter -------------
    INTEGER , PUBLIC                                        ::   nstp_iscpl   !:
    REAL(wp), PUBLIC                                        ::   rdt_iscpl    !: 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_ssh, risfcpl_cons_ssh, risfcpl_cons_ssh_b               !:
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b  !:
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_ssh, risfcpl_cons_ssh  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc  !:
    !
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
@@ -125,20 +126,12 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0       ! set to zero if no array to be allocated
-      !
-      ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( misfkt_par  (A2D(0)) , misfkb_par    (A2D(0)) , rfrac_tbl_par(A2D(0)) , &
+         &     rhisf_tbl_par(A2D(0)) , rhisf0_tbl_par(A2D(0)) , &
+         &     risfLeff     (A2D(0)) , mskisf_par    (A2D(0)) , STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
@@ -159,14 +152,10 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0       ! set to zero if no array to be allocated
-      !
-      ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( misfkt_cav(A2D(0)), misfkb_cav(A2D(0)), rfrac_tbl_cav(A2D(0)) , rhisf_tbl_cav(A2D(0)) , STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
@@ -185,46 +174,25 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0
-      !
-      ALLOCATE( risfcpl_ssh(jpi,jpj) , risfcpl_tsc(jpi,jpj,jpk,jpts) , risfcpl_vol(jpi,jpj,jpk) , STAT=ialloc )
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ALLOCATE( risfcpl_ssh     (jpi,jpj) , risfcpl_vol     (jpi,jpj,jpk) , &
+         &      risfcpl_cons_ssh(jpi,jpj) , risfcpl_cons_vol(jpi,jpj,jpk) , STAT=ialloc )
+      ierr = ierr + ialloc
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( risfcpl_tsc     (A2D(0),jpk,jpts) , &
+         &      risfcpl_cons_tsc(A2D(0),jpk,jpts) , STAT=ialloc )
       ierr = ierr + ialloc
-      !
-      risfcpl_tsc(:,:,:,:) = 0._wp ; risfcpl_vol(:,:,:) = 0._wp ; risfcpl_ssh(:,:) = 0._wp
-
-      IF ( ln_isfcpl_cons ) THEN
-         ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) , risfcpl_cons_ssh(jpi,jpj) , STAT=ialloc )
-         ierr = ierr + ialloc
-         !
-         risfcpl_cons_tsc(:,:,:,:) = 0._wp ; risfcpl_cons_vol(:,:,:) = 0._wp ; risfcpl_cons_ssh(:,:) = 0._wp
-         !
-      END IF
       !
       CALL mpp_sum ( 'isf', ierr )
       IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to allocate arrays.')
       !
    END SUBROUTINE isf_alloc_cpl
 
-   
-   SUBROUTINE isf_dealloc_cpl()
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_dealloc_cpl  ***
-      !!
-      !! ** Purpose : de-allocate useless public 3d array used for ice sheet coupling
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER :: ierr, ialloc
-      !!----------------------------------------------------------------------
-      ierr = 0
-      !
-      DEALLOCATE( risfcpl_ssh , risfcpl_tsc , risfcpl_vol , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      CALL mpp_sum ( 'isf', ierr )
-      IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to deallocate arrays.')
-      !
-   END SUBROUTINE isf_dealloc_cpl
-
-   
+     
    SUBROUTINE isf_alloc()
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isf_alloc  ***
@@ -237,52 +205,29 @@ CONTAINS
       !
       ierr = 0       ! set to zero if no array to be allocated
       !
-      ALLOCATE( fwfisf_par  (jpi,jpj) , fwfisf_cav  (jpi,jpj) ,     &
-         &      fwfisf_oasis(jpi,jpj)                         , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risf_par_tsc(jpi,jpj,jpts) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risf_cav_tsc(jpi,jpj,jpts) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ALLOCATE( fwfisf_par  (jpi,jpj) , fwfisf_cav  (jpi,jpj) , risfload(jpi,jpj) , &
 #if ! defined key_RK3
-      ! MLF : need to allocate before arrays
-      ALLOCATE( fwfisf_par_b(jpi,jpj) , fwfisf_cav_b(jpi,jpj) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risf_par_tsc_b(jpi,jpj,jpts) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risf_cav_tsc_b(jpi,jpj,jpts) , STAT=ialloc )
-      ierr = ierr + ialloc
+         &      fwfisf_par_b(jpi,jpj) , fwfisf_cav_b(jpi,jpj) , &   ! MLF : need to allocate before arrays
 #endif
-      !
-      ALLOCATE( risfload(jpi,jpj) , STAT=ialloc )
+         &                                                      STAT=ialloc )
       ierr = ierr + ialloc
       !
-      ALLOCATE( mskisf_cav(jpi,jpj) , STAT=ialloc )
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( fwfisf_oasis(A2D(0)) , risf_par_tsc  (A2D(0),jpts) , risf_cav_tsc  (A2D(0),jpts) , mskisf_cav(A2D(0)) , &
+#if ! defined key_RK3
+         &                             risf_par_tsc_b(A2D(0),jpts) , risf_cav_tsc_b(A2D(0),jpts) , &  ! MLF : need to allocate before arrays
+#endif
+         &                                                                  STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
       !
-      ! initalisation of fwf and tsc array to 0
-      risfload    (:,:)   = 0._wp
-      fwfisf_oasis(:,:)   = 0._wp
-#if defined key_RK3
-      fwfisf_par  (:,:)   = 0._wp
-      fwfisf_cav  (:,:)   = 0._wp
-      risf_cav_tsc(:,:,:) = 0._wp
-      risf_par_tsc(:,:,:) = 0._wp
-#else
-      fwfisf_par  (:,:)   = 0._wp   ;   fwfisf_par_b  (:,:)   = 0._wp
-      fwfisf_cav  (:,:)   = 0._wp   ;   fwfisf_cav_b  (:,:)   = 0._wp
-      risf_cav_tsc(:,:,:) = 0._wp   ;   risf_cav_tsc_b(:,:,:) = 0._wp
-      risf_par_tsc(:,:,:) = 0._wp   ;   risf_par_tsc_b(:,:,:) = 0._wp
-#endif
-      !
    END SUBROUTINE isf_alloc
    
    !!======================================================================
diff --git a/src/OCE/ISF/isfcav.F90 b/src/OCE/ISF/isfcav.F90
index 27ca9912..29dc6b16 100644
--- a/src/OCE/ISF/isfcav.F90
+++ b/src/OCE/ISF/isfcav.F90
@@ -14,18 +14,19 @@ MODULE isfcav
    !!----------------------------------------------------------------------
    USE isf_oce        ! ice shelf public variables
    !
-   USE isfrst   , ONLY: isfrst_write, isfrst_read ! ice shelf restart read/write subroutine
+   USE isfrst   , ONLY: isfrst_read    ! ice shelf restart read/write subroutine
    USE isfutils , ONLY: debug          ! ice shelf debug subroutine
-   USE isftbl   , ONLY: isf_tbl        ! ice shelf top boundary layer properties subroutine
+   USE isftbl                          ! ice shelf top boundary layer properties subroutine
    USE isfcavmlt, ONLY: isfcav_mlt     ! ice shelf melt formulation subroutine
    USE isfcavgam, ONLY: isfcav_gammats ! ice shelf melt exchange coeficient subroutine
    USE isfdiags , ONLY: isf_diags_flx  ! ice shelf diags subroutine
+   USE zdfdrg   , ONLY: rCd0_top, r_ke0_top ! vertical physics: top/bottom drag coef.
    !
    USE oce      , ONLY: ts, uu, vv, rn2                 ! ocean dynamics and tracers
    USE dom_oce                                          ! ocean space and time domain
-   USE par_oce  , ONLY: jpi,jpj                         ! ocean space and time domain
-   USE phycst   , ONLY: grav,rho0,rho0_rcp,r1_rho0_rcp  ! physical constants
-   USE eosbn2   , ONLY: ln_teos10                       ! use ln_teos10 or not
+   USE par_oce                                          ! ocean space and time domain
+   USE phycst                                           ! physical constants
+   USE eosbn2   , ONLY: eos_fzp, ln_teos10              ! equation of state & use ln_teos10 or not
    !
    USE in_out_manager ! I/O manager
    USE iom            ! I/O library
@@ -49,7 +50,7 @@ MODULE isfcav
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE isf_cav( kt, Kmm, ptsc, pqfwf )
+   SUBROUTINE isf_cav( kt, Kmm, ptsc, pfwf )
       !!---------------------------------------------------------------------
       !!                     ***  ROUTINE isf_cav  ***
       !!
@@ -67,123 +68,183 @@ CONTAINS
       !! ** Convention : all fluxes are from isf to oce
       !!
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT --------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(inout) :: pqfwf  ! ice shelf fwf
-      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(inout) :: ptsc   ! T & S ice shelf cavity contents
-      !!-------------------------- IN  --------------------------------------
-      INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
       INTEGER, INTENT(in) ::   kt   ! ocean time step
+      INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
+      REAL(wp), DIMENSION(A2D(0),jpts), INTENT(inout) ::   ptsc   ! T & S ice shelf cavity contents
+      REAL(wp), DIMENSION(A2D(0))     , INTENT(inout) ::   pfwf   ! ice shelf fwf
+      !!
+      INTEGER  ::   iconv, ji, jj, jk, ikt
+      REAL(wp) ::   zerr
+      REAL(wp) ::   zcoef, zdku, zdkv
+      INTEGER , PARAMETER ::   iconv_max = 100
+      LOGICAL , DIMENSION(A2D(0)) ::   l_converged              ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)) ::   ztfrz                    ! tbl freezing temperature
+      REAL(wp), DIMENSION(A2D(0)) ::   zqlat, zqoce, zqhc       ! heat fluxes
+      REAL(wp), DIMENSION(A2D(0)) ::   zqh_b, zRc               !
+      REAL(wp), DIMENSION(A2D(0)) ::   zgammat, zgammas         ! exchange coeficient
+      REAL(wp), DIMENSION(A2D(0)) ::   zttbl, zstbl             ! temp. and sal. in top boundary layer
+      REAL(wp), DIMENSION(A2D(0)) ::   zustar                   ! u*
+      REAL(wp), DIMENSION(A2D(0)) ::   zutbl, zvtbl             ! top boundary layer velocity
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   zvel, ze3            ! u and v at T points and e3t
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   ztmp           ! temporary array
       !!---------------------------------------------------------------------
-      LOGICAL :: lit
-      INTEGER :: nit, ji, jj, ikt
-      REAL(wp) :: zerr
-      REAL(wp) :: zcoef, zdku, zdkv
-      REAL(wp), DIMENSION(jpi,jpj) :: zqlat, zqoce, zqhc, zqh  ! heat fluxes
-      REAL(wp), DIMENSION(jpi,jpj) :: zqh_b, zRc               !
-      REAL(wp), DIMENSION(jpi,jpj) :: zgammat, zgammas         ! exchange coeficient
-      REAL(wp), DIMENSION(jpi,jpj) :: zttbl, zstbl             ! temp. and sal. in top boundary layer
-      !!---------------------------------------------------------------------
       !
-      ! compute T/S/U/V for the top boundary layer
-      CALL isf_tbl(Kmm, ts(:,:,:,jp_tem,Kmm), zttbl(:,:),'T', misfkt_cav, rhisf_tbl_cav, misfkb_cav, rfrac_tbl_cav )
-      CALL isf_tbl(Kmm, ts(:,:,:,jp_sal,Kmm), zstbl(:,:),'T', misfkt_cav, rhisf_tbl_cav, misfkb_cav, rfrac_tbl_cav )
+      DO_3D( 0 ,0, 0, 0, 1, jpk )
+         ze3(ji,jj,jk) = e3t(ji,jj,jk,Kmm)
+      END_3D
+      !
+      !===============================
+      ! 1.: compute T and S in the tbl
+      !===============================
+      CALL isf_tbl_avg( misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, ze3, ts(:,:,:,jp_tem,Kmm), & ! <<== in
+         &                                                                                           zttbl  )    ! ==>> out
       !
-      ! output T/S/U/V for the top boundary layer
-      CALL iom_put('ttbl_cav',zttbl(:,:) * mskisf_cav(:,:))
-      CALL iom_put('stbl'    ,zstbl(:,:) * mskisf_cav(:,:))
+      CALL isf_tbl_avg( misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, ze3, ts(:,:,:,jp_sal,Kmm), & ! <<== in
+         &                                                                                           zstbl  )    ! ==>> out
+      !
+      !==========================================
+      ! 2.: compute velocity in the tbl if needed
+      !==========================================
+      IF ( TRIM(cn_gammablk) == 'vel_stab' .OR. TRIM(cn_gammablk) == 'vel' ) THEN
+         ! compute velocity in tbl
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            zvel(ji,jj,jk) = 0.5_wp * ( uu(ji-1,jj,jk,Kmm) + uu(ji,jj,jk,Kmm) )
+         END_3D
+         CALL isf_tbl_avg( misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, ze3, zvel, & ! <<== in
+            &                                                                        zutbl  )    ! ==>> out
+         !
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            zvel(ji,jj,jk) = 0.5_wp * ( vv(ji,jj-1,jk,Kmm) + vv(ji,jj,jk,Kmm) )
+         END_3D
+         CALL isf_tbl_avg( misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, ze3, zvel, & ! <<== in
+            &                                                                        zvtbl  )    ! ==>> out
+         !
+         ! compute ustar (AD15 eq. 27)
+         DO_2D( 0, 0, 0, 0 )         
+            zustar(ji,jj) = SQRT( rCd0_top(ji,jj) * ( ( zutbl(ji,jj)*zutbl(ji,jj) + zvtbl(ji,jj)*zvtbl(ji,jj) ) + r_ke0_top ) &
+               &                ) * mskisf_cav(ji,jj)
+         END_2D
+         !
+         !
+      ELSE
+         zustar(:,:) = 0._wp ! not used
+      ENDIF
       !
-      ! initialisation
+      !==============================
+      ! 3.: compute ice shelf melting
+      !==============================
+      ! --- initialisation --- !
       IF ( TRIM(cn_gammablk) == 'vel_stab' ) THEN
-         zqoce(:,:) = -pqfwf(:,:) * rLfusisf ! 
-         zqh_b(:,:) =  ptsc(:,:,jp_tem) * rho0_rcp ! last time step total heat fluxes (to speed up convergence)
-
+         !
          DO_2D( 0, 0, 0, 0 )
+            zqoce(ji,jj) = -pfwf(ji,jj) * rLfusisf        * mskisf_cav(ji,jj)
+            zqh_b(ji,jj) =  ptsc(ji,jj,jp_tem) * rho0_rcp * mskisf_cav(ji,jj) ! last time step total heat fluxes (to speed up convergence)
+
             ikt = mikt(ji,jj)
             ! compute Rc number (as done in zdfric.F90)
 !!gm better to do it like in the new zdfric.F90   i.e. avm weighted Ri computation
             zcoef = 0.5_wp / e3w(ji,jj,ikt+1,Kmm)
             !                                            ! shear of horizontal velocity
-            zdku = zcoef * (  uu(ji-1,jj  ,ikt  ,Kmm) + uu(ji,jj,ikt  ,Kmm)  &
-               &             -uu(ji-1,jj  ,ikt+1,Kmm) - uu(ji,jj,ikt+1,Kmm)  )
-            zdkv = zcoef * (  vv(ji  ,jj-1,ikt  ,Kmm) + vv(ji,jj,ikt  ,Kmm)  &
-               &             -vv(ji  ,jj-1,ikt+1,Kmm) - vv(ji,jj,ikt+1,Kmm)  )
+            zdku = zcoef * (  ( uu(ji-1,jj  ,ikt  ,Kmm) + uu(ji,jj,ikt  ,Kmm) )  &   ! add () for NP repro
+               &            - ( uu(ji-1,jj  ,ikt+1,Kmm) + uu(ji,jj,ikt+1,Kmm) )  )
+            zdkv = zcoef * (  ( vv(ji  ,jj-1,ikt  ,Kmm) + vv(ji,jj,ikt  ,Kmm) )  &   ! add () for NP repro
+               &            - ( vv(ji  ,jj-1,ikt+1,Kmm) + vv(ji,jj,ikt+1,Kmm) )  )
             !                                            ! richardson number (minimum value set to zero)
-            zRc(ji,jj) = MAX(rn2(ji,jj,ikt+1), 1.e-20_wp) / MAX( zdku*zdku + zdkv*zdkv, 1.e-20_wp )
+            zRc(ji,jj) = MAX( rn2(ji,jj,ikt+1), 1.e-20_wp ) / MAX( zdku*zdku + zdkv*zdkv, 1.e-20_wp )
          END_2D
-         CALL lbc_lnk( 'isfmlt', zRc, 'T', 1._wp )
+         !
       ENDIF
       !
-      ! compute ice shelf melting
-      nit = 1 ; lit = .TRUE.
-      DO WHILE ( lit )    ! maybe just a constant number of iteration as in blk_core is fine
+      ! Calculate freezing temperature (overwritten only in case cn_isfcav_mlt="3eq")
+      CALL eos_fzp( zstbl(:,:), ztfrz(:,:), risfdep(:,:), kbnd=0 )
+      !
+      ! --- iteration loop --- !
+      iconv = 0
+      l_converged(:,:) = .FALSE.
+      ! Convergence calculated until all sub-domain grid points have converged
+      ! Calculations keep going for all grid points until sub-domain convergence (vectorisation optimisation)
+      ! but values are not taken into account (results independant of MPI partitioning)
+      !
+      DO WHILE ( ( .NOT. ALL (l_converged(:,:)) ) .AND. iconv < iconv_max )
+         iconv = iconv + 1
          !
-         ! compute gammat everywhere (2d)
-         ! useless if melt specified
+         ! compute gammat everywhere (2d) - useless if melt specified
          IF ( TRIM(cn_isfcav_mlt) .NE. 'spe' ) THEN
-            CALL isfcav_gammats( Kmm, zttbl, zstbl, zqoce  , pqfwf, zRc,  &
-               &                                    zgammat, zgammas )
+            CALL isfcav_gammats( Kmm, l_converged, zustar, zttbl, zstbl, zqoce, pfwf, zRc,  & ! <<== in
+               &                                                          zgammat, zgammas  ) ! ==>> inout
          END IF
          !
          ! compute tfrz, latent heat and melt (2d)
-         CALL isfcav_mlt(kt, zgammat, zgammas, zttbl, zstbl, &
-            &                         zqhc   , zqoce, pqfwf  )
+         CALL isfcav_mlt( kt, l_converged, zgammat, zgammas, zttbl, zstbl, & ! <<== in
+            &                                    zqhc, zqoce, pfwf, ztfrz  ) ! ==>> inout
          !
          ! define if we need to iterate
          SELECT CASE ( cn_gammablk )
-         CASE ( 'spe','vel' )
-            ! no convergence needed
-            lit = .FALSE.
+         CASE ( 'spe', 'vel' )
+            l_converged(:,:) = .TRUE.                ! no convergence needed
          CASE ( 'vel_stab' )
-            ! compute error between 2 iterations
-            zerr = 0._wp
-            DO_2D( 0, 0, 0, 0 )
-               zerr = MAX( zerr, ABS(zqhc(ji,jj)+zqoce(ji,jj) - zqh_b(ji,jj)) )
+            DO_2D( 0, 0, 0, 0 )                      ! compute error between 2 iterations
+               IF ( .NOT. l_converged(ji,jj) ) THEN
+                  zerr = ABS( zqhc(ji,jj) + zqoce(ji,jj) - zqh_b(ji,jj) )
+                  IF( zerr <= 0.01_wp ) THEN         ! convergence is reached
+                     l_converged(ji,jj) = .TRUE.
+                  ELSE                               ! converge is not yet reached
+                     l_converged(ji,jj) = .FALSE.
+                     zqh_b(ji,jj) = zqhc(ji,jj) + zqoce(ji,jj)
+                  ENDIF
+               ENDIF
             END_2D
-            CALL mpp_max( 'isfcav', zerr )   ! max over the global domain
             !
-            ! define if iteration needed
-            IF (nit >= 100) THEN              ! too much iteration
-               CALL ctl_stop( 'STOP', 'isf_cav: vel_stab gamma formulation had too many iterations ...' )
-            ELSE IF ( zerr <= 0.01_wp ) THEN  ! convergence is achieve
-               lit = .FALSE.
-            ELSE                              ! converge is not yet achieve
-               nit = nit + 1
-               zqh_b(:,:) = zqhc(:,:)+zqoce(:,:)
-            END IF
          END SELECT
          !
       END DO
+      IF( iconv == iconv_max )   CALL ctl_stop( 'STOP', 'isf_cav: vel_stab gamma formulation had too many iterations ...' )   ! too many iterations
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ! compute heat and water flux ( > 0 from isf to oce)
-         pqfwf(ji,jj) = pqfwf(ji,jj) * mskisf_cav(ji,jj)
-         zqoce(ji,jj) = zqoce(ji,jj) * mskisf_cav(ji,jj)
-         zqhc (ji,jj) = zqhc(ji,jj)  * mskisf_cav(ji,jj)
-         !
+      !
+      DO_2D( 0, 0, 0, 0 )
          ! compute heat content flux ( > 0 from isf to oce)
-         zqlat(ji,jj) = - pqfwf(ji,jj) * rLfusisf    ! 2d latent heat flux (W/m2)
-         !
-         ! total heat flux ( > 0 from isf to oce)
-         zqh(ji,jj) = ( zqhc (ji,jj) + zqoce(ji,jj) )
+         zqlat(ji,jj) = - pfwf(ji,jj) * rLfusisf    ! 2d latent heat flux (W/m2)
          !
          ! set temperature content
-         ptsc(ji,jj,jp_tem) = zqh(ji,jj) * r1_rho0_rcp
+         ptsc(ji,jj,jp_tem) = ( zqhc(ji,jj) + zqoce(ji,jj) ) * r1_rho0_rcp
       END_2D
-      CALL lbc_lnk( 'isfmlt', pqfwf, 'T', 1.0_wp)
       !
       ! output fluxes
-      CALL isf_diags_flx( Kmm, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, 'cav', pqfwf, zqoce, zqlat, zqhc)
+      CALL isf_diags_flx( Kmm, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, 'cav', pfwf, zqoce, zqlat, zqhc )
       !
-#if ! defined key_RK3
-      ! MLF: write restart variables (qoceisf, qhcisf, fwfisf for now and before)
-      IF (lrst_oce) CALL isfrst_write(kt, 'cav', ptsc, pqfwf)
-#endif
+      ! --- output --- !
+      CALL iom_put( 'ttbl_cav' , zttbl  (:,:) * mskisf_cav(:,:) )
+      CALL iom_put( 'stbl'     , zstbl  (:,:) * mskisf_cav(:,:) )
+      CALL iom_put( 'isfgammat', zgammat(:,:) * mskisf_cav(:,:) )
+      CALL iom_put( 'isfgammas', zgammas(:,:) * mskisf_cav(:,:) )
+      IF ( TRIM(cn_gammablk) == 'vel_stab' .OR. TRIM(cn_gammablk) == 'vel' ) THEN
+         CALL iom_put( 'isfustar', zustar              )
+         CALL iom_put( 'utbl'    , zutbl  * mskisf_cav )
+         CALL iom_put( 'vtbl'    , zvtbl  * mskisf_cav )
+      ENDIF
+      !
+      CALL iom_put('isftfrz_cav'    ,                ztfrz(:,:)   * mskisf_cav(:,:) )   ! freezing point at the interface
+      CALL iom_put('isfthermald_cav', ( zttbl(:,:) - ztfrz(:,:) ) * mskisf_cav(:,:) )   ! thermal driving at the interface
       !
+      IF( cn_isfcav_mlt == '3eq' ) THEN                                                 ! conductive heat flux through the ice
+         ALLOCATE( ztmp(A2D(0)) )
+         DO_2D( 0, 0, 0, 0 )
+            ztmp(ji,jj) = rhoisf * rcpisf * rkappa / MAX( risfdep(ji,jj), 1.e-20 ) * ( ztfrz(ji,jj) - rtsurf ) * mskisf_cav(ji,jj)
+         END_2D
+         CALL iom_put('qconisf', ztmp )
+         DEALLOCATE( ztmp )
+      ENDIF
+      !
+      ! --- debug --- !
       IF ( ln_isfdebug ) THEN
          IF(lwp) WRITE(numout,*) ''
-         CALL debug('isf_cav: ptsc T',ptsc(:,:,1))
-         CALL debug('isf_cav: ptsc S',ptsc(:,:,2))
-         CALL debug('isf_cav: pqfwf fwf',pqfwf(:,:))
+         CALL debug( 'isfcav: gammaT ', zgammat(:,:) )
+         CALL debug( 'isfcav: gammaS ', zgammas(:,:) )
+         CALL debug( 'isfcav: ptsc T ', ptsc(:,:,1)  )
+         CALL debug( 'isfcav: ptsc S ', ptsc(:,:,2)  )
+         CALL debug( 'isfcav: qhc    ', zqhc (:,:)   )
+         CALL debug( 'isfcav: qoce   ', zqoce(:,:)   )
+         CALL debug( 'isfcav: fwf    ', pfwf (:,:)   )
          IF(lwp) WRITE(numout,*) ''
       END IF
       !
@@ -196,27 +257,31 @@ CONTAINS
       !! ** Purpose : initialisation of variable needed to compute melt under an ice shelf
       !!
       !!----------------------------------------------------------------------
-      INTEGER :: ierr
+      INTEGER ::   ierr
+      INTEGER ::   ji, jj     ! dummy loop indices
       !!---------------------------------------------------------------------
       !
       !==============
       ! 0: allocation
       !==============
-      !
       CALL isf_alloc_cav()
       !
       !==================
       ! 1: initialisation
       !==================
-      !
-      ! top and bottom level of the 'top boundary layer'
-      misfkt_cav(:,:)    = mikt(:,:) ; misfkb_cav(:,:)    = 1
-      !
-      ! thickness of 'tbl' and fraction of bottom cell affected by 'tbl'
-      rhisf_tbl_cav(:,:) = 0.0_wp    ; rfrac_tbl_cav(:,:) = 0.0_wp
-      !
-      ! cavity mask
-      mskisf_cav(:,:)    = (1._wp - tmask(:,:,1)) * ssmask(:,:)
+      DO_2D( 0, 0, 0, 0 )
+         ! top and bottom level of the 'top boundary layer'
+         misfkt_cav(ji,jj)    = mikt(ji,jj)
+         misfkb_cav(ji,jj)    = 1
+         !
+         ! thickness of 'tbl' and fraction of bottom cell affected by 'tbl'
+         rhisf_tbl_cav(ji,jj) = 0.0_wp
+         rfrac_tbl_cav(ji,jj) = 0.0_wp
+         !
+         ! cavity mask
+         mskisf_cav(ji,jj) = ( 1._wp - tmask(ji,jj,1) ) * ssmask(ji,jj)
+         !
+      END_2D
       !
 #if ! defined key_RK3
       !================
@@ -239,7 +304,7 @@ CONTAINS
       CASE( 'spe' )
 
          ALLOCATE( sf_isfcav_fwf(1), STAT=ierr )
-         ALLOCATE( sf_isfcav_fwf(1)%fnow(jpi,jpj,1), sf_isfcav_fwf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_isfcav_fwf(1)%fnow(A2D(0),1), sf_isfcav_fwf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill( sf_isfcav_fwf, (/ sn_isfcav_fwf /), cn_isfdir, 'isf_cav_init', 'read fresh water flux isf data', 'namisf' )
 
          IF(lwp) WRITE(numout,*)
diff --git a/src/OCE/ISF/isfcavgam.F90 b/src/OCE/ISF/isfcavgam.F90
index 6c0ac2a4..de68f6e8 100644
--- a/src/OCE/ISF/isfcavgam.F90
+++ b/src/OCE/ISF/isfcavgam.F90
@@ -11,15 +11,13 @@ MODULE isfcavgam
    !!----------------------------------------------------------------------
    USE isf_oce
    USE isfutils, ONLY: debug
-   USE isftbl  , ONLY: isf_tbl
 
    USE oce     , ONLY: uu, vv              ! ocean dynamics
    USE phycst  , ONLY: grav, vkarmn        ! physical constant
    USE eosbn2  , ONLY: eos_rab             ! equation of state
-   USE zdfdrg  , ONLY: rCd0_top, r_ke0_top ! vertical physics: top/bottom drag coef.
-   USE iom     , ONLY: iom_put             !
    USE lib_mpp , ONLY: ctl_stop
 
+   USE par_oce        ! ocean space and time domain
    USE dom_oce        ! ocean space and time domain
    USE in_out_manager ! I/O manager
    !
@@ -39,88 +37,46 @@ MODULE isfcavgam
    !!----------------------------------------------------------------------
 CONTAINS
    !
-   !!-----------------------------------------------------------------------------------------------------
-   !!                              PUBLIC SUBROUTINES 
-   !!-----------------------------------------------------------------------------------------------------
-   !
-   SUBROUTINE isfcav_gammats( Kmm, pttbl, pstbl, pqoce, pqfwf, pRc, pgt, pgs )
+   SUBROUTINE isfcav_gammats( Kmm, l_converged, pustar, pttbl, pstbl, pqoce, pfwf, pRc, pgt, pgs )
       !!----------------------------------------------------------------------
       !! ** Purpose    : compute the coefficient echange for heat and fwf flux
       !!
       !! ** Method     : select the gamma formulation
       !!                 3 method available (cst, vel and vel_stab)
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt  , pgs      ! gamma t and gamma s 
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                                     :: Kmm             ! ocean time level index
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pqoce, pqfwf    ! isf heat and fwf
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl    ! top boundary layer tracer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pRc             ! Richardson number
-      !!---------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)                :: zutbl, zvtbl    ! top boundary layer velocity
+      INTEGER                    , INTENT(in   ) ::   Kmm             ! ocean time level index
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged     ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pustar          ! u*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pttbl, pstbl    ! top boundary layer tracer
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pqoce, pfwf     ! isf heat and fwf
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pRc             ! Richardson number
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pgt, pgs        ! gamma t and gamma s 
       !!---------------------------------------------------------------------
       !
-      !==========================================
-      ! 1.: compute velocity in the tbl if needed
-      !==========================================
+      ! --- compute gamma --- !
       !
-      SELECT CASE ( cn_gammablk )
-      CASE ( 'spe'  ) 
-         ! gamma is constant (specified in namelist)
-         ! nothing to do
-      CASE ('vel', 'vel_stab')
-         ! compute velocity in tbl
-         CALL isf_tbl(Kmm, uu(:,:,:,Kmm) ,zutbl(:,:),'U', miku, rhisf_tbl_cav)
-         CALL isf_tbl(Kmm, vv(:,:,:,Kmm) ,zvtbl(:,:),'V', mikv, rhisf_tbl_cav)
-         !
-         ! mask velocity in tbl with ice shelf mask
-         zutbl(:,:) = zutbl(:,:) * mskisf_cav(:,:)
-         zvtbl(:,:) = zvtbl(:,:) * mskisf_cav(:,:)
+      SELECT CASE( cn_gammablk )
+      CASE( 'spe'  )       ! gamma is constant (specified in namelist)
          !
-         ! output
-         CALL iom_put('utbl',zutbl(:,:))
-         CALL iom_put('vtbl',zvtbl(:,:))
-      CASE DEFAULT
-         CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
-      END SELECT
-      ! 
-      !==========================================
-      ! 2.: compute gamma
-      !==========================================
-      !
-      SELECT CASE ( cn_gammablk )
-      CASE ( 'spe'  ) ! gamma is constant (specified in namelist)
          pgt(:,:) = rn_gammat0
          pgs(:,:) = rn_gammas0
-      CASE ( 'vel' ) ! gamma is proportional to u*
-         CALL gammats_vel      (                   zutbl, zvtbl, rCd0_top, r_ke0_top,                    pgt, pgs )
-      CASE ( 'vel_stab' ) ! gamma depends of stability of boundary layer and u*
-         CALL gammats_vel_stab (Kmm, pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pRc, pgt, pgs )
+         !
+      CASE( 'vel' )        ! gamma is proportional to u*
+         !
+         CALL gammats_vel( pustar, pgt, pgs )
+         !
+      CASE( 'vel_stab' )   ! gamma depends of stability of boundary layer and u*
+         !
+         CALL gammats_vel_stab( Kmm, l_converged, pustar, pttbl, pstbl, pqoce, pfwf, pRc, pgt, pgs )
+         !
       CASE DEFAULT
          CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
       END SELECT
       !
-      !==========================================
-      ! 3.: output and debug
-      !==========================================
-      !
-      CALL iom_put('isfgammat', pgt(:,:))
-      CALL iom_put('isfgammas', pgs(:,:))
-      !
-      IF (ln_isfdebug) THEN
-         CALL debug( 'isfcav_gam pgt:', pgt(:,:) )
-         CALL debug( 'isfcav_gam pgs:', pgs(:,:) )
-      END IF
-      !
    END SUBROUTINE isfcav_gammats
    !
-   !!-----------------------------------------------------------------------------------------------------
-   !!                              PRIVATE SUBROUTINES 
-   !!-----------------------------------------------------------------------------------------------------
-   !
-   SUBROUTINE gammats_vel( putbl, pvtbl, pCd, pke2, &   ! <<== in
-      &                                  pgt, pgs   )   ! ==>> out gammats [m/s]
+   SUBROUTINE gammats_vel( pustar,  &   ! <<== in
+      &                    pgt, pgs )   ! ==>> out gammats [m/s]
       !!----------------------------------------------------------------------
       !! ** Purpose    : compute the coefficient echange coefficient 
       !!
@@ -128,33 +84,22 @@ CONTAINS
       !!
       !! ** Reference  : Asay-Davis et al., Geosci. Model Dev., 9, 2471-2497, 2016
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt, pgs     ! gammat and gammas [m/s]
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: putbl, pvtbl ! velocity in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pCd          ! drag coefficient
-      REAL(wp),                     INTENT(in   ) :: pke2         ! background velocity
-      !!---------------------------------------------------------------------
-      INTEGER  :: ji, jj                     ! loop index
-      REAL(wp), DIMENSION(jpi,jpj) :: zustar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pustar    ! u*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pgt, pgs  ! gammat and gammas [m/s]
+      !!
+      INTEGER ::   ji, jj                     ! loop index
       !!---------------------------------------------------------------------
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ! compute ustar (AD15 eq. 27)
-         zustar(ji,jj) = SQRT( pCd(ji,jj) * ( putbl(ji,jj) * putbl(ji,jj) + pvtbl(ji,jj) * pvtbl(ji,jj) + pke2 ) ) * mskisf_cav(ji,jj)
-         !
-         ! Compute gammats
-         pgt(ji,jj) = zustar(ji,jj) * rn_gammat0
-         pgs(ji,jj) = zustar(ji,jj) * rn_gammas0
+      DO_2D( 0, 0, 0, 0 )
+         pgt(ji,jj) = pustar(ji,jj) * rn_gammat0
+         pgs(ji,jj) = pustar(ji,jj) * rn_gammas0
       END_2D
       !
-      ! output ustar
-      CALL iom_put('isfustar',zustar(:,:))
       !
    END SUBROUTINE gammats_vel
 
-   SUBROUTINE gammats_vel_stab( Kmm, pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, pRc, &  ! <<== in
-      &                                                                     pgt  , pgs         )  ! ==>> out gammats [m/s]
+   SUBROUTINE gammats_vel_stab( Kmm, l_converged, pustar, pttbl, pstbl, pqoce, pfwf, pRc, &  ! <<== in
+      &                                                                        pgt , pgs  )  ! ==>> out gammats [m/s]
       !!----------------------------------------------------------------------
       !! ** Purpose    : compute the coefficient echange coefficient 
       !!
@@ -162,91 +107,81 @@ CONTAINS
       !!
       !! ** Reference  : Holland and Jenkins, 1999, JPO, p1787-1800
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt, pgs     ! gammat and gammas
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                                     :: Kmm            ! ocean time level index
-      REAL(wp),                     INTENT(in   ) :: pke2           ! background velocity squared
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pqoce, pqfwf   ! surface heat flux and fwf flux
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pCd            ! drag coeficient
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: putbl, pvtbl   ! velocity in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl   ! tracer   in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pRc            ! Richardson number
-      !!---------------------------------------------------------------------
-      INTEGER  :: ji, jj                     ! loop index
-      INTEGER  :: ikt                        ! local integer
-      REAL(wp) :: zdku, zdkv                 ! U, V shear 
-      REAL(wp) :: zPr, zSc                   ! Prandtl and Scmidth number 
-      REAL(wp) :: zmob, zmols                ! Monin Obukov length, coriolis factor at T point
-      REAL(wp) :: zbuofdep, zhnu             ! Bouyancy length scale, sublayer tickness
-      REAL(wp) :: zhmax                      ! limitation of mol
-      REAL(wp) :: zetastar                   ! stability parameter
-      REAL(wp) :: zgmolet, zgmoles, zgturb   ! contribution of modelecular sublayer and turbulence 
-      REAL(wp) :: zcoef                      ! temporary coef
-      REAL(wp) :: zdep
-      REAL(wp) :: zeps = 1.0e-20_wp    
-      REAL(wp), PARAMETER :: zxsiN = 0.052_wp   ! dimensionless constant
-      REAL(wp), PARAMETER :: znu   = 1.95e-6_wp ! kinamatic viscosity of sea water (m2.s-1)
-      REAL(wp), DIMENSION(2) :: zts, zab
-      REAL(wp), DIMENSION(jpi,jpj) :: zustar    ! friction velocity
+      INTEGER                    , INTENT(in   ) ::   Kmm            ! ocean time level index
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged    ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pustar         ! u*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pttbl, pstbl   ! tracer in the losch top boundary layer
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pqoce, pfwf    ! surface heat flux and fwf flux
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pRc            ! Richardson number
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pgt, pgs       ! gammat and gammas
+      !!
+      INTEGER  ::   ji, jj                     ! loop index
+      INTEGER  ::   ikt                        ! local integer
+      REAL(wp) ::   zmob, zmols                ! Monin Obukov length, coriolis factor at T point
+      REAL(wp) ::   zbuofdep, zhnu             ! Bouyancy length scale, sublayer tickness
+      REAL(wp) ::   zhmax                      ! limitation of mol
+      REAL(wp) ::   zetastar                   ! stability parameter
+      REAL(wp) ::   zgmolet, zgmoles, zgturb   ! contribution of modelecular sublayer and turbulence 
+      REAL(wp) ::   zdep
+      REAL(wp), PARAMETER ::   zxsiN =    0.052_wp   ! dimensionless constant
+      REAL(wp), PARAMETER ::   znu   =    1.95e-6_wp ! kinamatic viscosity of sea water (m2.s-1)
+      REAL(wp), PARAMETER ::   zPr   =   13.8_wp
+      REAL(wp), PARAMETER ::   zSc   = 2432.0_wp
+      REAL(wp), DIMENSION(jpts) ::   zts, zab
       !!---------------------------------------------------------------------
       !
-      ! compute Pr and Sc number (eq ??)
-      zPr =   13.8_wp
-      zSc = 2432.0_wp
-      !
       ! compute gamma mole (eq ??)
       zgmolet = 12.5_wp * zPr ** (2.0/3.0) - 6.0_wp
       zgmoles = 12.5_wp * zSc ** (2.0/3.0) - 6.0_wp
       !
       ! compute gamma
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-
-         ikt = mikt(ji,jj)
-
-         ! compute ustar
-         zustar(ji,jj) = SQRT( pCd(ji,jj) * ( putbl(ji,jj) * putbl(ji,jj) + pvtbl(ji,jj) * pvtbl(ji,jj) + pke2 ) )
-
-         IF( zustar(ji,jj) == 0._wp ) THEN           ! only for kt = 1 I think
-            pgt(ji,jj) = rn_gammat0
-            pgs(ji,jj) = rn_gammas0
-         ELSE
-            ! compute bouyancy 
-            zts(jp_tem) = pttbl(ji,jj)
-            zts(jp_sal) = pstbl(ji,jj)
-            zdep        = gdepw(ji,jj,ikt,Kmm)
-            !
-            CALL eos_rab( zts, zdep, zab, Kmm )
-            !
-            ! compute length scale (Eq ??)
-            zbuofdep = grav * ( zab(jp_tem) * pqoce(ji,jj) - zab(jp_sal) * pqfwf(ji,jj) )
-            !
-            ! compute Monin Obukov Length
-            ! Maximum boundary layer depth (Eq ??)
-            zhmax = gdept(ji,jj,mbkt(ji,jj),Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm) -0.001_wp
-            !
-            ! Compute Monin obukhov length scale at the surface and Ekman depth: (Eq ??)
-            zmob   = zustar(ji,jj) ** 3 / (vkarmn * (zbuofdep + zeps))
-            zmols  = SIGN(1._wp, zmob) * MIN(ABS(zmob), zhmax) * tmask(ji,jj,ikt)
-            !
-            ! compute eta* (stability parameter) (Eq ??)
-            zetastar = 1._wp / ( SQRT(1._wp + MAX( 0._wp, zxsiN * zustar(ji,jj) &
-               &                                        / MAX( 1.e-20, ABS(ff_t(ji,jj)) * zmols * pRc(ji,jj) ) )))
-            !
-            ! compute the sublayer thickness (Eq ??)
-            zhnu = 5 * znu / MAX( 1.e-20, zustar(ji,jj) )
+      DO_2D( 0, 0, 0, 0 )
+         !
+         IF ( .NOT. l_converged(ji,jj) ) THEN
             !
-            ! compute gamma turb (Eq ??)
-            zgturb = 1._wp / vkarmn * LOG(zustar(ji,jj) * zxsiN * zetastar * zetastar / MAX( 1.e-10, ABS(ff_t(ji,jj)) * zhnu )) &
-               &      + 1._wp / ( 2 * zxsiN * zetastar ) - 1._wp / vkarmn
+            ikt = mikt(ji,jj)
             !
-            ! compute gammats
-            pgt(ji,jj) = zustar(ji,jj) / (zgturb + zgmolet)
-            pgs(ji,jj) = zustar(ji,jj) / (zgturb + zgmoles)
-         END IF
+            IF( pustar(ji,jj) == 0._wp ) THEN           ! only for kt = 1 I think
+               pgt(ji,jj) = rn_gammat0
+               pgs(ji,jj) = rn_gammas0
+            ELSE
+               ! compute bouyancy 
+               zts(jp_tem) = pttbl(ji,jj)
+               zts(jp_sal) = pstbl(ji,jj)
+               zdep        = gdepw(ji,jj,ikt,Kmm)
+               !
+               CALL eos_rab( zts, zdep, zab, Kmm )
+               !
+               ! compute length scale (Eq ??)
+               zbuofdep = grav * ( zab(jp_tem) * pqoce(ji,jj) - zab(jp_sal) * pfwf(ji,jj) )
+               !
+               ! compute Monin Obukov Length
+               ! Maximum boundary layer depth (Eq ??)
+               zhmax = gdept(ji,jj,mbkt(ji,jj),Kmm) - gdepw(ji,jj,ikt,Kmm) -0.001_wp
+               !
+               ! Compute Monin obukhov length scale at the surface and Ekman depth: (Eq ??)
+               zmob   = pustar(ji,jj) ** 3 / (vkarmn * (zbuofdep + 1.e-20_wp ))
+               zmols  = SIGN(1._wp, zmob) * MIN(ABS(zmob), zhmax) * tmask(ji,jj,ikt)
+               !
+               ! compute eta* (stability parameter) (Eq ??)
+               zetastar = 1._wp / ( SQRT(1._wp + MAX( 0._wp, zxsiN * pustar(ji,jj) &
+                  &                                        / MAX( 1.e-20, ABS(ff_t(ji,jj)) * zmols * pRc(ji,jj) ) )))
+               !
+               ! compute the sublayer thickness (Eq ??)
+               zhnu = 5 * znu / MAX( 1.e-20, pustar(ji,jj) )
+               !
+               ! compute gamma turb (Eq ??)
+               zgturb = 1._wp / vkarmn * LOG(pustar(ji,jj) * zxsiN * zetastar * zetastar / MAX( 1.e-10_wp, ABS(ff_t(ji,jj)) * zhnu )) &
+                  &   + 1._wp / ( 2 * zxsiN * zetastar ) - 1._wp / vkarmn
+               !
+               ! compute gammats
+               pgt(ji,jj) = pustar(ji,jj) / (zgturb + zgmolet)
+               pgs(ji,jj) = pustar(ji,jj) / (zgturb + zgmoles)
+            ENDIF
+            !  
+         ENDIF
+         !
       END_2D
-      ! output ustar
-      CALL iom_put('isfustar',zustar(:,:))
 
    END SUBROUTINE gammats_vel_stab
 
diff --git a/src/OCE/ISF/isfcavmlt.F90 b/src/OCE/ISF/isfcavmlt.F90
index 665d75bb..e5a2ab26 100644
--- a/src/OCE/ISF/isfcavmlt.F90
+++ b/src/OCE/ISF/isfcavmlt.F90
@@ -11,20 +11,16 @@ MODULE isfcavmlt
    !!   isfcav_mlt    : compute or read ice shelf fwf/heat fluxes from isf 
    !!                   to oce
    !!----------------------------------------------------------------------
-
    USE isf_oce                  ! ice shelf
-   USE isftbl , ONLY: isf_tbl   ! ice shelf depth average
-   USE isfutils,ONLY: debug     ! debug subroutine
 
+   USE par_oce                            ! ocean space and time domain
    USE dom_oce                            ! ocean space and time domain
    USE phycst , ONLY: rcp, rho0, rho0_rcp ! physical constants
-   USE eosbn2 , ONLY: eos_fzp             ! equation of state
 
    USE in_out_manager              ! I/O manager
-   USE iom        , ONLY: iom_put  ! I/O library
    USE fldread    , ONLY: fld_read, FLD, FLD_N !
-   USE lib_fortran, ONLY: glob_sum !
-   USE lib_mpp    , ONLY: ctl_stop !
+   USE lib_fortran, ONLY: glob_sum_vec
+   USE lib_mpp    , ONLY: ctl_stop
 
    IMPLICIT NONE
    PRIVATE
@@ -40,60 +36,51 @@ MODULE isfcavmlt
    !!----------------------------------------------------------------------
 CONTAINS
 
-! -------------------------------------------------------------------------------------------------------
-! -------------------------------- PUBLIC SUBROUTINE ----------------------------------------------------
-! -------------------------------------------------------------------------------------------------------
 
-   SUBROUTINE isfcav_mlt(kt, pgt, pgs , pttbl, pstbl, &
-      &                           pqhc, pqoce, pqfwf  )
+   SUBROUTINE isfcav_mlt( kt, l_converged, pgt, pgs , pttbl, pstbl, &
+      &                                    pqhc, pqoce, pfwf, ptfrz )
       !!----------------------------------------------------------------------
       !!
       !!                          ***  ROUTINE isfcav_mlt  ***
       !!
       !! ** Purpose    : compute or read ice shelf fwf/heat fluxes in the ice shelf cavity
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER, INTENT(in) :: kt
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pgt  , pgs    ! gamma t and gamma s
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl  ! top boundary layer tracer
+      !!---------------------------------------------------------------------
+      INTEGER, INTENT(in) ::   kt
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged         ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pgt, pgs            ! gamma t and gamma s
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pttbl, pstbl        ! top boundary layer tracer
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf   ! heat and fwf fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   ptfrz               ! tbl freezing temperature
       !!---------------------------------------------------------------------
       !
       ! compute latent heat and melt (2d)
       SELECT CASE ( cn_isfcav_mlt )
       CASE ( 'spe' )   ! ice shelf melt specified (read input file, and heat fluxes derived from
-         CALL isfcav_mlt_spe( kt, pstbl,               &
-            &                  pqhc, pqoce, pqfwf  )
+         !
+         CALL isfcav_mlt_spe  ( kt, l_converged,                          pqhc, pqoce, pfwf, ptfrz )
+         !
       CASE ( '2eq' )   !  ISOMIP  formulation (2 equations) for volume flux (Hunter et al., 2006)
-         CALL isfcav_mlt_2eq( pgt, pttbl, pstbl,       &
-            &                  pqhc , pqoce, pqfwf )
+         !
+         CALL isfcav_mlt_2eq  (     l_converged, pgt,       pttbl,        pqhc, pqoce, pfwf, ptfrz )
+         !
       CASE ( '3eq' )   ! ISOMIP+ formulation (3 equations) for volume flux (Asay-Davis et al., 2015)
-         CALL isfcav_mlt_3eq( pgt, pgs , pttbl, pstbl, &
-            &                  pqhc, pqoce, pqfwf  )
+         !
+         CALL isfcav_mlt_3eq  (     l_converged, pgt, pgs , pttbl, pstbl, pqhc, pqoce, pfwf, ptfrz )
+         !
       CASE ( 'oasis' ) ! fwf pass trough oasis
-         CALL isfcav_mlt_oasis( kt, pstbl,              &
-            &                   pqhc, pqoce, pqfwf  )
+         !
+         CALL isfcav_mlt_oasis( kt, l_converged,                          pqhc, pqoce, pfwf, ptfrz )
+         !
       CASE DEFAULT
          CALL ctl_stop('STOP', 'unknown isf melt formulation : cn_isfcav (should not see this)')
       END SELECT
       !
-      IF (ln_isfdebug) THEN
-         IF(lwp) WRITE(numout,*) ''
-         CALL debug( 'isfcav_mlt qhc  :', pqhc (:,:) )
-         CALL debug( 'isfcav_mlt qoce :', pqoce(:,:) )
-         CALL debug( 'isfcav_mlt qfwf :', pqfwf(:,:) )
-         IF(lwp) WRITE(numout,*) ''
-      END IF
-      !
    END SUBROUTINE isfcav_mlt
 
-! -------------------------------------------------------------------------------------------------------
-! -------------------------------- PRIVATE SUBROUTINE ---------------------------------------------------
-! -------------------------------------------------------------------------------------------------------
 
-   SUBROUTINE isfcav_mlt_spe(kt, pstbl,          &  ! <<== in
-      &                      pqhc , pqoce, pqfwf )  ! ==>> out
+   SUBROUTINE isfcav_mlt_spe( kt, l_converged,                          &  ! <<== in
+      &                                        pqhc, pqoce, pfwf, ptfrz )  ! ==>> inout
       !!----------------------------------------------------------------------
       !!
       !!                          ***  ROUTINE isfcav_mlt_spe  ***
@@ -102,34 +89,30 @@ CONTAINS
       !!                 - compute ocea-ice heat flux (assuming it is equal to latent heat)
       !!                 - compute heat content flux
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! heat content, latent heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                     , INTENT(in   ) :: kt                  ! current time step
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pstbl               ! salinity in tbl
-      !!--------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: ztfrz                              ! tbl freezing temperature
+      INTEGER                    , INTENT(in   ) ::   kt                 ! current time step
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged        ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf  ! heat content, latent heat and fwf fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz              ! tbl freezing temp
+      !!
+      INTEGER ::   ji, jj     ! dummy loop indices
       !!--------------------------------------------------------------------
       !
-      ! Compute freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
-      !
       ! read input file of fwf (from isf to oce; ie melt)
       CALL fld_read ( kt, 1, sf_isfcav_fwf )
       !
-      ! define fwf and qoce
-      ! ocean heat flux is assume to be equal to the latent heat
-      pqfwf(:,:) =   sf_isfcav_fwf(1)%fnow(:,:,1)      ! fwf                ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean heat flux    ( > 0 from isf to oce)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux  ( > 0 from isf to oce)
-      !
-      ! output freezing point at the interface
-      CALL iom_put('isftfrz_cav', ztfrz(:,:) * mskisf_cav(:,:) )
+      ! define fwf and qoce (ocean heat flux is assume to be equal to the latent heat)
+      DO_2D( 0, 0, 0, 0 )
+         IF ( .NOT. l_converged(ji,jj) ) THEN
+            pfwf (ji,jj) =   sf_isfcav_fwf(1)%fnow(ji,jj,1)   * mskisf_cav(ji,jj)   ! fwf                ( > 0 from isf to oce)
+            pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf           * mskisf_cav(ji,jj)   ! ocean heat flux    ( > 0 from isf to oce)
+            pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp * mskisf_cav(ji,jj)   ! heat content flux  ( > 0 from isf to oce)
+         ENDIF
+      END_2D
       !
    END SUBROUTINE isfcav_mlt_spe
 
-   SUBROUTINE isfcav_mlt_2eq(pgt , pttbl, pstbl, &  ! <<== in
-      &                      pqhc, pqoce, pqfwf  )  ! ==>> out
+   SUBROUTINE isfcav_mlt_2eq( l_converged, pgt , pttbl,             &  ! <<== in
+      &                                    pqhc, pqoce, pfwf, ptfrz )  ! ==>> inout
       !!----------------------------------------------------------------------
       !!
       !!                          ***  ROUTINE isfcav_mlt_2eq  ***
@@ -138,43 +121,39 @@ CONTAINS
       !!
       !! ** Method     : The ice shelf melt latent heat is defined as being equal to the ocean/ice heat flux.
       !!                 From this we can derived the fwf, ocean/ice heat flux and the heat content flux as being :
-      !!                   qfwf  = Gammat * rho0 * Cp * ( Tw - Tfrz ) / Lf 
+      !!                    fwf  = Gammat * rho0 * Cp * ( Tw - Tfrz ) / Lf 
       !!                   qhoce = qlat
-      !!                   qhc   = qfwf * Cp * Tfrz
+      !!                   qhc   = fwf * Cp * Tfrz
       !!
       !! ** Reference  : Hunter,  J.  R.:  Specification  for  test  models  of  ice  shelf  cavities,  
       !!                 Tech.  Rep.  June,  Antarctic  Climate  &  Ecosystems  Cooperative  Research  Centre,  available  at:  
       !!                 http://staff.acecrc.org.au/~bkgalton/ISOMIP/test_cavities.pdf (last access: 21 July 2016), 2006.
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! hean content, ocean-ice heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pgt           ! temperature exchange coeficient
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl  ! temperature and salinity in top boundary layer
       !!--------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: ztfrz         ! freezing temperature
-      REAL(wp), DIMENSION(jpi,jpj) :: zthd          ! thermal driving
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged        ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pgt                ! temperature exchange coeficient
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pttbl              ! temperature and salinity in top boundary layer
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf  ! hean content, ocean-ice heat and fwf fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz              ! tbl freezing temp
+      !!
+      INTEGER  ::   ji, jj     ! dummy loop indices
       !!--------------------------------------------------------------------
       !
-      ! Calculate freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
-      !
-      ! thermal driving
-      zthd (:,:) = ( pttbl(:,:) - ztfrz(:,:) ) * mskisf_cav(:,:)
-      !
-      ! compute ocean-ice heat flux and then derive fwf assuming that ocean heat flux equal latent heat
-      pqfwf(:,:) =   pgt(:,:) * rho0_rcp * zthd(:,:) / rLfusisf    ! fresh water flux  ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf                         ! ocea-ice flux     ( > 0 from isf to oce)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp                 ! heat content flux ( > 0 from isf to oce)
-      !
-      ! output thermal driving and freezinpoint at the ice shelf interface
-      CALL iom_put('isfthermald_cav', zthd )
-      CALL iom_put('isftfrz_cav'    , ztfrz(:,:) * mskisf_cav(:,:) )
+      DO_2D( 0, 0, 0, 0 )
+         !
+         ! compute ocean-ice heat flux and then derive fwf assuming that ocean heat flux equal latent heat
+         IF ( .NOT. l_converged(ji,jj) ) THEN
+            pfwf (ji,jj) =   pgt (ji,jj) * rho0_rcp * ( pttbl(ji,jj) - ptfrz(ji,jj) ) / rLfusisf * mskisf_cav(ji,jj)  ! fresh water flux  ( > 0 from isf to oce)
+            pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf                                              * mskisf_cav(ji,jj)  ! ocea-ice flux     ( > 0 from isf to oce)
+            pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp                                    * mskisf_cav(ji,jj)  ! heat content flux ( > 0 from isf to oce)
+            !
+         ENDIF
+      END_2D
       !
    END SUBROUTINE isfcav_mlt_2eq
 
-   SUBROUTINE isfcav_mlt_3eq(pgt, pgs , pttbl, pstbl, &  ! <<== in
-      &                           pqhc, pqoce, pqfwf  )  ! ==>> out
+   SUBROUTINE isfcav_mlt_3eq( l_converged, pgt, pgs , pttbl, pstbl, &  ! <<== in
+      &                                    pqhc, pqoce, pfwf, ptfrz )  ! ==>> inout
       !!----------------------------------------------------------------------
       !!
       !!                          ***  ROUTINE isfcav_mlt_3eq  ***
@@ -194,71 +173,58 @@ CONTAINS
       !!                   MISMIP v. 3 (MISMIP +), ISOMIP v. 2 (ISOMIP +) and MISOMIP v. 1 (MISOMIP1), 
       !!                   Geosci. Model Dev., 9, 2471-2497, https://doi.org/10.5194/gmd-9-2471-2016, 2016. 
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! latent heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pgt  , pgs          ! heat/salt exchange coeficient
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl        ! mean temperature and salinity in top boundary layer
       !!--------------------------------------------------------------------
-      REAL(wp) :: zeps1,zeps2,zeps3,zeps4,zeps6,zeps7       ! dummy local scalar for quadratic equation resolution
-      REAL(wp) :: zaqe,zbqe,zcqe,zaqer,zdis,zsfrz,zcfac     ! dummy local scalar for quadratic equation resolution
-      REAL(wp) :: zeps = 1.e-20
-      REAL(wp), DIMENSION(jpi,jpj) :: ztfrz         ! freezing point
-      REAL(wp), DIMENSION(jpi,jpj) :: zqcon         ! conductive flux through the ice shelf
-      REAL(wp), DIMENSION(jpi,jpj) :: zthd          ! thermal driving
-      !
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged        ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pgt  , pgs         ! heat/salt exchange coeficient
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   pttbl, pstbl       ! mean temperature and salinity in top boundary layer
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf  ! latent heat and fwf fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   ptfrz              ! tbl freezing temp
+      !!
       INTEGER  ::   ji, jj     ! dummy loop indices
+      REAL(wp) ::   zeps1, zeps2, zeps3, zeps4, zeps6, zeps7        ! dummy local scalar for quadratic equation resolution
+      REAL(wp) ::   zaqe, zbqe, zcqe, zaqer, zdis, zsfrz, zcfac     ! dummy local scalar for quadratic equation resolution
       !!--------------------------------------------------------------------
       !
       ! compute upward heat flux zhtflx and upward water flux zwflx
       ! Resolution of a 3d equation from equation 24, 25 and 26 (note conduction through the ice has been added to Eq 24)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         !
-         ! compute coeficient to solve the 2nd order equation
-         zeps1 = rho0_rcp * pgt(ji,jj)
-         zeps2 = rLfusisf * rho0 * pgs(ji,jj)
-         zeps3 = rhoisf * rcpisf * rkappa / MAX(risfdep(ji,jj),zeps)
-         zeps4 = risf_lamb2 + risf_lamb3 * risfdep(ji,jj)
-         zeps6 = zeps4 - pttbl(ji,jj)
-         zeps7 = zeps4 - rtsurf
-         !
-         ! solve the 2nd order equation to find zsfrz
-         zaqe  = risf_lamb1 * (zeps1 + zeps3)
-         zaqer = 0.5_wp / MIN(zaqe,-zeps)
-         zbqe  = zeps1 * zeps6 + zeps3 * zeps7 - zeps2
-         zcqe  = zeps2 * pstbl(ji,jj)
-         zdis  = zbqe * zbqe - 4.0_wp * zaqe * zcqe               
-         !
-         ! Presumably zdis can never be negative because gammas is very small compared to gammat
-         zsfrz=(-zbqe - SQRT(zdis)) * zaqer
-         IF ( zsfrz < 0.0_wp ) zsfrz=(-zbqe + SQRT(zdis)) * zaqer  ! check this if this if is needed
-         !
-         ! compute t freeze (eq. 25)
-         ztfrz(ji,jj) = zeps4 + risf_lamb1 * zsfrz
-         !
-         ! thermal driving
-         zthd(ji,jj) = ( pttbl(ji,jj) - ztfrz(ji,jj) )
-         !
-         ! compute the upward water and heat flux (eq. 24 and eq. 26)
-         pqfwf(ji,jj) = - rho0     * pgs(ji,jj) * ( zsfrz - pstbl(ji,jj) ) / MAX(zsfrz,zeps) ! fresh water flux    ( > 0 from isf to oce)
-         pqoce(ji,jj) = - rho0_rcp * pgt(ji,jj) * zthd (ji,jj)                               ! ocean-ice heat flux ( > 0 from isf to oce)
-         pqhc (ji,jj) =   rcp      * pqfwf(ji,jj) * ztfrz(ji,jj)                             ! heat content   flux ( > 0 from isf to oce)
+      DO_2D( 0, 0, 0, 0 )
          !
-         zqcon(ji,jj) = zeps3 * ( ztfrz(ji,jj) - rtsurf )
+         IF ( .NOT. l_converged(ji,jj) ) THEN
+            ! compute coeficient to solve the 2nd order equation
+            zeps1 = rho0_rcp * pgt(ji,jj)
+            zeps2 = rLfusisf * rho0 * pgs(ji,jj)
+            zeps3 = rhoisf * rcpisf * rkappa / MAX(risfdep(ji,jj),1.e-20)
+            zeps4 = risf_lamb2 + risf_lamb3 * risfdep(ji,jj)
+            zeps6 = zeps4 - pttbl(ji,jj)
+            zeps7 = zeps4 - rtsurf
+            !
+            ! solve the 2nd order equation to find zsfrz
+            zaqe  = risf_lamb1 * (zeps1 + zeps3)
+            zaqer = 0.5_wp / MIN(zaqe,-1.e-20)
+            zbqe  = zeps1 * zeps6 + zeps3 * zeps7 - zeps2
+            zcqe  = zeps2 * pstbl(ji,jj)
+            zdis  = zbqe * zbqe - 4.0_wp * zaqe * zcqe
+            !
+            ! Presumably zdis can never be negative because gammas is very small compared to gammat
+            zsfrz=(-zbqe - SQRT(zdis)) * zaqer
+            IF ( zsfrz < 0.0_wp ) zsfrz=(-zbqe + SQRT(zdis)) * zaqer  ! check this if this if is needed
+            !
+            ! compute t freeze (eq. 25)
+            ptfrz(ji,jj) = zeps4 + risf_lamb1 * zsfrz
+            !
+            ! compute the upward water and heat flux (eq. 24 and eq. 26)
+            pfwf (ji,jj) = - rho0     * pgs(ji,jj) * ( zsfrz - pstbl(ji,jj) ) / MAX(zsfrz,1.e-20) * mskisf_cav(ji,jj) ! fresh water flux    ( > 0 from isf to oce)
+            pqoce(ji,jj) = - rho0_rcp * pgt(ji,jj) * ( pttbl(ji,jj) - ptfrz(ji,jj) )              * mskisf_cav(ji,jj) ! ocean-ice heat flux ( > 0 from isf to oce)
+            pqhc (ji,jj) =   rcp      * pfwf(ji,jj) * ptfrz(ji,jj)                                * mskisf_cav(ji,jj) ! heat content   flux ( > 0 from isf to oce)
+            !
+         ENDIF
          !
       END_2D
       !
-      ! output conductive heat flux through the ice
-      CALL iom_put('qconisf', zqcon(:,:) * mskisf_cav(:,:) )
-      !
-      ! output thermal driving and freezing point at the interface
-      CALL iom_put('isfthermald_cav', zthd (:,:) * mskisf_cav(:,:) )
-      CALL iom_put('isftfrz_cav'    , ztfrz(:,:) * mskisf_cav(:,:) )
-      !
    END SUBROUTINE isfcav_mlt_3eq
 
-   SUBROUTINE isfcav_mlt_oasis(kt, pstbl,          &  ! <<== in
-      &                        pqhc , pqoce, pqfwf )  ! ==>> out
+   SUBROUTINE isfcav_mlt_oasis( kt, l_converged,                          &  ! <<== in
+      &                                          pqhc, pqoce, pfwf, ptfrz )  ! ==>> inout
       !!----------------------------------------------------------------------
       !!                          ***  ROUTINE isfcav_mlt_oasis  ***
       !!
@@ -269,44 +235,38 @@ CONTAINS
       !!                 - scale fwf and compute heat fluxes
       !!
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! heat content, latent heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                     , INTENT(in   ) :: kt                  ! current time step
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pstbl               ! salinity in tbl
-      !!--------------------------------------------------------------------
-      REAL(wp)                     :: zfwf_fld, zfwf_oasis               ! total fwf in the forcing fields (pattern) and from the oasis interface (amount)
-      REAL(wp), DIMENSION(jpi,jpj) :: ztfrz                              ! tbl freezing temperature
-      REAL(wp), DIMENSION(jpi,jpj) :: zfwf                               ! 2d fwf map after scaling
+      INTEGER                    , INTENT(in   ) ::   kt                 ! current time step
+      LOGICAL , DIMENSION(A2D(0)), INTENT(in   ) ::   l_converged        ! true when melting converges (per grid point)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf  ! heat content, latent heat and fwf fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz              ! tbl freezing temp
+      !!
+      INTEGER  ::   ji, jj
+      REAL(wp), DIMENSION(A2D(0),2) ::   ztmp
+      REAL(wp), DIMENSION(2)        ::   zbg
       !!--------------------------------------------------------------------
       !
-      ! Calculate freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
-      !
       ! read input file of fwf from isf to oce
       CALL fld_read ( kt, 1, sf_isfcav_fwf )
       !
-      ! ice shelf 2d map
-      zfwf(:,:) = sf_isfcav_fwf(1)%fnow(:,:,1)
-      !
-      ! compute glob sum from input file
-      ! (PM) should consider delay sum as in fwb (1 time step offset if I well understood)
-      zfwf_fld = glob_sum('isfcav_mlt', e1e2t(:,:) * zfwf(:,:))
+      DO_2D( 0, 0, 0, 0 )
+         ! ice shelf 2d map
+         IF ( .NOT. l_converged(ji,jj) )   pfwf(ji,jj) = sf_isfcav_fwf(1)%fnow(ji,jj,1)
+         ztmp(ji,jj,1) = e1e2t(ji,jj) * pfwf(ji,jj)
+         ztmp(ji,jj,2) = e1e2t(ji,jj) * fwfisf_oasis(ji,jj)
+      END_2D
       !
-      ! compute glob sum from atm->oce ice shelf fwf
+      ! compute glob sum from input file and from atm->oce ice shelf fwf
       ! (PM) should consider delay sum as in fwb (1 time step offset if I well understood)
-      zfwf_oasis = glob_sum('isfcav_mlt', e1e2t(:,:) * fwfisf_oasis(:,:))
+      zbg = glob_sum_vec( 'isfcav_mlt', ztmp )
       !
-      ! scale fwf
-      zfwf(:,:) = zfwf(:,:) * zfwf_oasis / zfwf_fld
-      ! 
-      ! define fwf and qoce
-      ! ocean heat flux is assume to be equal to the latent heat
-      pqfwf(:,:) =   zfwf(:,:)                         ! fwf                ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean heat flux    ( > 0 from isf to oce)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux  ( > 0 from isf to oce)
-      !
-      CALL iom_put('isftfrz_cav', ztfrz * mskisf_cav(:,:) )
+      ! compute the upward water and heat flux (ocean heat flux is assume to be equal to the latent heat)
+      DO_2D( 0, 0, 0, 0 )
+         IF ( .NOT. l_converged(ji,jj) ) THEN
+            pfwf (ji,jj) =   pfwf(ji,jj) * zbg(2) / zbg(1)    * mskisf_cav(ji,jj)   ! scale fwf
+            pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf           * mskisf_cav(ji,jj)   ! ocean heat flux    ( > 0 from isf to oce)
+            pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp * mskisf_cav(ji,jj)   ! heat content flux  ( > 0 from isf to oce)
+         ENDIF
+      END_2D
       !
    END SUBROUTINE isfcav_mlt_oasis
 
diff --git a/src/OCE/ISF/isfcpl.F90 b/src/OCE/ISF/isfcpl.F90
index b035cd5e..e2e9464b 100644
--- a/src/OCE/ISF/isfcpl.F90
+++ b/src/OCE/ISF/isfcpl.F90
@@ -11,13 +11,12 @@ MODULE isfcpl
    !!----------------------------------------------------------------------
    !!   isfrst        : read/write iceshelf variables in/from restart
    !!----------------------------------------------------------------------
+   USE par_oce        ! ocean space and time domain
    USE oce            ! ocean dynamics and tracers
 #if defined key_qco
    USE domqco  , ONLY : dom_qco_zgr      ! vertical scale factor interpolation
 #elif defined key_linssh
    !                                     ! fix in time coordinate
-#else
-   USE domvvl  , ONLY : dom_vvl_zgr      ! vertical scale factor interpolation
 #endif
    USE domutl  , ONLY : dom_ngb          ! find the closest grid point from a given lon/lat position
    USE isf_oce        ! ice shelf variable
@@ -32,7 +31,6 @@ MODULE isfcpl
    PRIVATE
 
    PUBLIC isfcpl_rst_write, isfcpl_init                    ! iceshelf restart read and write
-   PUBLIC isfcpl_ssh, isfcpl_tra, isfcpl_vol, isfcpl_cons  ! iceshelf correction for ssh, tra, dyn and conservation
 
    TYPE isfcons
       INTEGER ::   ii     ! i global
@@ -79,6 +77,13 @@ CONTAINS
       ! allocation and initialisation to 0
       CALL isf_alloc_cpl()
       !
+      risfcpl_tsc     (:,:,:,:) = 0._wp
+      risfcpl_cons_tsc(:,:,:,:) = 0._wp
+      risfcpl_vol     (:,:,:)   = 0._wp
+      risfcpl_cons_vol(:,:,:)   = 0._wp
+      risfcpl_ssh     (:,:)     = 0._wp
+      risfcpl_cons_ssh(:,:)     = 0._wp
+      !
       ! check presence of variable needed for coupling
       ! iom_varid return 0 if not found
       id = 1
@@ -115,11 +120,11 @@ CONTAINS
       !
       ! all before fields set to now values
       ts  (:,:,:,:,Kbb) = ts  (:,:,:,:,Kmm)
-      uu   (:,:,:,Kbb)   = uu   (:,:,:,Kmm)
-      vv   (:,:,:,Kbb)   = vv   (:,:,:,Kmm)
+      uu  (:,:,:,Kbb)   = uu  (:,:,:,Kmm)
+      vv  (:,:,:,Kbb)   = vv  (:,:,:,Kmm)
       ssh (:,:,Kbb)     = ssh (:,:,Kmm)
 #if ! defined key_qco   &&   ! defined key_linssh
-      e3t(:,:,:,Kbb)   = e3t(:,:,:,Kmm)
+      e3t (:,:,:,Kbb)   = e3t (:,:,:,Kmm)
 #endif
    END SUBROUTINE isfcpl_init
 
@@ -135,23 +140,30 @@ CONTAINS
       INTEGER, INTENT(in) :: Kmm    ! ocean time level index
       !!----------------------------------------------------------------------
       INTEGER :: jk                               ! loop index
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t, ze3u, ze3v, zgdepw  ! for qco substitution
+      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztmp    ! for qco substitution
       !!----------------------------------------------------------------------
       !
+      CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask  )
+      CALL iom_rstput( kt, nitrst, numrow, 'ssmask' , ssmask )
+      !
+      DO jk = 1, jpk
+         ztmp(:,:,jk) = e3t(:,:,jk,Kmm)
+      END DO
+      CALL iom_rstput( kt, nitrst, numrow, 'e3t_n'  , ztmp   )
       DO jk = 1, jpk
-         ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         ze3u(:,:,jk) = e3u(:,:,jk,Kmm)
-         ze3v(:,:,jk) = e3v(:,:,jk,Kmm)
+         ztmp(:,:,jk) = e3u(:,:,jk,Kmm)
+      END DO
+      CALL iom_rstput( kt, nitrst, numrow, 'e3u_n'  , ztmp   )
+      DO jk = 1, jpk
+         ztmp(:,:,jk) = e3v(:,:,jk,Kmm)
+      END DO
+      CALL iom_rstput( kt, nitrst, numrow, 'e3v_n'  , ztmp   )
          !
-         zgdepw(:,:,jk) = gdepw(:,:,jk,Kmm)
+      DO jk = 1, jpk
+         ztmp(:,:,jk) = gdepw(:,:,jk,Kmm)
       END DO
+      CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', ztmp )
       !
-      CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask  )
-      CALL iom_rstput( kt, nitrst, numrow, 'ssmask' , ssmask )
-      CALL iom_rstput( kt, nitrst, numrow, 'e3t_n'  , ze3t   )
-      CALL iom_rstput( kt, nitrst, numrow, 'e3u_n'  , ze3u   )
-      CALL iom_rstput( kt, nitrst, numrow, 'e3v_n'  , ze3v   )
-      CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', zgdepw )
       !
    END SUBROUTINE isfcpl_rst_write
 
@@ -166,13 +178,14 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       !!
-      INTEGER, INTENT(in) :: Kbb, Kmm, Kaa    ! ocean time level indices
+      INTEGER, INTENT(in) ::   Kbb, Kmm, Kaa    ! ocean time level indices
       !!----------------------------------------------------------------------
-      INTEGER :: ji, jj, jd, jk      !! loop index
-      INTEGER :: jip1, jim1, jjp1, jjm1
+      INTEGER ::   ji, jj, jd, jk      !! loop index
+      INTEGER ::   jip1, jim1, jjp1, jjm1
+      INTEGER ::   ibnd
       !!
-      REAL(wp):: zsummsk
-      REAL(wp), DIMENSION(jpi,jpj) :: zdssmask, zssmask0, zssmask_b, zssh
+      REAL(wp)::   zdssmask, zsummsk
+      REAL(wp), DIMENSION(jpi,jpj) ::  zssmask0, zssmask_b, zssh
       !!----------------------------------------------------------------------
       !
       CALL iom_get( numror, jpdom_auto, 'ssmask'  , zssmask_b   ) ! need to extrapolate T/S
@@ -185,26 +198,36 @@ CONTAINS
       !
       DO jd = 1, nn_drown
          !
-         zdssmask(:,:) = ssmask(:,:) - zssmask0(:,:)
-         DO_2D( 0, 0, 0, 0 )
+         IF    ( MOD(jd,2) == 0 ) THEN ! even
+            ibnd = nn_hls-1
+         ELSEIF( MOD(jd,2) == 1 ) THEN ! odd
+            ibnd = 0
+         ENDIF
+         
+         DO_2D( ibnd, ibnd, ibnd, ibnd )
+            zdssmask = ssmask(ji,jj) - zssmask0(ji,jj)
+            
             jip1=ji+1   ;   jim1=ji-1
             jjp1=jj+1   ;   jjm1=jj-1
             !
             zsummsk = zssmask0(jip1,jj) + zssmask0(jim1,jj) + zssmask0(ji,jjp1) + zssmask0(ji,jjm1)
             !
-            IF (zdssmask(ji,jj) == 1._wp .AND. zsummsk /= 0._wp) THEN
-               ssh(ji,jj,Kmm)=( zssh(jip1,jj)*zssmask0(jip1,jj)     &
-                  &           + zssh(jim1,jj)*zssmask0(jim1,jj)     &
-                  &           + zssh(ji,jjp1)*zssmask0(ji,jjp1)     &
-                  &           + zssh(ji,jjm1)*zssmask0(ji,jjm1)) / zsummsk
+            IF (zdssmask == 1._wp .AND. zsummsk /= 0._wp) THEN
+               ssh(ji,jj,Kmm)=( ( zssh(jip1,jj)*zssmask0(jip1,jj) + zssh(jim1,jj)*zssmask0(jim1,jj) )     &   ! add () for NP repro
+                  &           + ( zssh(ji,jjp1)*zssmask0(ji,jjp1) + zssh(ji,jjm1)*zssmask0(ji,jjm1) ) ) / zsummsk
                zssmask_b(ji,jj) = 1._wp
             ENDIF
          END_2D
-         CALL lbc_lnk( 'isfcpl', ssh(:,:,Kmm), 'T', 1.0_wp, zssmask_b(:,:), 'T', 1.0_wp )
-         !
-         zssh(:,:) = ssh(:,:,Kmm)
-         zssmask0(:,:) = zssmask_b(:,:)
          !
+         ! update ssh and mask
+         DO_2D( ibnd, ibnd, ibnd, ibnd )
+            zssh    (ji,jj) = ssh      (ji,jj,Kmm)
+            zssmask0(ji,jj) = zssmask_b(ji,jj)
+         END_2D
+
+         IF( ibnd == 0 ) THEN
+            CALL lbc_lnk( 'isfcpl', zssh(:,:), 'T', 1.0_wp, zssmask0(:,:), 'T', 1.0_wp )
+         ENDIF
          !
       END DO
       !
@@ -222,12 +245,6 @@ CONTAINS
       CALL dom_qco_zgr(Kbb, Kmm)
 #elif defined key_linssh
       ! linear ssh : fix in time coord.
-#else
-      DO jk = 1, jpk
-         e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( 1._wp + (ht_0(:,:) + ssh(:,:,Kmm)) * r1_ht_0(:,:) )
-      END DO
-      e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-      CALL dom_vvl_zgr(Kbb, Kmm, Kaa)
 #endif
       !
    END SUBROUTINE isfcpl_ssh
@@ -244,19 +261,16 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) :: Kmm    ! ocean time level index
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztmask_b
+      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   ztmask_b, ztmask0 
+      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::   zts0
       !REAL(wp), DIMENSION(:,:,:  ), INTENT(in ) :: pdepw_b                         !! depth w before
       !!
-      INTEGER :: ji, jj, jk, jd          !! loop index
-      INTEGER :: jip1, jim1, jjp1, jjm1, jkp1, jkm1
+      INTEGER ::   ji, jj, jk, jd          !! loop index
+      INTEGER ::   jip1, jim1, jjp1, jjm1, jkp1, jkm1
+      INTEGER ::   ibnd
       !!
-      REAL(wp):: zsummsk
-      REAL(wp):: zdz, zdzm1, zdzp1
-      !!
-      REAL(wp), DIMENSION(jpi,jpj)          :: zdmask
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      :: ztmask0, zwmaskn
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      :: ztmask1, zwmaskb, ztmp3d
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) :: zts0
+      REAL(wp)::   zdmask, zsummsk
+      REAL(wp)::   zdz, zdzm1, zdzp1
       !!----------------------------------------------------------------------
       !
       CALL iom_get( numror, jpdom_auto, 'tmask'  , ztmask_b   ) ! need to extrapolate T/S
@@ -301,69 +315,77 @@ CONTAINS
 !         END DO
 !      END IF
 
-      zts0(:,:,:,:)  = ts(:,:,:,:,Kmm)
-      ztmask0(:,:,:) = ztmask_b(:,:,:)
-      ztmask1(:,:,:) = ztmask_b(:,:,:)
+      zts0   (:,:,:,:) = ts      (:,:,:,:,Kmm)
+      ztmask0(:,:,:)   = ztmask_b(:,:,:)
       !
       ! iterate the extrapolation processes nn_drown times
       DO jd = 1,nn_drown ! resolution dependent (OK for ISOMIP+ case)
-         DO jk = 1,jpk-1
-            !
+
+         IF    ( MOD(jd,2) == 0 ) THEN ! even
+            ibnd = nn_hls-1
+         ELSEIF( MOD(jd,2) == 1 ) THEN ! odd
+            ibnd = 0
+         ENDIF
+
+         DO_3D( ibnd, ibnd, ibnd, ibnd, 1, jpkm1 )
             ! define new wet cell
-            zdmask(:,:) = tmask(:,:,jk) - ztmask0(:,:,jk);
+            zdmask = tmask(ji,jj,jk) - ztmask0(ji,jj,jk)
+            
+            jip1=ji+1; jim1=ji-1;
+            jjp1=jj+1; jjm1=jj-1;
             !
-            DO_2D( 0, 0, 0, 0 )
-               jip1=ji+1; jim1=ji-1;
-               jjp1=jj+1; jjm1=jj-1;
-               !
-               ! check if a wet neigbourg cell is present
-               zsummsk = ztmask0(jip1,jj  ,jk) + ztmask0(jim1,jj  ,jk) &
-                       + ztmask0(ji  ,jjp1,jk) + ztmask0(ji  ,jjm1,jk)
+            ! check if a wet neigbourg cell is present
+            zsummsk = ztmask0(jip1,jj  ,jk) + ztmask0(jim1,jj  ,jk) &
+               &    + ztmask0(ji  ,jjp1,jk) + ztmask0(ji  ,jjm1,jk)
+            !
+            ! if neigbourg wet cell available at the same level
+            IF( zdmask == 1._wp  .AND. zsummsk /= 0._wp ) THEN
                !
-               ! if neigbourg wet cell available at the same level
-               IF ( zdmask(ji,jj) == 1._wp  .AND. zsummsk /= 0._wp ) THEN
-                  !
-                  ! horizontal basic extrapolation
-                  ts(ji,jj,jk,1,Kmm)=( zts0(jip1,jj  ,jk,1) * ztmask0(jip1,jj  ,jk) &
+               ! horizontal basic extrapolation
+               ts(ji,jj,jk,1,Kmm)=( zts0(jip1,jj  ,jk,1) * ztmask0(jip1,jj  ,jk) &
                   &               + zts0(jim1,jj  ,jk,1) * ztmask0(jim1,jj  ,jk) &
                   &               + zts0(ji  ,jjp1,jk,1) * ztmask0(ji  ,jjp1,jk) &
                   &               + zts0(ji  ,jjm1,jk,1) * ztmask0(ji  ,jjm1,jk) ) / zsummsk
-                  ts(ji,jj,jk,2,Kmm)=( zts0(jip1,jj  ,jk,2) * ztmask0(jip1,jj  ,jk) &
+               ts(ji,jj,jk,2,Kmm)=( zts0(jip1,jj  ,jk,2) * ztmask0(jip1,jj  ,jk) &
                   &               + zts0(jim1,jj  ,jk,2) * ztmask0(jim1,jj  ,jk) &
                   &               + zts0(ji  ,jjp1,jk,2) * ztmask0(ji  ,jjp1,jk) &
                   &               + zts0(ji  ,jjm1,jk,2) * ztmask0(ji  ,jjm1,jk) ) / zsummsk
-                  !
-                  ! update mask for next pass
-                  ztmask1(ji,jj,jk)=1
-                  !
+               !
+               ! update mask for next pass
+               ztmask_b(ji,jj,jk)=1
+               !
                ! in case no neigbourg wet cell available at the same level
                ! check if a wet cell is available below
-               ELSEIF (zdmask(ji,jj) == 1._wp .AND. zsummsk == 0._wp) THEN
-                  !
-                  ! vertical extrapolation if horizontal extrapolation failed
-                  jkm1=max(1,jk-1) ; jkp1=min(jpk,jk+1)
-                  !
-                  ! check if a wet neigbourg cell is present
-                  zsummsk = ztmask0(ji,jj,jkm1) + ztmask0(ji,jj,jkp1)
-                  IF (zdmask(ji,jj) == 1._wp .AND. zsummsk /= 0._wp ) THEN
-                     ts(ji,jj,jk,1,Kmm)=( zts0(ji,jj,jkp1,1)*ztmask0(ji,jj,jkp1)     &
+            ELSEIF( zdmask == 1._wp .AND. zsummsk == 0._wp ) THEN
+               !
+               ! vertical extrapolation if horizontal extrapolation failed
+               jkm1=MAX(1,jk-1) ; jkp1=MIN(jpk,jk+1)
+               !
+               ! check if a wet neigbourg cell is present
+               zsummsk = ztmask0(ji,jj,jkm1) + ztmask0(ji,jj,jkp1)
+               IF( zdmask == 1._wp .AND. zsummsk /= 0._wp ) THEN
+                  ts(ji,jj,jk,1,Kmm)=( zts0(ji,jj,jkp1,1)*ztmask0(ji,jj,jkp1)     &
                      &               + zts0(ji,jj,jkm1,1)*ztmask0(ji,jj,jkm1)) / zsummsk
-                     ts(ji,jj,jk,2,Kmm)=( zts0(ji,jj,jkp1,2)*ztmask0(ji,jj,jkp1)     &
+                  ts(ji,jj,jk,2,Kmm)=( zts0(ji,jj,jkp1,2)*ztmask0(ji,jj,jkp1)     &
                      &               + zts0(ji,jj,jkm1,2)*ztmask0(ji,jj,jkm1)) / zsummsk
-                     !
-                     ! update mask for next pass
-                     ztmask1(ji,jj,jk)=1._wp
-                  END IF
+                  !
+                  ! update mask for next pass
+                  ztmask_b(ji,jj,jk)=1._wp
                END IF
-            END_2D
-         END DO
-         !
-         CALL lbc_lnk( 'isfcpl', ts(:,:,:,jp_tem,Kmm), 'T', 1.0_wp, ts(:,:,:,jp_sal,Kmm), 'T', 1.0_wp, ztmask1, 'T', 1.0_wp)
-         !
+            END IF
+            !
+         END_3D
+         
          ! update temperature and salinity and mask
-         zts0(:,:,:,:)  = ts(:,:,:,:,Kmm)
-         ztmask0(:,:,:) = ztmask1(:,:,:)
+         DO_3D( ibnd, ibnd, ibnd, ibnd, 1, jpk )
+            zts0   (ji,jj,jk,1)  = ts      (ji,jj,jk,1,Kmm)
+            zts0   (ji,jj,jk,2)  = ts      (ji,jj,jk,2,Kmm)
+            ztmask0(ji,jj,jk)    = ztmask_b(ji,jj,jk)
+         END_3D
          !
+         IF( ibnd == 0 ) THEN
+            CALL lbc_lnk( 'isfcpl', zts0(:,:,:,1), 'T', 1.0_wp, zts0(:,:,:,2), 'T', 1.0_wp, ztmask0(:,:,:), 'T', 1.0_wp )
+         ENDIF
          !
       END DO  ! nn_drown
       !
@@ -374,7 +396,7 @@ CONTAINS
       ! sanity check
       ! -----------------------------------------------------------------------------------------
       ! case we open a cell but no neigbour cells available to get an estimate of T and S
-      DO_3D( 0, 0, 0, 0, 1,jpk-1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          IF (tmask(ji,jj,jk) == 1._wp .AND. ts(ji,jj,jk,2,Kmm) == 0._wp)              &
             &   CALL ctl_stop('STOP', 'failing to fill all new weet cell,     &
             &                          try increase nn_drown or activate XXXX &
@@ -455,25 +477,29 @@ CONTAINS
          !
       END_2D
       !
-      CALL lbc_lnk( 'isfcpl', risfcpl_vol, 'T', 1.0_wp )
-      !
       ! 3.0: set total correction (div, tr(:,:,:,:,Krhs), ssh)
       !
       ! 3.1: mask volume flux divergence correction
-      risfcpl_vol(:,:,:) = risfcpl_vol(:,:,:) * tmask(:,:,:)
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         risfcpl_vol(ji,jj,jk) = risfcpl_vol(ji,jj,jk) * tmask(ji,jj,jk)
+      END_3D
       !
       ! 3.2: get 3d tr(:,:,:,:,Krhs) increment to apply at the first time step
       ! temperature and salt content flux computed using local ts(:,:,:,:,Kmm)
       ! (very simple advection scheme)
       ! (>0 out)
-      risfcpl_tsc(:,:,:,jp_tem) = -risfcpl_vol(:,:,:) * ts(:,:,:,jp_tem,Kmm)
-      risfcpl_tsc(:,:,:,jp_sal) = -risfcpl_vol(:,:,:) * ts(:,:,:,jp_sal,Kmm)
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         risfcpl_tsc(ji,jj,jk,jp_tem) = -risfcpl_vol(ji,jj,jk) * ts(ji,jj,jk,jp_tem,Kmm)
+         risfcpl_tsc(ji,jj,jk,jp_sal) = -risfcpl_vol(ji,jj,jk) * ts(ji,jj,jk,jp_sal,Kmm)
+      END_3D
       !
       ! 3.3: ssh correction (for dynspg_ts)
-      risfcpl_ssh(:,:) = 0.0
-      DO jk = 1,jpk
-         risfcpl_ssh(:,:) = risfcpl_ssh(:,:) + risfcpl_vol(:,:,jk) * r1_e1e2t(:,:)
-      END DO
+      DO_2D( 0, 0, 0, 0 )
+         risfcpl_ssh(ji,jj) = 0.0
+      END_2D
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         risfcpl_ssh(ji,jj) = risfcpl_ssh(ji,jj) + risfcpl_vol(ji,jj,jk) * r1_e1e2t(ji,jj)
+      END_3D
       !
    END SUBROUTINE isfcpl_vol
 
@@ -507,21 +533,17 @@ CONTAINS
       REAL(wp) ::   z1_sum, z1_rdtiscpl
       REAL(wp) ::   zdtem, zdsal, zdvol, zratio       ! tem, sal, vol increment
       REAL(wp) ::   zlon , zlat                       ! target location
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztmask_b    ! mask before
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t_b      ! scale factor before
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zt_b      ! scale factor before
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zs_b      ! scale factor before
+      REAL(wp), DIMENSION(A2D(0),jpk) :: ztmask_b    ! mask before
+      REAL(wp), DIMENSION(A2D(0),jpk) :: ze3t_b      ! scale factor before
+      REAL(wp), DIMENSION(A2D(0),jpk) :: ztmp        ! scale factor before
       !!----------------------------------------------------------------------
 
       !==============================================================================
       ! 1.0: initialisation
       !==============================================================================
-
       ! get restart variable
       CALL iom_get( numror, jpdom_auto, 'tmask'  , ztmask_b(:,:,:) ) ! need to extrapolate T/S
-      CALL iom_get( numror, jpdom_auto, 'e3t_n'  , ze3t_b(:,:,:)   )
-      CALL iom_get( numror, jpdom_auto, 'tn'     , zt_b(:,:,:)     )
-      CALL iom_get( numror, jpdom_auto, 'sn'     , zs_b(:,:,:)     )
+
 
       ! compute run length
       nstp_iscpl  = nitend - nit000 + 1
@@ -540,32 +562,36 @@ CONTAINS
       ! 2.0: diagnose the heat, salt and volume input and compute the correction variable
       !      for case where we wet a cell or cell still wet (no change in cell status)
       !==============================================================================
+      CALL iom_get( numror, jpdom_auto, 'e3t_n'  , ze3t_b(:,:,:) )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         ! volume diff
+         zdvol =     e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
+            &   - ze3t_b(ji,jj,jk    ) * ztmask_b(ji,jj,jk)
+         ! volume differences in each cell (>0 means correction is an outward flux)
+         ! in addition to the geometry change unconservation, need to add the divergence correction as it is flux across the boundary
+         risfcpl_cons_vol(ji,jj,jk)        = (   zdvol * e1e2t(ji,jj) + risfcpl_vol(ji,jj,jk)        ) * z1_rdtiscpl
+      END_3D
 
-      DO jk = 1,jpk-1
-         DO jj = Njs0,Nje0
-            DO ji = Nis0,Nie0
-
-               ! volume diff
-               zdvol =   e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
-                  &   - ze3t_b(ji,jj,jk    ) * ztmask_b(ji,jj,jk)
-
-               ! heat diff
-               zdtem = ts (ji,jj,jk,jp_tem,Kmm) *  e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
-                     - zt_b(ji,jj,jk)        * ze3t_b(ji,jj,jk) * ztmask_b(ji,jj,jk)
-
-               ! salt diff
-               zdsal = ts(ji,jj,jk,jp_sal,Kmm) *  e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
-                     - zs_b(ji,jj,jk)       * ze3t_b(ji,jj,jk) * ztmask_b(ji,jj,jk)
+      CALL iom_get( numror, jpdom_auto, 'tn'     , ztmp(:,:,:)   )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         ! heat diff
+         zdtem =   ts (ji,jj,jk,jp_tem,Kmm) *  e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
+            &   - ztmp(ji,jj,jk)            * ze3t_b(ji,jj,jk)   * ztmask_b(ji,jj,jk)
+         ! heat differences in each cell (>0 means correction is an outward flux)
+         ! in addition to the geometry change unconservation, need to add the divergence correction as it is flux across the boundary
+         risfcpl_cons_tsc(ji,jj,jk,jp_tem) = ( - zdtem * e1e2t(ji,jj) + risfcpl_tsc(ji,jj,jk,jp_tem) ) * z1_rdtiscpl
+      END_3D
 
-               ! volume, heat and salt differences in each cell (>0 means correction is an outward flux)
-               ! in addition to the geometry change unconservation, need to add the divergence correction as it is flux across the boundary
-               risfcpl_cons_vol(ji,jj,jk)        = (   zdvol * e1e2t(ji,jj) + risfcpl_vol(ji,jj,jk)        ) * z1_rdtiscpl
-               risfcpl_cons_tsc(ji,jj,jk,jp_sal) = ( - zdsal * e1e2t(ji,jj) + risfcpl_tsc(ji,jj,jk,jp_sal) ) * z1_rdtiscpl
-               risfcpl_cons_tsc(ji,jj,jk,jp_tem) = ( - zdtem * e1e2t(ji,jj) + risfcpl_tsc(ji,jj,jk,jp_tem) ) * z1_rdtiscpl
+      CALL iom_get( numror, jpdom_auto, 'sn'     , ztmp(:,:,:)   )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         ! salt diff
+         zdsal =    ts(ji,jj,jk,jp_sal,Kmm) *  e3t(ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   &
+            &   - ztmp(ji,jj,jk)            * ze3t_b(ji,jj,jk)   * ztmask_b(ji,jj,jk)
 
-            END DO
-         END DO
-      END DO
+         ! salt differences in each cell (>0 means correction is an outward flux)
+         ! in addition to the geometry change unconservation, need to add the divergence correction as it is flux across the boundary
+         risfcpl_cons_tsc(ji,jj,jk,jp_sal) = ( - zdsal * e1e2t(ji,jj) + risfcpl_tsc(ji,jj,jk,jp_sal) ) * z1_rdtiscpl
+      END_3D
       !
       !==============================================================================
       ! 3.0: diagnose the heat, salt and volume input and compute the correction variable
@@ -575,16 +601,15 @@ CONTAINS
       ! compute the total number of point receiving a correction increment for each processor
       ! local
       nisfl(:)=0
-      DO jk = 1,jpk-1
-         DO jj = Njs0,Nje0
-            DO ji = Nis0,Nie0
-               jip1=MIN(ji+1,jpi) ; jim1=MAX(ji-1,1) ; jjp1=MIN(jj+1,jpj) ; jjm1=MAX(jj-1,1) ;
-               IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN
-                  nisfl(narea) = nisfl(narea) + MAX(SUM(tmask(jim1:jip1,jjm1:jjp1,jk)),1._wp)
-               ENDIF
-            ENDDO
-         ENDDO
-      ENDDO
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         jip1=MIN(ji+1,jpi)
+         jim1=MAX(ji-1,1  )
+         jjp1=MIN(jj+1,jpj)
+         jjm1=MAX(jj-1,1  )
+         IF( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN
+            nisfl(narea) = nisfl(narea) + MAX(SUM(tmask(jim1:jip1,jjm1:jjp1,jk)),1._wp)
+         ENDIF
+      END_3D
       !
       ! global
       CALL mpp_sum('isfcpl',nisfl  )
@@ -597,46 +622,42 @@ CONTAINS
       ! start computing the correction and fill zisfpts
       ! local
       jisf = 0
-      DO jk = 1,jpk-1
-         DO jj = Njs0,Nje0
-            DO ji = Nis0,Nie0
-               IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN
-
-                  jip1=MIN(ji+1,jpi) ; jim1=MAX(ji-1,1) ; jjp1=MIN(jj+1,jpj) ; jjm1=MAX(jj-1,1) ;
-
-                  zdvol = risfcpl_cons_vol(ji,jj,jk       )
-                  zdsal = risfcpl_cons_tsc(ji,jj,jk,jp_sal)
-                  zdtem = risfcpl_cons_tsc(ji,jj,jk,jp_tem)
-
-                  IF ( SUM( tmask(jim1:jip1,jjm1:jjp1,jk) ) > 0._wp ) THEN
-                     ! spread correction amoung neigbourg wet cells (horizontal direction first)
-                     ! as it is a rude correction corner and lateral cell have the same weight
-                     !
-                     z1_sum =  1._wp / SUM( tmask(jim1:jip1,jjm1:jjp1,jk) )
-                     !
-                     ! lateral cells
-                     IF (tmask(jip1,jj  ,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jj  , jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(jim1,jj  ,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jj  , jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(ji  ,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, ji  , jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(ji  ,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, ji  , jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     !
-                     ! corner  cells
-                     IF (tmask(jip1,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(jim1,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(jim1,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     IF (tmask(jip1,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
-                     !
-                  ELSE IF ( tmask(ji,jj,jk+1) == 1._wp ) THEN
-                     ! spread correction amoung neigbourg wet cells (vertical direction)
-                     CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk+1, zdvol, zdsal, zdtem, 1.0_wp, 0)
-                  ELSE
-                     ! need to find where to put correction in later on
-                     CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk  , zdvol, zdsal, zdtem, 1.0_wp, 1)
-                  END IF
-               END IF
-            END DO
-         END DO
-      END DO
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN
+
+            jip1=MIN(ji+1,jpi) ; jim1=MAX(ji-1,1) ; jjp1=MIN(jj+1,jpj) ; jjm1=MAX(jj-1,1) ;
+
+            zdvol = risfcpl_cons_vol(ji,jj,jk       )
+            zdsal = risfcpl_cons_tsc(ji,jj,jk,jp_sal)
+            zdtem = risfcpl_cons_tsc(ji,jj,jk,jp_tem)
+
+            IF ( SUM( tmask(jim1:jip1,jjm1:jjp1,jk) ) > 0._wp ) THEN
+               ! spread correction amoung neigbourg wet cells (horizontal direction first)
+               ! as it is a rude correction corner and lateral cell have the same weight
+               !
+               z1_sum =  1._wp / SUM( tmask(jim1:jip1,jjm1:jjp1,jk) )
+               !
+               ! lateral cells
+               IF (tmask(jip1,jj  ,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jj  , jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(jim1,jj  ,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jj  , jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(ji  ,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, ji  , jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(ji  ,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, ji  , jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
+               !
+               ! corner  cells
+               IF (tmask(jip1,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(jim1,jjm1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jjm1, jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(jim1,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jim1, jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
+               IF (tmask(jip1,jjp1,jk) == 1) CALL update_isfpts(zisfpts, jisf, jip1, jjp1, jk, zdvol, zdsal, zdtem, z1_sum)
+               !
+            ELSE IF ( tmask(ji,jj,jk+1) == 1._wp ) THEN
+               ! spread correction amoung neigbourg wet cells (vertical direction)
+               CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk+1, zdvol, zdsal, zdtem, 1.0_wp, 0)
+            ELSE
+               ! need to find where to put correction in later on
+               CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk  , zdvol, zdsal, zdtem, 1.0_wp, 1)
+            END IF
+         END IF
+      END_3D
       !
       ! share data among all processes because for some point we need to find the closest wet point (could be on other process)
       DO jproc=1,jpnij
@@ -686,19 +707,22 @@ CONTAINS
       !==============================================================================
       !
       ! mask
-      risfcpl_cons_vol(:,:,:       ) = risfcpl_cons_vol(:,:,:       ) * tmask(:,:,:)
-      risfcpl_cons_tsc(:,:,:,jp_sal) = risfcpl_cons_tsc(:,:,:,jp_sal) * tmask(:,:,:)
-      risfcpl_cons_tsc(:,:,:,jp_tem) = risfcpl_cons_tsc(:,:,:,jp_tem) * tmask(:,:,:)
-      !
-      ! add lbclnk
-      CALL lbc_lnk( 'isfcpl', risfcpl_cons_tsc(:,:,:,jp_tem), 'T', 1.0_wp, risfcpl_cons_tsc(:,:,:,jp_sal), 'T', 1.0_wp, &
-         &                    risfcpl_cons_vol(:,:,:)       , 'T', 1.0_wp)
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         risfcpl_cons_vol(ji,jj,jk       ) = risfcpl_cons_vol(ji,jj,jk       ) * tmask(ji,jj,jk)
+         risfcpl_cons_tsc(ji,jj,jk,jp_sal) = risfcpl_cons_tsc(ji,jj,jk,jp_sal) * tmask(ji,jj,jk)
+         risfcpl_cons_tsc(ji,jj,jk,jp_tem) = risfcpl_cons_tsc(ji,jj,jk,jp_tem) * tmask(ji,jj,jk)
+      END_3D
       !
       ! ssh correction (for dynspg_ts)
-      DO jk = 1,jpk
-         risfcpl_cons_ssh(:,:) = risfcpl_cons_ssh(:,:) + risfcpl_cons_vol(:,:,jk)
-      END DO
-      risfcpl_cons_ssh(:,:) = risfcpl_cons_ssh(:,:) * r1_e1e2t(:,:)
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         risfcpl_cons_ssh(ji,jj) = risfcpl_cons_ssh(ji,jj) + risfcpl_cons_vol(ji,jj,jk)
+      END_3D
+      DO_2D( 0, 0, 0, 0 )
+         risfcpl_cons_ssh(ji,jj) = risfcpl_cons_ssh(ji,jj) * r1_e1e2t(ji,jj)
+      END_2D
+      !
+      ! deallocate list of point receiving correction
+      DEALLOCATE( zisfpts )
       !
    END SUBROUTINE isfcpl_cons
    !
@@ -736,7 +760,8 @@ CONTAINS
       END IF
       !
       ! update isfpts structure
-      sisfpts(kpts) = isfcons(mig(ki), mjg(kj), kk, pratio * pdvol, pratio * pdsal, pratio * pdtem, glamt(ki,kj), gphit(ki,kj), ifind )
+      sisfpts(kpts) = isfcons(mig(ki,0), mjg(kj,0), kk, pratio * pdvol, pratio * pdsal, pratio * pdtem,   &
+         &                    glamt(ki,kj), gphit(ki,kj), ifind )
       !
    END SUBROUTINE update_isfpts
    !
@@ -760,9 +785,8 @@ CONTAINS
       iig = ki ; ijg = kj
       IF ( kfind == 1 ) CALL dom_ngb( plon, plat, iig, ijg,'T', kk)
       !
-      ! fill the correction array
-      DO jj = mj0(ijg),mj1(ijg)
-         DO ji = mi0(iig),mi1(iig)
+      DO jj = mj0(ijg,0),mj1(ijg,0)
+         DO ji = mi0(iig,0),mi1(iig,0)
             ! correct the vol_flx and corresponding heat/salt flx in the closest cell
             risfcpl_cons_vol(ji,jj,kk)        =  risfcpl_cons_vol(ji,jj,kk       ) + pvolinc
             risfcpl_cons_tsc(ji,jj,kk,jp_sal) =  risfcpl_cons_tsc(ji,jj,kk,jp_sal) + psalinc
diff --git a/src/OCE/ISF/isfdiags.F90 b/src/OCE/ISF/isfdiags.F90
index b9f97736..6f9ec1e0 100644
--- a/src/OCE/ISF/isfdiags.F90
+++ b/src/OCE/ISF/isfdiags.F90
@@ -13,6 +13,7 @@ MODULE isfdiags
    !!----------------------------------------------------------------------
 
    USE in_out_manager ! I/O manager
+   USE par_oce        ! ocean space and time domain
    USE dom_oce
    USE isf_oce        ! ice shelf variable
    USE iom            ! 
@@ -34,7 +35,7 @@ MODULE isfdiags
 
 CONTAINS
 
-   SUBROUTINE isf_diags_flx(Kmm, ktop, kbot, phtbl, pfrac, cdisf, pqfwf, pqoce, pqlat, pqhc)
+   SUBROUTINE isf_diags_flx( Kmm, ktop, kbot, phtbl, pfrac, cdisf, pfwf, pqoce, pqlat, pqhc )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isf_diags_flx ***
       !!
@@ -42,39 +43,37 @@ CONTAINS
       !!              from isf to oce fwf, latent heat, heat content fluxes
       !!
       !!----------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      !!-------------------------- IN  -------------------------------------
-      INTEGER,                      INTENT(in) :: Kmm                       ! ocean time level index
-      INTEGER , DIMENSION(jpi,jpj), INTENT(in) :: ktop , kbot               ! top and bottom level of the tbl
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: phtbl, pfrac              ! thickness of the tbl and fraction of last cell affected by the tbl
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqfwf, pqoce, pqlat, pqhc ! 2d var to map in 3d
-      CHARACTER(LEN=3), INTENT(in) :: cdisf                                 ! parametrisation or interactive melt
+      INTEGER,                     INTENT(in) ::   Kmm                       ! ocean time level index
+      INTEGER , DIMENSION(A2D(0)), INTENT(in) ::   ktop , kbot               ! top and bottom level of the tbl
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   phtbl, pfrac              ! thickness of the tbl and fraction of last cell affected by the tbl
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pfwf, pqoce, pqlat, pqhc  ! 2d var to map in 3d
+      CHARACTER(LEN=3), INTENT(in) ::   cdisf                                ! parametrisation or interactive melt
       !!---------------------------------------------------------------------
-      CHARACTER(LEN=256) :: cvarqfwf  , cvarqoce  , cvarqlat  , cvarqhc
-      CHARACTER(LEN=256) :: cvarqfwf3d, cvarqoce3d, cvarqlat3d, cvarqhc3d
+      CHARACTER(LEN=256) ::   cvarfwf  , cvarqoce  , cvarqlat  , cvarqhc
+      CHARACTER(LEN=256) ::   cvarfwf3d, cvarqoce3d, cvarqlat3d, cvarqhc3d
       !!---------------------------------------------------------------------
       !
       ! output melt
-      cvarqfwf = 'fwfisf_'//cdisf  ; cvarqfwf3d = 'fwfisf3d_'//cdisf
+      cvarfwf  = 'fwfisf_'//cdisf  ; cvarfwf3d  = 'fwfisf3d_'//cdisf
       cvarqoce = 'qoceisf_'//cdisf ; cvarqoce3d = 'qoceisf3d_'//cdisf
       cvarqlat = 'qlatisf_'//cdisf ; cvarqlat3d = 'qlatisf3d_'//cdisf 
       cvarqhc  = 'qhcisf_'//cdisf  ; cvarqhc3d  = 'qhcisf3d_'//cdisf
       !
       ! output 2d melt rate, latent heat and heat content flux from the injected water
-      CALL iom_put( TRIM(cvarqfwf), pqfwf(:,:) )   ! mass         flux ( > 0 from isf to oce)
+      CALL iom_put( TRIM(cvarfwf) , pfwf(:,:) )   ! mass         flux ( > 0 from isf to oce)
       CALL iom_put( TRIM(cvarqoce), pqoce(:,:) )   ! oce to ice   flux ( > 0 from isf to oce)
       CALL iom_put( TRIM(cvarqlat), pqlat(:,:) )   ! latent heat  flux ( > 0 from isf to oce)
       CALL iom_put( TRIM(cvarqhc) , pqhc (:,:) )   ! heat content flux ( > 0 from isf to oce)
       !
       ! output 3d Diagnostics
-      IF ( iom_use( TRIM(cvarqfwf3d) ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqfwf3d) , pqfwf(:,:))
+      IF ( iom_use( TRIM(cvarfwf3d)  ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarfwf3d)  , pfwf(:,:))
       IF ( iom_use( TRIM(cvarqoce3d) ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqoce3d) , pqoce(:,:))
       IF ( iom_use( TRIM(cvarqlat3d) ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqlat3d) , pqoce(:,:))
       IF ( iom_use( TRIM(cvarqhc3d)  ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqhc3d)  , pqhc (:,:))
       !
    END SUBROUTINE
 
-   SUBROUTINE isf_diags_2dto3d(Kmm, ktop, kbot, phtbl, pfrac, cdvar, pvar2d)
+   SUBROUTINE isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, cdvar, pvar2d )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isf_diags_2dto3d ***
       !!
@@ -82,25 +81,23 @@ CONTAINS
       !!              (ie uniformaly spread into the top boundary layer or parametrisation layer)
       !!
       !!----------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      !!-------------------------- IN  -------------------------------------
-      INTEGER,                      INTENT(in) :: Kmm           ! ocean time level index
-      INTEGER , DIMENSION(jpi,jpj), INTENT(in) :: ktop , kbot   ! top and bottom level of the tbl
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: phtbl, pfrac  ! thickness of the tbl and fraction of last cell affected by the tbl
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pvar2d        ! 2d var to map in 3d
-      CHARACTER(LEN=*), INTENT(in) :: cdvar
+      INTEGER,                     INTENT(in) ::   Kmm           ! ocean time level index
+      INTEGER , DIMENSION(A2D(0)), INTENT(in) ::   ktop , kbot   ! top and bottom level of the tbl
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   phtbl, pfrac  ! thickness of the tbl and fraction of last cell affected by the tbl
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pvar2d        ! 2d var to map in 3d
+      CHARACTER(LEN=*), INTENT(in) ::   cdvar
       !!---------------------------------------------------------------------
-      INTEGER  :: ji, jj, jk                       ! loop indices
-      INTEGER  :: ikt, ikb                         ! top and bottom level of the tbl
-      REAL(wp), DIMENSION(jpi,jpj)     :: zvar2d   !
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zvar3d   ! 3d var to output
+      INTEGER  :: ji, jj, jk                      ! loop indices
+      INTEGER  :: ikt, ikb                        ! top and bottom level of the tbl
+      REAL(wp), DIMENSION(A2D(0))     ::   zvar2d   !
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   zvar3d   ! 3d var to output
       !!---------------------------------------------------------------------
       !
       ! compute 3d output
       zvar2d(:,:) = pvar2d(:,:) / phtbl(:,:)
       zvar3d(:,:,:) = 0._wp
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ikt = ktop(ji,jj)
          ikb = kbot(ji,jj)
          DO jk = ikt, ikb - 1
@@ -109,7 +106,7 @@ CONTAINS
          zvar3d(ji,jj,ikb) = zvar2d(ji,jj) * e3t(ji,jj,ikb,Kmm) * pfrac(ji,jj)
       END_2D
       !
-      CALL iom_put( TRIM(cdvar) , zvar3d(:,:,:))
+      CALL iom_put( TRIM(cdvar) , zvar3d(:,:,:) )
       !
    END SUBROUTINE isf_diags_2dto3d
 
diff --git a/src/OCE/ISF/isfdynatf.F90 b/src/OCE/ISF/isfdynatf.F90
index 3be8abf8..17fd37b6 100644
--- a/src/OCE/ISF/isfdynatf.F90
+++ b/src/OCE/ISF/isfdynatf.F90
@@ -7,12 +7,13 @@ MODULE isfdynatf
    !!-------------------------------------------------------------------------
   
    !!-------------------------------------------------------------------------
-   !!   isfnxt       : apply correction needed for the ice shelf to ensure conservation
+   !!   isfdynatf       : apply correction needed for the ice shelf to ensure conservation
    !!-------------------------------------------------------------------------
 
    USE isf_oce
 
    USE phycst , ONLY: r1_rho0         ! physical constant
+   USE par_oce                        ! ocean space and time domain
    USE dom_oce                        ! time and space domain
    USE oce, ONLY : ssh                ! sea-surface height for qco substitution
 
@@ -26,66 +27,52 @@ MODULE isfdynatf
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
-
 CONTAINS
 
-   SUBROUTINE isf_dynatf ( kt, Kmm, pe3t_f, pcoef )
+   SUBROUTINE isf_dynatf ( kt, Kmm, pe3t_f )
       !!--------------------------------------------------------------------
       !!                  ***  ROUTINE isf_dynatf  ***
       !!
       !! ** Purpose : compute the ice shelf volume filter correction for cavity, param, ice sheet coupling case
       !!
       !!-------------------------- OUT -------------------------------------
-      INTEGER                         , INTENT(in   ) :: kt       ! ocean time step
-      INTEGER                         , INTENT(in   ) :: Kmm      ! ocean time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pe3t_f   ! time filtered scale factor to be corrected
-      !
-      REAL(wp)                        , INTENT(in   ) :: pcoef    ! rn_atfp * rn_Dt * r1_rho0
+      INTEGER                         , INTENT(in   ) ::   kt       ! ocean time step
+      INTEGER                         , INTENT(in   ) ::   Kmm      ! ocean time level index
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pe3t_f   ! time filtered scale factor to be corrected
       !!--------------------------------------------------------------------
-      INTEGER :: jk  ! loop index
+      INTEGER  ::   ji, jj, jk  ! loop index
+      REAL(wp) ::   ztmp
       !!--------------------------------------------------------------------
       !
       ! ice shelf cavity
-      IF ( ln_isfcav_mlt ) CALL isf_dynatf_mlt(Kmm, pe3t_f, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, fwfisf_cav_b, pcoef)
+      IF( ln_isfcav_mlt ) THEN
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            ztmp = rn_atfp * rn_Dt * ( fwfisf_cav_b(ji,jj) - fwfisf_cav(ji,jj) ) / ( ht(ji,jj,Kmm) + 1._wp - ssmask(ji,jj) ) * r1_rho0
+            !
+            DO jk = 1, jpkm1
+               pe3t_f(ji,jj,jk) = pe3t_f(ji,jj,jk) + tmask(ji,jj,jk) * ztmp * e3t(ji,jj,jk,Kmm)
+            END DO
+         END_2D
+      ENDIF
       !
       ! ice shelf parametrised
-      IF ( ln_isfpar_mlt ) CALL isf_dynatf_mlt(Kmm, pe3t_f, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, pcoef)
+      IF( ln_isfpar_mlt ) THEN
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            ztmp = rn_atfp * rn_Dt * ( fwfisf_par_b(ji,jj) - fwfisf_par(ji,jj) ) / ( ht(ji,jj,Kmm) + 1._wp - ssmask(ji,jj) ) * r1_rho0
+            !
+            DO jk = 1, jpkm1
+               pe3t_f(ji,jj,jk) = pe3t_f(ji,jj,jk) + tmask(ji,jj,jk) * ztmp * e3t(ji,jj,jk,Kmm)
+            END DO
+         END_2D
+      ENDIF
       !
-      IF ( ln_isfcpl .AND. ln_rstart .AND. kt == nit000+1 ) THEN
-         DO jk = 1, jpkm1
-            pe3t_f(:,:,jk) =   pe3t_f(:,:,jk) - pcoef * risfcpl_vol(:,:,jk) * r1_e1e2t(:,:)
-         END DO
+      ! if coupled
+      IF( ln_isfcpl .AND. ln_rstart .AND. kt == nit000+1 ) THEN
+         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+            pe3t_f(ji,jj,jk) = pe3t_f(ji,jj,jk) - rn_atfp * rn_Dt * risfcpl_vol(ji,jj,jk) * r1_e1e2t(ji,jj)
+         END_3D
       END IF
       !
    END SUBROUTINE isf_dynatf
 
-   SUBROUTINE isf_dynatf_mlt ( Kmm, pe3t_f, ktop, kbot, phtbl, pfrac, pfwf, pfwf_b, pcoef )
-      !!--------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_dynatf_mlt  ***
-      !!
-      !! ** Purpose : compute the ice shelf volume filter correction for cavity or param
-      !!
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                         , INTENT(in   ) :: Kmm             ! ocean time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pe3t_f          ! time-filtered scale factor to be corrected
-      INTEGER , DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop , kbot     ! top and bottom level of tbl
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfrac, phtbl    ! fraction of bottom cell included in tbl, tbl thickness
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfwf , pfwf_b   ! now/before fwf
-      REAL(wp),                         INTENT(in   ) :: pcoef           ! rn_atfp * rn_Dt * r1_rho0
-      !!----------------------------------------------------------------------
-      INTEGER :: ji,jj,jk
-      REAL(wp), DIMENSION(jpi,jpj) :: zfwfinc
-      !!----------------------------------------------------------------------
-      !
-      ! compute fwf conservation correction
-      zfwfinc(:,:) = pcoef * ( pfwf_b(:,:) - pfwf(:,:) ) / ( ht(:,:) + 1._wp - ssmask(:,:) ) * r1_rho0
-      !
-      ! add the increment
-      DO jk = 1, jpkm1
-         pe3t_f(:,:,jk) = pe3t_f(:,:,jk) + tmask(:,:,jk) * zfwfinc(:,:)   &
-            &                              * e3t(:,:,jk,Kmm)
-      END DO
-      !
-   END SUBROUTINE isf_dynatf_mlt
-
 END MODULE isfdynatf
diff --git a/src/OCE/ISF/isfhdiv.F90 b/src/OCE/ISF/isfhdiv.F90
index 58275063..5e5807e2 100644
--- a/src/OCE/ISF/isfhdiv.F90
+++ b/src/OCE/ISF/isfhdiv.F90
@@ -15,6 +15,7 @@ MODULE isfhdiv
 
    USE isf_oce                ! ice shelf
 
+   USE par_oce                ! ocean space and time domain
    USE dom_oce                ! time and space domain
    USE phycst , ONLY: r1_rho0 ! physical constant
    USE in_out_manager         !
@@ -24,10 +25,10 @@ MODULE isfhdiv
    PRIVATE
 
    PUBLIC isf_hdiv
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
-
 CONTAINS
 
    SUBROUTINE isf_hdiv( kt, Kmm, phdiv )
@@ -39,25 +40,29 @@ CONTAINS
       !!                 increment)
       !!
       !!----------------------------------------------------------------------
+      INTEGER, INTENT(in) ::   kt
+      INTEGER, INTENT(in) ::   Kmm      !  ocean time level index
       REAL(wp), DIMENSION(:,:,:), INTENT( inout ) ::   phdiv   ! horizontal divergence
       !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) :: kt
-      INTEGER, INTENT(in) :: Kmm      !  ocean time level index
       !
       IF ( ln_isf ) THEN
          !
 #if defined key_RK3
          ! ice shelf cavity contribution (RK3)
-         IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, phdiv)
+         IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, &
+            &                                                                             fwfisf_cav, phdiv)
          !
          ! ice shelf parametrisation contribution (RK3)
-         IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, phdiv)
+         IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, &
+                                                                                          fwfisf_par, phdiv)
 #else
          ! ice shelf cavity contribution (MLF)
-         IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, phdiv, fwfisf_cav_b)
+         IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, &
+            &                                                                             fwfisf_cav, phdiv, fwfisf_cav_b)
          !
          ! ice shelf parametrisation contribution (MLF)
-         IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, phdiv, fwfisf_par_b)
+         IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, &
+                                                                                          fwfisf_par, phdiv, fwfisf_par_b)
 #endif
          !
          ! ice sheet coupling contribution
@@ -81,7 +86,7 @@ CONTAINS
    END SUBROUTINE isf_hdiv
 
 
-   SUBROUTINE isf_hdiv_mlt(ktop, kbot, phtbl, pfrac, pfwf, phdiv, pfwf_b)
+   SUBROUTINE isf_hdiv_mlt( ktop, kbot, phtbl, pfrac, pfwf, phdiv, pfwf_b )
       !!----------------------------------------------------------------------
       !!                  ***  SUBROUTINE sbc_isf_div  ***
       !!       
@@ -92,45 +97,42 @@ CONTAINS
       !!
       !! ** Action  :   phdivn   increased by the ice shelf outflow
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      , INTENT(inout) :: phdiv
-      !!----------------------------------------------------------------------
-      INTEGER , DIMENSION(jpi,jpj)          , INTENT(in   ) :: ktop , kbot
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in   ) :: pfrac, phtbl
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in   ) :: pfwf
-      REAL(wp), DIMENSION(:,:)    , OPTIONAL, INTENT(in   ) :: pfwf_b
+      INTEGER , DIMENSION(A2D(0))           , INTENT(in   ) ::   ktop , kbot
+      REAL(wp), DIMENSION(A2D(0))           , INTENT(in   ) ::   pfrac, phtbl
+      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in   ) ::   pfwf
+      REAL(wp), DIMENSION(jpi,jpj,jpk)      , INTENT(inout) ::   phdiv
+      REAL(wp), DIMENSION(:,:)    , OPTIONAL, INTENT(in   ) ::   pfwf_b
       !!----------------------------------------------------------------------
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikt, ikb 
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zhdiv
+      REAL(wp) ::   zhdiv
       !!----------------------------------------------------------------------
       !
       !==   fwf distributed over several levels   ==!
       !
-      ! compute integrated divergence correction
-      DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+      ! update divergence at each level affected by ice shelf top boundary layer
+      DO_2D( 0, 0, 0, 0 )
+         ! compute integrated divergence correction
 #if defined key_RK3
-         zhdiv(ji,jj) = pfwf(ji,jj) * r1_rho0 / phtbl(ji,jj)
+         zhdiv = pfwf(ji,jj) * r1_rho0 / phtbl(ji,jj)
 #else
-         zhdiv(ji,jj) = 0.5_wp * ( pfwf(ji,jj) + pfwf_b(ji,jj) ) * r1_rho0 / phtbl(ji,jj)
+         zhdiv = 0.5_wp * ( pfwf(ji,jj) + pfwf_b(ji,jj) ) * r1_rho0 / phtbl(ji,jj)
 #endif
-      END_2D
-      !
-      ! update divergence at each level affected by ice shelf top boundary layer
-      DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+         !
          ikt = ktop(ji,jj)
          ikb = kbot(ji,jj)
          ! level fully include in the ice shelf boundary layer
          DO jk = ikt, ikb - 1
-            phdiv(ji,jj,jk) = phdiv(ji,jj,jk) - zhdiv(ji,jj)
+            phdiv(ji,jj,jk) = phdiv(ji,jj,jk) - zhdiv
          END DO
          ! level partially include in ice shelf boundary layer 
-         phdiv(ji,jj,ikb) = phdiv(ji,jj,ikb) - zhdiv(ji,jj) * pfrac(ji,jj)
+         phdiv(ji,jj,ikb) = phdiv(ji,jj,ikb) - zhdiv * pfrac(ji,jj)
       END_2D
       !
    END SUBROUTINE isf_hdiv_mlt
 
 
-   SUBROUTINE isf_hdiv_cpl(Kmm, pqvol, phdiv)
+   SUBROUTINE isf_hdiv_cpl( Kmm, pqvol, phdiv )
       !!----------------------------------------------------------------------
       !!                  ***  SUBROUTINE isf_hdiv_cpl  ***
       !!       
@@ -143,17 +145,15 @@ CONTAINS
       !! ** Action  :   phdivn   increased by the ice shelf outflow
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phdiv
-      !!----------------------------------------------------------------------
-      INTEGER,                          INTENT(in)    :: Kmm     ! ocean time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pqvol
+      INTEGER,                          INTENT(in)    ::   Kmm     ! ocean time level index
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pqvol
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phdiv
       !!----------------------------------------------------------------------
-      INTEGER :: ji, jj, jk
+      INTEGER ::   ji, jj, jk
       !!----------------------------------------------------------------------
       !
-      DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpk )
-         phdiv(ji,jj,jk) =  phdiv(ji,jj,jk) + pqvol(ji,jj,jk) * r1_e1e2t(ji,jj)   &
-            &                             / e3t(ji,jj,jk,Kmm)
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         phdiv(ji,jj,jk) = phdiv(ji,jj,jk) + pqvol(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
       END_3D
       !
    END SUBROUTINE isf_hdiv_cpl
diff --git a/src/OCE/ISF/isfload.F90 b/src/OCE/ISF/isfload.F90
index a069cdf5..d9a0d6e6 100644
--- a/src/OCE/ISF/isfload.F90
+++ b/src/OCE/ISF/isfload.F90
@@ -12,6 +12,7 @@ MODULE isfload
 
    USE isf_oce, ONLY: cn_isfload, rn_isfload_T, rn_isfload_S ! ice shelf variables
 
+   USE par_oce                                      ! ocean space and time domain
    USE dom_oce                                      ! vertical scale factor
    USE eosbn2 , ONLY: eos                           ! eos routine
 
@@ -76,19 +77,18 @@ CONTAINS
       INTEGER  :: ji, jj, jk
       INTEGER  :: ikt
       REAL(wp), DIMENSION(jpi,jpj)      :: zrhdtop_isf ! water density    displaced by the ice shelf (at the interface)
-      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts_top     ! water properties displaced by the ice shelf   
+      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts_top     ! water properties displaced by the ice shelf
+      REAL(wp), DIMENSION(jpi,jpj)      :: zdept       ! depth at T-level
       REAL(wp), DIMENSION(jpi,jpj,jpk)  :: zrhd        ! water density    displaced by the ice shelf
       !!----------------------------------------------------------------------
       !
       !                                !- assume water displaced by the ice shelf is at T=rn_isfload_T and S=rn_isfload_S (rude)
-      zts_top(:,:,jp_tem) = rn_isfload_T   ;   zts_top(:,:,jp_sal) = rn_isfload_S
+      zts_top(:,:,jp_tem) = rn_isfload_T
+      zts_top(:,:,jp_sal) = rn_isfload_S
       !
       DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf
-#if defined key_qco && key_isf
-         CALL eos( zts_top(:,:,:), gdept_0(:,:,jk), zrhd(:,:,jk) )
-#else 
-         CALL eos( zts_top(:,:,:), gdept(:,:,jk,Kmm), zrhd(:,:,jk) )
-#endif
+         zdept(:,:) = gdept_0(:,:,jk)
+         CALL eos( zts_top(:,:,:), zdept(:,:), zrhd(:,:,jk) )
       END DO
       !
       !                                !- compute rhd at the ice/oce interface (ice shelf side)
@@ -101,29 +101,16 @@ CONTAINS
          !
          IF ( ikt > 1 ) THEN
             !                                 ! top layer of the ice shelf
-#if defined key_qco && key_isf
             pload(ji,jj) = pload(ji,jj) + zrhd(ji,jj,1) * e3w_0(ji,jj,1) 
             ! 
-            DO jk = 2, ikt-1                  ! core layers of the ice shelf 
+            DO jk = 2, ikt-1                  ! core layers of the ice shelf (!!st half sum of rhd 1/2 applied in hpg)
                pload(ji,jj) = pload(ji,jj) + (zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_0(ji,jj,jk) 
-            END DO 
+            END DO
             !                                 ! deepest part of the ice shelf (between deepest T point and ice/ocean interface 
             pload(ji,jj) = pload(ji,jj) + ( zrhdtop_isf(ji,jj) +    zrhd(ji,jj,ikt-1) )   & 
                &                        * (     risfdep(ji,jj) - gdept_0(ji,jj,ikt-1) ) 
-#else
-            pload(ji,jj) = pload(ji,jj)   &
-               &         + zrhd (ji,jj,1) * e3w(ji,jj,1,Kmm)
-            !
-            DO jk = 2, ikt-1                  ! core layers of the ice shelf
-               pload(ji,jj) = pload(ji,jj) + (zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk))   &
-                  &                        *   e3w(ji,jj,jk,Kmm)
-            END DO
-            !                                 ! deepest part of the ice shelf (between deepest T point and ice/ocean interface
-            pload(ji,jj) = pload(ji,jj) + ( zrhdtop_isf(ji,jj) +  zrhd(ji,jj,ikt-1)     )   &
-               &                        * (     risfdep(ji,jj) - gdept(ji,jj,ikt-1,Kmm) )
-#endif
             !
-         END IF
+         ENDIF
       END_2D
       !
    END SUBROUTINE isf_load_uniform
diff --git a/src/OCE/ISF/isfpar.F90 b/src/OCE/ISF/isfpar.F90
index 31f36368..06096122 100644
--- a/src/OCE/ISF/isfpar.F90
+++ b/src/OCE/ISF/isfpar.F90
@@ -16,15 +16,17 @@ MODULE isfpar
    !!----------------------------------------------------------------------
    USE isf_oce        ! ice shelf
    !
-   USE isfrst   , ONLY: isfrst_write, isfrst_read ! ice shelf restart read/write subroutine
-   USE isftbl   , ONLY: isf_tbl_ktop, isf_tbl_lvl ! ice shelf top boundary layer properties subroutine
+   USE isfrst   , ONLY: isfrst_read               ! ice shelf restart read/write subroutine
+   USE isftbl                                     ! ice shelf top boundary layer properties subroutine
    USE isfparmlt, ONLY: isfpar_mlt                ! ice shelf melt formulation subroutine
    USE isfdiags , ONLY: isf_diags_flx             ! ice shelf diags subroutine
    USE isfutils , ONLY: debug, read_2dcstdta      ! ice shelf debug subroutine
    !
-   USE dom_oce  , ONLY: bathy          ! ocean space and time domain
-   USE par_oce  , ONLY: jpi,jpj        ! ocean space and time domain
-   USE phycst   , ONLY: r1_rho0_rcp    ! physical constants
+   USE oce      , ONLY: ts             ! ocean dynamics and tracers
+   USE dom_oce                         ! ocean space and time domain
+   USE par_oce                         ! ocean space and time domain
+   USE phycst                          ! physical constants
+   USE eosbn2   , ONLY: eos_fzp        ! equation of state
    !
    USE in_out_manager ! I/O manager
    USE iom            ! I/O library
@@ -37,6 +39,7 @@ MODULE isfpar
 
    !! * Substitutions   
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
@@ -44,7 +47,7 @@ MODULE isfpar
    !!----------------------------------------------------------------------
 CONTAINS
  
-   SUBROUTINE isf_par( kt, Kmm, ptsc, pqfwf )
+   SUBROUTINE isf_par( kt, Kmm, ptsc, pfwf )
       !!---------------------------------------------------------------------
       !!                     ***  ROUTINE isf_par ***      
       !!
@@ -60,50 +63,64 @@ CONTAINS
       !! ** Convention : all fluxes are from isf to oce
       !!
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT --------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(inout) :: pqfwf
-      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(inout) :: ptsc
-      !!-------------------------- IN  --------------------------------------
       INTEGER, INTENT(in) ::   kt                                     ! ocean time step
       INTEGER, INTENT(in) ::   Kmm                                    ! ocean time level index
-      !!---------------------------------------------------------------------
-      INTEGER ::   ji, jj
-      REAL(wp), DIMENSION(jpi,jpj) :: zqoce, zqhc, zqlat, zqh
+      REAL(wp), DIMENSION(A2D(0))     , INTENT(inout) ::   pfwf
+      REAL(wp), DIMENSION(A2D(0),jpts), INTENT(inout) ::   ptsc
+      !!
+      INTEGER ::   ji, jj, jk
+      REAL(wp), DIMENSION(A2D(0)) ::   ztfrz, ztavg                   ! tbl freezing and averaged temperatures
+      REAL(wp), DIMENSION(A2D(0)) ::   zqoce, zqhc, zqlat
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   ztfrz3d, ztmp
       !!---------------------------------------------------------------------
       !
+      ! Mean freezing point
+      CALL eos_fzp( ts, Kmm, ztfrz3d, 0 )
+!!st      DO_3D( 0 ,0, 0, 0, 1, jpk )
+!!st         ztmp(ji,jj,jk) = gdept(ji,jj,jk,Kmm)
+!!st      END_3D
+!!st      CALL eos_fzp( ts(A2D(0),:,jp_sal,Kmm), ztfrz3d(:,:,:), ztmp )
+      !
+      DO_3D( 0 ,0, 0, 0, 1, jpk )
+         ztmp(ji,jj,jk) = e3t  (ji,jj,jk,Kmm)
+      END_3D
+      CALL isf_tbl_avg( misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, ztmp, ztfrz3d, & ! <<== in
+         &                                                                            ztfrz  ) ! ==>> out
+
+      ! Mean temperature (only for bg03)
+      CALL isf_tbl_avg( misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, ztmp, ts(A2D(0),:,jp_tem,Kmm), & ! <<== in
+         &                                                                                           ztavg   ) ! ==>> out
+
       ! compute heat content, latent heat and melt fluxes (2d)
-      CALL isfpar_mlt( kt, Kmm, zqhc, zqoce, pqfwf  )
+      CALL isfpar_mlt( kt, Kmm, ztfrz, ztavg, zqhc, zqoce, pfwf )
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ! compute heat and water flux (from isf to oce)
-         pqfwf(ji,jj) = pqfwf(ji,jj) * mskisf_par(ji,jj)
-         zqoce(ji,jj) = zqoce(ji,jj) * mskisf_par(ji,jj)
-         zqhc (ji,jj) = zqhc(ji,jj)  * mskisf_par(ji,jj)
-         !
+      DO_2D( 0, 0, 0, 0 )
          ! compute latent heat flux (from isf to oce)
-         zqlat(ji,jj) = - pqfwf(ji,jj) * rLfusisf    ! 2d latent heat flux (W/m2)
-         !
-         ! total heat flux (from isf to oce)
-         zqh(ji,jj) = ( zqhc (ji,jj) + zqoce(ji,jj) )
+         zqlat(ji,jj) = - pfwf(ji,jj) * rLfusisf    ! 2d latent heat flux (W/m2)
          !
          ! set temperature content
-         ptsc(ji,jj,jp_tem) = zqh(ji,jj) * r1_rho0_rcp
+         ptsc(ji,jj,jp_tem) = ( zqhc (ji,jj) + zqoce(ji,jj) ) * r1_rho0_rcp
       END_2D
       !
       ! output fluxes
-      CALL isf_diags_flx( Kmm, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, 'par', pqfwf, zqoce, zqlat, zqhc)
+      CALL isf_diags_flx( Kmm, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, 'par', pfwf, zqoce, zqlat, zqhc )
       !
-#if ! defined key_RK3
-      ! MLF: write restart variables (qoceisf, qhcisf, fwfisf for now and before)
-      IF (lrst_oce) CALL isfrst_write(kt, 'par', ptsc, pqfwf)
+      ! outputs
+      CALL iom_put('isftfrz_par', ztfrz(:,:) * mskisf_par(:,:) ) ! freezing temperature
+      IF( cn_isfpar_mlt == 'bg03' ) THEN
+         CALL iom_put('ttbl_par',         ztavg(:,:)                * mskisf_par(:,:) )      ! ttbl
+         CALL iom_put('isfthermald_par',( ztavg(:,:) - ztfrz(:,:) ) * mskisf_par(:,:) )      ! thermal driving
+      ENDIF
       !
-#endif
+      ! debugs
       IF ( ln_isfdebug ) THEN
          IF(lwp) WRITE(numout,*)
-         CALL debug('isf_par: ptsc T',ptsc(:,:,1))
-         CALL debug('isf_par: ptsc S',ptsc(:,:,2))
-         CALL debug('isf_par: pqfwf fwf',pqfwf(:,:))
-         IF(lwp) WRITE(numout,*)
+         CALL debug('isf_par: ptsc T', ptsc (:,:,1))
+         CALL debug('isf_par: ptsc S', ptsc (:,:,2))
+         CALL debug( 'isfpar: qhc   ', zqhc (:,:)  )
+         CALL debug( 'isfpar: qoce  ', zqoce(:,:)  )
+         CALL debug( 'isfpar: fwf   ', pfwf (:,:)  )
+         IF(lwp) WRITE(numout,*) ''
       END IF
       !
    END SUBROUTINE isf_par
@@ -115,36 +132,43 @@ CONTAINS
       !! ** Purpose : initialisation of the variable needed for the parametrisation of ice shelf melt
       !!
       !!----------------------------------------------------------------------
-      INTEGER               :: ierr
-      REAL(wp), DIMENSION(jpi,jpj) :: ztblmax, ztblmin
+      INTEGER ::   ierr
+      INTEGER ::   ji, jj     ! dummy loop indices
+      REAL(wp), DIMENSION(A2D(0)) ::   ztblmax, ztblmin
       !!----------------------------------------------------------------------
       !
-      ! allocation
+      !==============
+      ! 0: allocation
+      !==============
       CALL isf_alloc_par()
       !
-      ! initialisation
-      misfkt_par(:,:)     = 1         ; misfkb_par(:,:)       = 1         
-      rhisf_tbl_par(:,:)  = 1e-20     ; rfrac_tbl_par(:,:)    = 0.0_wp
+      !==================
+      ! 1: initialisation
+      !==================
+      DO_2D( 0, 0, 0, 0 )
+         misfkt_par   (ji,jj) = 1
+         misfkb_par   (ji,jj) = 1         
+         rhisf_tbl_par(ji,jj) = 1e-20
+         rfrac_tbl_par(ji,jj) = 0.0_wp
+      END_2D
       !
       ! define isf tbl tickness, top and bottom indice
-      CALL read_2dcstdta(TRIM(sn_isfpar_zmax%clname), TRIM(sn_isfpar_zmax%clvar), ztblmax)
-      CALL read_2dcstdta(TRIM(sn_isfpar_zmin%clname), TRIM(sn_isfpar_zmin%clvar), ztblmin)
-      !
-      ! mask ice shelf parametrisation location
-      ztblmax(:,:) = ztblmax(:,:) * ssmask(:,:)
-      ztblmin(:,:) = ztblmin(:,:) * ssmask(:,:)
-      !
-      ! if param used under an ice shelf overwrite ztblmin by the ice shelf draft
-      WHERE ( risfdep > 0._wp .AND. ztblmin > 0._wp )
-         ztblmin(:,:) = risfdep(:,:)
-      END WHERE
+      CALL read_2dcstdta( TRIM(sn_isfpar_zmax%clname), TRIM(sn_isfpar_zmax%clvar), ztblmax )
+      CALL read_2dcstdta( TRIM(sn_isfpar_zmin%clname), TRIM(sn_isfpar_zmin%clvar), ztblmin )
       !
-      ! ensure ztblmax <= bathy
-      WHERE ( ztblmax(:,:) > bathy(:,:) )
-         ztblmax(:,:) = bathy(:,:)
-      END WHERE
+      DO_2D( 0, 0, 0, 0 )
+         ! mask ice shelf parametrisation location
+         ztblmax(ji,jj) = ztblmax(ji,jj) * ssmask(ji,jj)
+         ztblmin(ji,jj) = ztblmin(ji,jj) * ssmask(ji,jj)
+         !
+         ! if param used under an ice shelf overwrite ztblmin by the ice shelf draft
+         IF( risfdep(ji,jj) > 0._wp .AND. ztblmin(ji,jj) > 0._wp )   ztblmin(ji,jj) = risfdep(ji,jj)
+         !
+         ! ensure ztblmax <= bathy
+         ztblmax(ji,jj) = MIN( ztblmax(ji,jj), bathy(ji,jj) )
+      END_2D
       !
-      ! compute ktop and update ztblmin to gdepw_0(misfkt_par) 
+      ! compute ktop and update ztblmin to gdepw_0 at misfkt_par
       CALL isf_tbl_ktop(ztblmin, misfkt_par) !   out: misfkt_par
       !                                      ! inout: ztblmin
       !
@@ -158,16 +182,22 @@ CONTAINS
       END WHERE
       !
 #if ! defined key_RK3
+      !================
+      ! 2: read restart
+      !================
       ! MLF: read par variable from restart
-      IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b)
+      IF ( ln_rstart ) CALL isfrst_read( 'par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b )
 #endif
       !
+      !==========================================
+      ! 3: specific allocation and initialisation (depending of scheme choice)
+      !==========================================
       SELECT CASE ( TRIM(cn_isfpar_mlt) )
          !
       CASE ( 'spe' )
          !
          ALLOCATE( sf_isfpar_fwf(1), STAT=ierr )
-         ALLOCATE( sf_isfpar_fwf(1)%fnow(jpi,jpj,1), sf_isfpar_fwf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_isfpar_fwf(1)%fnow(A2D(0),1), sf_isfpar_fwf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill( sf_isfpar_fwf, (/ sn_isfpar_fwf /), cn_isfdir, 'isf_par_init', 'read fresh water flux isf data', 'namisf' )
          !
          IF(lwp) WRITE(numout,*)
@@ -185,7 +215,7 @@ CONTAINS
       CASE ( 'oasis' )
          !
          ALLOCATE( sf_isfpar_fwf(1), STAT=ierr )
-         ALLOCATE( sf_isfpar_fwf(1)%fnow(jpi,jpj,1), sf_isfpar_fwf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_isfpar_fwf(1)%fnow(A2D(0),1), sf_isfpar_fwf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill( sf_isfpar_fwf, (/ sn_isfpar_fwf /), cn_isfdir, 'isf_par_init', 'read fresh water flux isf data', 'namisf' )
          !
          IF(lwp) WRITE(numout,*)
diff --git a/src/OCE/ISF/isfparmlt.F90 b/src/OCE/ISF/isfparmlt.F90
index 237e3bee..a4c63aad 100644
--- a/src/OCE/ISF/isfparmlt.F90
+++ b/src/OCE/ISF/isfparmlt.F90
@@ -8,19 +8,17 @@ MODULE isfparmlt
    !!----------------------------------------------------------------------
 
    USE isf_oce                  ! ice shelf
-   USE isftbl , ONLY: isf_tbl   ! ice shelf depth average
-   USE isfutils,ONLY: debug     ! debug subroutine
+   USE isftbl                   ! ice shelf depth average
 
+   USE par_oce                  ! ocean space and time domain
    USE dom_oce                  ! ocean space and time domain
    USE oce    , ONLY: ts        ! ocean dynamics and tracers
    USE phycst , ONLY: rcp, rho0 ! physical constants
-   USE eosbn2 , ONLY: eos_fzp   ! equation of state
 
    USE in_out_manager              ! I/O manager
-   USE iom        , ONLY: iom_put  ! I/O library
    USE fldread    , ONLY: fld_read, FLD, FLD_N !
-   USE lib_fortran, ONLY: glob_sum !
-   USE lib_mpp    , ONLY: ctl_stop !
+   USE lib_fortran, ONLY: glob_sum_vec
+   USE lib_mpp    , ONLY: ctl_stop
 
    IMPLICIT NONE
 
@@ -28,9 +26,9 @@ MODULE isfparmlt
 
    PUBLIC  isfpar_mlt 
 
-
    !! * Substitutions
 #  include "domzgr_substitute.h90"   
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
@@ -38,11 +36,8 @@ MODULE isfparmlt
    !!----------------------------------------------------------------------
 CONTAINS
 
-! -------------------------------------------------------------------------------------------------------
-! -------------------------------- PUBLIC SUBROUTINE ----------------------------------------------------
-! -------------------------------------------------------------------------------------------------------
 
-   SUBROUTINE isfpar_mlt( kt, Kmm, pqhc, pqoce, pqfwf )
+   SUBROUTINE isfpar_mlt( kt, Kmm, ptfrz, ptavg, pqhc, pqoce, pfwf )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isfpar_mlt  ***
       !!
@@ -53,76 +48,63 @@ CONTAINS
       !!                        1 : Specified melt flux
       !!                        2 : Beckmann & Goose parameterization
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqfwf, pqoce, pqhc  ! fresh water, ice-ocean heat and heat content fluxes
-      !!-------------------------- IN  -------------------------------------
+      !!---------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ocean time step
       INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz, ptavg       ! tbl freezing and averaged temperatures
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pfwf, pqoce, pqhc  ! fresh water, ice-ocean heat and heat content fluxes
       !!---------------------------------------------------------------------
       !
       ! Choose among the available ice shelf parametrisation
       SELECT CASE ( cn_isfpar_mlt )
       CASE ( 'spe' )    ! specified runoff in depth (Mathiot et al., 2017 in preparation)
-         CALL isfpar_mlt_spe(kt, Kmm, pqhc, pqoce, pqfwf)
+         !
+         CALL isfpar_mlt_spe(   kt, Kmm, ptfrz, pqhc, pqoce, pfwf )
+         !
       CASE ( 'bg03' )    ! Beckmann and Goosse parametrisation 
-         CALL isfpar_mlt_bg03(kt, Kmm, pqhc, pqoce, pqfwf)
+         !
+         CALL isfpar_mlt_bg03(  kt, Kmm, ptfrz, ptavg, pqhc, pqoce, pfwf )
+         !
       CASE ( 'oasis' )
-         CALL isfpar_mlt_oasis( kt, Kmm, pqhc, pqoce, pqfwf)
+         !
+         CALL isfpar_mlt_oasis( kt, Kmm, ptfrz, pqhc, pqoce, pfwf )
+         !
       CASE DEFAULT
          CALL ctl_stop('STOP', 'unknown isf melt formulation : cn_isfpar (should not see this)')
       END SELECT
       !
-      IF (ln_isfdebug) THEN
-         IF(lwp) WRITE(numout,*) ''
-         CALL debug( 'isfpar_mlt qhc  :', pqhc (:,:) )
-         CALL debug( 'isfpar_mlt qoce :', pqoce(:,:) )
-         CALL debug( 'isfpar_mlt qfwf :', pqfwf(:,:) )
-         IF(lwp) WRITE(numout,*) ''
-      END IF
-      !
    END SUBROUTINE isfpar_mlt
 
-! -------------------------------------------------------------------------------------------------------
-! -------------------------------- PRIVATE SUBROUTINE ---------------------------------------------------
-! -------------------------------------------------------------------------------------------------------
 
-   SUBROUTINE isfpar_mlt_spe(kt, Kmm, pqhc, pqoce, pqfwf)
+   SUBROUTINE isfpar_mlt_spe( kt, Kmm, ptfrz, pqhc, pqoce, pfwf )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isfpar_mlt_spe  ***
       !!
       !! ** Purpose : prescribed ice shelf melting in case ice shelf cavities are closed.
       !!              data read into a forcing files.
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqhc, pqfwf, pqoce  ! fresh water and ice-ocean heat fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER,  INTENT(in) :: kt
-      INTEGER,  INTENT(in) :: Kmm    !  ocean time level index
       !!--------------------------------------------------------------------
-      INTEGER :: jk
-      REAL(wp), DIMENSION(jpi,jpj,jpk)  :: ztfrz3d
-      REAL(wp), DIMENSION(jpi,jpj)      :: ztfrz
+      INTEGER,  INTENT(in) ::   kt
+      INTEGER,  INTENT(in) ::   Kmm    !  ocean time level index
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz              ! tbl freezing temp
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pfwf, pqoce  ! fresh water and ice-ocean heat fluxes
+      !!
+      INTEGER ::   ji, jj     ! dummy loop indices
       !!--------------------------------------------------------------------
       !
-      ! 0. ------------Read specified fwf from isf to oce
-      CALL fld_read ( kt, 1, sf_isfpar_fwf   )
-      !
-      ! compute ptfrz
-      ! 1. ------------Mean freezing point
-      DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
-      END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
+      ! Read specified fwf from isf to oce
+      CALL fld_read ( kt, 1, sf_isfpar_fwf )
       !
-      pqfwf(:,:) =   sf_isfpar_fwf(1)%fnow(:,:,1)      ! fresh water flux from the isf (fwfisf <0 mean melting)       ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean/ice shelf flux assume to be equal to latent heat flux  ( > 0 from isf to oce)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux                                            ( > 0 from isf to oce)
+      DO_2D( 0, 0, 0, 0 )
+         pfwf(ji,jj) =   sf_isfpar_fwf(1)%fnow(ji,jj,1)    * mskisf_par(ji,jj)  ! fresh water flux from the isf (fwfisf <0 mean melting)       ( > 0 from isf to oce)
+         pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf           * mskisf_par(ji,jj)  ! ocean/ice shelf flux assume to be equal to latent heat flux  ( > 0 from isf to oce)
+         pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp * mskisf_par(ji,jj)  ! heat content flux                                            ( > 0 from isf to oce)
+      END_2D
       !
-      CALL iom_put('isftfrz_par', ztfrz(:,:) * mskisf_par(:,:) )
       !
    END SUBROUTINE isfpar_mlt_spe
 
-   SUBROUTINE isfpar_mlt_bg03(kt, Kmm, pqhc, pqoce, pqfwf)
+   SUBROUTINE isfpar_mlt_bg03( kt, Kmm, ptfrz, ptavg, pqhc, pqoce, pfwf )
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isfpar_mlt_bg03  ***
       !!
@@ -137,45 +119,25 @@ CONTAINS
       !! ** Reference : Beckmann and Goosse (2003), "A parameterization of ice shelf-ocean
       !!                interaction for climate models", Ocean Modelling 5(2003) 157-170.
       !!----------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqhc, pqfwf, pqoce  ! fresh water and ice-ocean heat fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER,  INTENT(in) :: kt
-      INTEGER,  INTENT(in) :: Kmm    !  ocean time level index
-      !!--------------------------------------------------------------------
-      INTEGER :: jk
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztfrz3d        ! freezing point
-      REAL(wp), DIMENSION(jpi,jpj)     :: ztfrz          ! freezing point
-      REAL(wp), DIMENSION(jpi,jpj)     :: ztavg          ! temperature avg
+      INTEGER,  INTENT(in) ::   kt
+      INTEGER,  INTENT(in) ::   Kmm    !  ocean time level index
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz, ptavg       ! tbl freezing and averaged temp
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pfwf, pqoce  ! fresh water and ice-ocean heat fluxes
+      !!
+      INTEGER ::   ji, jj     ! dummy loop indices
       !!----------------------------------------------------------------------
       !
-      ! 0. ------------Mean freezing point
-      DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
-      END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
-      !
-      ! 1. ------------Mean temperature
-      CALL isf_tbl(Kmm, ts(:,:,:,jp_tem,Kmm), ztavg, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
-      !
-      ! 2. ------------Net heat flux and fresh water flux due to the ice shelf
-      pqfwf(:,:) =   rho0 * rcp * rn_isfpar_bg03_gt0 * risfLeff(:,:) * e1t(:,:) * (ztavg(:,:) - ztfrz(:,:) ) * r1_e1e2t(:,:) / rLfusisf  ! ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean/ice shelf flux assume to be equal to latent heat flux  ( > 0 from isf to oce)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux                                            ( > 0 from isf to oce)
-      !
-      ! 3. ------------BG03 output
-      ! output ttbl
-      CALL iom_put('ttbl_par', ztavg(:,:) * mskisf_par(:,:) )
-      !
-      ! output thermal driving
-      CALL iom_put('isfthermald_par',( ztavg(:,:) - ztfrz(:,:) ) * mskisf_par(:,:))
-      !
-      ! output freezing point used to define the thermal driving and heat content fluxes
-      CALL iom_put('isftfrz_par', ztfrz(:,:) * mskisf_par(:,:) )
+      ! Net heat flux and fresh water flux due to the ice shelf
+      DO_2D( 0, 0, 0, 0 )
+         pfwf (ji,jj) =  rho0 * rcp * rn_isfpar_bg03_gt0 * risfLeff(ji,jj) * e1t(ji,jj) * ( ptavg(ji,jj) - ptfrz(ji,jj) ) &
+            &                 * r1_e1e2t(ji,jj) / rLfusisf * mskisf_par(ji,jj)   ! ( > 0 from isf to oce)
+         pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf           * mskisf_par(ji,jj)   ! ocean/ice shelf flux assume to be equal to latent heat flux  ( > 0 from isf to oce)
+         pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp * mskisf_par(ji,jj)   ! heat content flux                                            ( > 0 from isf to oce)
+      END_2D
       !
    END SUBROUTINE isfpar_mlt_bg03
 
-   SUBROUTINE isfpar_mlt_oasis(kt, Kmm, pqhc , pqoce, pqfwf )
+   SUBROUTINE isfpar_mlt_oasis( kt, Kmm, ptfrz, pqhc , pqoce, pfwf )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE isfpar_mlt_oasis  ***
       !!
@@ -186,50 +148,37 @@ CONTAINS
       !!                 - scale fwf and compute heat fluxes
       !!
       !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! heat content, latent heat and fwf fluxes
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                     , INTENT(in   ) :: kt                  ! current time step
-      INTEGER                     , INTENT(in   ) :: Kmm                 !  ocean time level index
-      !!--------------------------------------------------------------------
-      INTEGER                           :: jk                            ! loop index
-      REAL(wp)                          :: zfwf_fld, zfwf_oasis          ! total fwf in the forcing fields (pattern) and from the cpl interface (amount)
-      REAL(wp), DIMENSION(jpi,jpj)      :: ztfrz                         ! tbl freezing temperature
-      REAL(wp), DIMENSION(jpi,jpj)      :: zfwf                          ! 2d fwf map after scaling
-      REAL(wp), DIMENSION(jpi,jpj,jpk)  :: ztfrz3d
+      INTEGER                    , INTENT(in   ) ::   kt                 ! current time step
+      INTEGER                    , INTENT(in   ) ::   Kmm                !  ocean time level index
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in   ) ::   ptfrz              ! tbl freezing temp
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pqhc, pqoce, pfwf  ! heat content, latent heat and fwf fluxes
+      !!
+      INTEGER  ::   ji, jj           ! dummy loop indices
+      REAL(wp), DIMENSION(A2D(0),2) ::   ztmp
+      REAL(wp), DIMENSION(2)        ::   zbg
       !!--------------------------------------------------------------------
       !
-      ! 0. ------------Read specified runoff
-      CALL fld_read ( kt, 1, sf_isfpar_fwf   )
-      !
-      ! 1. ------------Mean freezing point (needed for heat content flux)
-      DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
-      END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
+      ! Read specified fwf from isf to oce
+      CALL fld_read ( kt, 1, sf_isfpar_fwf )
       !
-      ! 2. ------------Scale isf melt pattern with total amount from oasis
-      ! ice shelf 2d map of fwf from isf to oce
-      zfwf(:,:) = sf_isfpar_fwf(1)%fnow(:,:,1)
+      DO_2D( 0, 0, 0, 0 )
+         ! ice shelf 2d map
+         pfwf(ji,jj) = sf_isfpar_fwf(1)%fnow(ji,jj,1)
+         ztmp(ji,jj,1) = e1e2t(ji,jj) * pfwf(ji,jj)
+         ztmp(ji,jj,2) = e1e2t(ji,jj) * fwfisf_oasis(ji,jj)
+      END_2D
       !
-      ! compute glob sum from input file
-      ! (PM) should we consider delay sum as in fwb ? (it will offset by 1 time step if I understood well)
-      zfwf_fld = glob_sum('isfcav_mlt', e1e2t(:,:) * zfwf(:,:))
+      ! compute glob sum from input file and from atm->oce ice shelf fwf
+      ! (PM) should consider delay sum as in fwb (1 time step offset if I well understood)
+      zbg = glob_sum_vec( 'isfpar_mlt', ztmp )
       !
-      ! compute glob sum from atm->oce ice shelf fwf
-      ! (PM) should we consider delay sum as in fwb ?
-      zfwf_oasis = glob_sum('isfcav_mlt', e1e2t(:,:) * fwfisf_oasis(:,:))
-      !
-      ! scale fwf
-      zfwf(:,:) = zfwf(:,:) * zfwf_oasis / zfwf_fld
-      ! 
-      ! 3. -----------Define fwf and qoce
+      ! Define fwf and qoce
       ! ocean heat flux is assume to be equal to the latent heat
-      pqfwf(:,:) =   zfwf(:,:)                         ! fwf                ( > 0 from isf to oce)
-      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean heat flux    ( > 0 from isf to oce) (assumed to be the latent heat flux)
-      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux  ( > 0 from isf to oce)
-      !
-      CALL iom_put('isftfrz_par', ztfrz )
+      DO_2D( 0, 0, 0, 0 )
+         pfwf (ji,jj) =   pfwf(ji,jj) * zbg(2) / zbg(1)    * mskisf_par(ji,jj)   ! scale fwf ( > 0 from isf to oce)
+         pqoce(ji,jj) = - pfwf(ji,jj) * rLfusisf           * mskisf_par(ji,jj)   ! ocean heat flux    ( > 0 from isf to oce) (assumed to be the latent heat flux)
+         pqhc (ji,jj) =   pfwf(ji,jj) * ptfrz(ji,jj) * rcp * mskisf_par(ji,jj)   ! heat content flux  ( > 0 from isf to oce)
+      END_2D
       !
    END SUBROUTINE isfpar_mlt_oasis
 
diff --git a/src/OCE/ISF/isfrst.F90 b/src/OCE/ISF/isfrst.F90
index 696605ff..a6302a54 100644
--- a/src/OCE/ISF/isfrst.F90
+++ b/src/OCE/ISF/isfrst.F90
@@ -10,7 +10,7 @@ MODULE isfrst
    !!   isfrst : read/write iceshelf variables in/from restart
    !!----------------------------------------------------------------------
    !
-   USE par_oce, ONLY: jpi,jpj,jpk,jpts ! time and space domain
+   USE par_oce        ! time and space domain
    !
    USE in_out_manager ! I/O manager
    USE iom            ! I/O library
@@ -21,6 +21,8 @@ MODULE isfrst
 
    PUBLIC isfrst_read, isfrst_write ! iceshelf restart read and write
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
@@ -33,13 +35,12 @@ CONTAINS
       !!
       !!   isfrst_read : read iceshelf variables from restart
       !!
-      !!-------------------------- OUT --------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(  out) :: pfwf_b
-      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(  out) :: ptsc_b
-      !!-------------------------- IN  --------------------------------------
-      CHARACTER(LEN=3)                 , INTENT(in   ) :: cdisf
-      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(in   ) :: pfwf
-      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in   ) :: ptsc
+      !!----------------------------------------------------------------------
+      CHARACTER(LEN=3)                , INTENT(in   ) :: cdisf
+      REAL(wp), DIMENSION(A2D(0),jpts), INTENT(in   ) :: ptsc
+      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfwf
+      REAL(wp), DIMENSION(A2D(0),jpts), INTENT(  out) :: ptsc_b
+      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(  out) :: pfwf_b
       !!----------------------------------------------------------------------
       CHARACTER(LEN=256) :: cfwf_b, chc_b, csc_b
       !!----------------------------------------------------------------------
@@ -68,11 +69,11 @@ CONTAINS
       !!
       !!   isfrst_write : write iceshelf variables in restart
       !!
-      !!-------------------------- IN  --------------------------------------
-      INTEGER                          , INTENT(in   ) :: kt
-      CHARACTER(LEN=3)                 , INTENT(in   ) :: cdisf
-      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(in   ) :: pfwf
-      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in   ) :: ptsc
+      !!---------------------------------------------------------------------
+      INTEGER                         , INTENT(in   ) :: kt
+      CHARACTER(LEN=3)                , INTENT(in   ) :: cdisf
+      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: pfwf
+      REAL(wp), DIMENSION(A2D(0),jpts), INTENT(in   ) :: ptsc
       !!---------------------------------------------------------------------
       CHARACTER(LEN=256) :: cfwf_b, chc_b, csc_b
       !!---------------------------------------------------------------------
diff --git a/src/OCE/ISF/isfstp.F90 b/src/OCE/ISF/isfstp.F90
index edc5f92a..1c847f9b 100644
--- a/src/OCE/ISF/isfstp.F90
+++ b/src/OCE/ISF/isfstp.F90
@@ -13,20 +13,22 @@ MODULE isfstp
    !!   isfstp       : compute iceshelf melt and heat flux
    !!----------------------------------------------------------------------
    USE isf_oce                                      ! isf variables
+   USE isfrst , ONLY: isfrst_write                  ! ice shelf restart read/write subroutine
    USE isfload, ONLY: isf_load                      ! ice shelf load
    USE isftbl , ONLY: isf_tbl_lvl                   ! ice shelf boundary layer
    USE isfpar , ONLY: isf_par, isf_par_init         ! ice shelf parametrisation
    USE isfcav , ONLY: isf_cav, isf_cav_init         ! ice shelf cavity
    USE isfcpl , ONLY: isfcpl_rst_write, isfcpl_init ! isf variables
 
+   USE oce    , ONLY: ssh
+   USE par_oce        ! ocean space and time domain
    USE dom_oce        ! ocean space and time domain
-   USE oce      , ONLY: ssh                           ! sea surface height
-   USE domvvl,  ONLY: ln_vvl_zstar                      ! zstar logical
    USE zdfdrg,  ONLY: r_Cdmin_top, r_ke0_top            ! vertical physics: top/bottom drag coef.
    !
    USE lib_mpp, ONLY: ctl_stop, ctl_nam
    USE fldread, ONLY: FLD, FLD_N
    USE in_out_manager ! I/O manager
+   USE lbclnk
    USE timing
 
    IMPLICIT NONE
@@ -35,6 +37,7 @@ MODULE isfstp
    PUBLIC   isf_stp, isf_init, isf_nam  ! routine called in sbcmod and divhor
 
    !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -60,42 +63,49 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt    ! ocean time step
       INTEGER, INTENT(in) ::   Kmm   ! ocean time level index
       !
-      INTEGER :: jk                              ! loop index
-#if defined key_qco
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t   ! 3D workspace
-#endif
+      INTEGER ::   ji, jj, jk, ikt                     ! loop index
+      REAL(wp), DIMENSION(A2D(0))     ::   zhtmp  ! temporary array for thickness
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   ze3t   ! 3D workspace for key_qco
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('isf')
       !
+      ! temporary arrays for key_qco
+      DO_2D( 0 ,0, 0, 0 )
+         zhtmp(ji,jj) = ht(ji,jj,Kmm)
+         DO jk = 1, jpk
+            ze3t(ji,jj,jk) = e3t(ji,jj,jk,Kmm)
+         ENDDO
+      END_2D
+      !
       !=======================================================================
       ! 1.: compute melt and associated heat fluxes in the ice shelf cavities
       !=======================================================================
       !
       IF ( ln_isfcav_mlt ) THEN
          !
+         ! --- before time step --- ! 
 #if ! defined key_RK3
-         ! MLF : need risf_cav_tsc_b update
-         ! 1.1: before time step 
-         IF ( kt /= nit000 ) THEN 
-            risf_cav_tsc_b (:,:,:) = risf_cav_tsc (:,:,:)
-            fwfisf_cav_b(:,:)      = fwfisf_cav(:,:)
+         IF ( kt /= nit000 ) THEN         ! MLF : need risf_cav_tsc_b update 
+            DO_2D( 0, 0, 0, 0 )
+               risf_cav_tsc_b(ji,jj,:) = risf_cav_tsc(ji,jj,:)
+               fwfisf_cav_b  (ji,jj)   = fwfisf_cav  (ji,jj)
+            END_2D
          END IF
 #endif
          !
-         ! 1.2: compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
-         rhisf_tbl_cav(:,:) = rn_htbl * mskisf_cav(:,:)
-#if defined key_qco
-         DO jk = 1, jpk
-            ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         END DO 
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
-#else
-         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
-#endif
+         ! --- deepest level (misfkb), thickness (rhisf) & fraction of deepest cell affected by tbl (rfrac) --- !
+         DO_2D( 0 ,0, 0, 0 )
+            ! limit the tbl to water depth and to the top level thickness
+            ikt = misfkt_cav(ji,jj)  ! tbl top indices
+            rhisf_tbl_cav(ji,jj) = MAX( MIN( rn_htbl * mskisf_cav(ji,jj), zhtmp(ji,jj) ), ze3t(ji,jj,ikt) )
+         END_2D
+
+         CALL isf_tbl_lvl( ze3t, misfkt_cav, rhisf_tbl_cav, &  ! <<== in
+            &                    misfkb_cav, rfrac_tbl_cav )   ! ==>> out
          !
-         ! 1.3: compute ice shelf melt
-         CALL isf_cav( kt, Kmm, risf_cav_tsc, fwfisf_cav )
+         ! --- ice shelf melt (fwfisf) and temperature trend (risf) --- !
+         CALL isf_cav( kt, Kmm, risf_cav_tsc, fwfisf_cav(A2D(0)) )    ! <<==>> inout
          !
       END IF
       ! 
@@ -105,37 +115,59 @@ CONTAINS
       !
       IF ( ln_isfpar_mlt ) THEN
          !
+         ! --- before time step --- ! 
 #if ! defined key_RK3
-         ! MLF : need risf_par_tsc_b update
-         ! 2.1: before time step 
-         IF ( kt /= nit000 ) THEN 
-            risf_par_tsc_b(:,:,:) = risf_par_tsc(:,:,:)
-            fwfisf_par_b  (:,:)   = fwfisf_par  (:,:)
+         IF ( kt /= nit000 ) THEN          ! MLF : need risf_par_tsc_b update
+            DO_2D( 0, 0, 0, 0 )
+               risf_par_tsc_b(ji,jj,:) = risf_par_tsc(ji,jj,:)
+               fwfisf_par_b  (ji,jj)   = fwfisf_par  (ji,jj)
+            END_2D
          END IF
 #endif
          !
-         ! 2.2: compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
+         ! --- deepest level (misfkb), thickness (rhisf) & fraction of deepest cell affected by tbl (rfrac) --- !
          ! by simplicity, we assume the top level where param applied do not change with time (done in init part)
-         rhisf_tbl_par(:,:) = rhisf0_tbl_par(:,:)
-#if defined key_qco
-         DO jk = 1, jpk
-            ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         END DO
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
-#else
-         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
-#endif
+         !      limit the tbl to water depth and to the top level thickness
+         DO_2D( 0 ,0, 0, 0 )
+            ikt = misfkt_par(ji,jj)  ! tbl top indices
+            rhisf_tbl_par(ji,jj) = MAX( MIN( rhisf0_tbl_par(ji,jj), zhtmp(ji,jj) ), ze3t(ji,jj,ikt) )
+         END_2D
+
+         CALL isf_tbl_lvl( ze3t, misfkt_par, rhisf_tbl_par, &  ! <<== in
+            &                    misfkb_par, rfrac_tbl_par )   ! ==>> out
          !
-         ! 2.3: compute ice shelf melt
-         CALL isf_par( kt, Kmm, risf_par_tsc, fwfisf_par )
+         ! --- ice shelf melt (fwfisf) and temperature trend (risf) --- !
+         CALL isf_par( kt, Kmm, risf_par_tsc, fwfisf_par(A2D(0)) )    ! <<==>> inout
          !
       END IF
       !
-      !==================================================================================
-      ! 3.: output specific restart variable in case of coupling with an ice sheet model
-      !==================================================================================
       !
-      IF ( ln_isfcpl .AND. lrst_oce ) CALL isfcpl_rst_write(kt, Kmm)
+      !clem: these lbc are needed since we calculate everything in the interior now
+      IF( ln_isfcpl ) THEN
+         CALL lbc_lnk( 'isf_stp', fwfisf_par  , 'T', 1.0_wp, fwfisf_cav  , 'T', 1.0_wp, &
+#if ! defined key_RK3
+            &                     fwfisf_par_b, 'T', 1.0_wp, fwfisf_cav_b, 'T', 1.0_wp, &
+#endif
+            &                     risfcpl_ssh, 'T', 1.0_wp, risfcpl_cons_ssh, 'T', 1.0_wp ) ! needed in dynspg_ts, stp2d
+         CALL lbc_lnk( 'isf_stp', risfcpl_vol, 'T', 1.0_wp )                                ! needed in dynspg_ts, stp2d, sshwzv, dynatf
+      ELSE
+         CALL lbc_lnk( 'isf_stp', fwfisf_par  , 'T', 1.0_wp, fwfisf_cav  , 'T', 1.0_wp, &
+#if ! defined key_RK3
+            &                     fwfisf_par_b, 'T', 1.0_wp, fwfisf_cav_b, 'T', 1.0_wp  &
+            &        )
+#endif         
+      ENDIF
+      !
+      !==================
+      ! 3.: write restart
+      !==================
+#if ! defined key_RK3
+      ! MLF: write restart variables (qoceisf, qhcisf, fwfisf for now and before)
+      IF( ln_isfcav_mlt .AND. lrst_oce )   CALL isfrst_write( kt, 'cav', risf_cav_tsc , fwfisf_cav )
+      ! MLF: write restart variables (qoceisf, qhcisf, fwfisf for now and before)
+      IF( ln_isfpar_mlt .AND. lrst_oce )   CALL isfrst_write( kt, 'par', risf_par_tsc , fwfisf_par )
+#endif
+      IF( ln_isfcpl     .AND. lrst_oce )   CALL isfcpl_rst_write( kt, Kmm )
       !
       IF( ln_timing )   CALL timing_stop('isf')
       !
@@ -164,10 +196,19 @@ CONTAINS
       CALL isf_nam()                                              ! Read namelist
       !
       CALL isf_alloc()                                            ! Allocate public array
+      !
+      ! initalisation of fwf and tsc array to 0
+      risfload    (:,:)   = 0._wp
+      fwfisf_oasis(:,:)   = 0._wp ; fwfisf_par  (:,:)   = 0._wp ; fwfisf_cav(:,:) = 0._wp
+      risf_cav_tsc(:,:,:) = 0._wp ; risf_par_tsc(:,:,:) = 0._wp
+#if ! defined key_RK3
+      fwfisf_par_b  (:,:)   = 0._wp ; fwfisf_cav_b  (:,:)   = 0._wp
+      risf_cav_tsc_b(:,:,:) = 0._wp ; risf_par_tsc_b(:,:,:) = 0._wp
+#endif
       !
       CALL isf_ctl()                                              ! check option compatibility
       !
-      IF( ln_isfcav ) CALL isf_load( Kmm, risfload )              ! compute ice shelf load
+      IF( ln_isfcav )   CALL isf_load( Kmm, risfload )            ! compute ice shelf load
       !
       ! terminate routine now if no ice shelf melt formulation specify
       IF( ln_isf ) THEN
@@ -200,11 +241,9 @@ CONTAINS
          WRITE(numout,*)
          !
          IF ( ln_isf ) THEN
-#if key_qco 
-# if ! defined key_isf 
+#if defined key_qco && ! defined key_isf 
             CALL ctl_stop( 'STOP', 'isf_ctl: ice shelf requires both ln_isf=T AND key_isf activated' ) 
-# endif 
-#endif
+#endif 
             WRITE(numout,*) '      Add debug print in isf module           ln_isfdebug     = ', ln_isfdebug
             WRITE(numout,*)
             WRITE(numout,*) '      melt inside the cavity                  ln_isfcav_mlt   = ', ln_isfcav_mlt
@@ -281,10 +320,7 @@ CONTAINS
             IF ( TRIM(cn_isfpar_mlt) == 'oasis' .AND. TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis and cn_isfcav_mlt = oasis not coded' )
          END IF
          !
-         ! compatibility ice shelf and vvl
-         IF( .NOT. ln_vvl_zstar .AND. ln_isf ) CALL ctl_stop( 'Only vvl_zstar has been tested with ice shelf cavity' )
-         !
-      END IF
+      ENDIF
    END SUBROUTINE isf_ctl
 
    
diff --git a/src/OCE/ISF/isftbl.F90 b/src/OCE/ISF/isftbl.F90
index c6b3adc3..04d3da35 100644
--- a/src/OCE/ISF/isftbl.F90
+++ b/src/OCE/ISF/isftbl.F90
@@ -15,20 +15,21 @@ MODULE isftbl
 
    USE isf_oce ! ice shelf variables
 
+   USE par_oce ! ocean space and time domain
    USE dom_oce ! vertical scale factor and depth
+   USE domutl, ONLY : lbnd_ij
 
    IMPLICIT NONE
 
    PRIVATE
 
-   PUBLIC isf_tbl, isf_tbl_avg, isf_tbl_lvl, isf_tbl_ktop, isf_tbl_kbot
+   PUBLIC isf_tbl_avg, isf_tbl_lvl, isf_tbl_ktop
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
-
 CONTAINS
 
-   SUBROUTINE isf_tbl( Kmm, pvarin, pvarout, cd_ptin, ktop, phtbl, kbot, pfrac )
+   SUBROUTINE isf_tbl( Kmm, pvarin, cd_ptin, ktop, phtbl, pvarout, kbot, pfrac )
       !!--------------------------------------------------------------------
       !!                  ***  SUBROUTINE isf_tbl  ***
       !!
@@ -39,83 +40,87 @@ CONTAINS
       !! ** Reference : inspired from : Losch, Modeling ice shelf cavities in a z coordinate ocean general circulation model
       !!                https://doi.org/10.1029/2007JC004368 , 2008
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(  out) :: pvarout ! 2d average of pvarin
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                               , INTENT(in   ) :: Kmm           ! ocean time level index
-      CHARACTER(len=1)                      , INTENT(in   ) :: cd_ptin       ! point of variable in/out
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      , INTENT(in   ) :: pvarin        ! 3d variable to average over the tbl
-      INTEGER,  DIMENSION(jpi,jpj)          , INTENT(in   ) :: ktop          ! top level
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in   ) :: phtbl         ! tbl thickness
-      !!-------------------------- IN OPTIONAL -----------------------------
-      INTEGER,  DIMENSION(jpi,jpj), OPTIONAL, INTENT(in   ) :: kbot          ! bottom level
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in   ) :: pfrac         ! fraction of bottom cell affected by tbl
       !!--------------------------------------------------------------------
-      INTEGER ::   ji, jj                     ! loop index
-      INTEGER , DIMENSION(jpi,jpj) :: ikbot   ! bottom level of the tbl
-      REAL(wp), DIMENSION(jpi,jpj) :: zvarout ! 2d average of pvarin
-      REAL(wp), DIMENSION(jpi,jpj) :: zhtbl   ! thickness of the tbl
-      REAL(wp), DIMENSION(jpi,jpj) :: zfrac   ! thickness of the tbl
-      INTEGER :: jk                            ! loop index
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t,ze3u,ze3v ! e3 
+      INTEGER                              , INTENT(in ) ::   Kmm           ! ocean time level index
+      REAL(wp), DIMENSION(A2D(0),jpk)      , INTENT(in ) ::   pvarin        ! 3d variable to average over the tbl
+      CHARACTER(len=1)                     , INTENT(in ) ::   cd_ptin       ! point of variable in/out
+      INTEGER,  DIMENSION(A2D(0))          , INTENT(in ) ::   ktop          ! top level
+      REAL(wp), DIMENSION(A2D(0))          , INTENT(in ) ::   phtbl         ! tbl thickness
+      REAL(wp), DIMENSION(A2D(0))          , INTENT(out) ::   pvarout       ! 2d average of pvarin
+      INTEGER,  DIMENSION(A2D(0)), OPTIONAL, INTENT(in ) ::   kbot          ! bottom level
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in ) ::   pfrac         ! fraction of bottom cell affected by tbl
+      !!--------------------------------------------------------------------
+      INTEGER ::   ji, jj, jk, ikt             ! loop index
+      REAL(wp), DIMENSION(A2D(0)) ::   zhtbl   ! temporary array for thickness
+      INTEGER , DIMENSION(A2D(0)) ::   ikbot   ! bottom level of the tbl
+      REAL(wp), DIMENSION(A2D(0)) ::   zfrac   ! thickness of the tbl
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   ze3 ! e3 
       !!--------------------------------------------------------------------
       ! 
       SELECT CASE ( cd_ptin )
       CASE ( 'U' )
          !
-         ! copy phtbl (phtbl is INTENT in as we don't want to change it)
-         zhtbl = phtbl
+         DO_3D( 0 ,0, 0, 0, 1, jpk )
+            ze3(ji,jj,jk) = e3u(ji,jj,jk,Kmm)
+         END_3D 
          !
-         DO jk = 1, jpk
-            ze3u(:,:,jk) = e3u(:,:,jk,Kmm)
-         END DO 
          ! compute tbl lvl and thickness
-         CALL isf_tbl_lvl( hu(:,:,Kmm), ze3u, ktop, ikbot, zhtbl, zfrac )
+         DO_2D( 0 ,0, 0, 0 )
+            ikt = ktop(ji,jj)  ! tbl top indices
+            zhtbl(ji,jj) = MAX( MIN( phtbl(ji,jj), hu(ji,jj,Kmm) ), ze3(ji,jj,ikt) )
+         END_2D
+         CALL isf_tbl_lvl( ze3, ktop, zhtbl, & ! <<== in
+            &                   ikbot, zfrac ) ! ==>> out
          !
          ! compute tbl property at U point
-         CALL isf_tbl_avg( miku, ikbot, zhtbl, zfrac, ze3u, pvarin, zvarout )
+         CALL isf_tbl_avg( miku(A2D(0)), ikbot, zhtbl, zfrac, ze3, pvarin, & ! <<== in
+            &                                                      pvarout ) ! ==>> out
          !
-         ! compute tbl property at T point
-         pvarout(1,:) = 0._wp
-         DO_2D( nn_hls-1, nn_hls, nn_hls, nn_hls )
-            pvarout(ji,jj) = 0.5_wp * (zvarout(ji,jj) + zvarout(ji-1,jj))
-         END_2D
-         ! lbclnk not needed as a final communication is done after the computation of fwf
-         ! 
       CASE ( 'V' )
          !
-         ! copy phtbl (phtbl is INTENT in as we don't want to change it)
-         zhtbl = phtbl
+         DO_3D( 0 ,0, 0, 0, 1, jpk )
+            ze3(ji,jj,jk) = e3v(ji,jj,jk,Kmm)
+         END_3D 
          !
-         DO jk = 1, jpk
-            ze3v(:,:,jk) = e3v(:,:,jk,Kmm)
-         END DO 
          ! compute tbl lvl and thickness
-         CALL isf_tbl_lvl( hv(:,:,Kmm), ze3v, ktop, ikbot, zhtbl, zfrac )
+         DO_2D( 0 ,0, 0, 0 )
+            ikt = ktop(ji,jj)  ! tbl top indices
+            zhtbl(ji,jj) = MAX( MIN( phtbl(ji,jj), hv(ji,jj,Kmm) ), ze3(ji,jj,ikt) )
+         END_2D
+         CALL isf_tbl_lvl( ze3, ktop, zhtbl, & ! <<== in
+            &                   ikbot, zfrac ) ! ==>> out
          !
          ! compute tbl property at V point
-         CALL isf_tbl_avg( mikv, ikbot, zhtbl, zfrac, ze3v, pvarin, zvarout )
-         !
-         ! pvarout is an averaging of wet point
-         pvarout(:,1) = 0._wp
-         DO_2D( nn_hls, nn_hls, nn_hls-1, nn_hls )
-            pvarout(ji,jj) = 0.5_wp * (zvarout(ji,jj) + zvarout(ji,jj-1))
-         END_2D
-         ! lbclnk not needed as a final communication is done after the computation of fwf
+         CALL isf_tbl_avg( mikv(A2D(0)), ikbot, zhtbl, zfrac, ze3, pvarin, & ! <<== in
+            &                                                      pvarout ) ! ==>> out
          !
       CASE ( 'T' )
+         !
+         DO_3D( 0 ,0, 0, 0, 1, jpk )
+            ze3(ji,jj,jk) = e3t(ji,jj,jk,Kmm)
+         END_3D
          !
          ! compute tbl property at T point
-         DO jk = 1, jpk
-            ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         END DO 
-         CALL isf_tbl_avg( ktop, kbot, phtbl, pfrac, ze3t, pvarin, pvarout )
+         CALL isf_tbl_avg( ktop, kbot, phtbl, pfrac, ze3, pvarin, & ! <<== in
+            &                                             pvarout ) ! ==>> out
          !
       END SELECT
       !
    END SUBROUTINE isf_tbl
 
    SUBROUTINE isf_tbl_avg( ktop, kbot, phtbl, pfrac, pe3, pvarin, pvarout )
+      !!--------------------------------------------------------------------
+      INTEGER,  DIMENSION(:,:)       , INTENT(in ) ::   ktop         ! top level of the top boundary layer
+      INTEGER,  DIMENSION(A2D(0))    , INTENT(in ) ::   kbot         ! bottom level of the top boundary layer
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in ) ::   phtbl, pfrac ! fraction of bottom level to be affected by the tbl
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(in ) ::   pe3          ! vertical scale factor
+      REAL(wp), DIMENSION(:,:,:)     , INTENT(in ) ::   pvarin       ! tbl property to average between ktop, kbot over phtbl
+      REAL(wp), DIMENSION(:,:)       , INTENT(out) ::   pvarout      ! tbl property averaged over phtbl between level ktop and kbot
+      !!--------------------------------------------------------------------
+      CALL isf_tbl_avg_t( ktop, lbnd_ij(ktop), kbot, phtbl, pfrac, pe3, pvarin, lbnd_ij(pvarin), pvarout, lbnd_ij(pvarout) )
+   END SUBROUTINE isf_tbl_avg
+
+   SUBROUTINE isf_tbl_avg_t( ktop, ktktop, kbot, phtbl, pfrac, pe3, pvarin, ktvarin, pvarout, ktvarout )
       !!--------------------------------------------------------------------
       !!                  ***  ROUTINE isf_tbl_avg  ***
       !!
@@ -124,20 +129,21 @@ CONTAINS
       !! ** Method  : Depth average is made between the top level ktop and the bottom level kbot
       !!              over a thickness phtbl. The bottom level is partially counted (pfrac).
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(  out) :: pvarout      ! tbl property averaged over phtbl between level ktop and kbot
-      !!-------------------------- IN  -------------------------------------
-      INTEGER,  DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop, kbot   ! top and bottom level of the top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: phtbl, pfrac ! fraction of bottom level to be affected by the tbl
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pe3          ! vertical scale factor
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvarin       ! tbl property to average between ktop, kbot over phtbl
       !!--------------------------------------------------------------------
-      INTEGER  :: ji,jj,jk                    ! loop indices
-      INTEGER  :: ikt, ikb                    ! top and bottom levels
+      INTEGER,  DIMENSION(2)                , INTENT(in ) ::   ktvarin, ktktop, ktvarout
+      INTEGER,  DIMENSION(AB2D(ktktop))     , INTENT(in ) ::   ktop         ! top level of the top boundary layer
+      INTEGER,  DIMENSION(A2D(0))           , INTENT(in ) ::   kbot         ! bottom level of the top boundary layer
+      REAL(wp), DIMENSION(A2D(0))           , INTENT(in ) ::   phtbl, pfrac ! fraction of bottom level to be affected by the tbl
+      REAL(wp), DIMENSION(A2D(0),jpk)       , INTENT(in ) ::   pe3          ! vertical scale factor
+      REAL(wp), DIMENSION(AB2D(ktvarin),JPK), INTENT(in ) ::   pvarin       ! tbl property to average between ktop, kbot over phtbl
+      REAL(wp), DIMENSION(AB2D(ktvarout))   , INTENT(out) ::   pvarout      ! tbl property averaged over phtbl between level ktop and kbot
+      !!--------------------------------------------------------------------
+      INTEGER  ::   ji, jj                        ! loop indices
+      INTEGER  ::   ikt, ikb                      ! top and bottom levels
       !!--------------------------------------------------------------------
       !
       ! compute tbl top.bottom level and thickness
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          !
          ! tbl top/bottom indices initialisation
          ikt = ktop(ji,jj) ; ikb = kbot(ji,jj)
@@ -150,9 +156,9 @@ CONTAINS
          !
       END_2D
 
-   END SUBROUTINE isf_tbl_avg
+   END SUBROUTINE isf_tbl_avg_t
 
-   SUBROUTINE isf_tbl_lvl( phw, pe3, ktop, kbot, phtbl, pfrac )
+   SUBROUTINE isf_tbl_lvl( pe3, ktop, phtbl, kbot, pfrac )
       !!--------------------------------------------------------------------
       !!                  ***  ROUTINE isf_tbl_lvl  ***
       !!
@@ -160,96 +166,48 @@ CONTAINS
       !!              - thickness of the top boundary layer
       !!              - fraction of the bottom level affected by the tbl
       !!
-      !!-------------------------- OUT --------------------------------------
-      INTEGER,  DIMENSION(jpi,jpj)    , INTENT(  out) :: kbot   ! bottom level of the top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(  out) :: pfrac  ! fraction of bottom level in the tbl
-      !!-------------------------- IN  --------------------------------------
-      INTEGER,  DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop   ! top level of the top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: phw    ! water column thickness
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pe3    ! vertical scale factor
-      !!-------------------------- INOUT ------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(inout) :: phtbl  ! top boundary layer thickness
+      !!--------------------------------------------------------------------
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(in ) ::   pe3    ! vertical scale factor
+      INTEGER,  DIMENSION(A2D(0))    , INTENT(in ) ::   ktop   ! top level of the top boundary layer
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in ) ::   phtbl  ! top boundary layer thickness
+      INTEGER,  DIMENSION(A2D(0))    , INTENT(out) ::   kbot   ! bottom level of the top boundary layer
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(out) ::   pfrac  ! fraction of bottom level in the tbl
       !!---------------------------------------------------------------------
-      INTEGER :: ji,jj,jk
-      INTEGER :: ikt, ikb
+      INTEGER ::   ji, jj
+      INTEGER ::   ikt, ikb
       !!---------------------------------------------------------------------
       !
-      ! get htbl
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          !
-         ! tbl top/bottom indices initialisation
-         ikt = ktop(ji,jj)
-         !
-         ! limit the tbl to water thickness.
-         phtbl(ji,jj) = MIN( phtbl(ji,jj), phw(ji,jj) )
-         !
-         ! thickness of boundary layer must be at least the top level thickness
-         phtbl(ji,jj) = MAX( phtbl(ji,jj), pe3(ji,jj,ikt) )
+         ikt = ktop(ji,jj)  ! tbl top indices initialisation
          !
-      END_2D
-      !
-      ! get ktbl
-      CALL isf_tbl_kbot(ktop, phtbl, pe3, kbot)
-      !
-      ! get pfrac
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         ! --- get kbot --- !
+         !                  ! determine the deepest level influenced by the boundary layer
+         ikb = ikt+1
+         DO WHILE( SUM( pe3(ji,jj,ikt:ikb-1) ) < phtbl(ji,jj ) ) ;  ikb = ikb + 1 ;  END DO
+         kbot(ji,jj) = ikb - 1
          !
-         ! tbl top/bottom indices initialisation
-         ikt = ktop(ji,jj) ; ikb = kbot(ji,jj)
+         ikb = kbot(ji,jj)   ! tbl bottom indices initialisation
          !
-         ! proportion of the bottom cell included in ice shelf boundary layer 
+         ! --- get pfrac --- !
+         !                   ! proportion of the bottom cell included in ice shelf boundary layer 
          pfrac(ji,jj) = ( phtbl(ji,jj) - SUM( pe3(ji,jj,ikt:ikb-1) ) ) / pe3(ji,jj,ikb)
          !
       END_2D
       !
    END SUBROUTINE isf_tbl_lvl
    !
-   SUBROUTINE isf_tbl_kbot(ktop, phtbl, pe3, kbot)
-      !!--------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_tbl_bot  ***
-      !!
-      !! ** Purpose : compute bottom level of the isf top boundary layer
-      !!
-      !!-------------------------- OUT -------------------------------------
-      INTEGER,  DIMENSION(jpi,jpj)    , INTENT(  out) :: kbot   ! bottom level of the top boundary layer
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: phtbl  ! top boundary layer thickness
-      INTEGER,  DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop   ! top level of the top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pe3    ! vertical scale factor
-      !!--------------------------------------------------------------------
-      INTEGER :: ji, jj
-      INTEGER :: ikt, ikb
-      !!--------------------------------------------------------------------
-      !
-      ! phtbl need to be bounded by water column thickness before
-      ! test: if htbl = water column thickness, should return mbathy
-      ! test: if htbl = 0 should return ktop (phtbl cap to pe3t(ji,jj,1))
-      !
-      ! get ktbl
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         !
-         ! determine the deepest level influenced by the boundary layer
-         ikt = ktop(ji,jj)
-         ikb = ikt
-         DO WHILE ( SUM(pe3(ji,jj,ikt:ikb-1)) < phtbl(ji,jj ) ) ;  ikb = ikb + 1 ;  END DO
-         kbot(ji,jj) = ikb - 1
-         !
-      END_2D
-      !
-   END SUBROUTINE isf_tbl_kbot
-      !
-   SUBROUTINE isf_tbl_ktop(pdep, ktop)
+   SUBROUTINE isf_tbl_ktop( pdep, ktop )
       !!--------------------------------------------------------------------
       !!                  ***  ROUTINE isf_tbl_top  ***
       !!
       !! ** Purpose : compute top level of the isf top boundary layer in case of an ice shelf parametrisation
       !!
-      !!-------------------------- OUT -------------------------------------
-      INTEGER,  DIMENSION(jpi,jpj), INTENT(  out) :: ktop        ! top level affected by the ice shelf parametrisation
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pdep        ! top depth of the parametrisation influence
       !!--------------------------------------------------------------------
-      INTEGER :: ji,jj
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) :: pdep        ! top depth of the parametrisation influence
+      INTEGER,  DIMENSION(A2D(0)), INTENT(  out) :: ktop        ! top level affected by the ice shelf parametrisation
+      !!--------------------------------------------------------------------
+      INTEGER :: ji, jj
       INTEGER :: ikt
       !!--------------------------------------------------------------------
       !
@@ -260,14 +218,15 @@ CONTAINS
       ! test: this routine run on isfdraft should return mikt
       ! test: this routine run with pdep = 0 should return 1
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ! comput ktop
          ikt = 2
-         DO WHILE ( gdepw_0(ji,jj,ikt) <= pdep(ji,jj ) ) ;  ikt = ikt + 1 ;  END DO
+         DO WHILE ( gdepw_0(ji,jj,ikt) <= pdep(ji,jj) ) ;  ikt = ikt + 1 ;  END DO
          ktop(ji,jj) = ikt - 1
          !
          ! update pdep
-         pdep(ji,jj) = gdepw_0(ji,jj,ktop(ji,jj))
+         ikt=ktop(ji,jj)
+         pdep(ji,jj) = gdepw_0(ji,jj,ikt)
       END_2D
       !
    END SUBROUTINE isf_tbl_ktop
diff --git a/src/OCE/ISF/isfutils.F90 b/src/OCE/ISF/isfutils.F90
index 63c489c5..af103b46 100644
--- a/src/OCE/ISF/isfutils.F90
+++ b/src/OCE/ISF/isfutils.F90
@@ -13,9 +13,9 @@ MODULE isfutils
 
    USE iom           , ONLY: iom_open, iom_get, iom_close, jpdom_global      ! read input file
    USE lib_fortran   , ONLY: glob_sum, glob_min, glob_max                    ! compute global value
-   USE par_oce       , ONLY: jpi,jpj,jpk, jpnij, Nis0, Nie0, Njs0, Nje0      ! domain size
+   USE par_oce                                                               ! domain size
    USE dom_oce       , ONLY: narea                                           ! local domain
-   USE in_out_manager, ONLY: i8, wp, lwp, numout                             ! miscelenious
+   USE in_out_manager                                                        ! miscelenious
    USE lib_mpp
 
    IMPLICIT NONE
@@ -28,6 +28,8 @@ MODULE isfutils
 
    PUBLIC read_2dcstdta, debug
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
 CONTAINS
 
    SUBROUTINE read_2dcstdta(cdfile, cdvar, pvar)
@@ -36,17 +38,16 @@ CONTAINS
       !!
       !! ** Purpose : read input file
       !!
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pvar     ! output variable
-      !!-------------------------- IN  -------------------------------------
-      CHARACTER(len=*)            , INTENT(in   ) :: cdfile   ! input file name
-      CHARACTER(len=*)            , INTENT(in   ) :: cdvar    ! variable name
+      !!--------------------------------------------------------------------
+      CHARACTER(len=*)           , INTENT(in   ) ::   cdfile   ! input file name
+      CHARACTER(len=*)           , INTENT(in   ) ::   cdvar    ! variable name
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout) ::   pvar     ! output variable
       !!--------------------------------------------------------------------
       INTEGER :: inum
       !!--------------------------------------------------------------------
 
       CALL iom_open( TRIM(cdfile), inum )
-      CALL iom_get( inum, jpdom_global, TRIM(cdvar), pvar)
+      CALL iom_get( inum, jpdom_global, TRIM(cdvar), pvar )
       CALL iom_close(inum)
 
    END SUBROUTINE read_2dcstdta
@@ -57,16 +58,16 @@ CONTAINS
       !!
       !! ** Purpose : add debug print for 2d variables
       !!
-      !!-------------------------- IN  -------------------------------------
-      CHARACTER(LEN=*)            , INTENT(in   ) :: cdtxt
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pvar
       !!--------------------------------------------------------------------
-      REAL(wp)    :: zmin, zmax, zsum
-      INTEGER(i8) :: imodd, ip
-      INTEGER     :: imods
-      INTEGER     :: isums, idums
-      INTEGER     :: ji,jj,jk
-      INTEGER, DIMENSION(jpnij) :: itmps
+      CHARACTER(LEN=*)           , INTENT(in) ::   cdtxt
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pvar
+      !!--------------------------------------------------------------------
+      REAL(wp)    ::   zmin, zmax, zsum
+      INTEGER(i8) ::   imodd, ip
+      INTEGER     ::   imods
+      INTEGER     ::   isums, idums
+      INTEGER     ::   ji, jj, jk
+      INTEGER, DIMENSION(jpnij) ::   itmps
       !!--------------------------------------------------------------------
       !
       ! global min/max/sum to check data range and NaN
@@ -110,16 +111,16 @@ CONTAINS
       !!
       !! ** Purpose : add debug print for 3d variables
       !!
-      !!-------------------------- IN  -------------------------------------
-      CHARACTER(LEN=*)                , INTENT(in   ) :: cdtxt
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvar
       !!--------------------------------------------------------------------
-      REAL(wp)    :: zmin, zmax, zsum
-      INTEGER(i8) :: imodd, ip
-      INTEGER     :: imods
-      INTEGER     :: isums, idums
-      INTEGER     :: ji,jj,jk
-      INTEGER, DIMENSION(jpnij) :: itmps
+      CHARACTER(LEN=*)               , INTENT(in) ::   cdtxt
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(in) ::   pvar
+      !!--------------------------------------------------------------------
+      REAL(wp)    ::   zmin, zmax, zsum
+      INTEGER(i8) ::   imodd, ip
+      INTEGER     ::   imods
+      INTEGER     ::   isums, idums
+      INTEGER     ::   ji, jj, jk
+      INTEGER, DIMENSION(jpnij) ::   itmps
       !!--------------------------------------------------------------------
       !
       ! global min/max/sum to check data range and NaN
diff --git a/src/OCE/LBC/lbc_lnk_call_generic.h90 b/src/OCE/LBC/lbc_lnk_call_generic.h90
index 0d2e2514..b48047de 100644
--- a/src/OCE/LBC/lbc_lnk_call_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_call_generic.h90
@@ -26,8 +26,10 @@
       &                   , pt17, cdna17, psgn17, pt18, cdna18, psgn18, pt19, cdna19, psgn19, pt20, cdna20, psgn20  &
       &                   , pt21, cdna21, psgn21, pt22, cdna22, psgn22, pt23, cdna23, psgn23, pt24, cdna24, psgn24  &
       &                   , pt25, cdna25, psgn25, pt26, cdna26, psgn26, pt27, cdna27, psgn27, pt28, cdna28, psgn28  &
-      &                   , pt29, cdna29, psgn29, pt30, cdna30, psgn30                                              &
-      &                   , kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+      &                   , pt29, cdna29, psgn29, pt30, cdna30, psgn30, pt31, cdna31, psgn31, pt32, cdna32, psgn32  &
+      &                   , pt33, cdna33, psgn33, pt34, cdna34, psgn34, pt35, cdna35, psgn35, pt36, cdna36, psgn36  &
+      &                   , pt37, cdna37, psgn37, pt38, cdna38, psgn38, pt39, cdna39, psgn39, pt40, cdna40, psgn40  &
+      &                   , kfillmode, pfillval, lsend, lrecv, ld4only, ldfull )
       !!---------------------------------------------------------------------
       CHARACTER(len=*)     ,                   INTENT(in   ) ::   cdname  ! name of the calling subroutine
       REAL(PRECISION), DIMENSION(DIMS)          , TARGET, CONTIGUOUS, INTENT(inout) ::   pt1        ! arrays on which the lbc is applied
@@ -35,29 +37,32 @@
          &                                                                               pt9 , pt10, pt11, pt12, pt13, pt14, pt15, &
          &                                                                               pt16, pt17, pt18, pt19, pt20, pt21, pt22, &
          &                                                                               pt23, pt24, pt25, pt26, pt27, pt28, pt29, &
-         &                                                                               pt30
+         &                                                                               pt30, pt31, pt32, pt33, pt34, pt35, pt36, &
+         &                                                                               pt37, pt38, pt39, pt40
       CHARACTER(len=1)                       , INTENT(in   ) ::   cdna1   ! nature of pt2D. array grid-points
       CHARACTER(len=1)     , OPTIONAL        , INTENT(in   ) ::   cdna2 , cdna3 , cdna4 , cdna5 , cdna6 , cdna7 , cdna8 , &
          &                                                        cdna9 , cdna10, cdna11, cdna12, cdna13, cdna14, cdna15, &
          &                                                        cdna16, cdna17, cdna18, cdna19, cdna20, cdna21, cdna22, &
          &                                                        cdna23, cdna24, cdna25, cdna26, cdna27, cdna28, cdna29, &
-         &                                                        cdna30
+         &                                                        cdna30, cdna31, cdna32, cdna33, cdna34, cdna35, cdna36, &
+         &                                                        cdna37, cdna38, cdna39, cdna40 
       REAL(PRECISION)                        , INTENT(in   ) ::   psgn1   ! sign used across the north fold
       REAL(PRECISION)      , OPTIONAL        , INTENT(in   ) ::   psgn2 , psgn3 , psgn4 , psgn5 , psgn6 , psgn7 , psgn8 , &
          &                                                        psgn9 , psgn10, psgn11, psgn12, psgn13, psgn14, psgn15, &
          &                                                        psgn16, psgn17, psgn18, psgn19, psgn20, psgn21, psgn22, &
          &                                                        psgn23, psgn24, psgn25, psgn26, psgn27, psgn28, psgn29, &
-         &                                                        psgn30
+         &                                                        psgn30, psgn31, psgn32, psgn33, psgn34, psgn35, psgn36, &
+         &                                                        psgn37, psgn38, psgn39, psgn40 
       INTEGER              , OPTIONAL        , INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION)      , OPTIONAL        , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER              , OPTIONAL        , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8), OPTIONAL        , INTENT(in   ) ::   lsend, lrecv   ! indicate how communications are to be carried out
       LOGICAL              , OPTIONAL        , INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
+      LOGICAL              , OPTIONAL        , INTENT(in   ) ::   ldfull      ! .true. if we also update the last line of the inner domain
       !!
       INTEGER                          ::   kfld        ! number of elements that will be attributed
-      TYPE(PTR_4d_/**/PRECISION), DIMENSION(30) ::   ptab_ptr    ! pointer array
-      CHARACTER(len=1) , DIMENSION(30) ::   cdna_ptr    ! nature of ptab_ptr grid-points
-      REAL(PRECISION)  , DIMENSION(30) ::   psgn_ptr    ! sign used across the north fold boundary
+      TYPE(PTR_4d_/**/PRECISION), DIMENSION(40) ::   ptab_ptr    ! pointer array
+      CHARACTER(len=1) , DIMENSION(40) ::   cdna_ptr    ! nature of ptab_ptr grid-points
+      REAL(PRECISION)  , DIMENSION(40) ::   psgn_ptr    ! sign used across the north fold boundary
       !!---------------------------------------------------------------------
       !
       kfld = 0          ! initial array of pointer size
@@ -95,16 +100,22 @@
       IF( PRESENT(psgn28) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt28, cdna28, psgn28, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
       IF( PRESENT(psgn29) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt29, cdna29, psgn29, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
       IF( PRESENT(psgn30) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt30, cdna30, psgn30, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn31) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt31, cdna31, psgn31, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn32) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt32, cdna32, psgn32, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn33) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt33, cdna33, psgn33, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn34) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt34, cdna34, psgn34, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn35) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt35, cdna35, psgn35, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn36) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt36, cdna36, psgn36, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn37) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt37, cdna37, psgn37, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn38) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt38, cdna38, psgn38, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn39) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt39, cdna39, psgn39, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
+      IF( PRESENT(psgn40) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt40, cdna40, psgn40, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
       !
-#if ! defined key_mpi2     
       IF( nn_comm == 1 ) THEN 
-         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull )
       ELSE
-         CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+         CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull )
       ENDIF
-#else
-      CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
-#endif
       !
    END SUBROUTINE lbc_lnk_call_/**/XD/**/_/**/PRECISION
 
diff --git a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
index 3ce416fe..1ab6c1b1 100644
--- a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
@@ -1,5 +1,5 @@
 
-   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -7,265 +7,362 @@
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc
       LOGICAL,              OPTIONAL, INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
+      LOGICAL             , OPTIONAL, INTENT(in   ) ::   ldfull      ! .true. if we also update the last line of the inner domain
       !
-      INTEGER  ::    ji,  jj,  jk , jl,  jf, jn      ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipk, ipl, ipf          ! dimension of the input array
+      INTEGER  ::   ji,  jj,  jk , jl,  jf, jn      ! dummy loop indices
       INTEGER  ::   ip0i, ip1i, im0i, im1i
       INTEGER  ::   ip0j, ip1j, im0j, im1j
-      INTEGER  ::   ishti, ishtj, ishti2, ishtj2
-      INTEGER  ::   iszS, iszR
+      INTEGER  ::   ishti, ishtj, ishti1, ishtj1, ishti2, ishtj2
+      INTEGER  ::                 isgni1, isgni2, isgnj1, isgnj2
+      INTEGER  ::                    ii1,    ii2,    ij1,    ij2
+      INTEGER  ::   inbS, inbR, iszS, iszR
       INTEGER  ::   ierr
-      INTEGER  ::   ihls, idx
+      INTEGER  ::   ihls, ihlsmax, idx
       INTEGER  ::   impi_nc
       INTEGER  ::   ifill_nfd
       INTEGER, DIMENSION(4)  ::   iwewe, issnn
-      INTEGER, DIMENSION(8)  ::   isizei, ishtSi, ishtRi, ishtPi
-      INTEGER, DIMENSION(8)  ::   isizej, ishtSj, ishtRj, ishtPj
-      INTEGER, DIMENSION(8)  ::   ifill, iszall
-      INTEGER, DIMENSION(8)  ::   jnf
+      INTEGER, DIMENSION(  kfld)  ::   ipi, ipj, ipk, ipl   ! dimension of the input array
+      INTEGER, DIMENSION(8,kfld)  ::   ifill
+      INTEGER, DIMENSION(8,kfld)  ::   isizei, ishtSi, ishtRi, ishtPi
+      INTEGER, DIMENSION(8,kfld)  ::   isizej, ishtSj, ishtRj, ishtPj
+      INTEGER, DIMENSION(8)       ::   jnf
       INTEGER, DIMENSION(:), ALLOCATABLE  ::   iScnt, iRcnt    ! number of elements to be sent/received
       INTEGER, DIMENSION(:), ALLOCATABLE  ::   iSdpl, iRdpl    ! displacement in halos arrays
-      LOGICAL, DIMENSION(8)  ::   llsend, llrecv
-      REAL(PRECISION) ::   zland
+      LOGICAL, DIMENSION(8,kfld)  ::   llsend, llrecv
       LOGICAL  ::   ll4only                                    ! default: 8 neighbourgs
+      REAL(PRECISION) ::   zland
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------------- !
       !     1. local variables initialization     !
       ! ----------------------------------------- !
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
-      !
-      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. )
-      !
       ! take care of optional parameters
       !
-      ihls = nn_hls       ! default definition
-      IF( PRESENT( khls ) )   ihls = khls
-      IF( ihls > n_hlsmax ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipi /= Ni_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipj /= Nj_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
       ll4only = .FALSE.    ! default definition
       IF( PRESENT(ld4only) )   ll4only = ld4only
       !
-      impi_nc = mpi_nc_com8(ihls)   ! default
-      IF( ll4only )   impi_nc = mpi_nc_com4(ihls)
-      !
       zland = 0._wp                                     ! land filling value: zero by default
       IF( PRESENT( pfillval ) )   zland = pfillval      ! set land value
       !
-      ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
-      IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
-         CALL ctl_stop( 'STOP', 'mpp_nc_generic+lsend and lrecv not yet implemented')
-      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with only one of the two arguments lsend or lrecv'
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ELSE                                              ! default neighbours
-         llsend(:) = mpiSnei(ihls,:) >= 0
-         IF( ll4only )   llsend(5:8) = .FALSE.          ! exclude corners
-         llrecv(:) = mpiRnei(ihls,:) >= 0
-         IF( ll4only )   llrecv(5:8) = .FALSE.          ! exclude corners
-      ENDIF
+      ifill_nfd = jpfillcst                             ! default definition
+      IF( PRESENT(kfillmode) )   ifill_nfd = kfillmode
       !
-      ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
-      ! default definition
-      DO jn = 1, 8
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn) = jpfillperio  ! with self-periodicity
-         ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn) = kfillmode    ! localy defined
-         ELSE                                ;   ifill(jn) = jpfillcst    ! constant value (zland)
-         ENDIF
-      END DO
-      ! take care of "indirect self-periodicity" for the corners
-      DO jn = 5, 8
-         IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpwe))   ifill(jn) = jpfillnothing   ! no bi-perio but ew-perio: do corners later
-         IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpso))   ifill(jn) = jpfillnothing   ! no bi-perio but ns-perio: do corners later
-      END DO
-      ! north fold treatment
-      IF( l_IdoNFold ) THEN
-         ifill_nfd = ifill(jpno)             ! if we are here, this means llrecv(jpno) = .false. and l_SelfPerio(jpno) = .false.
-         ifill( (/jpno/) ) = jpfillnothing   ! we do north fold -> do nothing for northern halo
-      ENDIF
-      
-      ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
-      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
-      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+      ihlsmax = 0
       !
-      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
-      !                   !                       ________________________
-      ip0i =          0   !          im0j = inner |__|________________|__|
-      ip1i =       ihls   !   im1j = inner - halo |  |__|__________|__|  |
-      im1i = ipi-2*ihls   !                       |  |  |          |  |  |
-      im0i = ipi - ihls   !                       |  |  |          |  |  |
-      ip0j =          0   !                       |  |  |          |  |  |
-      ip1j =       ihls   !                       |  |__|__________|__|  |
-      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__|
-      im0j = ipj - ihls   !              ip0j = 0 |__|________________|__|
-      !                   !                    ip0i ip1i        im1i im0i
+      DO jf = 1, kfld
+         !
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls    = ( ipi(jf) - Ni_0 ) / 2
+         ihlsmax = MAX(ihls, ihlsmax)
+         !
+         IF( numcom == -1 ) THEN   ! test input array shape. Use numcom to do these tests only at the beginning of the run
+            IF( MOD( ipi(jf) - Ni_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong i-size: ', ipi(jf), Ni_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( MOD( ipj(jf) - Nj_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong j-size: ', ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ( ipj(jf) - Nj_0 ) / 2 /= ihls ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array as wong i and j-size: ',   &
+                  &           ipi(jf), Ni_0, ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ihls > n_hlsmax ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but for the ', jf,'th input array, ', ihls, ' > n_hlsmax = ',   &
+                  &           n_hlsmax
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+         ENDIF
+         !
+         ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
+         IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
+            CALL ctl_stop( 'STOP', 'mpp_nc_generic+lsend and lrecv not yet implemented')
+         ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
+            WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with only one of the two arguments lsend or lrecv'
+            CALL ctl_stop( 'STOP', ctmp1 )
+         ELSE                                                  ! default neighbours
+            llsend(:,jf) = mpiSnei(ihls,:) >= 0
+            IF( ll4only )   llsend(5:8,jf) = .FALSE.           ! exclude corners
+            llrecv(:,jf) = mpiRnei(ihls,:) >= 0
+            IF( ll4only )   llrecv(5:8,jf) = .FALSE.           ! exclude corners
+         ENDIF
+         !
+         ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
+         ! default definition
+         DO jn = 1, 8
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn,jf) = jpfillperio     ! with self-periodicity
+            ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn,jf) = kfillmode       ! localy defined
+            ELSEIF(          ihls == 0 ) THEN   ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ELSE                                ;   ifill(jn,jf) = jpfillcst       ! constant value (zland)
+            ENDIF
+         END DO
+         ! take care of "indirect self-periodicity" for the corners
+         DO jn = 5, 8
+            IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpwe)) ifill(jn,jf) = jpfillnothing ! no bi-perio but ew-perio: do corners later
+            IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpso)) ifill(jn,jf) = jpfillnothing ! no bi-perio but ns-perio: do corners later
+         END DO
+         ! north fold treatment
+         IF( l_IdoNFold )   ifill(jpno,jf) = jpfillnothing    ! we do north fold -> do nothing for northern halo
+         
+         ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
+         ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
+         ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+         !
+         ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
+         !                       !                       ________________________
+         ip0i =              0   !          im0j = inner |__|________________|__|
+         ip1i =           ihls   !   im1j = inner - halo |  |__|__________|__|  |
+         im1i = ipi(jf)-2*ihls   !                       |  |  |          |  |  |
+         im0i = ipi(jf) - ihls   !                       |  |  |          |  |  |
+         ip0j =              0   !                       |  |  |          |  |  |
+         ip1j =           ihls   !                       |  |__|__________|__|  |
+         im1j = ipj(jf)-2*ihls   !           ip1j = halo |__|__|__________|__|__|
+         im0j = ipj(jf) - ihls   !              ip0j = 0 |__|________________|__|
+         !                       !                    ip0i ip1i        im1i im0i
+         !
+         iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
+         !        sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
+         isizei(1:4,jf) = (/ ihls, ihls, Ni_0, Ni_0 /)   ;   isizei(5:8,jf) = ihls                 ! i- count
+         isizej(1:4,jf) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8,jf) = ihls                 ! j- count
+         ishtSi(1:4,jf) = (/ ip1i, im1i, ip1i, ip1i /)   ;   ishtSi(5:8,jf) = ishtSi( iwewe,jf )   ! i- shift  send data
+         ishtSj(1:4,jf) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8,jf) = ishtSj( issnn,jf )   ! j- shift  send data
+         ishtRi(1:4,jf) = (/ ip0i, im0i, ip1i, ip1i /)   ;   ishtRi(5:8,jf) = ishtRi( iwewe,jf )   ! i- shift  recv data
+         ishtRj(1:4,jf) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8,jf) = ishtRj( issnn,jf )   ! j- shift  recv data
+         ishtPi(1:4,jf) = (/ im1i, ip1i, ip1i, ip1i /)   ;   ishtPi(5:8,jf) = ishtPi( iwewe,jf )   ! i- shift perio data
+         ishtPj(1:4,jf) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8,jf) = ishtPj( issnn,jf )   ! j- shift perio data
+         !
+      END DO   ! jf
       !
-      iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
-      !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
-      isizei(1:4) = (/ ihls, ihls, Ni_0, Ni_0 /)   ;   isizei(5:8) = ihls              ! i- count
-      isizej(1:4) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8) = ihls              ! j- count
-      ishtSi(1:4) = (/ ip1i, im1i, ip1i, ip1i /)   ;   ishtSi(5:8) = ishtSi( iwewe )   ! i- shift send data
-      ishtSj(1:4) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8) = ishtSj( issnn )   ! j- shift send data
-      ishtRi(1:4) = (/ ip0i, im0i, ip1i, ip1i /)   ;   ishtRi(5:8) = ishtRi( iwewe )   ! i- shift received data location
-      ishtRj(1:4) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8) = ishtRj( issnn )   ! j- shift received data location
-      ishtPi(1:4) = (/ im1i, ip1i, ip1i, ip1i /)   ;   ishtPi(5:8) = ishtPi( iwewe )   ! i- shift data used for periodicity
-      ishtPj(1:4) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8) = ishtPj( issnn )   ! j- shift data used for periodicity
+      IF( narea == 1 .AND. numcom == -1 )   CALL mpp_report( cdname, SUM(ipk(:))/kfld, SUM(ipl(:))/kfld, kfld, ld_lbc = .TRUE. )
       !
       ! -------------------------------- !
       !     2. Prepare MPI exchanges     !
       ! -------------------------------- !
       !
       ! Allocate local temporary arrays to be sent/received.
-      iszS = COUNT( llsend )
-      iszR = COUNT( llrecv )
-      ALLOCATE( iScnt(iszS), iRcnt(iszR), iSdpl(iszS), iRdpl(iszR) )   ! ok if iszS = 0 or iszR = 0
-      iszall(:) = isizei(:) * isizej(:) * ipk * ipl * ipf
-      iScnt(:) = PACK( iszall, mask = llsend )                                       ! ok if mask = .false.
-      iRcnt(:) = PACK( iszall, mask = llrecv )
-      IF( iszS > 0 )   iSdpl(1) = 0
-      DO jn = 2,iszS
+      inbS = COUNT( ANY(llsend,dim=2) )   ! number of snd neighbourgs
+      inbR = COUNT( ANY(llrecv,dim=2) )   ! number of rcv neighbourgs
+      ALLOCATE( iScnt(inbS), iRcnt(inbR), iSdpl(inbS), iRdpl(inbR) )   ! ok if iszS = 0 or iszR = 0
+
+      iScnt(:) = 0   ;   idx = 0
+      DO jn = 1, 8
+         IF( COUNT( llsend(jn,:) ) > 0 ) THEN   ! we send something to neighbourg jn
+            idx = idx + 1
+            DO jf = 1, kfld
+               IF( llsend(jn,jf) ) iScnt(idx) = iScnt(idx) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            END DO
+         ENDIF
+      END DO
+      IF( inbS > 0 )   iSdpl(1) = 0
+      DO jn = 2,inbS
          iSdpl(jn) = iSdpl(jn-1) + iScnt(jn-1)   ! with _alltoallv: in units of sendtype
       END DO
-      IF( iszR > 0 )   iRdpl(1) = 0
-      DO jn = 2,iszR
+
+      iRcnt(:) = 0   ;   idx = 0
+      DO jn = 1, 8
+         IF( COUNT( llrecv(jn,:) ) > 0 ) THEN   ! we get something from neighbourg jn
+            idx = idx + 1
+            DO jf = 1, kfld
+               IF( llrecv(jn,jf) ) iRcnt(idx) = iRcnt(idx) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            END DO
+         ENDIF
+      END DO
+      IF( inbR > 0 )   iRdpl(1) = 0
+      DO jn = 2,inbR
          iRdpl(jn) = iRdpl(jn-1) + iRcnt(jn-1)   ! with _alltoallv: in units of sendtype
       END DO
-      
+      !
       ! Allocate buffer arrays to be sent/received if needed
-      iszS = SUM(iszall, mask = llsend)                             ! send buffer size
+      iszS = SUM(iScnt)                             ! send buffer size
       IF( ALLOCATED(BUFFSND) ) THEN
+         CALL mpi_waitall(8, nreq_p2p, MPI_STATUSES_IGNORE, ierr)   ! needed only if PREVIOUS call was using nn_comm = 1 (for tests)
          IF( SIZE(BUFFSND) < iszS )    DEALLOCATE(BUFFSND)          ! send buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFSND) )   ALLOCATE( BUFFSND(iszS) )
-      iszR = SUM(iszall, mask = llrecv)                             ! recv buffer size
+      iszR = SUM(iRcnt)                             ! recv buffer size
       IF( ALLOCATED(BUFFRCV) ) THEN
          IF( SIZE(BUFFRCV) < iszR )    DEALLOCATE(BUFFRCV)          ! recv buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFRCV) )   ALLOCATE( BUFFRCV(iszR) )
-
+      !
       ! fill sending buffer with ptab(jf)%pt4d
-      idx = 1
+      idx = 0
       DO jn = 1, 8
-         IF( llsend(jn) ) THEN
-            ishti = ishtSi(jn)
-            ishtj = ishtSj(jn)
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               BUFFSND(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
-               idx = idx + 1
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         ENDIF
+         DO jf = 1, kfld
+            IF( llsend(jn,jf) ) THEN
+               ishti = ishtSi(jn,jf)
+               ishtj = ishtSj(jn,jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  idx = idx + 1
+                  BUFFSND(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            ENDIF
+         END DO
       END DO
       !
       ! ------------------------------------------------ !
       !     3. Do all MPI exchanges in 1 unique call     !
       ! ------------------------------------------------ !
       !
-      IF( ln_timing ) CALL tic_tac(.TRUE.)
-      CALL mpi_neighbor_alltoallv (BUFFSND, iScnt, iSdpl, MPI_TYPE, BUFFRCV, iRcnt, iRdpl, MPI_TYPE, impi_nc, ierr)
-      IF( ln_timing ) CALL tic_tac(.FALSE.)
+      IF( ihlsmax > 0 ) THEN
+         impi_nc = mpi_nc_com8( ihlsmax )
+         IF( ll4only )   impi_nc = mpi_nc_com4( ihlsmax )
+#if ! defined key_mpi2
+         IF( ln_timing ) CALL tic_tac( .TRUE.)
+         CALL mpi_Ineighbor_alltoallv(BUFFSND, iScnt, iSdpl, MPI_TYPE, BUFFRCV, iRcnt, iRdpl, MPI_TYPE, impi_nc, nreq_nei, ierr)
+         IF( ln_timing ) CALL tic_tac(.FALSE.)
+#endif
+      ENDIF
+      nreq_p2p = MPI_REQUEST_NULL   ! needed only if we switch between nn_comm = 1 and 2 (for tests)
       !
-      ! ------------------------- !
-      !     4. Fill all halos     !
-      ! ------------------------- !
+      ! --------------------------------- !
+      !     4. Fill all Non-MPI halos     !
+      ! --------------------------------- !
       !
-      idx = 1
-      ! MPI3 bug fix when domain decomposition has 2 columns/rows
-      IF (jpni .eq. 2) THEN
-         IF (jpnj .eq. 2) THEN
+      ! do it first to give (potentially) more time for the communications
+      DO jn = 1, 8
+         DO jf = 1, kfld
+            !
+            IF(     ifill(jn,jf) == jpfillcst ) THEN
+               !
+               ishti = ishtRi(jn,jf)
+               ishtj = ishtRj(jn,jf)
+               DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
+               END DO   ;   END DO   ;   END DO   ;   END DO
+               !
+            ELSEIF( ifill(jn,jf) == jpfillperio .OR. ifill(jn,jf) == jpfillcopy ) THEN
+               !
+               IF(     jn == jpwe .OR. jn == jpsw .OR. jn == jpnw ) THEN   ! western side
+                                                               ishti1 = ishtSi(jpwe,jf) + 1   ;   isgni1 = -1
+                  IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishti2 = ishtRi(jpea,jf) + 1   ;   isgni2 = -1
+                  ELSE                                     ;   ishti2 = ishtSi(jpwe,jf)       ;   isgni2 =  1
+                  ENDIF
+               ELSEIF( jn == jpea .OR. jn == jpse .OR. jn == jpne ) THEN   ! eastern side
+                                                               ishti1 = ishtRi(jpea,jf)       ;   isgni1 =  1
+                  IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishti2 = ishtSi(jpwe,jf)       ;   isgni2 =  1
+                  ELSE                                     ;   ishti2 = ishtRi(jpea,jf) + 1   ;   isgni2 = -1
+                  ENDIF
+               ELSE                                                        ! southern/northern side
+                                                               ishti1 = ishtRi(jn,jf)   ;   isgni1 =  1
+                                                               ishti2 = ishtSi(jn,jf)   ;   isgni2 =  1
+               ENDIF
+               IF(     jn == jpso .OR. jn == jpsw .OR. jn == jpse ) THEN   ! southern side
+                                                               ishtj1 = ishtSj(jpso,jf) + 1   ;   isgnj1 = -1
+                  IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishtj2 = ishtRj(jpno,jf) + 1   ;   isgnj2 = -1
+                  ELSE                                     ;   ishtj2 = ishtSj(jpso,jf)       ;   isgnj2 =  1
+                  ENDIF
+               ELSEIF( jn == jpno .OR. jn == jpnw .OR. jn == jpne ) THEN   ! northern side
+                                                               ishtj1 = ishtRj(jpno,jf)       ;   isgnj1 =  1
+                  IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishtj2 = ishtSj(jpso,jf)       ;   isgnj2 =  1
+                  ELSE                                     ;   ishtj2 = ishtRj(jpno,jf) + 1   ;   isgnj2 = -1
+                  ENDIF
+               ELSE                                                        ! western/eastern side
+                                                               ishtj1 = ishtRj(jn,jf)   ;   isgnj1 =  1
+                                                               ishtj2 = ishtSj(jn,jf)   ;   isgnj2 =  1  
+               ENDIF
+               !
+               DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+                  ii1 = ishti1 +       ji                * isgni1
+                  ij1 = ishtj1 +       jj                * isgnj1
+                  ii2 = ishti2 + ( MOD(ji-1, Ni_0) + 1 ) * isgni2   ! warning: Ni_0 my be smaller than isizei(jn,jf)
+                  ij2 = ishtj2 + ( MOD(jj-1, Nj_0) + 1 ) * isgnj2   ! warning: Nj_0 my be smaller than isizej(jn,jf)
+                  ptab(jf)%pt4d(ii1,ij1,jk,jl) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+               !
+!!$      ELSEIF( ifill(jn,jf) == jpfillnothing ) THEN   ! no filling 
+!!$      ELSEIF( ifill(jn,jf) == jpfillmpi     ) THEN   ! do it later
+            ENDIF
+         END DO   ! jf
+      END DO   ! jn
+      !
+      ! ----------------------------- !
+      !     5. Fill all MPI halos     !
+      ! ----------------------------- !
+      !
+      CALL mpi_wait( nreq_nei, MPI_STATUS_IGNORE, ierr )
+      !
+      ! --------------------------------------------------------- !
+      ! MPI3 bug fix when domain decomposition has 2 columns/rows !
+      ! --------------------------------------------------------- !
+      !
+      IF( jpni == 2 ) THEN
+         IF( jpnj == 2 ) THEN
             jnf(1:8) = (/ 2, 1, 4, 3, 8, 7, 6, 5 /)
          ELSE
             jnf(1:8) = (/ 2, 1, 3, 4, 6, 5, 8, 7 /)
          ENDIF
       ELSE
-         IF (jpnj .eq. 2) THEN
+         IF( jpnj == 2 ) THEN
             jnf(1:8) = (/ 1, 2, 4, 3, 7, 8, 5, 6 /)
          ELSE
             jnf(1:8) = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)
          ENDIF
       ENDIF
-
+      !
+      idx = 0
       DO jn = 1, 8
-         ishti = ishtRi(jnf(jn))
-         ishtj = ishtRj(jnf(jn))
-         SELECT CASE ( ifill(jnf(jn)) )
-         CASE ( jpfillnothing )               ! no filling 
-         CASE ( jpfillmpi   )                 ! fill with data received by MPI
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idx)
-               idx = idx + 1
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillperio )                 ! use periodicity
-            ishti2 = ishtPi(jnf(jn))
-            ishtj2 = ishtPj(jnf(jn))
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillcopy  )                 ! filling with inner domain values
-            ishti2 = ishtSi(jnf(jn))
-            ishtj2 = ishtSj(jnf(jn))
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillcst   )                 ! filling with constant value
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         END SELECT
+         DO jf = 1, kfld
+            IF( ifill(jnf(jn),jf) == jpfillmpi ) THEN   ! fill with data received by MPI
+               ishti = ishtRi(jnf(jn),jf)
+               ishtj = ishtRj(jnf(jn),jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jnf(jn),jf)   ;  DO ji = 1,isizei(jnf(jn),jf)
+                  idx = idx + 1
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idx)
+               END DO;   END DO   ;   END DO   ;   END DO
+            ENDIF
+         END DO
       END DO
 
       DEALLOCATE( iScnt, iRcnt, iSdpl, iRdpl )
       IF( iszS > jpi*jpj )   DEALLOCATE(BUFFSND)                    ! blocking Send -> can directly deallocate
       IF( iszR > jpi*jpj )   DEALLOCATE(BUFFRCV)                    ! blocking Recv -> can directly deallocate
-
-      ! potential "indirect self-periodicity" for the corners
+      !
+      ! ---------------------------------------------------------------- !
+      !     6. Potential "indirect self-periodicity" for the corners     !
+      ! ---------------------------------------------------------------- !
+      !
       DO jn = 5, 8
          IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpwe)  ) THEN   ! no bi-perio but ew-perio: corners indirect definition
-            ishti  = ishtRi(jn)
-            ishtj  = ishtRj(jn)
-            ishti2 = ishtPi(jn)   ! use i- shift periodicity
-            ishtj2 = ishtRj(jn)   ! use j- shift recv location: use ew-perio -> ok as filling of the south and north halos now done
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+            DO jf = 1, kfld
+               ishti  = ishtRi(jn,jf)
+               ishtj  = ishtRj(jn,jf)
+               ishti2 = ishtPi(jn,jf)   ! use i- shift periodicity
+               ishtj2 = ishtRj(jn,jf)   ! use j- shift recv location: use ew-perio -> ok as filling of the so and no halos now done
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            END DO
          ENDIF
          IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpso)  ) THEN   ! no bi-perio but ns-perio: corners indirect definition
-            ishti  = ishtRi(jn)
-            ishtj  = ishtRj(jn)
-            ishti2 = ishtRi(jn)   ! use i- shift recv location: use ns-perio -> ok as filling of the west and east halos now done
-            ishtj2 = ishtPj(jn)   ! use j- shift periodicity
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+            DO jf = 1, kfld
+               ishti  = ishtRi(jn,jf)
+               ishtj  = ishtRj(jn,jf)
+               ishti2 = ishtRi(jn,jf)   ! use i- shift recv location: use ns-perio -> ok as filling of the we and ea halos now done
+               ishtj2 = ishtPj(jn,jf)   ! use j- shift periodicity
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            END DO
          ENDIF
       END DO
       !
       ! ------------------------------- !
-      !     5. north fold treatment     !
+      !     7. north fold treatment     !
       ! ------------------------------- !
       !
       IF( l_IdoNFold ) THEN
-         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold
-         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold
+         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , kfld         )   ! self NFold
+         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld, ldfull )   ! mpi  NFold
          ENDIF
       ENDIF
       !
diff --git a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
index 395a3e93..118aa5c5 100644
--- a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
@@ -1,6 +1,6 @@
   
-#if ! defined BLOCK_ISEND && ! defined BLOCK_FILL
-   SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+#if ! defined BLOCK_ISEND && ! defined BLOCK_FILL_nonMPI && ! defined BLOCK_FILL_MPI_RECV
+   SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -8,161 +8,186 @@
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc
       LOGICAL,              OPTIONAL, INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
+      LOGICAL             , OPTIONAL, INTENT(in   ) ::   ldfull      ! .true. if we also update the last line of the inner domain
       !
       INTEGER  ::     ji,   jj,  jk,  jl,  jf, jn     ! dummy loop indices
-      INTEGER  ::    ipi,  ipj, ipk, ipl, ipf         ! dimension of the input array
       INTEGER  ::   ip0i, ip1i, im0i, im1i
       INTEGER  ::   ip0j, ip1j, im0j, im1j
-      INTEGER  ::   ishti, ishtj, ishti2, ishtj2
+      INTEGER  ::   ishti, ishtj, ishti1, ishtj1, ishti2, ishtj2
+      INTEGER  ::                 isgni1, isgni2, isgnj1, isgnj2
+      INTEGER  ::                    ii1,    ii2,    ij1,    ij2
       INTEGER  ::   ifill_nfd, icomm, ierr
-      INTEGER  ::   ihls, idxs, idxr, iszS, iszR
+      INTEGER  ::   ihls, iisz
+      INTEGER  ::   idxs, idxr, iszS, iszR
       INTEGER, DIMENSION(4)  ::   iwewe, issnn
-      INTEGER, DIMENSION(8)  ::   isizei, ishtSi, ishtRi, ishtPi
-      INTEGER, DIMENSION(8)  ::   isizej, ishtSj, ishtRj, ishtPj
-      INTEGER, DIMENSION(8)  ::   ifill, iszall, ishtS, ishtR
-      INTEGER, DIMENSION(8)  ::   ireq             ! mpi_request id
+      INTEGER, DIMENSION(8)  ::   ibufszS, ibufszR, ishtS, ishtR
       INTEGER, DIMENSION(8)  ::   iStag, iRtag     ! Send and Recv mpi_tag id
-      REAL(PRECISION) ::   zland
-      LOGICAL, DIMENSION(8)  ::   llsend, llrecv
+      INTEGER, DIMENSION(  kfld)  ::   ipi, ipj, ipk, ipl   ! dimension of the input array
+      INTEGER, DIMENSION(8,kfld)  ::   ifill
+      INTEGER, DIMENSION(8,kfld)  ::   isizei, ishtSi, ishtRi
+      INTEGER, DIMENSION(8,kfld)  ::   isizej, ishtSj, ishtRj
+      LOGICAL, DIMENSION(8,kfld)  ::   llsend, llrecv
       LOGICAL  ::   ll4only                                        ! default: 8 neighbourgs
+      REAL(PRECISION) ::   zland
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------------- !
       !     1. local variables initialization     !
       ! ----------------------------------------- !
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
-      !
-      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. )
-      !
       idxs = 1   ! initalize index for send buffer
       idxr = 1   ! initalize index for recv buffer
       icomm = mpi_comm_oce        ! shorter name
       !
       ! take care of optional parameters
       !
-      ihls = nn_hls   ! default definition
-      IF( PRESENT( khls ) )   ihls = khls
-      IF( ihls > n_hlsmax ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipi /= Ni_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipj /= Nj_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
-      ll4only = .FALSE.    ! default definition
-      IF( PRESENT(ld4only) )   ll4only = ld4only
+      ll4only = .FALSE.                                 ! default definition
+      IF( PRESENT( ld4only ) )   ll4only = ld4only
       !
       zland = 0._wp                                     ! land filling value: zero by default
-      IF( PRESENT( pfillval ) )   zland = pfillval      ! set land value
+      IF( PRESENT( pfillval) )   zland = pfillval       ! set land value
       !
-      ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
-      IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
-         llsend(:) = lsend(:)   ;   llrecv(:) = lrecv(:)
-      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with only one of the two arguments lsend or lrecv'
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ELSE                                              ! default neighbours
-         llsend(:) = mpiSnei(ihls,:) >= 0
-         IF( ll4only )   llsend(5:8) = .FALSE.          ! exclude corners
-         llrecv(:) = mpiRnei(ihls,:) >= 0
-         IF( ll4only )   llrecv(5:8) = .FALSE.          ! exclude corners
-      ENDIF
+      ifill_nfd = jpfillcst                             ! default definition
+      IF( PRESENT(kfillmode) )   ifill_nfd = kfillmode
       !
-      ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
-      ! default definition
-      DO jn = 1, 4
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn) = jpfillperio  ! with self-periodicity
-         ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn) = kfillmode    ! localy defined
-         ELSE                                ;   ifill(jn) = jpfillcst    ! constant value (zland)
+      DO jf = 1, kfld
+         !
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls = ( ipi(jf) - Ni_0 ) / 2
+         !
+         IF( numcom == -1 ) THEN   ! test input array shape. Use numcom to do these tests only at the beginning of the run
+            IF( MOD( ipi(jf) - Ni_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong i-size: ', ipi(jf), Ni_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( MOD( ipj(jf) - Nj_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong j-size: ', ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ( ipj(jf) - Nj_0 ) / 2 /= ihls ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array as wong i and j-size: ',   &
+                  &           ipi(jf), Ni_0, ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ihls > n_hlsmax ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but for the ', jf,'th input array, ', ihls, ' > n_hlsmax = ',   &
+                  &           n_hlsmax
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
          ENDIF
-      END DO
-      DO jn = 5, 8
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSE                                ;   ifill(jn) = jpfillnothing! do nothing
+         !
+         ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
+         IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
+            llsend(:,jf) = lsend(:)   ;   llrecv(:,jf) = lrecv(:)
+         ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
+            WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with only one of the two arguments lsend or lrecv'
+            CALL ctl_stop( 'STOP', ctmp1 )
+         ELSE                                              ! default neighbours
+            llsend(:,jf) = mpiSnei(ihls,:) >= 0
+            IF( ll4only )   llsend(5:8,jf) = .FALSE.       ! exclude corners
+            llrecv(:,jf) = mpiRnei(ihls,:) >= 0
+            IF( ll4only )   llrecv(5:8,jf) = .FALSE.       ! exclude corners
          ENDIF
-      END DO
          !
-      ! north fold treatment
-      IF( l_IdoNFold ) THEN
-         ifill_nfd = ifill(jpno)             ! if we are here, this means llrecv(jpno) = .false. and l_SelfPerio(jpno) = .false.
-         ifill( (/jpno/) ) = jpfillnothing   ! we do north fold -> do nothing for northern halo
-      ENDIF
-      
-      ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
-      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
-      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
-      !
-      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
-      !                   !                       ________________________
-      ip0i =          0   !          im0j = inner |__|__|__________|__|__|
-      ip1i =       ihls   !   im1j = inner - halo |__|__|__________|__|__|
-      im1i = ipi-2*ihls   !                       |  |  |          |  |  |
-      im0i = ipi - ihls   !                       |  |  |          |  |  |
-      ip0j =          0   !                       |  |  |          |  |  |
-      ip1j =       ihls   !                       |__|__|__________|__|__|
-      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__|
-      im0j = ipj - ihls   !              ip0j = 0 |__|__|__________|__|__|
-      !                   !                    ip0i ip1i        im1i im0i
+         ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
+         ! default definition
+         DO jn = 1, 4   ! 4 sides
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn,jf) = jpfillperio     ! with self-periodicity
+            ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn,jf) = kfillmode       ! localy defined
+            ELSEIF(          ihls == 0 ) THEN   ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ELSE                                ;   ifill(jn,jf) = jpfillcst       ! constant value (zland)
+            ENDIF
+         END DO
+         DO jn = 5, 8   ! 4 corners
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSE                                ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ENDIF
+         END DO
+         !
+         ! north fold treatment
+         IF( l_IdoNFold )   ifill(jpno,jf) = jpfillnothing    ! we do north fold -> do nothing for northern halo
+         
+         ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
+         ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
+         ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+         !
+         ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
+         !
+         !                       !                       ________________________
+         ip0i =             0    !          im0j = inner |__|__|__________|__|__|
+         ip1i =           ihls   !   im1j = inner - halo |__|__|__________|__|__|
+         im1i = ipi(jf)-2*ihls   !                       |  |  |          |  |  |
+         im0i = ipi(jf) - ihls   !                       |  |  |          |  |  |
+         ip0j =             0    !                       |  |  |          |  |  |
+         ip1j =           ihls   !                       |__|__|__________|__|__|
+         im1j = ipj(jf)-2*ihls   !           ip1j = halo |__|__|__________|__|__|
+         im0j = ipj(jf) - ihls   !              ip0j = 0 |__|__|__________|__|__|
+         !                       !                    ip0i ip1i        im1i im0i
+         !
+         ! define shorter names...
+         iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
+         iisz = ipi(jf)
+         !        sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
+         isizei(1:4,jf) = (/ ihls, ihls, iisz, iisz /)   ;   isizei(5:8,jf) = ihls                 ! i- count
+         isizej(1:4,jf) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8,jf) = ihls                 ! j- count
+         ishtSi(1:4,jf) = (/ ip1i, im1i, ip0i, ip0i /)   ;   ishtSi(5:8,jf) = ishtSi( iwewe,jf )   ! i- shift  send data
+         ishtSj(1:4,jf) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8,jf) = ishtSj( issnn,jf )   ! j- shift  send data
+         ishtRi(1:4,jf) = (/ ip0i, im0i, ip0i, ip0i /)   ;   ishtRi(5:8,jf) = ishtRi( iwewe,jf )   ! i- shift  recv data
+         ishtRj(1:4,jf) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8,jf) = ishtRj( issnn,jf )   ! j- shift  recv data
+         !
+      END DO   ! jf
       !
-      iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
-      !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
-      isizei(1:4) = (/ ihls, ihls,  ipi,  ipi /)   ;   isizei(5:8) = ihls              ! i- count
-      isizej(1:4) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8) = ihls              ! j- count
-      ishtSi(1:4) = (/ ip1i, im1i, ip0i, ip0i /)   ;   ishtSi(5:8) = ishtSi( iwewe )   ! i- shift send data
-      ishtSj(1:4) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8) = ishtSj( issnn )   ! j- shift send data
-      ishtRi(1:4) = (/ ip0i, im0i, ip0i, ip0i /)   ;   ishtRi(5:8) = ishtRi( iwewe )   ! i- shift received data location
-      ishtRj(1:4) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8) = ishtRj( issnn )   ! j- shift received data location
-      ishtPi(1:4) = (/ im1i, ip1i, ip0i, ip0i /)   ;   ishtPi(5:8) = ishtPi( iwewe )   ! i- shift data used for periodicity
-      ishtPj(1:4) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8) = ishtPj( issnn )   ! j- shift data used for periodicity
+      IF( narea == 1 .AND. numcom == -1 )   CALL mpp_report( cdname, SUM(ipk(:))/kfld, SUM(ipl(:))/kfld, kfld, ld_lbc = .TRUE. )
       !
       ! -------------------------------- !
       !     2. Prepare MPI exchanges     !
       ! -------------------------------- !
       !
-      iStag = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)   ! any value but each one must be different
+      iStag = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)   ! can be any value but each value must be unique
       ! define iRtag with the corresponding iStag, e.g. data received at west where sent at east.
       iRtag(jpwe) = iStag(jpea)   ;   iRtag(jpea) = iStag(jpwe)   ;   iRtag(jpso) = iStag(jpno)   ;   iRtag(jpno) = iStag(jpso)
       iRtag(jpsw) = iStag(jpne)   ;   iRtag(jpse) = iStag(jpnw)   ;   iRtag(jpnw) = iStag(jpse)   ;   iRtag(jpne) = iStag(jpsw)
       !
-      iszall(:) = isizei(:) * isizej(:) * ipk * ipl * ipf
+      ! size of the buffer to be sent/recv in each direction
+      ibufszS(:) = 0   ! defaut definition
+      ibufszR(:) = 0
+      DO jf = 1, kfld
+         DO jn = 1, 8
+            IF( llsend(jn,jf) )   ibufszS(jn) = ibufszS(jn) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            IF( llrecv(jn,jf) )   ibufszR(jn) = ibufszR(jn) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+         END DO
+      END DO
+      !
+      ! offset to apply to find the position of the sent/recv data within the buffer
       ishtS(1) = 0
       DO jn = 2, 8
-         ishtS(jn) = ishtS(jn-1) + iszall(jn-1) * COUNT( (/llsend(jn-1)/) )
+         ishtS(jn) = ishtS(jn-1) + ibufszS(jn-1)
       END DO
       ishtR(1) = 0
       DO jn = 2, 8
-         ishtR(jn) = ishtR(jn-1) + iszall(jn-1) * COUNT( (/llrecv(jn-1)/) )
+         ishtR(jn) = ishtR(jn-1) + ibufszR(jn-1)
       END DO
-
+      !
       ! Allocate buffer arrays to be sent/received if needed
-      iszS = SUM(iszall, mask = llsend)                             ! send buffer size
+      iszS = SUM(ibufszS)                                           ! send buffer size
       IF( ALLOCATED(BUFFSND) ) THEN
          CALL mpi_waitall(8, nreq_p2p, MPI_STATUSES_IGNORE, ierr)   ! wait for Isend from the PREVIOUS call
          IF( SIZE(BUFFSND) < iszS )    DEALLOCATE(BUFFSND)          ! send buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFSND) )   ALLOCATE( BUFFSND(iszS) )
-      iszR = SUM(iszall, mask = llrecv)                             ! recv buffer size
+      iszR = SUM(ibufszR)                                           ! recv buffer size
       IF( ALLOCATED(BUFFRCV) ) THEN
          IF( SIZE(BUFFRCV) < iszR )    DEALLOCATE(BUFFRCV)          ! recv buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFRCV) )   ALLOCATE( BUFFRCV(iszR) )
       !
-      ! default definition when no communication is done. understood by mpi_waitall
+      ! Default definition when no communication is done. Understood by mpi_waitall
       nreq_p2p(:) = MPI_REQUEST_NULL   ! WARNING: Must be done after the call to mpi_waitall just above
       !
       ! ----------------------------------------------- !
@@ -177,19 +202,28 @@
       !
       ! ----------------------------------- !
       !     4. Fill east and west halos     !
+      !   Must be done before sending data  !
+      !     data to south/north/corners     !
       ! ----------------------------------- !
       !
-      DO jn = 1, 2
-#define BLOCK_FILL
+      DO jn = 1, 2   ! first: do all the non-MPI filling to give more time to MPI_RECV
+#define BLOCK_FILL_nonMPI
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
+#undef BLOCK_FILL_nonMPI
+      END DO
+      DO jn = 1, 2   ! next: do the MPI_RECV part
+#define BLOCK_FILL_MPI_RECV
+#  include "lbc_lnk_pt2pt_generic.h90"         
+#undef BLOCK_FILL_MPI_RECV
       END DO
       !
       ! ------------------------------------------------- !
       !     5. Do north and south MPI_Isend if needed     !
+      !      and Specific problem in corner treatment     !
+      !               ( very rate case... )               !
       ! ------------------------------------------------- !
       !
-      DO jn = 3, 4
+      DO jn = 3, 8
 #define BLOCK_ISEND
 #  include "lbc_lnk_pt2pt_generic.h90"         
 #undef BLOCK_ISEND
@@ -199,44 +233,34 @@
       !     6. north fold treatment     !
       ! ------------------------------- !
       !
-      ! Must be done after receiving data from East/West neighbourgs (as it is coded in mpp_nfd, to be changed one day...)
-      ! Do it after MPI_iSend to south/north neighbourgs so they won't wait (too much) to receive their data
-      ! Do if before MPI_Recv from south/north neighbourgs so we have more time to receive data
+      ! Do it after MPI_iSend to south/north/corners neighbourgs so they won't wait (too much) to receive their data
+      ! Do if before MPI_Recv from south/north/corners neighbourgs so we will have more time to receive data
       !
       IF( l_IdoNFold ) THEN
-         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold
-         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold
+         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , kfld         )   ! self NFold
+         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld, ldfull )   ! mpi  NFold
          ENDIF
       ENDIF
       !
-      ! ------------------------------------- !
-      !     7. Fill south and north halos     !
-      ! ------------------------------------- !
-      !
-      DO jn = 3, 4
-#define BLOCK_FILL
-#  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
-      END DO
-      !
-      ! ----------------------------------------------- !
-      !     8. Specific problem in corner treatment     !
-      !              ( very rate case... )              !
-      ! ----------------------------------------------- !
+      ! ------------------------------------------------ !
+      !           7. Fill south and north halos          !
+      !     and specific problem in corner treatment     !
+      !               ( very rate case... )              !
+      ! ------------------------------------------------ !
       !
-      DO jn = 5, 8
-#define BLOCK_ISEND
+      DO jn = 3, 8   ! first: do all the non-MPI filling to give more time to MPI_RECV
+#define BLOCK_FILL_nonMPI
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_ISEND
+#undef BLOCK_FILL_nonMPI
       END DO
-      DO jn = 5, 8
-#define BLOCK_FILL
+      DO jn = 3, 8   ! next: do the MPI_RECV part
+#define BLOCK_FILL_MPI_RECV
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
+#undef BLOCK_FILL_MPI_RECV
       END DO
       !
       ! -------------------------------------------- !
-      !     9. deallocate local temporary arrays     !
+      !     8. deallocate local temporary arrays     !
       !        if they areg larger than jpi*jpj      !  <- arbitrary max size...
       ! -------------------------------------------- !
       !
@@ -250,53 +274,104 @@
 #endif
 
 #if defined BLOCK_ISEND
-   IF( llsend(jn) ) THEN
-      ishti = ishtSi(jn)
-      ishtj = ishtSj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         BUFFSND(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
-         idxs = idxs + 1
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+   IF( ibufszS(jn) > 0 ) THEN          ! we must send some data
+      DO jf = 1, kfld                  ! first: fill the buffer to be sent
+         IF( llsend(jn,jf) ) THEN
+            ishti = ishtSi(jn,jf)
+            ishtj = ishtSj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               BUFFSND(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
+               idxs = idxs + 1
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         ENDIF
+      END DO
 #if ! defined key_mpi_off
       IF( ln_timing ) CALL tic_tac(.TRUE.)
-      ! non-blocking send of the west/east side using local buffer
-      CALL MPI_ISEND( BUFFSND(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), iStag(jn), icomm, nreq_p2p(jn), ierr )
+      ! next: non-blocking send using local buffer. use mpiSnei(n_hlsmax,jn), see mppini
+      CALL MPI_ISEND( BUFFSND(ishtS(jn)+1), ibufszS(jn), MPI_TYPE, mpiSnei(n_hlsmax,jn), iStag(jn), icomm, nreq_p2p(jn), ierr )
       IF( ln_timing ) CALL tic_tac(.FALSE.)
 #endif
    ENDIF
+
 #endif
 
-#if defined BLOCK_FILL
-   ishti = ishtRi(jn)
-   ishtj = ishtRj(jn)
-   SELECT CASE ( ifill(jn) )
-   CASE ( jpfillnothing )               ! no filling 
-   CASE ( jpfillmpi   )                 ! fill with data received by MPI
+#if defined BLOCK_FILL_nonMPI
+ 
+   DO jf = 1, kfld
+      !
+      IF(     ifill(jn,jf) == jpfillcst ) THEN
+         !
+         ishti = ishtRi(jn,jf)
+         ishtj = ishtRj(jn,jf)
+         DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+            ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
+         END DO   ;   END DO   ;   END DO   ;   END DO
+         !
+      ELSEIF( ifill(jn,jf) == jpfillperio .OR. ifill(jn,jf) == jpfillcopy ) THEN
+         !
+         IF(     jn == jpwe .OR. jn == jpsw .OR. jn == jpnw ) THEN   ! western side
+                                                         ishti1 = ishtSi(jpwe,jf) + 1   ;   isgni1 = -1
+            IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishti2 = ishtRi(jpea,jf) + 1   ;   isgni2 = -1
+            ELSE                                     ;   ishti2 = ishtSi(jpwe,jf)       ;   isgni2 =  1
+            ENDIF
+            iisz = Ni_0
+         ELSEIF( jn == jpea .OR. jn == jpse .OR. jn == jpne ) THEN   ! eastern side
+                                                         ishti1 = ishtRi(jpea,jf)       ;   isgni1 =  1
+            IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishti2 = ishtSi(jpwe,jf)       ;   isgni2 =  1
+            ELSE                                     ;   ishti2 = ishtRi(jpea,jf) + 1   ;   isgni2 = -1
+            ENDIF
+            iisz = Ni_0
+         ELSE                                                        ! southern/northern side
+            ishti1 = ishtRi(jn,jf)   ;   isgni1 =  1
+            ishti2 = ishtSi(jn,jf)   ;   isgni2 =  1
+            iisz   = isizei(jn,jf)
+         ENDIF
+         IF(     jn == jpso .OR. jn == jpsw .OR. jn == jpse ) THEN   ! southern side
+                                                         ishtj1 = ishtSj(jpso,jf) + 1   ;   isgnj1 = -1
+            IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishtj2 = ishtRj(jpno,jf) + 1   ;   isgnj2 = -1
+            ELSE                                     ;   ishtj2 = ishtSj(jpso,jf)       ;   isgnj2 =  1
+            ENDIF
+         ELSEIF( jn == jpno .OR. jn == jpnw .OR. jn == jpne ) THEN   ! northern side
+                                                         ishtj1 = ishtRj(jpno,jf)       ;   isgnj1 =  1
+            IF( ifill(jn,jf) == jpfillperio ) THEN   ;   ishtj2 = ishtSj(jpso,jf)       ;   isgnj2 =  1
+            ELSE                                     ;   ishtj2 = ishtRj(jpno,jf) + 1   ;   isgnj2 = -1
+            ENDIF
+         ELSE                                                        ! western/eastern side
+            ishtj1 = ishtRj(jn,jf)   ;   isgnj1 =  1
+            ishtj2 = ishtSj(jn,jf)   ;   isgnj2 =  1  
+         ENDIF
+         !
+         DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+            ii1 = ishti1 +       ji                * isgni1
+            ij1 = ishtj1 +       jj                * isgnj1
+            ii2 = ishti2 + ( MOD(ji-1, iisz) + 1 ) * isgni2   ! warning: iisz my be smaller than isizei(jn,jf)
+            ij2 = ishtj2 + ( MOD(jj-1, Nj_0) + 1 ) * isgnj2   ! warning: Nj_0 my be smaller than isizej(jn,jf)
+            ptab(jf)%pt4d(ii1,ij1,jk,jl) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+         END DO   ;   END DO   ;   END DO   ;   END DO
+         !
+!!$      ELSEIF( ifill(jn,jf) == jpfillnothing ) THEN   ! no filling 
+!!$      ELSEIF( ifill(jn,jf) == jpfillmpi     ) THEN   ! do it later
+      ENDIF
+   END DO   ! jf
+#endif
+
+#if defined BLOCK_FILL_MPI_RECV
+   IF( ibufszR(jn) > 0 ) THEN          ! we must receive some data
 #if ! defined key_mpi_off
       IF( ln_timing ) CALL tic_tac(.TRUE.)
-      !                                 ! blocking receive of the west/east halo in local temporary arrays
-      CALL MPI_RECV( BUFFRCV(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), iRtag(jn), icomm, MPI_STATUS_IGNORE, ierr )
+      ! blocking receive in local buffer. use mpiRnei(n_hlsmax,jn), see mppini
+      CALL MPI_RECV( BUFFRCV(ishtR(jn)+1), ibufszR(jn), MPI_TYPE, mpiRnei(n_hlsmax,jn), iRtag(jn), icomm, MPI_STATUS_IGNORE, ierr )
       IF( ln_timing ) CALL tic_tac(.FALSE.)
 #endif
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idxr)
-         idxr = idxr + 1
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillperio )                 ! use periodicity
-      ishti2 = ishtPi(jn)
-      ishtj2 = ishtPj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillcopy  )                 ! filling with inner domain values
-      ishti2 = ishtSi(jn)
-      ishtj2 = ishtSj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillcst   )                 ! filling with constant value
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   END SELECT
+      DO jf = 1, kfld
+         IF( ifill(jn,jf) == jpfillmpi ) THEN    ! Use MPI-received data
+            ishti = ishtRi(jn,jf)
+            ishtj = ishtRj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idxr)
+               idxr = idxr + 1
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         ENDIF
+      END DO
+   ENDIF
 #endif
diff --git a/src/OCE/LBC/lbc_nfd_generic.h90 b/src/OCE/LBC/lbc_nfd_generic.h90
index 18ae8973..fa20805f 100644
--- a/src/OCE/LBC/lbc_nfd_generic.h90
+++ b/src/OCE/LBC/lbc_nfd_generic.h90
@@ -1,28 +1,23 @@
 
-   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld )
+   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfld )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
       REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
-      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       !
       INTEGER  ::    ji,  jj,  jk,  jl,  jf   ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipk, ipl, ipf   ! dimension of the input array
+      INTEGER  ::   ipi, ipj, ipk, ipl, ihls  ! dimension of the input array
       INTEGER  ::   ii1, ii2, ij1, ij2
       !!----------------------------------------------------------------------
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
+      DO jf = 1, kfld                      ! Loop on the number of arrays to be treated
       !
-      IF( ipi /= Ni0glo+2*khls ) THEN
-         WRITE(ctmp1,*) 'lbc_nfd input array does not match khls', ipi, khls, Ni0glo
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
-      DO jf = 1, ipf                      ! Loop on the number of arrays to be treated
+         ipi = SIZE(ptab(jf)%pt4d,1)
+         ipj = SIZE(ptab(jf)%pt4d,2)
+         ipk = SIZE(ptab(jf)%pt4d,3)
+         ipl = SIZE(ptab(jf)%pt4d,4)
+         !
+         ihls = ( ipi - Ni0glo ) / 2
          !
          IF( c_NFtype == 'T' ) THEN            ! *  North fold  T-point pivot
             !
@@ -30,160 +25,162 @@
             CASE ( 'T' , 'W' )                         ! T-, W-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls+1
-                        ii1 = khls + ji
+                     DO ji = 1, 1                 ! point ihls+1
+                        ii1 = ihls + ji
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =   2 + ihls + ji - 1        ! ends at: 2 + ihls + ipi - 2*ihls - 1 - 1 = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls + 1
-                        ii1 = ipi - khls + ji
-                        ii2 =       khls + ji
+                     DO ji = 1, COUNT( (/ihls > 0/) ) ! point ipi - ihls + 1
+                        ii1 = ipi - ihls + ji
+                        ii2 =       ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! last khls-1 points
-                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
-                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
+                     DO ji = 1, ihls-1            ! last ihls-1 points
+                        ii1 = ipi - ihls + 1 + ji        ! ends at: ipi - ihls + 1 + ihls - 1 = ipi
+                        ii2 = ipi - ihls + 1 - ji        ! ends at: ipi - ihls + 1 - ihls + 1 = ipi - 2*ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - khls - 1) + 1 = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls - 1) + 1 = khls + 2
+                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - ihls - 1) + 1 = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls - 1) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
+                     !                            ! last ihls-1 points: have been or will be done by e-w periodicity 
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'U' )                               ! U-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
+                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
+                     !                            ! last ihls-1 points: have been or will be done by e-w periodicity 
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'V' )                               ! V-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls+1 lines (from ipj to ipj-khls) : full
-               	  DO jj = 1, khls+1
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
-                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
+                  ! last ihls+1 lines (from ipj to ipj-ihls) : full
+               	  DO jj = 1, ihls+1
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( ihls + 1 ) + 1 = ipj - ihls
+                     ij2 = ipj - 2*ihls + jj - 2         ! ends at: ipj - 2*ihls + ihls + 1 - 2 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls+1
-                        ii1 = khls + ji
+                     DO ji = 1, 1                 ! point ihls+1
+                        ii1 = ihls + ji
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =   2 + ihls + ji - 1        ! ends at: 2 + ihls + ipi - 2*ihls - 1 - 1 = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls + 1
-                        ii1 = ipi - khls + ji
-                        ii2 =       khls + ji
+                     IF( ihls > 0 ) THEN
+                     DO ji = 1, COUNT( (/ihls > 0/) ) ! point ipi - ihls + 1
+                        ii1 = ipi - ihls + ji
+                        ii2 =       ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! last khls-1 points
-                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
-                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
+                     ENDIF
+                     DO ji = 1, ihls-1            ! last ihls-1 points
+                        ii1 = ipi - ihls + 1 + ji        ! ends at: ipi - ihls + 1 + ihls - 1 = ipi
+                        ii2 = ipi - ihls + 1 - ji        ! ends at: ipi - ihls + 1 - ihls + 1 = ipi - 2*ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'F' )                               ! F-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls+1 lines (from ipj to ipj-khls) : full
-               	  DO jj = 1, khls+1
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
-                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
+                  ! last ihls+1 lines (from ipj to ipj-ihls) : full
+               	  DO jj = 1, ihls+1
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( ihls + 1 ) + 1 = ipj - ihls
+                     ij2 = ipj - 2*ihls + jj - 2         ! ends at: ipj - 2*ihls + ihls + 1 - 2 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -199,47 +196,24 @@
             CASE ( 'T' , 'W' )                         ! T-, W-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! first: line number ipj-khls : 3 points
-               	  DO jj = 1, 1
-                     ij1 = ipj - khls
-                     ij2 = ij1   ! same line
-                     !
-                     DO ji = 1, 1                 ! points from ipi/2+1
-                        ii1 = ipi/2 + ji
-                        ii2 = ipi/2 - ji + 1
-                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
-                     END DO
-                     DO ji = 1, 1                 ! points ipi - khls
-                        ii1 = ipi - khls + ji - 1
-                        ii2 =       khls + ji
-                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
-                     END DO
-                     DO ji = 1, 1                 ! point khls: redo it just in case (if e-w periodocity already done)
-                        !                         ! as we just changed point ipi - khls
-                        ii1 = khls + ji - 1
-                        ii2 = khls + ji
-                        ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
-                     END DO
-                  END DO
-                  !
-                  ! Second: last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
-                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - ihls
+                     ij2 = ipj - 2*ihls + jj             ! ends at: ipj - 2*ihls + ihls = ipj - ihls
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -248,34 +222,34 @@
             CASE ( 'U' )                               ! U-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
-                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - ihls
+                     ij2 = ipj - 2*ihls + jj             ! ends at: ipj - 2*ihls + ihls = ipj - ihls
                      !
-                     DO ji = 1, khls-1            ! first khls-1 points
-                        ii1 =          ji                ! ends at: khls-1
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points
+                        ii1 =          ji                ! ends at: ihls-1
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls
-                        ii1 = khls + ji - 1
+                     DO ji = 1, 1                        ! point ihls (here ihls > 0 so it is ok)
+                        ii1 = ihls + ji - 1
                         ii2 = ipi - ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+1 to ipi - ihls - 1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ( ipi - 2*ihls - 1 ) = ipi - ihls - 1
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls
-                        ii1 = ipi - khls + ji - 1
+                     DO ji = 1, 1                 ! point ipi - ihls
+                        ii1 = ipi - ihls + ji - 1
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ihls = ipi - 2*ihls
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -284,100 +258,100 @@
             CASE ( 'V' )                               ! V-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji          ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls            ! last khls points
-                        ii1 = ipi - khls + ji          ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO   
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
+                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls points: have been / will done by e-w periodicity 
+                     !                            ! last ihls points: have been or will be done by e-w periodicity 
                   END DO
                   !
                END DO; END DO
             CASE ( 'F' )                               ! F-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls-1            ! first khls-1 points
-                        ii1 =          ji                ! ends at: khls-1
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points
+                        ii1 =          ji                ! ends at: ihls-1
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls
-                        ii1 = khls + ji - 1
+                     DO ji = 1, 1                 ! point ihls (here ihls > 0 so it is ok)
+                        ii1 = ihls + ji - 1
                         ii2 = ipi - ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+1 to ipi - ihls - 1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ( ipi - 2*ihls - 1 ) = ipi - ihls - 1
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls
-                        ii1 = ipi - khls + ji - 1
+                     DO ji = 1, 1                 ! point ipi - ihls
+                        ii1 = ipi - ihls + ji - 1
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ihls = ipi - 2*ihls
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO   
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - khls-1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - ihls-1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! first khls-1 points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-nn_hl-1  
-                        ii1 =          ji                ! ends at: khls
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-nn_hl-1  
+                        ii1 =          ji                ! ends at: ihls
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls points: have been / will done by e-w periodicity 
+                     !                            ! last ihls points: have been or will be done by e-w periodicity 
                   END DO
                   !
                END DO; END DO
@@ -385,7 +359,7 @@
             !
          ENDIF   ! c_NFtype == 'F'
          !
-      END DO   ! ipf
+      END DO   ! kfld
       !
    END SUBROUTINE lbc_nfd_/**/PRECISION
 
diff --git a/src/OCE/LBC/lbclnk.F90 b/src/OCE/LBC/lbclnk.F90
index be65cdc1..3776b595 100644
--- a/src/OCE/LBC/lbclnk.F90
+++ b/src/OCE/LBC/lbclnk.F90
@@ -38,11 +38,9 @@ MODULE lbclnk
       MODULE PROCEDURE   lbc_lnk_pt2pt_sp, lbc_lnk_pt2pt_dp
    END INTERFACE
 
-#if ! defined key_mpi2
    INTERFACE lbc_lnk_neicoll
       MODULE PROCEDURE   lbc_lnk_neicoll_sp ,lbc_lnk_neicoll_dp
    END INTERFACE
-#endif
    !
    INTERFACE lbc_lnk_icb
       MODULE PROCEDURE mpp_lnk_2d_icb_dp, mpp_lnk_2d_icb_sp
@@ -51,10 +49,10 @@ MODULE lbclnk
    PUBLIC   lbc_lnk            ! ocean/ice lateral boundary conditions
    PUBLIC   lbc_lnk_icb        ! iceberg lateral boundary conditions
 
-   REAL(dp), DIMENSION(:), ALLOCATABLE ::   buffsnd_dp, buffrcv_dp   ! MPI send/recv buffers
-   REAL(sp), DIMENSION(:), ALLOCATABLE ::   buffsnd_sp, buffrcv_sp   ! 
-   INTEGER,  DIMENSION(8)              ::   nreq_p2p                 ! request id for MPI_Isend in point-2-point communication
-   
+   REAL(dp), DIMENSION(:), ALLOCATABLE ::   buffsnd_dp, buffrcv_dp         ! MPI send/recv buffers
+   REAL(sp), DIMENSION(:), ALLOCATABLE ::   buffsnd_sp, buffrcv_sp         ! 
+   INTEGER,  DIMENSION(8)              ::   nreq_p2p = MPI_REQUEST_NULL    ! request id for MPI_Isend in point-2-point communication
+   INTEGER                             ::   nreq_nei = MPI_REQUEST_NULL    ! request id for mpi_neighbor_ialltoallv
    !! * Substitutions
    !!#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -134,9 +132,7 @@ CONTAINS
 #  define BUFFSND buffsnd_sp
 #  define BUFFRCV buffrcv_sp
 #  include "lbc_lnk_pt2pt_generic.h90"
-#if ! defined key_mpi2
 #  include "lbc_lnk_neicoll_generic.h90"
-#endif
 #  undef MPI_TYPE
 #  undef BUFFSND
 #  undef BUFFRCV
@@ -149,9 +145,7 @@ CONTAINS
 #  define BUFFSND buffsnd_dp
 #  define BUFFRCV buffrcv_dp
 #  include "lbc_lnk_pt2pt_generic.h90"
-#if ! defined key_mpi2
 #  include "lbc_lnk_neicoll_generic.h90"
-#endif
 #  undef MPI_TYPE
 #  undef BUFFSND
 #  undef BUFFRCV
diff --git a/src/OCE/LBC/lbcnfd.F90 b/src/OCE/LBC/lbcnfd.F90
index dc784b86..c6be460c 100644
--- a/src/OCE/LBC/lbcnfd.F90
+++ b/src/OCE/LBC/lbcnfd.F90
@@ -23,8 +23,11 @@ MODULE lbcnfd
    PRIVATE
 
    INTERFACE lbc_nfd            ! called by mpp_nfd, lbc_lnk_pt2pt or lbc_lnk_neicoll
-      MODULE PROCEDURE   lbc_nfd_sp, lbc_nfd_ext_sp
-      MODULE PROCEDURE   lbc_nfd_dp, lbc_nfd_ext_dp
+      MODULE PROCEDURE   lbc_nfd_sp, lbc_nfd_dp
+   END INTERFACE
+
+   INTERFACE lbc_nfd_ext        ! called by mpp_lnk_2d_icb
+      MODULE PROCEDURE   lbc_nfd_ext_sp, lbc_nfd_ext_dp
    END INTERFACE
 
    INTERFACE mpp_nfd            ! called by lbc_lnk_pt2pt or lbc_lnk_neicoll
@@ -33,11 +36,13 @@ MODULE lbcnfd
    
    PUBLIC   mpp_nfd            ! mpi north fold conditions
    PUBLIC   lbc_nfd            ! north fold conditions
+   PUBLIC   lbc_nfd_ext        ! north fold conditions, called by mpp_lnk_2d_icb
 
-   INTEGER, PUBLIC                               :: nfd_nbnei
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:  ) :: nfd_rknei
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:) :: nfd_rksnd
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:) :: nfd_jisnd
+   INTEGER, PUBLIC                                 :: nfd_nbnei
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:    ) :: nfd_rknei
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:,:) :: nfd_rksnd
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:,:) :: nfd_jisnd
+   LOGICAL, PUBLIC, ALLOCATABLE, DIMENSION (:,:  ) :: lnfd_same
    
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
diff --git a/src/OCE/LBC/lib_mpp.F90 b/src/OCE/LBC/lib_mpp.F90
index bf839de5..eeec1305 100644
--- a/src/OCE/LBC/lib_mpp.F90
+++ b/src/OCE/LBC/lib_mpp.F90
@@ -140,10 +140,10 @@ MODULE lib_mpp
    INTEGER :: MPI_SUMDD
 
    ! Neighbourgs informations
-   INTEGER,    PARAMETER, PUBLIC ::   n_hlsmax = 3
-   INTEGER, DIMENSION(         8), PUBLIC ::   mpinei      !: 8-neighbourg MPI indexes (starting at 0, -1 if no neighbourg)
-   INTEGER, DIMENSION(n_hlsmax,8), PUBLIC ::   mpiSnei     !: 8-neighbourg Send MPI indexes (starting at 0, -1 if no neighbourg)
-   INTEGER, DIMENSION(n_hlsmax,8), PUBLIC ::   mpiRnei     !: 8-neighbourg Recv MPI indexes (starting at 0, -1 if no neighbourg)
+   INTEGER,    PARAMETER, PUBLIC ::   n_hlsmax = 2
+   INTEGER, DIMENSION(           8), PUBLIC ::   mpinei      !: 8-neighbourg MPI indexes (starting at 0, -1 if no neighbourg)
+   INTEGER, DIMENSION(0:n_hlsmax,8), PUBLIC ::   mpiSnei     !: 8-neighbourg Send MPI indexes (starting at 0, -1 if no neighbourg)
+   INTEGER, DIMENSION(0:n_hlsmax,8), PUBLIC ::   mpiRnei     !: 8-neighbourg Recv MPI indexes (starting at 0, -1 if no neighbourg)
    INTEGER,    PARAMETER, PUBLIC ::   jpwe = 1   !: WEst
    INTEGER,    PARAMETER, PUBLIC ::   jpea = 2   !: EAst
    INTEGER,    PARAMETER, PUBLIC ::   jpso = 3   !: SOuth
@@ -190,7 +190,6 @@ MODULE lib_mpp
    INTEGER, PUBLIC                               ::   n_sequence_glb = 0           !: # of global communications
    INTEGER, PUBLIC                               ::   n_sequence_dlg = 0           !: # of delayed global communications
    INTEGER, PUBLIC                               ::   numcom = -1                  !: logical unit for communicaton report
-   LOGICAL, PUBLIC                               ::   l_full_nf_update = .TRUE.    !: logical for a full (2lines) update of bc at North fold report
    INTEGER,                    PARAMETER, PUBLIC ::   nbdelay = 2       !: number of delayed operations
    !: name (used as id) of allreduce-delayed operations
    ! Warning: we must use the same character length in an array constructor (at least for gcc compiler)
@@ -1125,7 +1124,7 @@ CONTAINS
       INTEGER                            :: ierr
       LOGICAL, PARAMETER                 :: ireord = .FALSE.
       !!----------------------------------------------------------------------
-#if ! defined key_mpi_off && ! defined key_mpi2
+#if ! defined key_mpi_off
       
       iScnt4 = COUNT( mpiSnei(khls,1:4) >= 0 )
       iRcnt4 = COUNT( mpiRnei(khls,1:4) >= 0 )
@@ -1139,10 +1138,19 @@ CONTAINS
       iSnei8 = PACK( mpiSnei(khls,1:8), mask = mpiSnei(khls,1:8) >= 0 )
       iRnei8 = PACK( mpiRnei(khls,1:8), mask = mpiRnei(khls,1:8) >= 0 )
 
+      ! Isolated processes (i.e., processes WITH no outgoing or incoming edges, that is, processes that have specied
+      ! indegree and outdegree as zero and thus DO not occur as source or destination rank in the graph specication)
+      ! are allowed. 
+      
+# if ! defined key_mpi2
       CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt4, iSnei4, MPI_UNWEIGHTED, iRcnt4, iRnei4, MPI_UNWEIGHTED,   &
          &                                 MPI_INFO_NULL, ireord, mpi_nc_com4(khls), ierr )
       CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt8, iSnei8, MPI_UNWEIGHTED, iRcnt8, iRnei8, MPI_UNWEIGHTED,   &
          &                                 MPI_INFO_NULL, ireord, mpi_nc_com8(khls), ierr)
+# else
+      mpi_nc_com4(khls) = -1
+      mpi_nc_com8(khls) = -1
+# endif
 
       DEALLOCATE( iSnei4, iRnei4, iSnei8, iRnei8 )
 #endif
@@ -1305,7 +1313,7 @@ CONTAINS
             IF ( ncomm_sequence(ji,1) .GT. 1 .AND. ncomm_sequence(ji,2) .GT. 1 ) jj = jj + 1
             jh = MAX (jh, ncomm_sequence(ji,1)*ncomm_sequence(ji,2))
          END DO
-         WRITE(numcom,'(A,I3)') ' 3D Exchanged halos : ', jk
+         WRITE(numcom,'(A,I3)') ' 3D or 4D Exchanged halos : ', jk
          WRITE(numcom,'(A,I3)') ' Multi arrays exchanged halos : ', jf
          WRITE(numcom,'(A,I3)') '   from which 3D : ', jj
          WRITE(numcom,'(A,I10)') ' Array max size : ', jh*jpi*jpj
diff --git a/src/OCE/LBC/mpp_lbc_north_icb_generic.h90 b/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
index 3c8382ea..63cef9ab 100644
--- a/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
+++ b/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
@@ -92,7 +92,7 @@
 
       ! 2. North-Fold boundary conditions
       ! ----------------------------------
-      CALL lbc_nfd( ztab_e(:,1-kextj:ipj+kextj), cd_type, psgn, kextj )
+      CALL lbc_nfd_ext( ztab_e(:,1-kextj:ipj+kextj), cd_type, psgn, kextj )
 
       ij = 1 - kextj
       !! Scatter back to pt2d
diff --git a/src/OCE/LBC/mpp_lnk_icb_generic.h90 b/src/OCE/LBC/mpp_lnk_icb_generic.h90
index 8798f3e0..b0cb70d4 100644
--- a/src/OCE/LBC/mpp_lnk_icb_generic.h90
+++ b/src/OCE/LBC/mpp_lnk_icb_generic.h90
@@ -87,7 +87,7 @@
       IF( l_IdoNFold ) THEN
          !
          SELECT CASE ( jpni )
-                   CASE ( 1 )     ;   CALL lbc_nfd         ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
+                   CASE ( 1 )     ;   CALL lbc_nfd_ext     ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
                    CASE DEFAULT   ;   CALL LBCNORTH        ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
          END SELECT
          !
diff --git a/src/OCE/LBC/mpp_loc_generic.h90 b/src/OCE/LBC/mpp_loc_generic.h90
index 1bce8df2..fe569763 100644
--- a/src/OCE/LBC/mpp_loc_generic.h90
+++ b/src/OCE/LBC/mpp_loc_generic.h90
@@ -47,6 +47,7 @@
       !
       INTEGER  ::   ierror, ii, idim
       INTEGER  ::   index0
+      INTEGER  ::   ihls, ipiglo, ipjglo
       INTEGER , DIMENSION(:), ALLOCATABLE  ::   ilocs
       REAL(PRECISION) ::   zmin     ! local minimum
       REAL(PRECISION), DIMENSION(2,1) ::   zain, zaout
@@ -60,6 +61,9 @@
       ENDIF
       !
       idim = SIZE(kindex)
+      ihls = ( SIZE(ARRAY_IN(:,:,:), 1) - Ni_0 ) / 2
+      ipiglo = Ni0glo + 2*ihls
+      ipjglo = Nj0glo + 2*ihls
       !
       IF ( ANY( MASK_IN(:,:,:) ) ) THEN   ! there is at least 1 valid point...
          !
@@ -68,9 +72,9 @@
          ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) )
          zmin  = ARRAY_IN(ilocs(1),ilocs(2),ilocs(3))
          !
-         kindex(1) = mig( ilocs(1) )
+         kindex(1) = mig( ilocs(1), ihls )
 #if defined DIM_2d || defined DIM_3d    /* avoid warning when kindex has 1 element */
-         kindex(2) = mjg( ilocs(2) )
+         kindex(2) = mjg( ilocs(2), ihls )
 #endif
 #if defined DIM_3d                      /* avoid warning when kindex has 2 elements */
          kindex(3) = ilocs(3)
@@ -80,10 +84,10 @@
          !
          index0 = kindex(1)-1   ! 1d index starting at 0
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-         index0 = index0 + jpiglo * (kindex(2)-1)
+         index0 = index0 + ipiglo * (kindex(2)-1)
 #endif
 #if defined DIM_3d                     /* avoid warning when kindex has 2 elements */
-         index0 = index0 + jpiglo * jpjglo * (kindex(3)-1)
+         index0 = index0 + ipiglo * ipjglo * (kindex(3)-1)
 #endif
       ELSE
          ! special case for land processors
@@ -105,20 +109,20 @@
       pmin      = zaout(1,1)
       index0    = NINT( zaout(2,1) )
 #if defined DIM_3d                     /* avoid warning when kindex has 2 elements */
-      kindex(3) = index0 / (jpiglo*jpjglo)
-      index0    = index0 - kindex(3) * (jpiglo*jpjglo)
+      kindex(3) = index0 / (ipiglo*ipjglo)
+      index0    = index0 - kindex(3) * (ipiglo*ipjglo)
 #endif
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-      kindex(2) = index0 / jpiglo
-      index0 = index0 - kindex(2) * jpiglo
+      kindex(2) = index0 / ipiglo
+      index0 = index0 - kindex(2) * ipiglo
 #endif
       kindex(1) = index0
       kindex(:) = kindex(:) + 1   ! start indices at 1
 
       IF( .NOT. llhalo ) THEN
-         kindex(1)  = kindex(1) - nn_hls
+         kindex(1)  = kindex(1) - ihls
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-         kindex(2)  = kindex(2) - nn_hls
+         kindex(2)  = kindex(2) - ihls
 #endif
       ENDIF
       
diff --git a/src/OCE/LBC/mpp_nfd_generic.h90 b/src/OCE/LBC/mpp_nfd_generic.h90
index fd45035f..20ecf8ac 100644
--- a/src/OCE/LBC/mpp_nfd_generic.h90
+++ b/src/OCE/LBC/mpp_nfd_generic.h90
@@ -1,38 +1,40 @@
 
-   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, khls, kfld )
+   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld, ldfull )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
-      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
-      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
-      INTEGER                       , INTENT(in   ) ::   kfillmode   ! filling method for halo over land 
-      REAL(PRECISION)               , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
-      INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
+      CHARACTER(len=1), DIMENSION(kfld), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
+      REAL(PRECISION),  DIMENSION(kfld), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
+      INTEGER                          , INTENT(in   ) ::   kfillmode   ! filling method for halo over land 
+      REAL(PRECISION)                  , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
+      INTEGER                          , INTENT(in   ) ::   kfld        ! number of pt3d arrays
+      LOGICAL                , OPTIONAL, INTENT(in   ) ::   ldfull      ! .true. if we also update the last line of the inner domain
       !
-      LOGICAL  ::   ll_add_line
+      LOGICAL  ::   llfull
       INTEGER  ::   ji,  jj,  jk,  jl, jf, jr, jg, jn   ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipj2, ipk, ipl, ipf   ! dimension of the input array
-      INTEGER  ::   ierr, ibuffsize, iis0, iie0, impp
-      INTEGER  ::   ii1, ii2, ij1, ij2, iis, iie, iib, iig, iin
-      INTEGER  ::   i0max
-      INTEGER  ::   ij, iproc, ipni, ijnr
-      INTEGER, DIMENSION (:), ALLOCATABLE ::   ireq_s, ireq_r   ! for mpi_isend when avoiding mpi_allgather
-      INTEGER                             ::   ipjtot           ! sum of lines for all multi fields
-      INTEGER                             ::   i012             ! 0, 1 or 2
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijsnd  ! j-position of sent lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijbuf  ! j-position of send buffer lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijrcv  ! j-position of recv buffer lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ii1st, iiend
-      INTEGER , DIMENSION(:)          , ALLOCATABLE ::   ipjfld ! number of sent lines for each field
-      REAL(PRECISION), DIMENSION(:,:,:,:)    , ALLOCATABLE ::   zbufs  ! buffer, receive and work arrays
-      REAL(PRECISION), DIMENSION(:,:,:,:,:)  , ALLOCATABLE ::   zbufr  ! buffer, receive and work arrays
-      REAL(PRECISION), DIMENSION(:,:,:,:,:)  , ALLOCATABLE ::   znorthloc
-      REAL(PRECISION), DIMENSION(:,:,:,:,:,:), ALLOCATABLE ::   znorthglo
-      TYPE(PTR_4D_/**/PRECISION), DIMENSION(:), ALLOCATABLE ::   ztabglo        ! array or pointer of arrays on which apply the b.c.
+      INTEGER  ::   ierr, ibuffsize, impp, ipi0
+      INTEGER  ::   ii1, ii2, ij1, ij2, ij3, iig, inei
+      INTEGER  ::   i0max, ilntot, iisht, ijsht, ihsz
+      INTEGER  ::   iproc, ijnr, ipjtot, iF_TU, i012
+      INTEGER,         DIMENSION(kfld)               ::   ipi, ipj, ipj1, ipj2, ipk, ipl   ! dimension of the input array
+      INTEGER,         DIMENSION(kfld)               ::   ihls                             ! halo size
+      INTEGER,         DIMENSION(:)    , ALLOCATABLE ::   ireq_s, ireq_r   ! for mpi_isend when avoiding mpi_allgather
+      INTEGER,         DIMENSION(:)    , ALLOCATABLE ::   ipjfld ! number of sent lines for each field
+      REAL(PRECISION)                                ::   zhuge, zztmp
+      REAL(PRECISION), DIMENSION(:,:)  , ALLOCATABLE ::   zbufs  ! buffer, receive and work arrays
+      REAL(PRECISION), DIMENSION(:,:,:), ALLOCATABLE ::   zbufr  ! buffer, receive and work arrays
+      REAL(PRECISION), DIMENSION(:,:)  , ALLOCATABLE ::   znorthloc
+      REAL(PRECISION), DIMENSION(:,:,:), ALLOCATABLE ::   znorthall
+      TYPE(PTR_4D_/**/PRECISION), DIMENSION(1) ::   ztabglo        ! array or pointer of arrays on which apply the b.c.
       !!----------------------------------------------------------------------
       !
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
+      zhuge = HUGE(0._/**/PRECISION)   ! avoid to call the huge function inside do loops
+      !
+      DO jf = 1, kfld
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls(jf) = ( ipi(jf) - Ni_0 ) / 2
+      END DO
       !
       IF( ln_nnogather ) THEN      !==  no allgather exchanges  ==!
 
@@ -45,7 +47,6 @@
          !  - c_NFtype='T', grid=U : half of the last line (jpiglo/2+1:jpiglo-nn_hls)
          !  - c_NFtype='T', grid=V : all the last line nn_hls+1 and (nn_hls+2:jpiglo-nn_hls)
          !  - c_NFtype='T', grid=F : all the last line (nn_hls+1:jpiglo-nn_hls)
-         !  - c_NFtype='F', grid=T : 2 points of the last line (jpiglo/2+1 and jpglo-nn_hls)
          !  - c_NFtype='F', grid=U : no points are duplicated
          !  - c_NFtype='F', grid=V : half of the last line (jpiglo/2+1:jpiglo-nn_hls)
          !  - c_NFtype='F', grid=F : half of the last line (jpiglo/2+1:jpiglo-nn_hls-1)
@@ -54,81 +55,46 @@
          ! In consequence, we may want to force the folding on these points by setting l_full_nf_update = .TRUE.
          ! This is slightly slower but necessary to avoid different values on identical grid points!!
          !
-         !!!!!!!!!           temporary switch off this optimisation ==> force TRUE           !!!!!!!!
-         !!!!!!!!!  needed to get the same results without agrif and with agrif and no zoom  !!!!!!!!
-         !!!!!!!!!                    I don't know why we must do that...                    !!!!!!!!
-         l_full_nf_update = .TRUE.
-         ! also force it if not restart during the first 2 steps (leap frog?)
-         ll_add_line = l_full_nf_update .OR. ( ncom_stp <= nit000+1 .AND. .NOT. ln_rstart )
+         llfull = .FALSE.
+         IF ( PRESENT(ldfull) )   llfull = ldfull
+         ! also force during the first step to make sure all the init are ok
+         llfull = llfull .OR. ncom_stp <= nit000
          
-         ALLOCATE(ipjfld(ipf))                 ! how many lines do we exchange for each field?
-         IF( ll_add_line ) THEN
-            DO jf = 1, ipf                     ! Loop over the number of arrays to be processed
-               ipjfld(jf) = khls + COUNT( (/ c_NFtype == 'T' .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )
+         ALLOCATE(ipjfld(kfld))                 ! how many lines do we send for each field?
+         IF( llfull ) THEN
+            DO jf = 1, kfld                     ! Loop over the number of arrays to be processed
+               ipjfld(jf) = ihls(jf) + COUNT( (/ c_NFtype == 'T'  .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )
             END DO
          ELSE
-            ipjfld(:) = khls
+            ipjfld(:) = ihls(:)
          ENDIF
-         
-         ipj    = MAXVAL(ipjfld(:))            ! Max 2nd dimension of message transfers
-         ipjtot = SUM(   ipjfld(:))            ! Total number of lines to be exchanged
-
-         ! Index of modifying lines in input
-         ALLOCATE( ijsnd(ipj, ipf), ijbuf(ipj, ipf), ijrcv(ipj, ipf), ii1st(ipj, ipf), iiend(ipj, ipf) )
-
-         ij1 = 0
-         DO jf = 1, ipf                        ! Loop over the number of arrays to be processed
-            !
-            DO jj = 1, khls   ! first khls lines (starting from top) must be fully defined
-               ii1st(jj, jf) = 1
-               iiend(jj, jf) = jpi
-            END DO
-            !
-            ! what do we do with line khls+1 (starting from top)
-            IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot
-               SELECT CASE ( cd_nat(jf) )
-               CASE ('T','W')   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+2)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls)
-               CASE ('U'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls)
-               CASE ('V'    )   ;   i012 = 2   ;   ii1st(khls+1, jf) = 1                 ;   iiend(khls+1, jf) = jpi
-               CASE ('F'    )   ;   i012 = 2   ;   ii1st(khls+1, jf) = 1                 ;   iiend(khls+1, jf) = jpi
-               END SELECT
-            ENDIF
-            IF( c_NFtype == 'F' ) THEN          ! *  North fold  F-point pivot
-               SELECT CASE ( cd_nat(jf) )
-               CASE ('T','W')   ;   i012 = 0   ! we don't touch line khls+1
-               CASE ('U'    )   ;   i012 = 0   ! we don't touch line khls+1
-               CASE ('V'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls  )
-               CASE ('F'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls-1)
-               END SELECT
-            ENDIF
-            !
-            DO jj = 1, ipjfld(jf)
-               ij1 = ij1 + 1
-               ijsnd(jj,jf) = jpj - 2*khls + jj - i012   ! sent lines (from bottom of sent lines)
-               ijbuf(jj,jf) = ij1                        ! gather all lines in the snd/rcv buffers
-               ijrcv(jj,jf) = jpj - jj + 1               ! recv lines (from the top -> reverse order for jj)
-            END DO
-            !
-         END DO
          !
-         i0max = jpimax - 2 * khls                                    ! we are not sending the halos
-         ALLOCATE( zbufs(i0max,ipjtot,ipk,ipl), ireq_s(nfd_nbnei) )   ! store all the data to be sent in a buffer array
-         ibuffsize = i0max * ipjtot * ipk * ipl
+         i0max = MAXVAL( nfni_0, mask = nfproc /= -1 )        ! largest value of Ni_0 among processors (we are not sending halos)
+         ilntot = SUM( ipjfld(:) * ipk(:) * ipl(:) )
+         ALLOCATE( zbufs(i0max,ilntot), ireq_s(nfd_nbnei) )   ! store all the data to be sent in a buffer array
+         ibuffsize = i0max * ilntot                           ! must be the same for all processors -> use i0max
          !
          ! fill the send buffer with all the lines
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-            DO jj = 1, ipjfld(jf)
-               ij1 = ijbuf(jj,jf)
-               ij2 = ijsnd(jj,jf)
-               DO ji = Nis0, Nie0       ! should not use any other value
-                  iib = ji - Nis0 + 1
-                  zbufs(iib,ij1,jk,jl) = ptab(jf)%pt4d(ji,ij2,jk,jl)
-               END DO
-               DO ji = Ni_0+1, i0max    ! avoid sending uninitialized values (make sure we don't use it)
-                  zbufs(ji,ij1,jk,jl) = HUGE(0._/**/PRECISION)   ! make sure we don't use it...
+         ij1 = 0
+         DO jf = 1, kfld
+            !
+            i012 = COUNT( (/ c_NFtype == 'T' /) ) + COUNT( (/ cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )   ! 0, 1 OR 2
+            ijsht = ipj(jf) - 2*ihls(jf) - i012         ! j-position of the sent lines (from bottom of sent lines)
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+               DO jj = 1, ipjfld(jf)
+                  ij1 = ij1 + 1
+                  ij2 = jj + ijsht
+                  DO ji = 1, Ni_0          ! use only inner domain
+                     ii2 = ji + ihls(jf)
+                     zbufs(ji,ij1) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+                  END DO
+                  DO ji = Ni_0+1, i0max    ! avoid sending uninitialized values and make sure we don't use it
+                     zbufs(ji,ij1) = zhuge
+                  END DO
                END DO
-            END DO
-         END DO   ;   END DO   ;   END DO
+            END DO   ;   END DO
+         END DO   ! jf
          !
          ! start waiting time measurement
          IF( ln_timing ) CALL tic_tac(.TRUE.)
@@ -136,68 +102,62 @@
          ! send the same buffer data to all neighbourgs as soon as possible
          DO jn = 1, nfd_nbnei
             iproc = nfd_rknei(jn)
-            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN
+            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN   ! it is neither me nor a land-only neighbourg
 #if ! defined key_mpi_off
                CALL MPI_Isend( zbufs, ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_s(jn), ierr )
 #endif
             ELSE
-               ireq_s(jn) = MPI_REQUEST_NULL
+               ireq_s(jn) = MPI_REQUEST_NULL   ! must be defined for mpi_waitall
             ENDIF
          END DO
          !
-         ALLOCATE( zbufr(i0max,ipjtot,ipk,ipl,nfd_nbnei), ireq_r(nfd_nbnei) ) 
+         ALLOCATE( zbufr(i0max,ilntot,nfd_nbnei), ireq_r(nfd_nbnei) ) 
          !
-         DO jn = 1, nfd_nbnei
-            !
+         DO jn = 1, nfd_nbnei                  ! 1st loop: first get data which does not need any communication
+            !                                  !           -> this gives more time to receive the communications
             iproc = nfd_rknei(jn)
             !
-            IF(           iproc == -1 ) THEN   ! No neighbour (land proc that was suppressed)
+            IF(           iproc == -1 ) THEN   ! No neighbour (land-only neighbourg that was suppressed)
                !
-               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received
-               zbufr(:,:,:,:,jn) = HUGE(0._/**/PRECISION)   ! default: define it and make sure we don't use it...
+               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received, must be defined for mpi_waitall
                SELECT CASE ( kfillmode )
                CASE ( jpfillnothing )                       ! no filling 
-               CASE ( jpfillcopy    )                       ! filling with inner domain values
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipjfld(jf)
-                        ij1 = ijbuf(jj,jf)
-                        ij2 = ijsnd(jj,jf)                                      ! we will use only the first value, see init_nfdcom
-                        zbufr(1,ij1,jk,jl,jn) = ptab(jf)%pt4d(Nis0,ij2,jk,jl)   ! chose to take the 1st inner domain point
-                     END DO
-                  END DO   ;   END DO   ;   END DO
+               CASE ( jpfillcopy    )                       ! filling with my inner domain values
+                  !                                            ! trick: we use only the 1st value, see init_nfdcom
+                  zbufr(1,:,jn) = zbufs(1,:)                   ! chose to take the 1st inner domain point
                CASE ( jpfillcst     )                       ! filling with constant value
-                  zbufr(1,:,:,:,jn) = pfillval              ! we will use only the first value, see init_nfdcom
+                  zbufr(1,:,jn) = pfillval                     ! trick: we use only the 1st value, see init_nfdcom
                END SELECT
                !
-            ELSE IF( iproc == narea-1 ) THEN   ! get data from myself!
+            ELSE IF( iproc == narea-1 ) THEN   ! I get data from myself!
                !
-               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received
-               DO jf = 1, ipf   ;   DO jl = 1, ipl  ;   DO jk = 1, ipk
-                  DO jj = 1, ipjfld(jf)
-                     ij1 = ijbuf(jj,jf)
-                     ij2 = ijsnd(jj,jf)
-                     DO ji = Nis0, Nie0                     ! should not use any other value
-                        iib = ji - Nis0 + 1
-                        zbufr(iib,ij1,jk,jl,jn) = ptab(jf)%pt4d(ji,ij2,jk,jl)
-                     END DO
-                  END DO
-               END DO   ;   END DO   ;   END DO
+               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received, must be defined for mpi_waitall
+               zbufr(:,:,jn) = zbufs(:,:)                      ! we can directly do: received buffer = sent buffer!
                !
-            ELSE                               ! get data from a neighbour trough communication
+            ENDIF
+            !
+         END DO   ! nfd_nbnei
+         !
+         DO jn = 1, nfd_nbnei                  ! 2nd loop: now get data from a neighbour trough communication
+            !
+            iproc = nfd_rknei(jn)
+            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN   ! it is neither me nor a land-only neighbourg
 #if ! defined key_mpi_off
-               CALL MPI_Irecv( zbufr(:,:,:,:,jn), ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_r(jn), ierr )
+               CALL MPI_Irecv( zbufr(:,:,jn), ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_r(jn), ierr )
 #endif
             ENDIF
-            !
          END DO   ! nfd_nbnei
          !
+#if ! defined key_mpi_off
          CALL mpi_waitall(nfd_nbnei, ireq_r, MPI_STATUSES_IGNORE, ierr)   ! wait for all Irecv
+#endif
          !
          IF( ln_timing ) CALL tic_tac(.FALSE.)
          !
-         ! North fold boundary condition
+         ! Apply the North pole folding
          !
-         DO jf = 1, ipf
+         ij2 = 0
+         DO jf = 1, kfld
             !
             SELECT CASE ( cd_nat(jf) )     ! which grid number?
             CASE ('T','W')   ;   iig = 1   ! T-, W-point
@@ -206,76 +166,42 @@
             CASE ('F')       ;   iig = 4   ! F-point
             END SELECT
             !
-            DO jl = 1, ipl   ;   DO jk = 1, ipk
-               !
-               ! if T point with F-point pivot : must be done first
-               !    --> specific correction of 3 points near the 2 pivots (to be clean, usually masked -> so useless) 
-               IF( c_NFtype == 'F' .AND. iig == 1 ) THEN
-                  ij1 = jpj - khls     ! j-index in the receiving array
-                  ij2 = 1              ! only 1 line in the buffer
-                  DO ji = mi0(khls), mi1(khls)               ! change because of EW periodicity as we also change jpiglo-khls
-                     iib = nfd_jisnd(mi0(       khls),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0(       khls),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-                  DO ji = mi0(jpiglo/2+1), mi1(jpiglo/2+1)
-                     iib = nfd_jisnd(mi0( jpiglo/2+1),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0( jpiglo/2+1),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-                  DO ji = mi0(jpiglo-khls), mi1(jpiglo-khls)
-                     iib = nfd_jisnd(mi0(jpiglo-khls),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0(jpiglo-khls),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-               ENDIF
+            ihsz = ihls(jf)   ! shorter name
+            iisht = nn_hls - ihsz
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
                !
-               ! Apply the North pole folding.
-               DO jj = 1, ipjfld(jf)   ! for all lines to be exchanged for this field
-                  ij1 = ijrcv(jj,jf)   ! j-index in the receiving array
-                  ij2 = ijbuf(jj,jf)   ! j-index in the buffer
-                  iis = ii1st(jj,jf)   ! stating i-index in the receiving array
-                  iie = iiend(jj,jf)   !  ending i-index in the receiving array
-                  DO ji = iis, iie 
-                     iib = nfd_jisnd(ji,iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(ji,iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(iib,ij2,jk,jl,iin)
+               DO jj = 1,ihsz                        ! NP folding for the last ihls(jf) lines of this field
+                  ij1 = ipj(jf) - jj + 1             ! j-index in the receiving array (from the top -> reverse order for jj)
+                  ij2 = ij2 + 1
+                  ij3 = ihsz+1  - jj + 1
+                  DO ji = 1, ipi(jf)
+                     ii1 = ji + iisht
+                     inei = nfd_rksnd(ii1,ij3,iig)       ! neigbhour-index in the buffer
+                     IF( nfd_rknei(inei) == -1 .AND. kfillmode == jpfillnothing )   CYCLE   ! no neighbourg and do nothing to fill
+                     ii2 = nfd_jisnd(ii1,ij3,iig)        ! i-index in the buffer, starts at 1 in the inner domain
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(ii2,ij2,inei)
                   END DO
                END DO
-               !
-               ! re-apply periodocity when we modified the eastern side of the inner domain (and not the full line)
-               IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot
-                  IF(     iig <= 2 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls)   ! 'T','W','U': update west halo
-                  ELSE                      ;   iis = 1        ;   iie = 0           ! 'V','F'    : full line already exchanged
-                  ENDIF
-               ENDIF
-               IF( c_NFtype == 'F' ) THEN          ! *  North fold  F-point pivot
-                  IF(     iig <= 2 ) THEN   ;   iis = 1        ;   iie = 0           ! 'T','W','U': nothing to do
-                  ELSEIF( iig == 3 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls)   ! 'V'        : update west halo
-                  ELSEIF( khls > 1 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls-1) ! 'F' and khls > 1
-                  ELSE                      ;   iis = 1        ;   iie = 0           ! 'F' and khls == 1 : nothing to do
-                  ENDIF
-               ENDIF
-               jj  = ipjfld(jf)     ! only for the last line of this field
-               ij1 = ijrcv(jj,jf)   ! j-index in the receiving array
-               ij2 = ijbuf(jj,jf)   ! j-index in the buffer
-               DO ji = iis, iie
-                  iib = nfd_jisnd(ji,iig)   ! i-index in the buffer
-                  iin = nfd_rksnd(ji,iig)   ! neigbhour-index in the buffer
-                  IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                  ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(iib,ij2,jk,jl,iin)
+               DO jj = ihsz+1, ipjfld(jf)            ! NP folding for line ipj-ihsz that can be partially modified
+                  ij1 = ipj(jf) - jj + 1             ! j-index in the receiving array (from the top -> reverse order for jj)
+                  ij2 = ij2 + 1
+                  ij3 = 1
+                  DO ji = 1, ipi(jf)
+                     ii1 = ji + iisht
+                     IF( lnfd_same(ii1,iig) )   CYCLE    ! do nothing if should not be modified
+                     inei = nfd_rksnd(ii1,ij3,iig)       ! neigbhour-index in the buffer
+                     IF( nfd_rknei(inei) == -1 .AND. kfillmode == jpfillnothing )   CYCLE   ! no neighbourg and do nothing to fill
+                     ii2 = nfd_jisnd(ii1,ij3,iig)        ! i-index in the buffer, starts at 1 in the inner domain
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(ii2,ij2,inei)
+                  END DO
                END DO
                !               
-            END DO   ;   END DO   ! ipl   ; ipk
+            END DO   ;   END DO   ! jk   ;   jl
             !               
-         END DO   ! ipf
-       
+         END DO   ! jf
          !
-         DEALLOCATE( zbufr, ireq_r, ijsnd, ijbuf, ijrcv, ii1st, iiend, ipjfld )
+         DEALLOCATE( zbufr, ireq_r, ipjfld )
          !
          CALL mpi_waitall(nfd_nbnei, ireq_s, MPI_STATUSES_IGNORE, ierr)   ! wait for all Isend
          !
@@ -283,114 +209,126 @@
          !
       ELSE                             !==  allgather exchanges  ==!
          !
-         ! how many lines do we exchange at max? -> ipj    (no further optimizations in this case...)
-         ipj =      khls + 2
-         ! how many lines do we     need at max? -> ipj2   (no further optimizations in this case...)
-         ipj2 = 2 * khls + 2
+         DO jf = 1, kfld
+            ! how many lines do we send for each field?
+            ipj1(jf) =     ihls(jf) + COUNT( (/ c_NFtype == 'T'  .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )
+            ! how many lines do we need for each field?
+            ipj2(jf) = 2 * ihls(jf) + COUNT( (/ c_NFtype == 'T' /) ) + COUNT( (/ cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )
+         END DO
          !
-         i0max = jpimax - 2 * khls
-         ibuffsize = i0max * ipj * ipk * ipl * ipf
-         ALLOCATE( znorthloc(i0max,ipj,ipk,ipl,ipf), znorthglo(i0max,ipj,ipk,ipl,ipf,ndim_rank_north) )
+         i0max = MAXVAL( nfni_0, mask = nfproc /= -1 )           ! largest value of Ni_0 among processors (we are not sending halos)
+         ibuffsize = i0max * SUM( ipj1(:) * ipk(:) * ipl(:) )    ! use i0max because each proc must have the same buffer size
+         ALLOCATE( znorthloc(i0max, ibuffsize/i0max), znorthall(i0max, ibuffsize/i0max, ndim_rank_north) )
          !
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk               ! put in znorthloc ipj j-lines of ptab
-            DO jj = 1, ipj
-               ij2 = jpj - ipj2 + jj                        ! the first ipj lines of the last ipj2 lines
+         ij1 = 0                                                 ! initalize line index
+         DO jf = 1, kfld   ;   DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+            DO jj = 1, ipj1(jf)                                  ! put in znorthloc ipj1(jf) j-lines of ptab
+               ij2 = ipj(jf) - ipj2(jf) + jj                     ! the first ipj1 lines of the last ipj2 lines
+               ij1 = ij1 + 1
                DO ji = 1, Ni_0
-                  ii2 = Nis0 - 1 + ji                       ! inner domain: Nis0 to Nie0
-                  znorthloc(ji,jj,jk,jl,jf) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+                  ii2 = ihls(jf) + ji                            ! copy only the inner domain
+                  znorthloc(ji,ij1) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
                END DO
-               DO ji = Ni_0+1, i0max
-                  znorthloc(ji,jj,jk,jl,jf) = HUGE(0._/**/PRECISION)   ! avoid sending uninitialized values (make sure we don't use it)
+               DO ji = Ni_0+1, i0max                             ! avoid to send uninitialized values
+                  znorthloc(ji,ij1) = zhuge                      ! and make sure we don't use it
                END DO
             END DO
          END DO   ;   END DO   ;   END DO
          !
          ! start waiting time measurement
-         IF( ln_timing ) CALL tic_tac(.TRUE.)
 #if ! defined key_mpi_off
-         CALL MPI_ALLGATHER( znorthloc, ibuffsize, MPI_TYPE, znorthglo, ibuffsize, MPI_TYPE, ncomm_north, ierr )
+         IF( ln_timing )   CALL tic_tac( .TRUE.)   ! start waiting time measurement
+         ! fill znorthall with the znorthloc of each northern process
+         CALL MPI_ALLGATHER( znorthloc, ibuffsize, MPI_TYPE, znorthall, ibuffsize, MPI_TYPE, ncomm_north, ierr )
+         IF( ln_timing )   CALL tic_tac(.FALSE.)   ! stop waiting time measurement
 #endif
-         ! stop waiting time measurement
-         IF( ln_timing ) CALL tic_tac(.FALSE.)
-         DEALLOCATE( znorthloc )
-         ALLOCATE( ztabglo(ipf) )
-         DO jf = 1, ipf
-            ALLOCATE( ztabglo(jf)%pt4d(jpiglo,ipj2,ipk,ipl) )
-         END DO
+         DEALLOCATE( znorthloc )                                 ! no more need of znorthloc
          !
-         ! need to fill only the first ipj lines of ztabglo as lbc_nfd don't use the last khls lines
-         ijnr = 0
-         DO jr = 1, jpni                                                        ! recover the global north array
-            iproc = nfproc(jr)
-            impp  = nfimpp(jr)
-            ipi   = nfjpi( jr) - 2 * khls                       ! corresponds to Ni_0 but for subdomain iproc
-            IF( iproc == -1 ) THEN   ! No neighbour (land proc that was suppressed)
-              !
-               SELECT CASE ( kfillmode )
-               CASE ( jpfillnothing )               ! no filling
-                  CALL ctl_stop( 'STOP', 'mpp_nfd_generic : cannot use jpfillnothing with ln_nnogather = F')
-               CASE ( jpfillcopy    )               ! filling with inner domain values
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipj
-                        ij2 = jpj - ipj2 + jj                    ! the first ipj lines of the last ipj2 lines
-                        DO ji = 1, ipi
-                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc
-                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(Nis0,ij2,jk,jl) ! chose to take the 1st inner domain point
+         DO jf = 1, kfld
+            !
+            ihsz = ihls(jf)   ! shorter name
+            iisht = nn_hls - ihsz
+            ALLOCATE( ztabglo(1)%pt4d(Ni0glo+2*ihsz,ipj2(jf),ipk(jf),ipl(jf)) )
+            !
+            iF_TU = COUNT( (/ c_NFtype == 'F' .AND. ( cd_nat(jf) == 'U' .OR. cd_nat(jf) == 'T' ) /) )   ! F-folding and T or U grid
+            IF( iF_TU == 0 )   ztabglo(1)%pt4d(:,ipj2(jf)-ihsz,:,:) = zhuge   ! flag off the line that is not fully modified
+            !
+            ! need to fill only the first ipj1(j) lines of ztabglo as lbc_nfd don't use the last ihsz lines
+            ijnr = 0
+            DO jr = 1, jpni                                      ! recover the global north array using each northern process
+               iproc = nfproc(jr)                                ! process number
+               impp  = nfimpp(jr) + ihsz   ! ( = +nn_hls-iisht)  ! inner domain position (without halos) of subdomain iproc 
+               ipi0  = nfni_0(jr)                                ! Ni_0 but for subdomain iproc
+               !
+               IF( iproc == -1 ) THEN                  ! No neighbour (land proc that was suppressed)
+                  !
+                  SELECT CASE ( kfillmode )
+                  CASE ( jpfillnothing )               ! no filling
+                     CALL ctl_stop( 'STOP', 'mpp_nfd_generic : cannot use jpfillnothing with ln_nnogather = F')
+                  CASE ( jpfillcopy    )               ! filling with inner domain values
+                     DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                        DO jj = 1, ipj1(jf)
+                           ij2 = ipj(jf) - ipj2(jf) + jj     ! the first ipj1(jf) lines of the last ipj2(jf) lines
+                           DO ji = 1, ipi0
+                              ii1 = impp + ji - 1            ! inner iproc-subdomain in the global domain with ihsz halos
+                              ztabglo(1)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(ihsz+1,ij2,jk,jl) ! take the 1st inner domain point
+                           END DO
                         END DO
-                     END DO
-                  END DO   ;   END DO   ;   END DO
-               CASE ( jpfillcst     )               ! filling with constant value
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipj
-                        DO ji = 1, ipi
-                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc
-                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = pfillval
+                     END DO   ;   END DO
+                  CASE ( jpfillcst     )               ! filling with constant value
+                     DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                        DO jj = 1, ipj1(jf)
+                           DO ji = 1, ipi0
+                              ii1 = impp + ji - 1            ! inner iproc-subdomain in the global domain with ihsz halos
+                              ztabglo(1)%pt4d(ii1,jj,jk,jl) = pfillval
+                           END DO
+                        END DO
+                     END DO   ;   END DO
+                  END SELECT
+                  !
+               ELSE                                    ! use neighbour values
+                  ijnr = ijnr + 1
+                  ij1 = SUM( ipj1(1:jf-1) * ipk(1:jf-1) * ipl(1:jf-1) )   ! reset line offset, return 0 if jf = 1
+                  DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                     DO jj = 1, ipj1(jf)
+                        ij1 = ij1 + 1
+                        DO ji = 1, ipi0
+                           ii1 = impp + ji - 1               ! inner iproc-subdomain in the global domain with ihsz halos
+                           ztabglo(1)%pt4d(ii1,jj,jk,jl) = znorthall(ji, ij1, ijnr)
                         END DO
                      END DO
-                 END DO   ;   END DO   ;   END DO
-               END SELECT
+                  END DO   ;   END DO
+               ENDIF
                !
-            ELSE
-               ijnr = ijnr + 1
-               DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                  DO jj = 1, ipj
-                     DO ji = 1, ipi
-                        ii1 = impp + khls + ji - 1               ! corresponds to mig(khls + ji) but for subdomain iproc
-                        ztabglo(jf)%pt4d(ii1,jj,jk,jl) = znorthglo(ji,jj,jk,jl,jf,ijnr)
-                     END DO
-                  END DO
-               END DO   ;   END DO   ;   END DO
-            ENDIF
+            END DO   ! jpni
             !
-         END DO   ! jpni
-         DEALLOCATE( znorthglo )
-         !
-         DO jf = 1, ipf
-            CALL lbc_nfd( ztabglo(jf:jf), cd_nat(jf:jf), psgn(jf:jf), khls, 1 )   ! North fold boundary condition
-            DO jl = 1, ipl   ;   DO jk = 1, ipk                  ! e-w periodicity
-               DO jj = 1, khls + 1
-                  ij1 = ipj2 - (khls + 1) + jj                   ! need only the last khls + 1 lines until ipj2
-                  ztabglo(jf)%pt4d(            1:  khls,ij1,jk,jl) = ztabglo(jf)%pt4d(jpiglo-2*khls+1:jpiglo-khls,ij1,jk,jl)
-                  ztabglo(jf)%pt4d(jpiglo-khls+1:jpiglo,ij1,jk,jl) = ztabglo(jf)%pt4d(         khls+1:     2*khls,ij1,jk,jl)
+            CALL lbc_nfd( ztabglo, cd_nat(jf:jf), psgn(jf:jf), 1 )   ! North fold boundary condition
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)               ! Scatter back to ARRAY_IN
+               DO jj = 0, ihsz-1
+                  ij1 = ipj( jf) - jj   ! last ihsz lines
+                  ij2 = ipj2(jf) - jj   ! last ihsz lines
+                  DO ji= 1, ipi(jf)
+                     ii2 = mig(ji+iisht,ihsz)            ! warning, mig is expecting local domain indices related to nn_hls
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = ztabglo(1)%pt4d(ii2,ij2,jk,jl)
+                  END DO
                END DO
-            END DO   ;   END DO
-         END DO     
-         !
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk               ! Scatter back to ARRAY_IN
-            DO jj = 1, khls + 1
-               ij1 = jpj  - (khls + 1) + jj   ! last khls + 1 lines until jpj
-               ij2 = ipj2 - (khls + 1) + jj   ! last khls + 1 lines until ipj2
-               DO ji= 1, jpi
-                  ii2 = mig(ji)
-                  ptab(jf)%pt4d(ji,ij1,jk,jl) = ztabglo(jf)%pt4d(ii2,ij2,jk,jl)
+               DO jj = ihsz, ihsz - iF_TU
+                  ij1 = ipj( jf) - jj   ! last ihsz+1 line
+                  ij2 = ipj2(jf) - jj   ! last ihsz+1 line
+                  DO ji= 1, ipi(jf)
+                     ii2 = mig(ji+iisht,ihsz)            ! warning, mig is expecting local domain indices related to nn_hls
+                     zztmp = ztabglo(1)%pt4d(ii2,ij2,jk,jl)
+                     IF( zztmp /= zhuge )   ptab(jf)%pt4d(ji,ij1,jk,jl) = zztmp   ! apply it only if it was modified by lbc_nfd
+                  END DO
                END DO
-            END DO
-         END DO   ;   END DO   ;   END DO
+            END DO   ;   END DO
+            !
+            DEALLOCATE( ztabglo(1)%pt4d )
+            !
+         END DO   ! jf
          !
-         DO jf = 1, ipf
-            DEALLOCATE( ztabglo(jf)%pt4d )
-         END DO
-         DEALLOCATE( ztabglo )
+         DEALLOCATE( znorthall )
          !
       ENDIF   ! ln_nnogather
       !
diff --git a/src/OCE/LBC/mppini.F90 b/src/OCE/LBC/mppini.F90
index 7af3c0fe..3e335b8f 100644
--- a/src/OCE/LBC/mppini.F90
+++ b/src/OCE/LBC/mppini.F90
@@ -73,7 +73,8 @@ CONTAINS
       jpi     = jpiglo
       jpj     = jpjglo
       jpk     = MAX( 2, jpkglo )
-      jpij    = jpi*jpj
+      !jpij   = jpi*jpj
+      jpij    = Ni0glo*Nj0glo
       jpni    = 1
       jpnj    = 1
       jpnij   = jpni*jpnj
@@ -169,6 +170,10 @@ CONTAINS
 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nammpp in configuration namelist' )
       !
       nn_hls = MAX(1, nn_hls)   ! nn_hls must be > 0
+# if defined key_mpi2
+      WRITE(numout,*) '   use key_mpi2, we force nn_comm = 1'
+      nn_comm = 1
+# endif
       IF(lwp) THEN
             WRITE(numout,*) '   Namelist nammpp'
          IF( jpni < 1 .OR. jpnj < 1 ) THEN
@@ -307,7 +312,7 @@ CONTAINS
 9002  FORMAT (a, i4, a)
 9003  FORMAT (a, i5)
 
-      ALLOCATE( nfimpp(jpni), nfproc(jpni), nfjpi(jpni),   &
+      ALLOCATE( nfimpp(jpni), nfproc(jpni), nfjpi(jpni), nfni_0(jpni),   &
          &      iin(jpnij), ijn(jpnij),   &
          &      iimppt(jpni,jpnj), ijmppt(jpni,jpnj), ijpi(jpni,jpnj), ijpj(jpni,jpnj), ipproc(jpni,jpnj),   &
          &      inei(8,jpni,jpnj), llnei(8,jpni,jpnj),   &
@@ -331,7 +336,8 @@ CONTAINS
       jpi   = ijpi(ii,ij)
       jpj   = ijpj(ii,ij)
       jpk   = MAX( 2, jpkglo )
-      jpij  = jpi*jpj
+      !jpij = jpi*jpj
+      jpij  = (jpi-2*nn_hls)*(jpj-2*nn_hls)
       nimpp = iimppt(ii,ij)
       njmpp = ijmppt(ii,ij)
       !
@@ -379,7 +385,8 @@ CONTAINS
       ! Store informations for the north pole folding communications
       nfproc(:) = ipproc(:,jpnj)
       nfimpp(:) = iimppt(:,jpnj)
-      nfjpi (:) =   ijpi(:,jpnj)
+      nfjpi (:) =   ijpi(:,jpnj)   ! needed only for mpp_lbc_north_icb_generic.h90
+      nfni_0(:) =   ijpi(:,jpnj) - 2 * nn_hls
       !
       ! 3. Define Western, Eastern, Southern and Northern neighbors + corners in the subdomain grid reference
       ! ------------------------------------------------------------------------------------------------------
@@ -493,7 +500,9 @@ CONTAINS
       ! -----------------------------------------
       !
       ! set default neighbours
-      mpinei(:) = impi(:,narea)
+      mpinei(:) = impi(:,narea)   ! should be just local but is still used in icblbc and mpp_lnk_icb_generic.h90...
+      mpiSnei(0,:) = -1           ! no comm if no halo (but still need to call the NP Folding that may modify the last line)
+      mpiRnei(0,:) = -1 
       DO jh = 1, n_hlsmax
          mpiSnei(jh,:) = impi(:,narea)   ! default definition
          mpiRnei(jh,:) = impi(:,narea)
@@ -520,6 +529,7 @@ CONTAINS
       !
       !                          ! Prepare mpp north fold
       !
+      l_NFold = l_NFold .AND. ANY( nfproc /= -1 )             ! make sure that we kept at least 1 proc along the last line
       llmpiNFold =          jpni  > 1 .AND. l_NFold           ! is the North fold done with an MPI communication?
       l_IdoNFold = ijn(narea) == jpnj .AND. l_NFold           ! is this process doing North fold?
       !
@@ -1203,7 +1213,7 @@ CONTAINS
          !
          ALLOCATE( zmsk0(ipi,ipj), zmsk(ipi,ipj) )
          zmsk0(jh+1:jh+Ni_0,jh+1:jh+Nj_0) = REAL(COUNT(lloce, dim = 3), wp)   ! define inner domain -> need REAL to use lbclnk
-         CALL lbc_lnk('mppini', zmsk0, 'T', 1._wp, khls = jh)                 ! fill halos
+         CALL lbc_lnk( ' mppini', zmsk0, 'T', 1._wp )                         ! fill halos
          ! Beware about the mask we must use here :
          DO jj = jh+1, jh+Nj_0
             DO ji = jh+1, jh+Ni_0
@@ -1216,7 +1226,7 @@ CONTAINS
                   &        + zmsk0(ji+1,jj) + zmsk0(ji,jj+1) + zmsk0(ji+1,jj+1)
             END DO
          END DO
-         CALL lbc_lnk('mppini', zmsk, 'T', 1._wp, khls = jh)                 ! fill halos again!
+         CALL lbc_lnk( 'mppini', zmsk, 'T', 1._wp )                           ! fill halos again!
          !        
          iiwe = jh   ;   iiea = Ni_0   ! bottom-left corner - 1 of the sent data
          ijso = jh   ;   ijno = Nj_0
@@ -1289,7 +1299,7 @@ ENDIF
       ! used in IOM. This works even if jpnij .ne. jpni*jpnj.
       iglo( :) = (/ Ni0glo, Nj0glo /)
       iloc( :) = (/ Ni_0  , Nj_0   /)
-      iabsf(:) = (/ Nis0  , Njs0   /) + (/ nimpp, njmpp /) - 1 - nn_hls   ! corresponds to mig0(Nis0) but mig0 is not yet defined!
+      iabsf(:) = (/ Nis0  , Njs0   /) + (/ nimpp, njmpp /) - 1 - nn_hls   ! corresponds to mig(Nis0,0) but mig is not yet defined!
       iabsl(:) = iabsf(:) + iloc(:) - 1
       ihals(:) = (/ 0     , 0      /)
       ihale(:) = (/ 0     , 0      /)
@@ -1324,10 +1334,10 @@ ENDIF
       INTEGER, INTENT(in   ) ::   knum       ! layout.dat unit
       !
       REAL(wp), DIMENSION(jpi,jpj,2,4) ::   zinfo
-      INTEGER , DIMENSION(10) ::   irknei ! too many elements but safe...
+      INTEGER , DIMENSION(0:10) ::   irknei ! too many elements but safe...
       INTEGER                 ::   ji, jj, jg, jn   ! dummy loop indices
       INTEGER                 ::   iitmp
-      LOGICAL                 ::   lnew
+      LOGICAL                 ::   llnew
       !!----------------------------------------------------------------------
       !
       IF (lwp) THEN
@@ -1341,29 +1351,28 @@ ENDIF
          WRITE(knum,*)
          WRITE(knum,*)
          WRITE(knum,*) 'Number of subdomains located along the north fold : ', ndim_rank_north
-         WRITE(knum,*) 'Rank of the subdomains located along the north fold : ', ndim_rank_north
+         WRITE(knum,*) 'Rank of the subdomains located along the north fold : '
          DO jn = 1, ndim_rank_north, 5
             WRITE(knum,*) nrank_north( jn:MINVAL( (/jn+4,ndim_rank_north/) ) )
          END DO
       ENDIF
       
-      nfd_nbnei = 0   ! defaul def (useless?)
+      nfd_nbnei = 0   ! default def (useless?)
       IF( ln_nnogather ) THEN
          !
          ! Use the "gather nfd" to know how to do the nfd: for ji point, which process send data from which of its ji-index?
          ! Note that nfd is perfectly symetric: I receive data from X <=> I send data to X  (-> no deadlock)
          !
-         zinfo(:,:,:,:) = HUGE(0._wp)   ! default def to make sure we don't use the halos
-         DO jg = 1, 4   ! grid type: T, U, V, F
+         DO jg = 1, 4                                   ! grid type: T, U, V, F
             DO jj = nn_hls+1, jpj-nn_hls                ! inner domain (warning do_loop_substitute not yet defined)
                DO ji = nn_hls+1, jpi-nn_hls             ! inner domain (warning do_loop_substitute not yet defined)
-                  zinfo(ji,jj,1,jg) = REAL(narea, wp)   ! mpi_rank + 1 (as default lbc_lnk fill is 0
+                  zinfo(ji,jj,1,jg) = REAL(narea, wp)   ! mpi_rank + 1 (note: lbc_lnk will put 0 if no neighbour)
                   zinfo(ji,jj,2,jg) = REAL(ji, wp)      ! ji of this proc
                END DO
             END DO
          END DO
          !
-         ln_nnogather = .FALSE.   ! force "classical" North pole folding to fill all halos -> should be no more HUGE values...
+         ln_nnogather = .FALSE.   ! force "classical" North pole folding to fill all halos
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,1), 'T', 1._wp )   ! Do 4 calls instead of 1 to save memory as the nogather version
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,2), 'U', 1._wp )   ! creates buffer arrays with jpiglo as the first dimension
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,3), 'V', 1._wp )   ! 
@@ -1372,24 +1381,52 @@ ENDIF
          
          IF( l_IdoNFold ) THEN   ! only the procs involed in the NFD must take care of this
             
-            ALLOCATE( nfd_rksnd(jpi,4), nfd_jisnd(jpi,4) )          ! neighbour rand and remote ji-index for each grid (T, U, V, F)
-            nfd_rksnd(:,:) = NINT( zinfo(:, jpj, 1, :) ) - 1        ! neighbour MPI rank
-            nfd_jisnd(:,:) = NINT( zinfo(:, jpj, 2, :) ) - nn_hls   ! neighbour ji index (shifted as we don't send the halos)
-            WHERE( nfd_rksnd == -1 )   nfd_jisnd = 1                ! use ji=1 if no neighbour, see mpp_nfd_generic.h90
-            
-            nfd_nbnei = 1                ! Number of neighbour sending data for the nfd. We have at least 1 neighbour!
-            irknei(1) = nfd_rksnd(1,1)   ! which is the 1st one (I can be neighbour of myself, exclude land-proc are also ok)
+            ALLOCATE( nfd_rksnd(jpi,nn_hls+1,4), nfd_jisnd(jpi,nn_hls+1,4), lnfd_same(jpi,4) )
+            nfd_rksnd(:,:,:) = NINT( zinfo(:,jpj-nn_hls:jpj,1,:) ) - 1        ! neighbour MPI rank (-1 means no neighbour)
+            ! Use some tricks for mpp_nfd_generic.h90:
+            !    1) neighbour ji index (shifted as we don't send the halos)
+            nfd_jisnd(:,:,:) = NINT( zinfo(:,jpj-nn_hls:jpj,2,:) ) - nn_hls
+            !    2) use ji=1 if no neighbour
+            WHERE( nfd_rksnd == -1 )   nfd_jisnd = 1
+            !    3) control which points must be modified by the NP folding on line jpjglo-nn_hls
+            lnfd_same(:,:) = .TRUE.
+            IF(     c_NFtype == 'T' ) THEN
+               lnfd_same(mi0(jpiglo/2+2,nn_hls):mi1(jpiglo-nn_hls,nn_hls),  1) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1,nn_hls):mi1(jpiglo-nn_hls,nn_hls),  2) = .FALSE.
+               lnfd_same(mi0(  nn_hls+1,nn_hls):mi1(jpiglo-nn_hls,nn_hls),3:4) = .FALSE.
+               IF( l_Iperio ) THEN   ! in case the ew-periodicity was done before calling the NP folding
+                  lnfd_same(mi0(              1,nn_hls):mi1(nn_hls,nn_hls),1:4) = .FALSE.
+                  lnfd_same(mi0(jpiglo-nn_hls+1,nn_hls):mi1(jpiglo,nn_hls),3:4) = .FALSE.
+               ENDIF
+            ELSEIF( c_NFtype == 'F' ) THEN
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo/2+1     ,nn_hls),1) = .FALSE.
+               lnfd_same(mi0(jpiglo-nn_hls,nn_hls):mi1(jpiglo-nn_hls  ,nn_hls),1) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo-nn_hls  ,nn_hls),3) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo-nn_hls-1,nn_hls),4) = .FALSE.
+               IF( l_Iperio ) THEN   ! in case the ew-periodicity was done before calling the NP folding
+                  lnfd_same(mi0(nn_hls,nn_hls):mi1(nn_hls  ,nn_hls),1) = .FALSE.
+                  lnfd_same(mi0(     1,nn_hls):mi1(nn_hls  ,nn_hls),3) = .FALSE.
+                  IF( nn_hls > 1 ) lnfd_same(mi0(     1,nn_hls):mi1(nn_hls-1,nn_hls),4) = .FALSE.
+               ENDIF
+            ENDIF
+            WHERE( lnfd_same )   nfd_jisnd(:,1,:) = HUGE(0)   ! make sure we dont use it
+               
+            nfd_nbnei = 0
+            irknei(0) = HUGE(0)
             DO jg = 1, 4
-               DO ji = 1, jpi     ! we must be able to fill the full line including halos
-                  lnew = .TRUE.   ! new neighbour?
-                  DO jn = 1, nfd_nbnei
-                     IF( irknei(jn) == nfd_rksnd(ji,jg) )   lnew = .FALSE.   ! already found
+               DO jj = 1, nn_hls+1
+                  DO ji = 1, jpi     ! we must be able to fill the full line including halos
+                     IF( jj == 1 .AND. lnfd_same(ji,jg) )   CYCLE
+                     llnew = .TRUE.   ! new neighbour?
+                     DO jn = 0, nfd_nbnei
+                        IF( irknei(jn) == nfd_rksnd(ji,jj,jg) )   llnew = .FALSE.   ! already found
+                     END DO
+                     IF( llnew ) THEN
+                        jn = nfd_nbnei + 1
+                        nfd_nbnei = jn
+                        irknei(jn) = nfd_rksnd(ji,jj,jg)
+                     ENDIF
                   END DO
-                  IF( lnew ) THEN
-                     jn = nfd_nbnei + 1
-                     nfd_nbnei = jn
-                     irknei(jn) = nfd_rksnd(ji,jg)
-                  ENDIF
                END DO
             END DO
             
@@ -1397,14 +1434,20 @@ ENDIF
             nfd_rknei(:) = irknei(1:nfd_nbnei)
             ! re-number nfd_rksnd according to the indexes of nfd_rknei
             DO jg = 1, 4
-               DO ji = 1, jpi
-                  iitmp = nfd_rksnd(ji,jg)   ! must store a copy of nfd_rksnd(ji,jg) to make sure we don't change it twice
-                  DO jn = 1, nfd_nbnei
-                     IF( iitmp == nfd_rknei(jn) )   nfd_rksnd(ji,jg) = jn
+               DO jj = 1, nn_hls+1
+                  DO ji = 1, jpi
+                     IF( jj == 1 .AND. lnfd_same(ji,jg) ) THEN
+                        nfd_rksnd(ji,jj,jg) = HUGE(0)   ! make sure we don't use it
+                     ELSE
+                        iitmp = nfd_rksnd(ji,jj,jg)     ! must store a copy of nfd_rksnd(ji,jj,jg) so we don't change it twice
+                        DO jn = 1, nfd_nbnei
+                           IF( iitmp == nfd_rknei(jn) )   nfd_rksnd(ji,jj,jg) = jn
+                        END DO
+                     ENDIF
                   END DO
                END DO
             END DO
-            
+
             IF( ldwrtlay ) THEN
                WRITE(knum,*)
                WRITE(knum,*) 'north fold exchanges with explicit point-to-point messaging :'
@@ -1435,7 +1478,18 @@ ENDIF
       Ni_0 = Nie0 - Nis0 + 1
       Nj_0 = Nje0 - Njs0 + 1
       !
-      jpkm1 = jpk-1                             !   "           "
+      jpkm1 = jpk-1
+      !
+      ntile = 0                     ! Initialise "no tile" by default
+      nijtile = 1
+      ntsi = Nis0
+      ntsj = Njs0
+      ntei = Nie0
+      ntej = Nje0
+      nthl = 0
+      nthr = 0
+      nthb = 0
+      ntht = 0
       !
    END SUBROUTINE init_doloop
 
@@ -1448,38 +1502,74 @@ ENDIF
       !!
       !! ** Method  :
       !!
-      !! ** Action  : - mig , mjg : local  domain indices ==> global domain, including halos, indices
-      !!              - mig0, mjg0: local  domain indices ==> global domain, excluding halos, indices
+      !!              Local domain indices: Same values for the same point, different upper/lower bounds 
+      !!              e.g. with nn_hls = 2
+      !!                    jh = 0   x,x,3,...,jpi-2,    x,  x
+      !!                    jh = 1   x,2,3,...,jpi-2,jpi-1,  x
+      !!                    jh = 2   1,2,3,...,jpi-2,jpi-1,jpi
+      !!       
+      !!                 or jh = 0   x,x,3,...,Ni_0+2,     x,     x
+      !!                    jh = 1   x,2,3,...,Ni_0+2,Ni_0+3,     x
+      !!                    jh = 2   1,2,3,...,Ni_0+2,Ni_0+3,Ni_0+4
+      !!              
+      !!              Global domain indices: different values for the same point, all starts at 1
+      !!              e.g. with nn_hls = 2
+      !!                    jh = 0       1,2,3,              ...,jpiglo-4,       x,     x,x,x
+      !!                    jh = 1     1,2,3,       ...,jpiglo-4,jpiglo-3,jpiglo-2,     x,x
+      !!                    jh = 2   1,2,3,...,jpiglo-4,jpiglo-3,jpiglo-2,jpiglo-1,jpiglo
+      !!       
+      !!                 or jh = 0       1,2,3,            ...,Ni0glo  ,       x,       x,x,x
+      !!                    jh = 1     1,2,3,     ...,Ni0glo  ,Ni0glo+1,Ni0glo+2,       x,x
+      !!                    jh = 2   1,2,3,...,Ni0glo,Ni0glo+1,Ni0glo+2,Ni0glo+3,Ni0glo+4
+      !!                                 ^
+      !!                                 |
+      !!                                 |
+      !!                               iimpp
+      !!
+      !! ** Action  : - mig , mjg : local  domain indices ==> global domain indices
       !!              - mi0 , mi1 : global domain indices ==> local  domain indices
       !!              - mj0 , mj1   (if global point not in the local domain ==> mi0>mi1 and/or mj0>mj1)
       !!----------------------------------------------------------------------
-      INTEGER ::   ji, jj   ! dummy loop argument
+      INTEGER ::   ji, jj, jh   ! dummy loop argument
+      INTEGER ::   ipi, ipj, ipiglo, ipjglo, iimpp, ijmpp, ishft
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( mig(jpi), mjg(jpj), mig0(jpi), mjg0(jpj) )
-      ALLOCATE( mi0(jpiglo), mi1(jpiglo), mj0(jpjglo), mj1(jpjglo) )
+      ALLOCATE( mig(jpi   , 0:nn_hls), mjg(jpj   , 0:nn_hls) )
+      ALLOCATE( mi0(jpiglo, 0:nn_hls), mi1(jpiglo, 0:nn_hls), mj0(jpjglo, 0:nn_hls), mj1(jpjglo, 0:nn_hls) )
       !
-      DO ji = 1, jpi                 ! local domain indices ==> global domain indices, including halos
-        mig(ji) = ji + nimpp - 1
-      END DO
-      DO jj = 1, jpj
-        mjg(jj) = jj + njmpp - 1
-      END DO
-      !                              ! local domain indices ==> global domain indices, excluding halos
-      !
-      mig0(:) = mig(:) - nn_hls
-      mjg0(:) = mjg(:) - nn_hls
-      !                              ! global domain, including halos, indices ==> local domain indices
-      !                                   ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
-      !                                   ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
-      DO ji = 1, jpiglo
-        mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) )
-        mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi   ) )
-      END DO
-      DO jj = 1, jpjglo
-        mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) )
-        mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj   ) )
-      END DO
+      DO jh = 0, nn_hls
+         !
+         ishft  = nn_hls - jh
+         !
+         ipi    = Ni_0   + 2*jh   ;   ipj    = Nj_0   + 2*jh
+         ipiglo = Ni0glo + 2*jh   ;   ipjglo = Nj0glo + 2*jh
+         iimpp  = nimpp - ishft   ;   ijmpp  = njmpp - ishft
+         !
+         ! local domain indices ==> global domain indices, including jh halos
+         !
+         DO ji = ishft + 1, ishft + ipi
+            mig(ji,jh) = ji + iimpp - 1
+         END DO
+         !
+         DO jj = ishft + 1, ishft + ipj
+            mjg(jj,jh) = jj + ijmpp - 1
+         END DO
+         !
+         ! global domain, including jh halos, indices ==> local domain indices
+         !    return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
+         !    local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
+         !
+         DO ji = 1, ipiglo
+            mi0(ji,jh) = MAX( 1 , MIN( ji - iimpp + 1, ipi+ishft+1 ) )
+            mi1(ji,jh) = MAX( 0 , MIN( ji - iimpp + 1, ipi+ishft   ) )
+         END DO
+         !
+         DO jj = 1, ipjglo
+            mj0(jj,jh) = MAX( 1 , MIN( jj - ijmpp + 1, ipj+ishft+1 ) )
+            mj1(jj,jh) = MAX( 0 , MIN( jj - ijmpp + 1, ipj+ishft   ) )
+         END DO
+         !
+      END DO   ! jh
       !
    END SUBROUTINE init_locglo
    
diff --git a/src/OCE/LDF/ldfc1d_c2d.F90 b/src/OCE/LDF/ldfc1d_c2d.F90
index efe9c3ad..c81bb36d 100644
--- a/src/OCE/LDF/ldfc1d_c2d.F90
+++ b/src/OCE/LDF/ldfc1d_c2d.F90
@@ -31,6 +31,7 @@ MODULE ldfc1d_c2d
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: ldfc1d_c2d.F90 15014 2021-06-17 17:02:04Z smasson $
@@ -80,8 +81,8 @@ CONTAINS
             pah1(:,:,jk) = pahs1(:,:) * (  zratio + zc * ( 1._wp + TANH( - ( gdept_0(:,:,jk) - zh ) * zw) )  )
          END DO
          DO_3DS( 0, 0, 0, 0, jpkm1, 1, -1 )  ! pah2 at F-point (zdep2 is an approximation in zps-coord.)
-            zdep2 = (  gdept_0(ji,jj+1,jk) + gdept_0(ji+1,jj+1,jk)   &
-               &     + gdept_0(ji,jj  ,jk) + gdept_0(ji+1,jj  ,jk)  ) * r1_4
+            zdep2 = (  ( gdept_0(ji,jj+1,jk) + gdept_0(ji+1,jj+1,jk) )   &   ! add () for NP repro
+               &     + ( gdept_0(ji,jj  ,jk) + gdept_0(ji+1,jj  ,jk) )  ) * r1_4
             pah2(ji,jj,jk) = pahs2(ji,jj) * (  zratio + zc * ( 1._wp + TANH( - ( zdep2 - zh ) * zw) )  )
          END_3D
          CALL lbc_lnk( 'ldfc1d_c2d', pah2, 'F', 1.0_wp )   ! Lateral boundary conditions
diff --git a/src/OCE/LDF/ldfdyn.F90 b/src/OCE/LDF/ldfdyn.F90
index 92623ba0..9f9bf187 100644
--- a/src/OCE/LDF/ldfdyn.F90
+++ b/src/OCE/LDF/ldfdyn.F90
@@ -185,35 +185,25 @@ CONTAINS
          !                             ! Set nldf_dyn, the type of lateral diffusion, from ln_dynldf_... logicals
          ierr = 0
          IF( ln_dynldf_lap ) THEN         ! laplacian operator
-            IF( ln_zco ) THEN                   ! z-coordinate
-               IF ( ln_dynldf_lev )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
-               IF ( ln_dynldf_hor )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
-               IF ( ln_dynldf_iso )   nldf_dyn = np_lap_i   ! iso-neutral            (   rotation)
+            IF( l_zco .OR. l_zps ) THEN        ! z-coordinate with or without partial step
+               IF( ln_dynldf_lev )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
+               IF( ln_dynldf_hor )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
+               IF( ln_dynldf_iso )   nldf_dyn = np_lap_i   ! iso-neutral            (   rotation)
             ENDIF
-            IF( ln_zps ) THEN                   ! z-coordinate with partial step
-               IF ( ln_dynldf_lev )   nldf_dyn = np_lap     ! iso-level              (no rotation)
-               IF ( ln_dynldf_hor )   nldf_dyn = np_lap     ! iso-level              (no rotation)
-               IF ( ln_dynldf_iso )   nldf_dyn = np_lap_i   ! iso-neutral            (   rotation)
-            ENDIF
-            IF( ln_sco ) THEN                   ! s-coordinate
-               IF ( ln_dynldf_lev )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
-               IF ( ln_dynldf_hor )   nldf_dyn = np_lap_i   ! horizontal             (   rotation)
-               IF ( ln_dynldf_iso )   nldf_dyn = np_lap_i   ! iso-neutral            (   rotation)
+            IF( l_sco ) THEN                   ! s-coordinate
+               IF( ln_dynldf_lev )   nldf_dyn = np_lap     ! iso-level = horizontal (no rotation)
+               IF( ln_dynldf_hor )   nldf_dyn = np_lap_i   ! horizontal             (   rotation)
+               IF( ln_dynldf_iso )   nldf_dyn = np_lap_i   ! iso-neutral            (   rotation)
             ENDIF
          ENDIF
          !
          IF( ln_dynldf_blp ) THEN         ! bilaplacian operator
-            IF( ln_zco ) THEN                   ! z-coordinate
+            IF( l_zco .OR. l_zps ) THEN        ! z-coordinate with or without partial step
                IF( ln_dynldf_lev )   nldf_dyn = np_blp   ! iso-level = horizontal (no rotation)
                IF( ln_dynldf_hor )   nldf_dyn = np_blp   ! iso-level = horizontal (no rotation)
                IF( ln_dynldf_iso )   ierr = 2            ! iso-neutral            (   rotation)
             ENDIF
-            IF( ln_zps ) THEN                   ! z-coordinate with partial step
-               IF( ln_dynldf_lev )   nldf_dyn = np_blp   ! iso-level              (no rotation)
-               IF( ln_dynldf_hor )   nldf_dyn = np_blp   ! iso-level              (no rotation)
-               IF( ln_dynldf_iso )   ierr = 2            ! iso-neutral            (   rotation)
-            ENDIF
-            IF( ln_sco ) THEN                   ! s-coordinate
+            IF( l_sco ) THEN                   ! s-coordinate
                IF( ln_dynldf_lev )   nldf_dyn = np_blp   ! iso-level              (no rotation)
                IF( ln_dynldf_hor )   ierr = 2            ! horizontal             (   rotation)
                IF( ln_dynldf_iso )   ierr = 2            ! iso-neutral            (   rotation)
@@ -321,10 +311,10 @@ CONTAINS
             l_ldfdyn_time = .TRUE.     ! will be calculated by call to ldf_dyn routine in step.F90
             !
             !                          ! allocate arrays used in ldf_dyn. 
-            ALLOCATE( dtensq(jpi,jpj,jpk) , dshesq(jpi,jpj,jpk) , esqt(jpi,jpj) , esqf(jpi,jpj) , STAT=ierr )
+            ALLOCATE( dtensq(A2D(1),jpk) , dshesq(A2D(1),jpk) , esqt(A2D(0)) , esqf(A2D(0)) , STAT=ierr )
             IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'ldf_dyn_init: failed to allocate Smagorinsky arrays')
             !
-            DO_2D( 1, 1, 1, 1 )        ! Set local gridscale values
+            DO_2D( 0, 0, 0, 0 )        ! Set local gridscale values
                esqt(ji,jj) = ( 2._wp * e1e2t(ji,jj) / ( e1t(ji,jj) + e2t(ji,jj) ) )**2 
                esqf(ji,jj) = ( 2._wp * e1e2f(ji,jj) / ( e1f(ji,jj) + e2f(ji,jj) ) )**2 
             END_2D
@@ -419,26 +409,20 @@ CONTAINS
             !                                                                       ! of |U|L^3/16 in blp case
             DO jk = 1, jpkm1
                !
-               DO_2D( 0, 0, 0, 0 )
-                  zdb =    ( uu(ji,jj,jk,Kbb) * r1_e2u(ji,jj) -  uu(ji-1,jj,jk,Kbb) * r1_e2u(ji-1,jj) )  &
-                       &                      * r1_e1t(ji,jj) * e2t(ji,jj)                           &
-                       & - ( vv(ji,jj,jk,Kbb) * r1_e1v(ji,jj) -  vv(ji,jj-1,jk,Kbb) * r1_e1v(ji,jj-1) )  &
-                       &                      * r1_e2t(ji,jj) * e1t(ji,jj)
+               DO_2D( 0, 1, 0, 1 )
+                  zdb =   ( uu(ji,jj,jk,Kbb) * r1_e2u(ji,jj) - uu(ji-1,jj,jk,Kbb) * r1_e2u(ji-1,jj) ) * r1_e1t(ji,jj) * e2t(ji,jj) &
+                     &  - ( vv(ji,jj,jk,Kbb) * r1_e1v(ji,jj) - vv(ji,jj-1,jk,Kbb) * r1_e1v(ji,jj-1) ) * r1_e2t(ji,jj) * e1t(ji,jj)
                   dtensq(ji,jj,jk) = zdb * zdb * tmask(ji,jj,jk)
                END_2D
                !
                DO_2D( 1, 0, 1, 0 )
-                  zdb =   (  uu(ji,jj+1,jk,Kbb) * r1_e1u(ji,jj+1) -  uu(ji,jj,jk,Kbb) * r1_e1u(ji,jj) )  &
-                       &                        * r1_e2f(ji,jj)   * e1f(ji,jj)                       &
-                       & + ( vv(ji+1,jj,jk,Kbb) * r1_e2v(ji+1,jj) -  vv(ji,jj,jk,Kbb) * r1_e2v(ji,jj) )  &
-                       &                        * r1_e1f(ji,jj)   * e2f(ji,jj)
+                  zdb =   ( uu(ji,jj+1,jk,Kbb) * r1_e1u(ji,jj+1) - uu(ji,jj,jk,Kbb) * r1_e1u(ji,jj) ) * r1_e2f(ji,jj) * e1f(ji,jj) &
+                     &  + ( vv(ji+1,jj,jk,Kbb) * r1_e2v(ji+1,jj) - vv(ji,jj,jk,Kbb) * r1_e2v(ji,jj) ) * r1_e1f(ji,jj) * e2f(ji,jj)
                   dshesq(ji,jj,jk) = zdb * zdb * fmask(ji,jj,jk)
                END_2D
                !
             END DO
             !
-            CALL lbc_lnk( 'ldfdyn', dtensq, 'T', 1.0_wp )  ! lbc_lnk on dshesq not needed
-            !
             DO jk = 1, jpkm1
               !
                DO_2D( 0, 0, 0, 0 )                                   ! T-point value
@@ -447,23 +431,23 @@ CONTAINS
                   zu2pv2_ij_m1 = uu(ji-1,jj  ,jk,Kbb) * uu(ji-1,jj  ,jk,Kbb) + vv(ji  ,jj-1,jk,Kbb) * vv(ji  ,jj-1,jk,Kbb)
                   !
                   zdelta         = zcmsmag * esqt(ji,jj)                                        ! L^2 * (C_smag/pi)^2
-                  ahmt(ji,jj,jk) = zdelta * SQRT(          dtensq(ji  ,jj,jk) +                         &
-                     &                            r1_4 * ( dshesq(ji  ,jj,jk) + dshesq(ji  ,jj-1,jk) +  &
-                     &                                     dshesq(ji-1,jj,jk) + dshesq(ji-1,jj-1,jk) ) )
+                  ahmt(ji,jj,jk) = zdelta * SQRT(            dtensq(ji  ,jj,jk) +                           &
+                     &                            r1_4 * ( ( dshesq(ji  ,jj,jk) + dshesq(ji  ,jj-1,jk) ) +  & ! add () for NP repro
+                     &                                     ( dshesq(ji-1,jj,jk) + dshesq(ji-1,jj-1,jk) ) ) )
                   ahmt(ji,jj,jk) = MAX( ahmt(ji,jj,jk), SQRT( (zu2pv2_ij + zu2pv2_ij_m1) * zdelta * zstabf_lo ) ) ! Impose lower limit == minfac  * |U|L/2
                   ahmt(ji,jj,jk) = MIN( ahmt(ji,jj,jk),                                    zdelta * zstabf_up )   ! Impose upper limit == maxfac  * L^2/(4*2dt)
                   !
                END_2D
                !
-               DO_2D( 1, 0, 1, 0 )                                   ! F-point value
+               DO_2D( 0, 0, 0, 0 )                                   ! F-point value
                   !
-                  zu2pv2_ij_p1 = uu(ji  ,jj+1,jk, kbb) * uu(ji  ,jj+1,jk, kbb) + vv(ji+1,jj  ,jk, kbb) * vv(ji+1,jj  ,jk, kbb)
-                  zu2pv2_ij    = uu(ji  ,jj  ,jk, kbb) * uu(ji  ,jj  ,jk, kbb) + vv(ji  ,jj  ,jk, kbb) * vv(ji  ,jj  ,jk, kbb)
+                  zu2pv2_ij_p1 = uu(ji  ,jj+1,jk,kbb) * uu(ji  ,jj+1,jk,kbb) + vv(ji+1,jj  ,jk,kbb) * vv(ji+1,jj  ,jk,kbb)
+                  zu2pv2_ij    = uu(ji  ,jj  ,jk,kbb) * uu(ji  ,jj  ,jk,kbb) + vv(ji  ,jj  ,jk,kbb) * vv(ji  ,jj  ,jk,kbb)
                   !
                   zdelta         = zcmsmag * esqf(ji,jj)                                        ! L^2 * (C_smag/pi)^2
-                  ahmf(ji,jj,jk) = zdelta * SQRT(          dshesq(ji  ,jj,jk) +                         &
-                     &                            r1_4 * ( dtensq(ji  ,jj,jk) + dtensq(ji  ,jj+1,jk) +  &
-                     &                                     dtensq(ji+1,jj,jk) + dtensq(ji+1,jj+1,jk) ) )
+                  ahmf(ji,jj,jk) = zdelta * SQRT(            dshesq(ji  ,jj,jk) +                           &
+                     &                            r1_4 * ( ( dtensq(ji  ,jj,jk) + dtensq(ji  ,jj+1,jk) ) +  & ! add () for NP repro
+                     &                                     ( dtensq(ji+1,jj,jk) + dtensq(ji+1,jj+1,jk) ) ) )
                   ahmf(ji,jj,jk) = MAX( ahmf(ji,jj,jk), SQRT( (zu2pv2_ij + zu2pv2_ij_p1) * zdelta * zstabf_lo ) ) ! Impose lower limit == minfac  * |U|L/2
                   ahmf(ji,jj,jk) = MIN( ahmf(ji,jj,jk),                                    zdelta * zstabf_up )   ! Impose upper limit == maxfac  * L^2/(4*2dt)
                   !
diff --git a/src/OCE/LDF/ldfslp.F90 b/src/OCE/LDF/ldfslp.F90
index d4804673..5a1fcf8e 100644
--- a/src/OCE/LDF/ldfslp.F90
+++ b/src/OCE/LDF/ldfslp.F90
@@ -11,12 +11,12 @@ MODULE ldfslp
    !!            3.3  ! 2010-10  (G. Nurser, C. Harris, G. Madec)  add Griffies operator
    !!             -   ! 2010-11  (F. Dupond, G. Madec)  bug correction in slopes just below the ML
    !!            3.7  ! 2013-12  (F. Lemarie, G. Madec)  add limiter on triad slopes
+   !!            4.x  ! 2022-12  (S. Techene, G. Madec)  optmise memory and correct discrepancy wrt eos evolution
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
    !!   ldf_slp       : calculates the slopes of neutral surface   (Madec operator)
    !!   ldf_slp_triad : calculates the triads of isoneutral slopes (Griffies operator)
-   !!   ldf_slp_mxl   : calculates the slopes at the base of the mixed layer (Madec operator)
    !!   ldf_slp_init  : initialization of the slopes computation
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and tracers
@@ -64,11 +64,7 @@ MODULE ldfslp
    !                                                     !! both operators
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   ah_wslp2             !: ah * slope^2 at w-point
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   akz                  !: stabilizing vertical diffusivity
-   
-   !                                                     !! Madec operator
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   omlmask           ! mask of the surface mixed layer at T-pt
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   uslpml, wslpiml   ! i_slope at U- and W-points just below the mixed layer
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vslpml, wslpjml   ! j_slope at V- and W-points just below the mixed layer
+
 
    REAL(wp) ::   repsln = 1.e-25_wp       ! tiny value used as minium of di(rho), dj(rho) and dk(rho)
 
@@ -98,11 +94,11 @@ CONTAINS
       !!      diffusion (here, aht=2000m2/s ==> l=20km with a typical velocity
       !!      of 10cm/s)
       !!        A horizontal shapiro filter is applied to the slopes
-      !!        ln_sco=T, s-coordinate, add to the previously computed slopes
+      !!        l_sco=T, s-coordinate, add to the previously computed slopes
       !!      the slope of the model level surface.
       !!        macro-tasked on horizontal slab (jk-loop)  (2, jpk-1)
       !!      [slopes already set to zero at level 1, and to zero or the ocean
-      !!      bottom slope (ln_sco=T) at level jpk in inildf]
+      !!      bottom slope (l_sco=T) at level jpk in inildf]
       !!
       !! ** Action : - uslp, wslpi, and vslp, wslpj, the i- and  j-slopes
       !!               of now neutral surfaces at u-, w- and v- w-points, resp.
@@ -112,17 +108,20 @@ CONTAINS
       REAL(wp), INTENT(in), DIMENSION(:,:,:) ::   prd   ! in situ density
       REAL(wp), INTENT(in), DIMENSION(:,:,:) ::   pn2   ! Brunt-Vaisala frequency (locally ref.)
       !!
-      INTEGER  ::   ji , jj , jk    ! dummy loop indices
-      INTEGER  ::   ii0, ii1        ! temporary integer
-      INTEGER  ::   ij0, ij1        ! temporary integer
+      INTEGER  ::   ji , jj , jk                 ! dummy loop indices
+      INTEGER  ::   iik, iikm1, itmp, iku, ikv   ! local integer
       REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_16, zcofw, z1_slpmax ! local scalars
-      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi   !   -      -
-      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj   !   -      -
-      REAL(wp) ::   zck, zfk,      zbw             !   -      -
-      REAL(wp) ::   zdepu, zdepv                   !   -      -
-      REAL(wp), DIMENSION(jpi,jpj)     ::  zslpml_hmlpu, zslpml_hmlpv
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zgru, zwz, zdzr
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zgrv, zww
+      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi, zmli   !   -      -
+      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj, zmlj   !   -      -
+      REAL(wp) ::   zck, zfk,      zbw          , zmlk   !   -      -
+      REAL(wp) ::   zdepu, zdepv                         !   -      -
+      REAL(wp), DIMENSION(A2D(2))   ::  zwz, zdzr
+      REAL(wp), DIMENSION(A2D(2))   ::  zww
+      REAL(wp), DIMENSION(A2D(2))   ::  zhmlpt
+      REAL(wp), DIMENSION(A2D(1))   ::  zuslp_hml, zwslpi_hml, r1_hmlu
+      REAL(wp), DIMENSION(A2D(1))   ::  zvslp_hml, zwslpj_hml, r1_hmlv
+      REAL(wp), DIMENSION(A2D(1))   ::                         r1_hmlw
+      REAL(wp), DIMENSION(A2D(2),2) ::  zgru, zgrv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('ldf_slp')
@@ -133,192 +132,185 @@ CONTAINS
       zm1_2g = -0.5_wp / grav
       z1_slpmax = 1._wp / rn_slpmax
       !
-      zww(:,:,:) = 0._wp
-      zwz(:,:,:) = 0._wp
+      zuslp_hml(:,:) = 0._wp   ;   zwslpi_hml(:,:) = 0._wp
+      zvslp_hml(:,:) = 0._wp   ;   zwslpj_hml(:,:) = 0._wp
       !
-      DO_3D( 1, 0, 1, 0, 1, jpk )   !==   i- & j-gradient of density   ==!
-         zgru(ji,jj,jk) = umask(ji,jj,jk) * ( prd(ji+1,jj  ,jk) - prd(ji,jj,jk) )
-         zgrv(ji,jj,jk) = vmask(ji,jj,jk) * ( prd(ji  ,jj+1,jk) - prd(ji,jj,jk) )
-      END_3D
-      IF( ln_zps ) THEN                           ! partial steps correction at the bottom ocean level
-         DO_2D( 1, 0, 1, 0 )
-            zgru(ji,jj,mbku(ji,jj)) = gru(ji,jj)
-            zgrv(ji,jj,mbkv(ji,jj)) = grv(ji,jj)
+      ! nmln calculation in zdfmxl is only on internal points
+      DO_2D( 0, 0, 0, 0 )
+         zhmlpt(ji,jj) = REAL( nmln(ji,jj), wp )
+      END_2D
+      CALL lbc_lnk( 'ldfslp', zhmlpt, 'T', 1.0_wp, hmlp, 'W', 1.0_wp, kfillmode=jpfillcopy )  ! No 0 over closed boundaries
+      DO_2D( 1, 2, 1, 2 )
+         nmln(ji,jj) = NINT( zhmlpt(ji,jj) )
+      END_2D
+      !
+      DO_2D( 1, 2, 1, 2 )                  ! depth of the last T-point inside the mixed layer
+         zhmlpt(ji,jj) = gdept(ji,jj,nmln(ji,jj)-1,Kmm) * ssmask(ji,jj)
+      END_2D
+      !                             !==   Mixed layer height at u-, v- and w-points  ==!
+      IF( ln_isfcav ) THEN
+         DO_2D( 1, 1, 1, 1 )
+            r1_hmlu(ji,jj) = 1._wp / ( MAX(zhmlpt (ji,jj), zhmlpt (ji+1,jj  ), 5._wp) &
+               &                     - MAX(risfdep(ji,jj), risfdep(ji+1,jj  )       ) )
+            r1_hmlv(ji,jj) = 1._wp / ( MAX(zhmlpt (ji,jj), zhmlpt (ji  ,jj+1), 5._wp) &
+               &                     - MAX(risfdep(ji,jj), risfdep(ji  ,jj+1)       ) )
          END_2D
-      ENDIF
-      IF( ln_zps .AND. ln_isfcav ) THEN           ! partial steps correction at the bottom ocean level
-         DO_2D( 1, 0, 1, 0 )
-            IF( miku(ji,jj) > 1 )   zgru(ji,jj,miku(ji,jj)) = grui(ji,jj) 
-            IF( mikv(ji,jj) > 1 )   zgrv(ji,jj,mikv(ji,jj)) = grvi(ji,jj)
+      ELSE
+         DO_2D( 1, 1, 1, 1 )
+            r1_hmlu(ji,jj) = 1._wp / MAX(zhmlpt(ji,jj), zhmlpt(ji+1,jj  ), 5._wp)
+            r1_hmlv(ji,jj) = 1._wp / MAX(zhmlpt(ji,jj), zhmlpt(ji  ,jj+1), 5._wp)
          END_2D
       ENDIF
       !
-      zdzr(:,:,1) = 0._wp           !==   Local vertical density gradient at T-point   == !   (evaluated from N^2)
-      DO jk = 2, jpkm1
-         !                                ! zdzr = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point
-         !                                !   trick: tmask(ik  )  = 0   =>   all pn2   = 0   =>   zdzr = 0
-         !                                !    else  tmask(ik+1)  = 0   =>   pn2(ik+1) = 0   =>   zdzr divides by 1
-         !                                !          umask(ik+1) /= 0   =>   all pn2  /= 0   =>   zdzr divides by 2
-         !                                ! NB: 1/(tmask+1) = (1-.5*tmask)  substitute a / by a *  ==> faster
-         zdzr(:,:,jk) = zm1_g * ( prd(:,:,jk) + 1._wp )              &
-            &                 * ( pn2(:,:,jk) + pn2(:,:,jk+1) ) * ( 1._wp - 0.5_wp * tmask(:,:,jk+1) )
-      END DO
+      DO_2D( 1, 1, 1, 1 )
+         r1_hmlw(ji,jj) = 1._wp / MAX( hmlp(ji,jj) - gdepw(ji,jj,mikt(ji,jj),Kmm), 10._wp )
+      END_2D
       !
-      !                             !==   Slopes just below the mixed layer   ==!
-      CALL ldf_slp_mxl( prd, pn2, zgru, zgrv, zdzr, Kmm )        ! output: uslpml, vslpml, wslpiml, wslpjml
-
-
-      ! I.  slopes at u and v point      | uslp = d/di( prd ) / d/dz( prd )
-      ! ===========================      | vslp = d/dj( prd ) / d/dz( prd )
+      iikm1 = 1   ;   iik = 2                              ! iik-index initialisation
       !
-      IF ( ln_isfcav ) THEN
-         DO_2D( 0, 0, 0, 0 )
-            zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / ( MAX(hmlpt  (ji,jj), hmlpt  (ji+1,jj  ), 5._wp) &
-               &                                  - MAX(risfdep(ji,jj), risfdep(ji+1,jj  )       ) ) 
-            zslpml_hmlpv(ji,jj) = vslpml(ji,jj) / ( MAX(hmlpt  (ji,jj), hmlpt  (ji  ,jj+1), 5._wp) &
-               &                                  - MAX(risfdep(ji,jj), risfdep(ji  ,jj+1)       ) )
+      DO_2D( 2, 1, 2, 1 )           !==   bottom i- & j-gradient of density at u- and v-points ==!
+         zgru(ji,jj,iikm1) = umask(ji,jj,jpkm1) * ( prd(ji+1,jj  ,jpkm1) - prd(ji,jj,jpkm1) )
+         zgrv(ji,jj,iikm1) = vmask(ji,jj,jpkm1) * ( prd(ji  ,jj+1,jpkm1) - prd(ji,jj,jpkm1) )
+      END_2D
+      !
+      zdzr(:,:) = 0._wp             !==   bottom local vertical density gradient at T-point   == !
+      !
+      !                               !----------------------!
+      DO jk = jpkm1, 2, -1            !-  Horizontal slice  -!
+         !                            !----------------------!
+         !
+         itmp = iik   ;   iik = iikm1   ;   iikm1 = itmp   ! swap iik-index
+         !
+         DO_2D( 2, 1, 2, 1 )
+            !                       !==   jk: i- & j-gradient of density  ==!
+            zgru(ji,jj,iikm1) = umask(ji,jj,jk-1) * ( prd(ji+1,jj  ,jk-1) - prd(ji,jj,jk-1) )
+            zgrv(ji,jj,iikm1) = vmask(ji,jj,jk-1) * ( prd(ji  ,jj+1,jk-1) - prd(ji,jj,jk-1) )
+            !
          END_2D
-      ELSE
-         DO_2D( 0, 0, 0, 0 )
-            zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp)
-            zslpml_hmlpv(ji,jj) = vslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp)
+         !                          !==   jk: Local vertical density gradient at T-point   == !
+         DO_2D( 1, 2, 1, 2 )
+            !                                ! zdzr = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point
+            !                                !   trick: tmask(ik  )  = 0   =>   all pn2   = 0   =>   zdzr = 0
+            !                                !    else  tmask(ik+1)  = 0   =>   pn2(ik+1) = 0   =>   zdzr divides by 1
+            !                                !          umask(ik+1) /= 0   =>   all pn2  /= 0   =>   zdzr divides by 2
+            !                                ! NB: 1/(tmask+1) = (1-.5*tmask)  substitute a / by a *  ==> faster
+            zdzr(ji,jj) = zm1_g * ( prd(ji,jj,jk) + 1._wp )              &
+               &                * ( pn2(ji,jj,jk) + pn2(ji,jj,jk+1) ) * ( 1._wp - 0.5_wp * tmask(ji,jj,jk+1) )
          END_2D
-      END IF
-
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )        !* Slopes at u and v points
-         !                                      ! horizontal and vertical density gradient at u- and v-points
-         zau = zgru(ji,jj,jk) * r1_e1u(ji,jj)
-         zav = zgrv(ji,jj,jk) * r1_e2v(ji,jj)
-         zbu = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji+1,jj  ,jk) )
-         zbv = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji  ,jj+1,jk) )
-         !                                      ! bound the slopes: abs(zw.)<= 1/100 and zb..<0
-         !                                      ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
-         zbu = MIN(  zbu, - z1_slpmax * ABS( zau ) , -7.e+3_wp/e3u(ji,jj,jk,Kmm)* ABS( zau )  )
-         zbv = MIN(  zbv, - z1_slpmax * ABS( zav ) , -7.e+3_wp/e3v(ji,jj,jk,Kmm)* ABS( zav )  )
-         !                                      ! Fred Dupont: add a correction for bottom partial steps:
-         !                                      !              max slope = 1/2 * e3 / e1
-         IF (ln_zps .AND. jk==mbku(ji,jj)) &
-            zbu = MIN(  zbu, - z1_slpmax * ABS( zau ) ,   &
-               &                - 2._wp * e1u(ji,jj) / e3u(ji,jj,jk,Kmm)* ABS( zau )  )
-         IF (ln_zps .AND. jk==mbkv(ji,jj)) &
-            zbv = MIN(  zbv, - z1_slpmax * ABS( zav ) ,   &
-               &                - 2._wp * e2v(ji,jj) / e3v(ji,jj,jk,Kmm)* ABS( zav )  )
-         !                                      ! uslp and vslp output in zwz and zww, resp.
-         zfi = MAX( omlmask(ji,jj,jk), omlmask(ji+1,jj,jk) )
-         zfj = MAX( omlmask(ji,jj,jk), omlmask(ji,jj+1,jk) )
-         ! thickness of water column between surface and level k at u/v point
-         zdepu = 0.5_wp * ( ( gdept(ji,jj,jk,Kmm) + gdept(ji+1,jj,jk,Kmm) )                            &
-            &              - 2 * MAX( risfdep(ji,jj), risfdep(ji+1,jj) )        &
-            &              - e3u(ji,jj,miku(ji,jj),Kmm)   )
-         zdepv = 0.5_wp * ( ( gdept(ji,jj,jk,Kmm) + gdept(ji,jj+1,jk,Kmm) )                            &
-            &              - 2 * MAX( risfdep(ji,jj), risfdep(ji,jj+1) )        &
-            &              - e3v(ji,jj,mikv(ji,jj),Kmm)   )
          !
-         zwz(ji,jj,jk) = ( ( 1._wp - zfi) * zau / ( zbu - zeps )                                     &
-            &                      + zfi  * zdepu * zslpml_hmlpu(ji,jj) ) * umask(ji,jj,jk)
-         zww(ji,jj,jk) = ( ( 1._wp - zfj) * zav / ( zbv - zeps )                                     &
-            &                      + zfj  * zdepv * zslpml_hmlpv(ji,jj) ) * vmask(ji,jj,jk)
-!!gm  modif to suppress omlmask.... (as in Griffies case)
-!               !                                         ! jk must be >= ML level for zf=1. otherwise  zf=0.
-!               zfi = REAL( 1 - 1/(1 + jk / MAX( nmln(ji+1,jj), nmln(ji,jj) ) ), wp )
-!               zfj = REAL( 1 - 1/(1 + jk / MAX( nmln(ji,jj+1), nmln(ji,jj) ) ), wp )
-!               zci = 0.5 * ( gdept(ji+1,jj,jk,Kmm)+gdept(ji,jj,jk,Kmm) ) / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 10. ) )
-!               zcj = 0.5 * ( gdept(ji,jj+1,jk,Kmm)+gdept(ji,jj,jk,Kmm) ) / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 10. ) )
-!               zwz(ji,jj,jk) = ( zfi * zai / ( zbi - zeps ) + ( 1._wp - zfi ) * wslpiml(ji,jj) * zci ) * tmask(ji,jj,jk)
-!               zww(ji,jj,jk) = ( zfj * zaj / ( zbj - zeps ) + ( 1._wp - zfj ) * wslpjml(ji,jj) * zcj ) * tmask(ji,jj,jk)
-!!gm end modif
-      END_3D
-      CALL lbc_lnk( 'ldfslp', zwz, 'U', -1.0_wp,  zww, 'V', -1.0_wp )      ! lateral boundary conditions
-      !
-      !                                    !* horizontal Shapiro filter
-      DO jk = 2, jpkm1
+         !
+         !                     !==================================!
+         DO_2D( 1, 1, 1, 1 )   !==   Slopes at u and v points   ==!
+            !                  !==================================!
+            !                                              ! horizontal and vertical density gradient at u- and v-points
+            zau = zgru(ji,jj,iik) * r1_e1u(ji,jj)
+            zav = zgrv(ji,jj,iik) * r1_e2v(ji,jj)
+            zbu = 0.5_wp * ( zdzr(ji,jj) + zdzr(ji+1,jj  ) )
+            zbv = 0.5_wp * ( zdzr(ji,jj) + zdzr(ji  ,jj+1) )
+            !                                              ! bound the slopes: abs(zw.)<= 1/100 and zb..<0
+            !                                              ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
+            zbu = MIN(  zbu, - z1_slpmax * ABS( zau ) , -7.e+3_wp/e3u(ji,jj,jk,Kmm)* ABS( zau )  )
+            zbv = MIN(  zbv, - z1_slpmax * ABS( zav ) , -7.e+3_wp/e3v(ji,jj,jk,Kmm)* ABS( zav )  )
+            !
+            !                       !==  slp=dxR(jk)/dzR(jk) under ml   slp=dep(jk)/hml*(dxR/dzR)_ml in ml ==!
+            iku = MAX( nmln(ji+1,jj), nmln(ji,jj) )        ! mix-layer index
+            ikv = MAX( nmln(ji,jj+1), nmln(ji,jj) )
+            !                                              ! zfi/j=0 in the mix-layer otherwise zfi/j=1
+            zfi = REAL( 1 - 1/(1 + jk / iku ), wp )
+            zfj = REAL( 1 - 1/(1 + jk / ikv ), wp )
+            !                                              ! zmi/j=1 when jk=nmln otherwise zmi/j=0
+            zmli = REAL(  1/( 1 + jk / (iku + 1) )  - 1/( 1 + jk / iku ), wp  )
+            zmlj = REAL(  1/( 1 + jk / (ikv + 1) )  - 1/( 1 + jk / ikv ), wp  )
+            !
+            !                                              ! thickness of water column between surface and level k at u/v point
+            zdepu = 0.5_wp * ( ( gdept(ji,jj,jk,Kmm) + gdept(ji+1,jj,jk,Kmm) )   &
+               &              - 2 * MAX( risfdep(ji,jj), risfdep(ji+1,jj) )      &
+               &              - e3u(ji,jj,miku(ji,jj),Kmm)   )
+            zdepv = 0.5_wp * ( ( gdept(ji,jj,jk,Kmm) + gdept(ji,jj+1,jk,Kmm) )   &
+               &              - 2 * MAX( risfdep(ji,jj), risfdep(ji,jj+1) )      &
+               &              - e3v(ji,jj,mikv(ji,jj),Kmm)   )
+            !                                              ! slp at jk level
+            zwz(ji,jj) = ( zfi * zau / ( zbu - zeps ) + ( 1._wp - zfi ) * zdepu * zuslp_hml(ji,jj) ) * umask(ji,jj,jk)
+            zww(ji,jj) = ( zfj * zav / ( zbv - zeps ) + ( 1._wp - zfj ) * zdepv * zvslp_hml(ji,jj) ) * vmask(ji,jj,jk)
+            !                                              ! store 1/hml*(dxR/dzR)_ml at nmln level
+            zuslp_hml(ji,jj) = zmli * zwz(ji,jj) * r1_hmlu(ji,jj) + ( 1._wp - zmli ) * zuslp_hml(ji,jj)
+            zvslp_hml(ji,jj) = zmlj * zww(ji,jj) * r1_hmlv(ji,jj) + ( 1._wp - zmlj ) * zvslp_hml(ji,jj)
+         END_2D
+         !
+         !                          !==  horizontal Shapiro filter + decrease along coastal boundaries  ==!
          DO_2D( 0, 0, 0, 0 )                                 ! rows jj=2 and =jpjm1 only
-            uslp(ji,jj,jk) = z1_16 * (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)      &
-               &                       +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)      &
-               &                       + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)      &
-               &                       +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )    &
-               &                       + 4.*  zwz(ji  ,jj  ,jk)                       )
-            vslp(ji,jj,jk) = z1_16 * (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)      &
-               &                       +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)      &
-               &                       + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)      &
-               &                       +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )    &
-               &                       + 4.*  zww(ji,jj    ,jk)                       )
+            uslp(ji,jj,jk) = z1_16 * (      ( ( zwz(ji-1,jj-1) + zwz(ji+1,jj-1) )      &   ! need additional () for
+               &                       +      ( zwz(ji-1,jj+1) + zwz(ji+1,jj+1) ) )    &   ! reproducibility around NP
+               &                       + 2.*( ( zwz(ji  ,jj-1) + zwz(ji-1,jj  ) )      &
+               &                       +      ( zwz(ji+1,jj  ) + zwz(ji  ,jj+1) ) )    &
+               &                       + 4.*    zwz(ji  ,jj  )                      )  &
+               &                   * ( umask(ji,jj+1,jk) + umask(ji,jj-1,jk  ) ) * 0.5_wp   &
+               &                   * ( umask(ji,jj  ,jk) + umask(ji,jj  ,jk+1) ) * 0.5_wp
+            vslp(ji,jj,jk) = z1_16 * (      ( ( zww(ji-1,jj-1) + zww(ji+1,jj-1) )      &
+               &                       +      ( zww(ji-1,jj+1) + zww(ji+1,jj+1) ) )    &
+               &                       + 2.*( ( zww(ji  ,jj-1) + zww(ji-1,jj  ) )      &
+               &                       +      ( zww(ji+1,jj  ) + zww(ji  ,jj+1) ) )    &
+               &                       + 4.*    zww(ji,jj    )                      )  &
+               &                   * ( vmask(ji+1,jj,jk) + vmask(ji-1,jj,jk  ) ) * 0.5_wp   &
+               &                   * ( vmask(ji  ,jj,jk) + vmask(ji  ,jj,jk+1) ) * 0.5_wp
          END_2D
-         !                                 !* decrease along coastal boundaries
-         DO_2D( 0, 0, 0, 0 )
-            uslp(ji,jj,jk) = uslp(ji,jj,jk) * ( umask(ji,jj+1,jk) + umask(ji,jj-1,jk  ) ) * 0.5_wp   &
-               &                            * ( umask(ji,jj  ,jk) + umask(ji,jj  ,jk+1) ) * 0.5_wp
-            vslp(ji,jj,jk) = vslp(ji,jj,jk) * ( vmask(ji+1,jj,jk) + vmask(ji-1,jj,jk  ) ) * 0.5_wp   &
-               &                            * ( vmask(ji  ,jj,jk) + vmask(ji  ,jj,jk+1) ) * 0.5_wp
+         !
+         !                      !============================!
+         DO_2D( 1, 1, 1, 1 )    !==   Slopes at w points   ==!
+            !                   !============================!
+            !                       !==  Local vertical density gradient evaluated from N^2  ==!
+            zbw = zm1_2g * pn2 (ji,jj,jk) * ( prd (ji,jj,jk) + prd (ji,jj,jk-1) + 2. )
+            !                       !==  Slopes at w point
+            !                                        ! i- & j-gradient of density at w-points  ==!
+            zci = MAX(  umask(ji-1,jj,jk   ) + umask(ji,jj,jk   )           &
+               &      + umask(ji-1,jj,jk-1 ) + umask(ji,jj,jk-1 ) , zeps  ) * e1t(ji,jj)
+            zcj = MAX(  vmask(ji,jj-1,jk   ) + vmask(ji,jj,jk-1 )           &
+               &      + vmask(ji,jj-1,jk-1 ) + vmask(ji,jj,jk   ) , zeps  ) * e2t(ji,jj)
+            zai =    (  ( zgru (ji-1,jj,iik  ) + zgru (ji,jj,iik  ) )           &     ! need additional () for reproducibility around NP
+               &      + ( zgru (ji-1,jj,iikm1) + zgru (ji,jj,iikm1) )   ) / zci * wmask (ji,jj,jk)
+            zaj =    (  ( zgrv (ji,jj-1,iik  ) + zgrv (ji,jj,iikm1) )           &
+               &      + ( zgrv (ji,jj-1,iikm1) + zgrv (ji,jj,iik  ) )   ) / zcj * wmask (ji,jj,jk)
+            !                                        ! bound the slopes: abs(zw.)<= 1/100 and zb..<0.
+            !                                        ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
+            zbi = MIN( zbw ,- 100._wp* ABS( zai ) , -7.e+3_wp/e3w(ji,jj,jk,Kmm)* ABS( zai )  )
+            zbj = MIN( zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/e3w(ji,jj,jk,Kmm)* ABS( zaj )  )
+            !
+            !                                        ! zfk=0 in the mix-layer otherwise zfk=1
+            zfk = REAL(   1 - 1/(  1 + jk / ( nmln(ji,jj) + 1 )  ) , wp   )
+            !                                        ! zmlk=1 when jk=nmln+1 otherwise zmlk=0
+            zmlk = REAL(  1/( 1 + jk / ( nmln(ji,jj) + 2 ) )  - 1/( 1 + jk / ( nmln(ji,jj) + 1 ) ), wp  )
+            !
+            !                                        ! thickness of water column between surface and level k at w point
+            zck = ( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm) )
+            !                                        ! wslpi and wslpj with ML flattening (output in zwz and zww, resp.)
+            zwz(ji,jj) = (  zfk * zai / ( zbi - zeps ) + ( 1._wp - zfk ) * zck * zwslpi_hml(ji,jj)  ) * wmask(ji,jj,jk)
+            zww(ji,jj) = (  zfk * zaj / ( zbj - zeps ) + ( 1._wp - zfk ) * zck * zwslpj_hml(ji,jj)  ) * wmask(ji,jj,jk)
+            !
+            !                                        ! store 1/hml*(dxR/dzR)_ml at nmln+1 level (1st level above lower T-point in ML)
+            zwslpi_hml(ji,jj) = zmlk * zwz(ji,jj) * r1_hmlw(ji,jj) + ( 1._wp - zmlk ) * zwslpi_hml(ji,jj)
+            zwslpj_hml(ji,jj) = zmlk * zww(ji,jj) * r1_hmlw(ji,jj) + ( 1._wp - zmlk ) * zwslpj_hml(ji,jj)
          END_2D
-      END DO
-
-
-      ! II.  slopes at w point           | wslpi = mij( d/di( prd ) / d/dz( prd )
-      ! ===========================      | wslpj = mij( d/dj( prd ) / d/dz( prd )
-      !
-      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-         !                                  !* Local vertical density gradient evaluated from N^2
-         zbw = zm1_2g * pn2 (ji,jj,jk) * ( prd (ji,jj,jk) + prd (ji,jj,jk-1) + 2. )
-         !                                  !* Slopes at w point
-         !                                        ! i- & j-gradient of density at w-points
-         zci = MAX(  umask(ji-1,jj,jk  ) + umask(ji,jj,jk  )           &
-            &      + umask(ji-1,jj,jk-1) + umask(ji,jj,jk-1) , zeps  ) * e1t(ji,jj)
-         zcj = MAX(  vmask(ji,jj-1,jk  ) + vmask(ji,jj,jk-1)           &
-            &      + vmask(ji,jj-1,jk-1) + vmask(ji,jj,jk  ) , zeps  ) * e2t(ji,jj)
-         zai =    (  zgru (ji-1,jj,jk  ) + zgru (ji,jj,jk-1)           &
-            &      + zgru (ji-1,jj,jk-1) + zgru (ji,jj,jk  )   ) / zci * wmask (ji,jj,jk)
-         zaj =    (  zgrv (ji,jj-1,jk  ) + zgrv (ji,jj,jk-1)           &
-            &      + zgrv (ji,jj-1,jk-1) + zgrv (ji,jj,jk  )   ) / zcj * wmask (ji,jj,jk)
-         !                                        ! bound the slopes: abs(zw.)<= 1/100 and zb..<0.
-         !                                        ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
-         zbi = MIN( zbw ,- 100._wp* ABS( zai ) , -7.e+3_wp/e3w(ji,jj,jk,Kmm)* ABS( zai )  )
-         zbj = MIN( zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/e3w(ji,jj,jk,Kmm)* ABS( zaj )  )
-         !                                        ! wslpi and wslpj with ML flattening (output in zwz and zww, resp.)
-         zfk = MAX( omlmask(ji,jj,jk), omlmask(ji,jj,jk-1) )   ! zfk=1 in the ML otherwise zfk=0
-         zck = ( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm) ) / MAX( hmlp(ji,jj) - gdepw(ji,jj,mikt(ji,jj),Kmm), 10._wp )
-         zwz(ji,jj,jk) = (  zai / ( zbi - zeps ) * ( 1._wp - zfk ) + zck * wslpiml(ji,jj) * zfk  ) * wmask(ji,jj,jk)
-         zww(ji,jj,jk) = (  zaj / ( zbj - zeps ) * ( 1._wp - zfk ) + zck * wslpjml(ji,jj) * zfk  ) * wmask(ji,jj,jk)
-
-!!gm  modif to suppress omlmask....  (as in Griffies operator)
-!               !                                         ! jk must be >= ML level for zfk=1. otherwise  zfk=0.
-!               zfk = REAL( 1 - 1/(1 + jk / nmln(ji+1,jj)), wp )
-!               zck = gdepw(ji,jj,jk,Kmm)    / MAX( hmlp(ji,jj), 10. )
-!               zwz(ji,jj,jk) = ( zfk * zai / ( zbi - zeps ) + ( 1._wp - zfk ) * wslpiml(ji,jj) * zck ) * tmask(ji,jj,jk)
-!               zww(ji,jj,jk) = ( zfk * zaj / ( zbj - zeps ) + ( 1._wp - zfk ) * wslpjml(ji,jj) * zck ) * tmask(ji,jj,jk)
-!!gm end modif
-      END_3D
-      CALL lbc_lnk( 'ldfslp', zwz, 'T', -1.0_wp,  zww, 'T', -1.0_wp )      ! lateral boundary conditions
-      !
-      !                                           !* horizontal Shapiro filter
-      DO jk = 2, jpkm1
+         !                           !== horizontal Shapiro filter + decrease in vicinity of topography  ==!
          DO_2D( 0, 0, 0, 0 )                             ! rows jj=2 and =jpjm1 only
-            zcofw = wmask(ji,jj,jk) * z1_16
-            wslpi(ji,jj,jk) = (         zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)     &
-                 &               +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)     &
-                 &               + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)     &
-                 &               +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )   &
-                 &               + 4.*  zwz(ji  ,jj  ,jk)                         ) * zcofw
-
-            wslpj(ji,jj,jk) = (         zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)     &
-                 &               +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)     &
-                 &               + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)     &
-                 &               +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )   &
-                 &               + 4.*  zww(ji  ,jj  ,jk)                         ) * zcofw
-         END_2D
-         !                                        !* decrease in vicinity of topography
-         DO_2D( 0, 0, 0, 0 )
-            zck =   ( umask(ji,jj,jk) + umask(ji-1,jj,jk) )   &
-               &  * ( vmask(ji,jj,jk) + vmask(ji,jj-1,jk) ) * 0.25
-            wslpi(ji,jj,jk) = wslpi(ji,jj,jk) * zck
-            wslpj(ji,jj,jk) = wslpj(ji,jj,jk) * zck
+            zcofw = wmask(ji,jj,jk) * z1_16 * ( umask(ji,jj,jk) + umask(ji-1,jj,jk) )   &
+               &                            * ( vmask(ji,jj,jk) + vmask(ji,jj-1,jk) ) * 0.25
+            wslpi(ji,jj,jk) = (       ( ( zwz(ji-1,jj-1) + zwz(ji+1,jj-1) )     &   ! need additional () for
+                 &               +      ( zwz(ji-1,jj+1) + zwz(ji+1,jj+1) ) )   &   ! reproducibility around NP
+                 &               + 2.*( ( zwz(ji  ,jj-1) + zwz(ji-1,jj  ) )     &
+                 &               +      ( zwz(ji+1,jj  ) + zwz(ji  ,jj+1) ) )   &
+                 &               + 4.*    zwz(ji  ,jj  )                        ) * zcofw
+
+            wslpj(ji,jj,jk) = (       ( ( zww(ji-1,jj-1) + zww(ji+1,jj-1) )     &
+                 &               +      ( zww(ji-1,jj+1) + zww(ji+1,jj+1) ) )   &
+                 &               + 2.*( ( zww(ji  ,jj-1) + zww(ji-1,jj  ) )     &
+                 &               +      ( zww(ji+1,jj  ) + zww(ji  ,jj+1) ) )   &
+                 &               + 4.*    zww(ji  ,jj  )                        ) * zcofw
          END_2D
-      END DO
-
-      ! IV. Lateral boundary conditions
-      ! ===============================
+         !
+      END DO  ! end jk
+      !                              !==  Lateral boundary conditions  ==!
       CALL lbc_lnk( 'ldfslp', uslp , 'U', -1.0_wp , vslp , 'V', -1.0_wp , wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp )
-
+      !
       IF(sn_cfctl%l_prtctl) THEN
          CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ')
          CALL prt_ctl(tab3d_1=wslpi, clinfo1=' slp  - wi: ', tab3d_2=wslpj, clinfo2=' wj: ')
@@ -381,18 +373,6 @@ CONTAINS
             zdyrho(ji   ,jj+jp,jk,1-jp) = SIGN(  MAX( repsln, ABS( zdyrho_raw ) ), zdyrho_raw  )
          END_3D
          !
-         IF( ln_zps .AND. l_grad_zps ) THEN     ! partial steps: correction of i- & j-grad on bottom
-            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
-               iku  = mbku(ji,jj)          ;   ikv  = mbkv(ji,jj)             ! last ocean level (u- & v-points)
-               zdit = gtsu(ji,jj,jp_tem)   ;   zdjt = gtsv(ji,jj,jp_tem)      ! i- & j-gradient of Temperature
-               zdis = gtsu(ji,jj,jp_sal)   ;   zdjs = gtsv(ji,jj,jp_sal)      ! i- & j-gradient of Salinity
-               zdxrho_raw = ( - rab_b(ji+ip,jj   ,iku,jp_tem) * zdit + rab_b(ji+ip,jj   ,iku,jp_sal) * zdis ) * r1_e1u(ji,jj)
-               zdyrho_raw = ( - rab_b(ji   ,jj+jp,ikv,jp_tem) * zdjt + rab_b(ji   ,jj+jp,ikv,jp_sal) * zdjs ) * r1_e2v(ji,jj)
-               zdxrho(ji+ip,jj   ,iku,1-ip) = SIGN( MAX( repsln, ABS( zdxrho_raw ) ), zdxrho_raw )   ! keep the sign
-               zdyrho(ji   ,jj+jp,ikv,1-jp) = SIGN( MAX( repsln, ABS( zdyrho_raw ) ), zdyrho_raw )
-            END_2D
-         ENDIF
-         !
       END DO
 
       DO kp = 0, 1                            !==  unmasked before density i- j-, k-gradients  ==!
@@ -410,6 +390,13 @@ CONTAINS
             zdzrho(ji,jj,jk,kp) = - MIN( - repsln , zdzrho_raw )    ! force zdzrho >= repsln
          END_3D
       END DO
+
+      ! nmln calculation in zdfmxl is only on internal points
+      DO_2D( 0, 0, 0, 0 )
+         z1_mlbw(ji,jj) = REAL( nmln(ji,jj), wp )
+      END_2D
+      CALL lbc_lnk( 'ldfslp', z1_mlbw, 'T', 1.0_wp, kfillmode=jpfillcopy )  ! No 0 over closed boundaries
+      nmln(:,:) = NINT( z1_mlbw(:,:) )
       !
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                   !== Reciprocal depth of the w-point below ML base  ==!
          jk = MIN( nmln(ji,jj), mbkt(ji,jj) ) + 1     ! MIN in case ML depth is the ocean depth
@@ -556,113 +543,6 @@ CONTAINS
    END SUBROUTINE ldf_slp_triad
 
 
-   SUBROUTINE ldf_slp_mxl( prd, pn2, p_gru, p_grv, p_dzr, Kmm )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE ldf_slp_mxl  ***
-      !!
-      !! ** Purpose :   Compute the slopes of iso-neutral surface just below
-      !!              the mixed layer.
-      !!
-      !! ** Method  :   The slope in the i-direction is computed at u- & w-points
-      !!              (uslpml, wslpiml) and the slope in the j-direction is computed
-      !!              at v- and w-points (vslpml, wslpjml) with the same bounds as
-      !!              in ldf_slp.
-      !!
-      !! ** Action  :   uslpml, wslpiml :  i- &  j-slopes of neutral surfaces
-      !!                vslpml, wslpjml    just below the mixed layer
-      !!                omlmask         :  mixed layer mask
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   prd            ! in situ density
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   pn2            ! Brunt-Vaisala frequency (locally ref.)
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   p_gru, p_grv   ! i- & j-gradient of density (u- & v-pts)
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   p_dzr          ! z-gradient of density      (T-point)
-      INTEGER , INTENT(in)                   ::   Kmm            ! ocean time level indices
-      !!
-      INTEGER  ::   ji , jj , jk                   ! dummy loop indices
-      INTEGER  ::   iku, ikv, ik, ikm1             ! local integers
-      REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_slpmax ! local scalars
-      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi   !   -      -
-      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj   !   -      -
-      REAL(wp) ::   zck, zfk,      zbw             !   -      -
-      !!----------------------------------------------------------------------
-      !
-      zeps   =  1.e-20_wp        !==   Local constant initialization   ==!
-      zm1_g  = -1.0_wp / grav
-      zm1_2g = -0.5_wp / grav
-      z1_slpmax = 1._wp / rn_slpmax
-      !
-      uslpml (1,:) = 0._wp      ;      uslpml (jpi,:) = 0._wp
-      vslpml (1,:) = 0._wp      ;      vslpml (jpi,:) = 0._wp
-      wslpiml(1,:) = 0._wp      ;      wslpiml(jpi,:) = 0._wp
-      wslpjml(1,:) = 0._wp      ;      wslpjml(jpi,:) = 0._wp
-      !
-      !                                            !==   surface mixed layer mask   !
-      DO_3D( 1, 1, 1, 1, 1, jpk )                  ! =1 inside the mixed layer, =0 otherwise
-         ik = nmln(ji,jj) - 1
-         IF( jk <= ik ) THEN   ;   omlmask(ji,jj,jk) = 1._wp
-         ELSE                  ;   omlmask(ji,jj,jk) = 0._wp
-         ENDIF
-      END_3D
-
-
-      ! Slopes of isopycnal surfaces just before bottom of mixed layer
-      ! --------------------------------------------------------------
-      ! The slope are computed as in the 3D case.
-      ! A key point here is the definition of the mixed layer at u- and v-points.
-      ! It is assumed to be the maximum of the two neighbouring T-point mixed layer depth.
-      ! Otherwise, a n2 value inside the mixed layer can be involved in the computation
-      ! of the slope, resulting in a too steep diagnosed slope and thus a spurious eddy
-      ! induce velocity field near the base of the mixed layer.
-      !-----------------------------------------------------------------------
-      !
-      DO_2D( 0, 0, 0, 0 )
-         !                        !==   Slope at u- & v-points just below the Mixed Layer   ==!
-         !
-         !                        !- vertical density gradient for u- and v-slopes (from dzr at T-point)
-         iku = MIN(  MAX( 1, nmln(ji,jj) , nmln(ji+1,jj) ) , jpkm1  )   ! ML (MAX of T-pts, bound by jpkm1)
-         ikv = MIN(  MAX( 1, nmln(ji,jj) , nmln(ji,jj+1) ) , jpkm1  )   !
-         zbu = 0.5_wp * ( p_dzr(ji,jj,iku) + p_dzr(ji+1,jj  ,iku) )
-         zbv = 0.5_wp * ( p_dzr(ji,jj,ikv) + p_dzr(ji  ,jj+1,ikv) )
-         !                        !- horizontal density gradient at u- & v-points
-         zau = p_gru(ji,jj,iku) * r1_e1u(ji,jj)
-         zav = p_grv(ji,jj,ikv) * r1_e2v(ji,jj)
-         !                        !- bound the slopes: abs(zw.)<= 1/100 and zb..<0
-         !                           kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
-         zbu = MIN(  zbu , - z1_slpmax * ABS( zau ) , -7.e+3_wp/e3u(ji,jj,iku,Kmm)* ABS( zau )  )
-         zbv = MIN(  zbv , - z1_slpmax * ABS( zav ) , -7.e+3_wp/e3v(ji,jj,ikv,Kmm)* ABS( zav )  )
-         !                        !- Slope at u- & v-points (uslpml, vslpml)
-         uslpml(ji,jj) = zau / ( zbu - zeps ) * umask(ji,jj,iku)
-         vslpml(ji,jj) = zav / ( zbv - zeps ) * vmask(ji,jj,ikv)
-         !
-         !                        !==   i- & j-slopes at w-points just below the Mixed Layer   ==!
-         !
-         ik   = MIN( nmln(ji,jj) + 1, jpk )
-         ikm1 = MAX( 1, ik-1 )
-         !                        !- vertical density gradient for w-slope (from N^2)
-         zbw = zm1_2g * pn2 (ji,jj,ik) * ( prd (ji,jj,ik) + prd (ji,jj,ikm1) + 2. )
-         !                        !- horizontal density i- & j-gradient at w-points
-         zci = MAX(   umask(ji-1,jj,ik  ) + umask(ji,jj,ik  )           &
-            &       + umask(ji-1,jj,ikm1) + umask(ji,jj,ikm1) , zeps  ) * e1t(ji,jj)
-         zcj = MAX(   vmask(ji,jj-1,ik  ) + vmask(ji,jj,ik  )           &
-            &       + vmask(ji,jj-1,ikm1) + vmask(ji,jj,ikm1) , zeps  ) * e2t(ji,jj)
-         zai =    (   p_gru(ji-1,jj,ik  ) + p_gru(ji,jj,ik)             &
-            &       + p_gru(ji-1,jj,ikm1) + p_gru(ji,jj,ikm1  )  ) / zci  * tmask(ji,jj,ik)
-         zaj =    (   p_grv(ji,jj-1,ik  ) + p_grv(ji,jj,ik  )           &
-            &       + p_grv(ji,jj-1,ikm1) + p_grv(ji,jj,ikm1)  ) / zcj  * tmask(ji,jj,ik)
-         !                        !- bound the slopes: abs(zw.)<= 1/100 and zb..<0.
-         !                           kxz max= ah slope max =< e1 e3 /(pi**2 2 dt)
-         zbi = MIN(  zbw , -100._wp* ABS( zai ) , -7.e+3_wp/e3w(ji,jj,ik,Kmm)* ABS( zai )  )
-         zbj = MIN(  zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/e3w(ji,jj,ik,Kmm)* ABS( zaj )  )
-         !                        !- i- & j-slope at w-points (wslpiml, wslpjml)
-         wslpiml(ji,jj) = zai / ( zbi - zeps ) * tmask (ji,jj,ik)
-         wslpjml(ji,jj) = zaj / ( zbj - zeps ) * tmask (ji,jj,ik)
-      END_2D
-      !!gm this lbc_lnk should be useless....
-      CALL lbc_lnk( 'ldfslp', uslpml , 'U', -1.0_wp , vslpml , 'V', -1.0_wp , wslpiml, 'W', -1.0_wp , wslpjml, 'W', -1.0_wp ) 
-      !
-   END SUBROUTINE ldf_slp_mxl
-
-
    SUBROUTINE ldf_slp_init
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE ldf_slp_init  ***
@@ -699,17 +579,16 @@ CONTAINS
          !
       ELSE                             ! Madec operator : slopes at u-, v-, and w-points
          IF(lwp) WRITE(numout,*) '   ==>>>   iso operator (Madec)'
-         ALLOCATE( omlmask(jpi,jpj,jpk) ,                                                                        &
-            &      uslp(jpi,jpj,jpk) , uslpml(jpi,jpj) , wslpi(jpi,jpj,jpk) , wslpiml(jpi,jpj) ,     &
-            &      vslp(jpi,jpj,jpk) , vslpml(jpi,jpj) , wslpj(jpi,jpj,jpk) , wslpjml(jpi,jpj) , STAT=ierr )
+         ALLOCATE( uslp(jpi,jpj,jpk) ,  wslpi(jpi,jpj,jpk) ,     &
+            &      vslp(jpi,jpj,jpk) ,  wslpj(jpi,jpj,jpk) , STAT=ierr )
          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'ldf_slp_init : unable to allocate Madec operator slope ' )
 
          ! Direction of lateral diffusion (tracers and/or momentum)
          ! ------------------------------
-         uslp (:,:,:) = 0._wp   ;   uslpml (:,:) = 0._wp      ! set the slope to zero (even in s-coordinates)
-         vslp (:,:,:) = 0._wp   ;   vslpml (:,:) = 0._wp
-         wslpi(:,:,:) = 0._wp   ;   wslpiml(:,:) = 0._wp
-         wslpj(:,:,:) = 0._wp   ;   wslpjml(:,:) = 0._wp
+         uslp (:,:,:) = 0._wp      ! set the slope to zero (even in s-coordinates)
+         vslp (:,:,:) = 0._wp
+         wslpi(:,:,:) = 0._wp
+         wslpj(:,:,:) = 0._wp
 
          !!gm I no longer understand this.....
 !!gm         IF( (ln_traldf_hor .OR. ln_dynldf_hor) .AND. .NOT. (.NOT.ln_linssh .AND. ln_rstart) ) THEN
diff --git a/src/OCE/LDF/ldftra.F90 b/src/OCE/LDF/ldftra.F90
index 87e1d746..7304aabd 100644
--- a/src/OCE/LDF/ldftra.F90
+++ b/src/OCE/LDF/ldftra.F90
@@ -204,19 +204,13 @@ CONTAINS
          !                                ! defined the type of lateral diffusion from ln_traldf_... logicals
          ierr = 0
          IF ( ln_traldf_lap ) THEN        ! laplacian operator
-            IF ( ln_zco ) THEN                  ! z-coordinate
+            IF ( l_zco .OR. l_zps ) THEN       ! z-coordinate with or without partial step
                IF ( ln_traldf_lev   )   nldf_tra = np_lap     ! iso-level = horizontal (no rotation)
                IF ( ln_traldf_hor   )   nldf_tra = np_lap     ! iso-level = horizontal (no rotation)
                IF ( ln_traldf_iso   )   nldf_tra = np_lap_i   ! iso-neutral: standard  (   rotation)
                IF ( ln_traldf_triad )   nldf_tra = np_lap_it  ! iso-neutral: triad     (   rotation)
             ENDIF
-            IF ( ln_zps ) THEN                  ! z-coordinate with partial step
-               IF ( ln_traldf_lev   )   ierr     = 1          ! iso-level not allowed
-               IF ( ln_traldf_hor   )   nldf_tra = np_lap     ! horizontal             (no rotation)
-               IF ( ln_traldf_iso   )   nldf_tra = np_lap_i   ! iso-neutral: standard     (rotation)
-               IF ( ln_traldf_triad )   nldf_tra = np_lap_it  ! iso-neutral: triad        (rotation)
-            ENDIF
-            IF ( ln_sco ) THEN                  ! s-coordinate
+            IF ( l_sco ) THEN                  ! s-coordinate
                IF ( ln_traldf_lev   )   nldf_tra = np_lap     ! iso-level              (no rotation)
                IF ( ln_traldf_hor   )   nldf_tra = np_lap_i   ! horizontal             (   rotation)
                IF ( ln_traldf_iso   )   nldf_tra = np_lap_i   ! iso-neutral: standard  (   rotation)
@@ -225,19 +219,13 @@ CONTAINS
          ENDIF
          !
          IF( ln_traldf_blp ) THEN         ! bilaplacian operator
-            IF ( ln_zco ) THEN                  ! z-coordinate
+            IF ( l_zco .OR. l_zps ) THEN       ! z-coordinate with or without partial step
                IF ( ln_traldf_lev   )   nldf_tra = np_blp     ! iso-level = horizontal (no rotation)
                IF ( ln_traldf_hor   )   nldf_tra = np_blp     ! iso-level = horizontal (no rotation)
                IF ( ln_traldf_iso   )   nldf_tra = np_blp_i   ! iso-neutral: standard  (   rotation)
                IF ( ln_traldf_triad )   nldf_tra = np_blp_it  ! iso-neutral: triad     (   rotation)
             ENDIF
-            IF ( ln_zps ) THEN                  ! z-coordinate with partial step
-               IF ( ln_traldf_lev   )   ierr     = 1          ! iso-level not allowed
-               IF ( ln_traldf_hor   )   nldf_tra = np_blp     ! horizontal             (no rotation)
-               IF ( ln_traldf_iso   )   nldf_tra = np_blp_i   ! iso-neutral: standard  (   rotation)
-               IF ( ln_traldf_triad )   nldf_tra = np_blp_it  ! iso-neutral: triad     (   rotation)
-            ENDIF
-            IF ( ln_sco ) THEN                  ! s-coordinate
+            IF ( l_sco ) THEN                  ! s-coordinate
                IF ( ln_traldf_lev   )   nldf_tra = np_blp     ! iso-level              (no rotation)
                IF ( ln_traldf_hor   )   nldf_tra = np_blp_it  ! horizontal             (   rotation)
                IF ( ln_traldf_iso   )   nldf_tra = np_blp_i   ! iso-neutral: standard  (   rotation)
@@ -726,19 +714,18 @@ CONTAINS
       !!
       !! ** Action  : pu, pv increased by the eiv transport
       !!----------------------------------------------------------------------
-      INTEGER                     , INTENT(in   ) ::   kt        ! ocean time-step index
-      INTEGER                     , INTENT(in   ) ::   kit000    ! first time step index
-      INTEGER                     , INTENT(in   ) ::   Kmm, Krhs ! ocean time level indices
-      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype    ! =TRA or TRC (tracer indicator)
-      ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu        ! in : 3 ocean transport components   [m3/s]
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv        ! out: 3 ocean transport components   [m3/s]
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw        ! increased by the eiv                [m3/s]
+      INTEGER                             , INTENT(in   ) :: kt        ! ocean time-step index
+      INTEGER                             , INTENT(in   ) :: kit000    ! first time step index
+      INTEGER                             , INTENT(in   ) :: Kmm, Krhs ! ocean time level indices
+      CHARACTER(len=3)                    , INTENT(in   ) :: cdtype    ! =TRA or TRC (tracer indicator)
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) :: pu        ! in : 3 ocean transport components   [m3/s]
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) :: pv        ! out: 3 ocean transport components   [m3/s]
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) :: pw        ! increased by the eiv                [m3/s]
       !!
       INTEGER  ::   ji, jj, jk                 ! dummy loop indices
       REAL(wp) ::   zuwk, zuwk1, zuwi, zuwi1   ! local scalars
       REAL(wp) ::   zvwk, zvwk1, zvwj, zvwj1   !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zpsi_uw, zpsi_vw
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zpsi_uw, zpsi_vw
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -765,8 +752,8 @@ CONTAINS
          pv(ji,jj,jk) = pv(ji,jj,jk) - ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) )
       END_3D
       DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
-         pw(ji,jj,jk) = pw(ji,jj,jk) + (  zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj  ,jk)   &
-            &                           + zpsi_vw(ji,jj,jk) - zpsi_vw(ji  ,jj-1,jk) )
+         pw(ji,jj,jk) = pw(ji,jj,jk) + (  ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj  ,jk) )   &   ! add () for NP repro
+            &                           + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji  ,jj-1,jk) ) )
       END_3D
       !
       !                              ! diagnose the eddy induced velocity and associated heat transport
@@ -789,13 +776,13 @@ CONTAINS
       !! ** Method :
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in) ::   psi_uw, psi_vw   ! streamfunction   [m3/s]
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in) ::   psi_uw, psi_vw   ! streamfunction   [m3/s]
       INTEGER                             , INTENT(in) ::   Kmm              ! ocean time level indices
       !
       INTEGER  ::   ji, jj, jk    ! dummy loop indices
       REAL(wp) ::   zztmp   ! local scalar
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zw2d   ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zw3d   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(0))     ::   zw2d   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zw3d   ! 3D workspace
       !!----------------------------------------------------------------------
       !
 !!gm I don't like this routine....   Crazy  way of doing things, not optimal at all...
@@ -806,42 +793,53 @@ CONTAINS
       !
       !                                                  !==  eiv velocities: calculate and output  ==!
       !
-      zw3d(:,:,jpk) = 0._wp                                    ! bottom value always 0
+      zw3d(:,:,jpk) = 0._wp                                   ! bottom value always 0
       !
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                  ! e2u e3u u_eiv = -dk[psi_uw]
-         zw3d(ji,jj,jk) = ( psi_uw(ji,jj,jk+1) - psi_uw(ji,jj,jk) ) / ( e2u(ji,jj) * e3u(ji,jj,jk,Kmm) )
-      END_3D
-      CALL iom_put( "uoce_eiv", zw3d )
+      IF( iom_use('uoce_eiv') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                  ! e2u e3u u_eiv = -dk[psi_uw]
+            zw3d(ji,jj,jk) = ( psi_uw(ji,jj,jk+1) - psi_uw(ji,jj,jk) ) / ( e2u(ji,jj) * e3u(ji,jj,jk,Kmm) )
+         END_3D
+         CALL iom_put( "uoce_eiv", zw3d )
+      ENDIF
       !
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                  ! e1v e3v v_eiv = -dk[psi_vw]
-         zw3d(ji,jj,jk) = ( psi_vw(ji,jj,jk+1) - psi_vw(ji,jj,jk) ) / ( e1v(ji,jj) * e3v(ji,jj,jk,Kmm) )
-      END_3D
-      CALL iom_put( "voce_eiv", zw3d )
+      IF( iom_use('ueiv_masstr') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = rho0 * ( psi_uw(ji,jj,jk+1) - psi_uw(ji,jj,jk) )
+         END_3D
+         CALL iom_put( "ueiv_masstr", zw3d )                  ! mass transport in i-direction
+      ENDIF
       !
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )                            ! e1 e2 w_eiv = dk[psix] + dk[psix]
-         zw3d(ji,jj,jk) = (  psi_vw(ji,jj,jk) - psi_vw(ji  ,jj-1,jk)    &
-            &              + psi_uw(ji,jj,jk) - psi_uw(ji-1,jj  ,jk)  ) / e1e2t(ji,jj)
-      END_3D
-      CALL iom_put( "woce_eiv", zw3d )
+      IF( iom_use('voce_eiv') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                  ! e1v e3v v_eiv = -dk[psi_vw]
+            zw3d(ji,jj,jk) = ( psi_vw(ji,jj,jk+1) - psi_vw(ji,jj,jk) ) / ( e1v(ji,jj) * e3v(ji,jj,jk,Kmm) )
+         END_3D
+         CALL iom_put( "voce_eiv", zw3d )
+      ENDIF
       !
-      IF( iom_use('weiv_masstr') ) THEN   ! vertical mass transport & its square value
-         DO_2D( 0, 0, 0, 0 )
-            zw2d(ji,jj) = rho0 * e1e2t(ji,jj)
-         END_2D
-         DO jk = 1, jpk
-            zw3d(:,:,jk) = zw3d(:,:,jk) * zw2d(:,:)
-         END DO
-         CALL iom_put( "weiv_masstr" , zw3d )
+      IF( iom_use('veiv_masstr') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = rho0 * ( psi_vw(ji,jj,jk+1) - psi_vw(ji,jj,jk) )
+         END_3D
+         CALL iom_put( "veiv_masstr", zw3d )                  ! mass transport in j-direction
+      ENDIF
+       !
+      IF( iom_use('woce_eiv') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )                                  ! e1 e2 w_eiv = dk[psix] + dk[psix]
+            zw3d(ji,jj,jk) = (  ( psi_vw(ji,jj,jk) - psi_vw(ji  ,jj-1,jk) )    &   ! add () for NP repro
+               &              + ( psi_uw(ji,jj,jk) - psi_uw(ji-1,jj  ,jk) )  ) / e1e2t(ji,jj)
+         END_3D
+         CALL iom_put( "woce_eiv", zw3d )
       ENDIF
       !
-      IF( iom_use('ueiv_masstr') ) THEN
-         zw3d(:,:,:) = 0.e0
-         DO jk = 1, jpkm1
-            zw3d(:,:,jk) = rho0 * ( psi_uw(:,:,jk+1) - psi_uw(:,:,jk) )
-         END DO
-         CALL iom_put( "ueiv_masstr", zw3d )                  ! mass transport in i-direction
+      IF( iom_use('weiv_masstr') ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = rho0 * (  ( psi_vw(ji,jj,jk) - psi_vw(ji  ,jj-1,jk) )  &   ! add () for NP repro
+               &                     + ( psi_uw(ji,jj,jk) - psi_uw(ji-1,jj  ,jk) )  )
+         END_3D
+         CALL iom_put( "weiv_masstr" , zw3d )                 ! mass transport in z-direction
       ENDIF
       !
+      !
       zztmp = 0.5_wp * rho0 * rcp
       IF( iom_use('ueiv_heattr') .OR. iom_use('ueiv_heattr3d') ) THEN
         zw2d(:,:)   = 0._wp
@@ -855,49 +853,47 @@ CONTAINS
         CALL iom_put( "ueiv_heattr3d", zztmp * zw3d )                  ! heat transport in i-direction
       ENDIF
       !
-      IF( iom_use('veiv_masstr') ) THEN
-         zw3d(:,:,:) = 0.e0
-         DO jk = 1, jpkm1
-            zw3d(:,:,jk) = rho0 * ( psi_vw(:,:,jk+1) - psi_vw(:,:,jk) )
-         END DO
-         CALL iom_put( "veiv_masstr", zw3d )                  ! mass transport in i-direction
+      IF( iom_use('veiv_heattr') .OR. iom_use('veiv_heattr3d') .OR. iom_use('sophteiv') ) THEN
+         zw2d(:,:)   = 0._wp
+         zw3d(:,:,:) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = zw3d(ji,jj,jk) + ( psi_vw(ji,jj,jk+1)          - psi_vw(ji,jj  ,jk)            )   &
+               &                            * ( ts    (ji,jj,jk,jp_tem,Kmm) + ts    (ji,jj+1,jk,jp_tem,Kmm) )
+            zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
+         END_3D
+         CALL iom_put( "veiv_heattr"  , zztmp * zw2d )                  !  heat transport in j-direction
+         CALL iom_put( "veiv_heattr3d", zztmp * zw3d )                  !  heat transport in j-direction
+         !
+         IF( iom_use( 'sophteiv' ) .AND. l_diaptr )   CALL dia_ptr_hst( jp_tem, 'eiv', 0.5 * zw3d )
       ENDIF
       !
-      zw2d(:,:)   = 0._wp
-      zw3d(:,:,:) = 0._wp
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-         zw3d(ji,jj,jk) = zw3d(ji,jj,jk) + ( psi_vw(ji,jj,jk+1)          - psi_vw(ji,jj  ,jk)            )   &
-            &                            * ( ts    (ji,jj,jk,jp_tem,Kmm) + ts    (ji,jj+1,jk,jp_tem,Kmm) )
-         zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
-      END_3D
-      CALL iom_put( "veiv_heattr"  , zztmp * zw2d )                  !  heat transport in j-direction
-      CALL iom_put( "veiv_heattr3d", zztmp * zw3d )                  !  heat transport in j-direction
-      !
-      IF( iom_use( 'sophteiv' ) .AND. l_diaptr )   CALL dia_ptr_hst( jp_tem, 'eiv', 0.5 * zw3d )
       !
       zztmp = 0.5_wp * 0.5
-      IF( iom_use('ueiv_salttr') .OR. iom_use('ueiv_salttr3d')) THEN
-        zw2d(:,:) = 0._wp
-        zw3d(:,:,:) = 0._wp
-        DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-           zw3d(ji,jj,jk) = zw3d(ji,jj,jk) * ( psi_uw(ji,jj,jk+1)          - psi_uw(ji  ,jj,jk)            )   &
-              &                            * ( ts    (ji,jj,jk,jp_sal,Kmm) + ts    (ji+1,jj,jk,jp_sal,Kmm) )
-           zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
-        END_3D
-        CALL iom_put( "ueiv_salttr", zztmp * zw2d )                  ! salt transport in i-direction
-        CALL iom_put( "ueiv_salttr3d", zztmp * zw3d )                ! salt transport in i-direction
+      IF( iom_use('ueiv_salttr') .OR. iom_use('ueiv_salttr3d') ) THEN
+         zw2d(:,:) = 0._wp
+         zw3d(:,:,:) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = zw3d(ji,jj,jk) * ( psi_uw(ji,jj,jk+1)          - psi_uw(ji  ,jj,jk)            )   &
+               &                            * ( ts    (ji,jj,jk,jp_sal,Kmm) + ts    (ji+1,jj,jk,jp_sal,Kmm) )
+            zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
+         END_3D
+         CALL iom_put( "ueiv_salttr", zztmp * zw2d )                    ! salt transport in i-direction
+         CALL iom_put( "ueiv_salttr3d", zztmp * zw3d )                  ! salt transport in i-direction
       ENDIF
-      zw2d(:,:) = 0._wp
-      zw3d(:,:,:) = 0._wp
-      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-         zw3d(ji,jj,jk) = zw3d(ji,jj,jk) + ( psi_vw(ji,jj,jk+1)          - psi_vw(ji,jj  ,jk)            )   &
-            &                            * ( ts    (ji,jj,jk,jp_sal,Kmm) + ts    (ji,jj+1,jk,jp_sal,Kmm) )
-         zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
-      END_3D
-      CALL iom_put( "veiv_salttr"  , zztmp * zw2d )                  !  salt transport in j-direction
-      CALL iom_put( "veiv_salttr3d", zztmp * zw3d )                  !  salt transport in j-direction
       !
-      IF( iom_use( 'sopsteiv' ) .AND. l_diaptr ) CALL dia_ptr_hst( jp_sal, 'eiv', 0.5 * zw3d )
+      IF( iom_use('veiv_salttr') .OR. iom_use('veiv_salttr3d') .OR. iom_use('sopsteiv') ) THEN
+         zw2d(:,:) = 0._wp
+         zw3d(:,:,:) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zw3d(ji,jj,jk) = zw3d(ji,jj,jk) + ( psi_vw(ji,jj,jk+1)          - psi_vw(ji,jj  ,jk)            )   &
+               &                            * ( ts    (ji,jj,jk,jp_sal,Kmm) + ts    (ji,jj+1,jk,jp_sal,Kmm) )
+            zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk)
+         END_3D
+         CALL iom_put( "veiv_salttr"  , zztmp * zw2d )                  !  salt transport in j-direction
+         CALL iom_put( "veiv_salttr3d", zztmp * zw3d )                  !  salt transport in j-direction
+         !
+         IF( iom_use( 'sopsteiv' ) .AND. l_diaptr )   CALL dia_ptr_hst( jp_sal, 'eiv', 0.5 * zw3d )
+      ENDIF
       !
       !
    END SUBROUTINE ldf_eiv_dia
diff --git a/src/OCE/OBS/mpp_map.F90 b/src/OCE/OBS/mpp_map.F90
index 5a4007df..553a3644 100644
--- a/src/OCE/OBS/mpp_map.F90
+++ b/src/OCE/OBS/mpp_map.F90
@@ -10,8 +10,8 @@ MODULE mpp_map
    !!  mppmap_init : Initialize mppmap.
    !!----------------------------------------------------------------------
    USE par_kind, ONLY :   wp            ! Precision variables
-   USE par_oce , ONLY :   jpi, jpj, Nis0, Nie0, Njs0, Nje0   ! Ocean parameters
-   USE dom_oce , ONLY :   mig, mjg, narea                    ! Ocean space and time domain variables
+   USE par_oce , ONLY :   jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls   ! Ocean parameters
+   USE dom_oce , ONLY :   mig, mjg, narea                            ! Ocean space and time domain variables
 #if ! defined key_mpi_off
    USE lib_mpp , ONLY :   mpi_comm_oce   ! MPP library
 #endif
@@ -64,7 +64,7 @@ INCLUDE 'mpif.h'
       imppmap(:,:) = 0
 
 !      ! Setup local grid points
-      imppmap(mig(1):mig(jpi),mjg(1):mjg(jpj)) = narea
+      imppmap(mig(1,nn_hls):mig(jpi,nn_hls),mjg(1,nn_hls):mjg(jpj,nn_hls)) = narea
       
       ! Get global data
 
diff --git a/src/OCE/OBS/obs_grd_bruteforce.h90 b/src/OCE/OBS/obs_grd_bruteforce.h90
index 5a41fa31..5df8b26c 100644
--- a/src/OCE/OBS/obs_grd_bruteforce.h90
+++ b/src/OCE/OBS/obs_grd_bruteforce.h90
@@ -111,9 +111,9 @@
          zmskg(:,:) = -1.e+10
          DO jj = kldj, klej
             DO ji = kldi, klei
-               zlamg(mig(ji),mjg(jj)) = pglam(ji,jj)
-               zphig(mig(ji),mjg(jj)) = pgphi(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = pmask(ji,jj)
+               zlamg(mig(ji,nn_hls),mjg(jj,nn_hls)) = pglam(ji,jj)
+               zphig(mig(ji,nn_hls),mjg(jj,nn_hls)) = pgphi(ji,jj)
+               zmskg(mig(ji,nn_hls),mjg(jj,nn_hls)) = pmask(ji,jj)
             END DO
          END DO
          CALL mpp_global_max( zlamg )
diff --git a/src/OCE/OBS/obs_grid.F90 b/src/OCE/OBS/obs_grid.F90
index 71574162..b9c7554c 100644
--- a/src/OCE/OBS/obs_grid.F90
+++ b/src/OCE/OBS/obs_grid.F90
@@ -280,9 +280,9 @@ CONTAINS
          ! Add various grids here.
          DO jj = 1, jpj
             DO ji = 1, jpi
-               zlamg(mig(ji),mjg(jj)) = glamt(ji,jj)
-               zphig(mig(ji),mjg(jj)) = gphit(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = tmask(ji,jj,1)
+               zlamg(mig(ji,nn_hls),mjg(jj,nn_hls)) = glamt(ji,jj)
+               zphig(mig(ji,nn_hls),mjg(jj,nn_hls)) = gphit(ji,jj)
+               zmskg(mig(ji,nn_hls),mjg(jj,nn_hls)) = tmask(ji,jj,1)
             END DO
          END DO
          CALL mpp_global_max( zlamg )
diff --git a/src/OCE/OBS/obs_inter_sup.F90 b/src/OCE/OBS/obs_inter_sup.F90
index d8116276..084830e1 100644
--- a/src/OCE/OBS/obs_inter_sup.F90
+++ b/src/OCE/OBS/obs_inter_sup.F90
@@ -279,8 +279,8 @@ CONTAINS
       ! Pack interpolation data to be sent
 
       DO ji = 1, itot
-         ii = mi1(igrdij_recv(2*ji-1))
-         ij = mj1(igrdij_recv(2*ji))
+         ii = mi1(igrdij_recv(2*ji-1),nn_hls)
+         ij = mj1(igrdij_recv(2*ji  ),nn_hls)
          DO jk = 1, kpk
             zsend(jk,ji) = pval(ii,ij,jk)
          END DO
diff --git a/src/OCE/OBS/obs_write.F90 b/src/OCE/OBS/obs_write.F90
index 1b44338d..d0c0eda8 100644
--- a/src/OCE/OBS/obs_write.F90
+++ b/src/OCE/OBS/obs_write.F90
@@ -245,8 +245,8 @@ CONTAINS
                fbdata%iobsi(jo,jvar) = profdata%mi(jo,jvar)
                fbdata%iobsj(jo,jvar) = profdata%mj(jo,jvar)
             ELSE
-               fbdata%iobsi(jo,jvar) = mig(profdata%mi(jo,jvar))
-               fbdata%iobsj(jo,jvar) = mjg(profdata%mj(jo,jvar))
+               fbdata%iobsi(jo,jvar) = mig(profdata%mi(jo,jvar),nn_hls)
+               fbdata%iobsj(jo,jvar) = mjg(profdata%mj(jo,jvar),nn_hls)
             ENDIF
          END DO
          CALL greg2jul( 0, &
@@ -511,8 +511,8 @@ CONTAINS
             fbdata%iobsi(jo,1) = surfdata%mi(jo)
             fbdata%iobsj(jo,1) = surfdata%mj(jo)
          ELSE
-            fbdata%iobsi(jo,1) = mig(surfdata%mi(jo))
-            fbdata%iobsj(jo,1) = mjg(surfdata%mj(jo))
+            fbdata%iobsi(jo,1) = mig(surfdata%mi(jo),nn_hls)
+            fbdata%iobsj(jo,1) = mjg(surfdata%mj(jo),nn_hls)
          ENDIF
          CALL greg2jul( 0, &
             &           surfdata%nmin(jo), &
diff --git a/src/OCE/SBC/cpl_oasis3.F90 b/src/OCE/SBC/cpl_oasis3.F90
index 111343f9..c64bfd2d 100644
--- a/src/OCE/SBC/cpl_oasis3.F90
+++ b/src/OCE/SBC/cpl_oasis3.F90
@@ -67,7 +67,6 @@ MODULE cpl_oasis3
    INTEGER                    ::   nrcv         ! total number of fields received
    INTEGER                    ::   nsnd         ! total number of fields sent
    INTEGER                    ::   ncplmodel    ! Maximum number of models to/from which NEMO is potentialy sending/receiving data
-   INTEGER, PUBLIC, PARAMETER ::   nmaxfld=62   ! Maximum number of coupling fields
    INTEGER, PUBLIC, PARAMETER ::   nmaxcat=5    ! Maximum number of coupling fields
    INTEGER, PUBLIC, PARAMETER ::   nmaxcpl=5    ! Maximum number of coupling fields
 
@@ -81,7 +80,7 @@ MODULE cpl_oasis3
       INTEGER               ::   ncplmodel ! Maximum number of models to/from which this variable may be sent/received
    END TYPE FLD_CPL
 
-   TYPE(FLD_CPL), DIMENSION(nmaxfld), PUBLIC ::   srcv, ssnd   !: Coupling fields
+   TYPE(FLD_CPL), DIMENSION(:), ALLOCATABLE, PUBLIC ::   srcv, ssnd   !: Coupling fields
 
    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   exfld   ! Temporary buffer for receiving
 
@@ -157,15 +156,6 @@ CONTAINS
          CALL oasis_abort ( ncomp_id, 'cpl_define', 'ncplmodel is larger than nmaxcpl, increase nmaxcpl')   ;   RETURN
       ENDIF
 
-      nrcv = krcv
-      IF( nrcv > nmaxfld ) THEN
-         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nrcv is larger than nmaxfld, increase nmaxfld')   ;   RETURN
-      ENDIF
-
-      nsnd = ksnd
-      IF( nsnd > nmaxfld ) THEN
-         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nsnd is larger than nmaxfld, increase nmaxfld')   ;   RETURN
-      ENDIF
       !
       ! ... Define the shape for the area that excludes the halo as we don't want them to be "seen" by oasis
       !
@@ -185,11 +175,11 @@ CONTAINS
       ! ... Define the partition, excluding halos as we don't want them to be "seen" by oasis
       ! -----------------------------------------------------------------
 
-      paral(1) = 2                                      ! box partitioning
-      paral(2) = Ni0glo * mjg0(nn_hls) + mig0(nn_hls)   ! NEMO lower left corner global offset, without halos
-      paral(3) = Ni_0                                   ! local extent in i, excluding halos
-      paral(4) = Nj_0                                   ! local extent in j, excluding halos
-      paral(5) = Ni0glo                                 ! global extent in x, excluding halos
+      paral(1) = 2                                        ! box partitioning
+      paral(2) = Ni0glo * mjg(nn_hls,0) + mig(nn_hls,0)   ! NEMO lower left corner global offset, without halos
+      paral(3) = Ni_0                                     ! local extent in i, excluding halos
+      paral(4) = Nj_0                                     ! local extent in j, excluding halos
+      paral(5) = Ni0glo                                   ! global extent in x, excluding halos
 
       IF( sn_cfctl%l_oasout ) THEN
          WRITE(numout,*) ' multiexchg: paral (1:5)', paral
@@ -428,8 +418,9 @@ CONTAINS
 
          !--- we must call lbc_lnk to fill the halos that where not received.
          IF( .NOT. ll_1st ) THEN
-            CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn )
+            CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn, ldfull = .TRUE. )
          ENDIF
+         !!clem: mettre T instead of clgrid
 
       ENDDO
       !
diff --git a/src/OCE/SBC/cyclone.F90 b/src/OCE/SBC/cyclone.F90
index 6a66bb02..175a3663 100644
--- a/src/OCE/SBC/cyclone.F90
+++ b/src/OCE/SBC/cyclone.F90
@@ -54,9 +54,9 @@ CONTAINS
       !! ** Action  : - open TC data, find TCs for the current timestep
       !!              - for each potential TC, add the winds on the grid
       !!----------------------------------------------------------------------
-      INTEGER , INTENT(in)                      ::   kt       ! time step index 
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) ::   pwnd_i   ! wind speed i-components at T-point ORCA direction
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) ::   pwnd_j   ! wind speed j-components at T-point ORCA direction
+      INTEGER , INTENT(in)                     ::   kt       ! time step index 
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) ::   pwnd_i   ! wind speed i-components at T-point ORCA direction
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) ::   pwnd_j   ! wind speed j-components at T-point ORCA direction
       ! 
       !!
       INTEGER  ::   ji, jj , jtc        ! loop arguments
@@ -79,7 +79,7 @@ CONTAINS
       REAL(wp) ::   zwnd_r, zwnd_t      ! radial and tangential components of the wind
       REAL(wp) ::   zvmax               ! timestep interpolated vmax
       REAL(wp) ::   zrlon, zrlat        ! temporary 
-      REAL(wp), DIMENSION(jpi,jpj) ::   zwnd_x, zwnd_y   ! zonal and meridional components of the wind
+      REAL(wp), DIMENSION(A2D(0))  ::   zwnd_x, zwnd_y   ! zonal and meridional components of the wind
       REAL(wp), DIMENSION(14,5)    ::   ztct                ! tropical cyclone track data at kt
       !
       CHARACTER(len=100) ::  cn_dir            ! Root directory for location of files
@@ -146,7 +146,7 @@ CONTAINS
             ! fitted B parameter (Willoughby 2004)
             zb = 2.
 
-            DO_2D( 1, 1, 1, 1 )
+            DO_2D( 0, 0, 0, 0 )
 
                ! calc distance between TC center and any point following great circle
                ! source : http://www.movable-type.co.uk/scripts/latlong.html
@@ -207,7 +207,7 @@ CONTAINS
                zA=0
             ENDIF           
         
-            DO_2D( 1, 1, 1, 1 )
+            DO_2D( 0, 0, 0, 0 )
                                
                zzrglam = rad * glamt(ji,jj) - zrlon
                zzrgphi = rad * gphit(ji,jj)
diff --git a/src/OCE/SBC/fldread.F90 b/src/OCE/SBC/fldread.F90
index f7a6d90f..dd25b66e 100644
--- a/src/OCE/SBC/fldread.F90
+++ b/src/OCE/SBC/fldread.F90
@@ -274,7 +274,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER  ,           INTENT(in   ) ::   ksecsbc   ! 
       TYPE(FLD),           INTENT(inout) ::   sdjf      ! input field related variables
-      INTEGER  , OPTIONAL, INTENT(in   ) ::   Kmm    ! ocean time level index
+      INTEGER  , OPTIONAL, INTENT(in   ) ::   Kmm       ! ocean time level index
       !
       INTEGER  ::   ja           ! end of this record (in seconds)
       INTEGER  ::   ibb, iaa     ! shorter name for sdjf%nbb and sdjf%naa
@@ -288,7 +288,7 @@ CONTAINS
          DO WHILE ( ksecsbc >= sdjf%nrecsec(ja) .AND. ja < sdjf%nreclast )   ! Warning: make sure ja <= sdjf%nreclast in this test
             ja = ja + 1
          END DO
-         IF( ksecsbc > sdjf%nrecsec(ja) )   ja = ja + 1   ! in case ksecsbc > sdjf%nrecsec(sdjf%nreclast)
+         IF( ksecsbc > sdjf%nrecsec(ja) )   ja = ja + 1         ! in case ksecsbc > sdjf%nrecsec(sdjf%nreclast)
 
          ! if ln_tint and if the new after is not ja+1, we need also to update after data before the swap
          ! so, after the swap, sdjf%nrec(2,ibb) will still be the closest value located just before ksecsbc
@@ -699,9 +699,10 @@ CONTAINS
       INTEGER ::   imf             ! size of the structure sd
       INTEGER ::   ill             ! character length
       INTEGER ::   iv              ! indice of V component
+      INTEGER ::   ipi, ipj
       CHARACTER (LEN=100)          ::   clcomp       ! dummy weight name
-      REAL(wp), DIMENSION(jpi,jpj) ::   utmp, vtmp   ! temporary arrays for vector rotation
-      REAL(wp), DIMENSION(:,:,:), POINTER ::   dta_u, dta_v    ! short cut
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   utmp, vtmp   ! temporary arrays for vector rotation
+      REAL(wp), DIMENSION(:,:,:), POINTER   ::   dta_u, dta_v    ! short cut
       !!---------------------------------------------------------------------
       !
       !! (sga: following code should be modified so that pairs arent searched for each time
@@ -724,11 +725,14 @@ CONTAINS
                      IF( sd(ju)%ln_tint ) THEN   ;   dta_u => sd(ju)%fdta(:,:,:,jn)   ;   dta_v => sd(iv)%fdta(:,:,:,jn) 
                      ELSE                        ;   dta_u => sd(ju)%fnow(:,:,:   )   ;   dta_v => sd(iv)%fnow(:,:,:   )
                      ENDIF
+                     ipi = SIZE(dta_u,1)   ;   ipj = SIZE(dta_u,2)
+                     ALLOCATE( utmp(ipi,ipj), vtmp(ipi,ipj) )
                      DO jk = 1, SIZE( sd(ju)%fnow, 3 )
                         CALL rot_rep( dta_u(:,:,jk), dta_v(:,:,jk), 'T', 'en->i', utmp(:,:) )
                         CALL rot_rep( dta_u(:,:,jk), dta_v(:,:,jk), 'T', 'en->j', vtmp(:,:) )
                         dta_u(:,:,jk) = utmp(:,:)   ;   dta_v(:,:,jk) = vtmp(:,:)
                      END DO
+                     DEALLOCATE( utmp, vtmp )
                      sd(ju)%rotn(jn) = .TRUE.               ! vector was rotated 
                      IF( lwp .AND. kt == nit000 )   WRITE(numout,*)   &
                         &   'fld_read: vector pair ('//TRIM(sd(ju)%clvar)//', '//TRIM(sd(iv)%clvar)//') rotated on to model grid'
@@ -745,11 +749,18 @@ CONTAINS
       !!---------------------------------------------------------------------
       !!                    ***  ROUTINE fld_def  ***
       !!
-      !! ** Purpose :   define the record(s) of the file and its name
+      !! ** Purpose :   Compute the record(s) of the file and define its name.
+      !!                By default, the current file is defined according to the current time step calendar
+      !!                variables (nyear, month, day, nsec_month, nsec_year... see daymod.F90)
+      !!                Records time (seconds since Jan. 1st 00h of nit000 year) is stored in sdjf%nrecsec
+      !!                if sdjf%ln_tint = .TRUE.
+      !!                   sdjf%nrecsec(1:sdjf%nreclast) = middle of each record
+      !!                if sdjf%ln_tint = .FALSE.
+      !!                   sdjf%nrecsec(0:sdjf%nreclast) = beginning/end of each record
       !!----------------------------------------------------------------------
       TYPE(FLD)        , INTENT(inout) ::   sdjf       ! input field related variables
-      LOGICAL, OPTIONAL, INTENT(in   ) ::   ldprev     ! 
-      LOGICAL, OPTIONAL, INTENT(in   ) ::   ldnext     ! 
+      LOGICAL, OPTIONAL, INTENT(in   ) ::   ldprev     ! True if sdjf must be defined for the previous file
+      LOGICAL, OPTIONAL, INTENT(in   ) ::   ldnext     ! True if sdjf must be defined for the next file
       !
       INTEGER  :: jt
       INTEGER  :: idaysec               ! number of seconds in 1 day = NINT(rday)
@@ -1100,7 +1111,7 @@ CONTAINS
       CHARACTER (len=5) ::   clname   !
       INTEGER , DIMENSION(4) ::   ddims
       INTEGER                ::   isrc
-      REAL(wp), DIMENSION(jpi,jpj) ::   data_tmp
+      REAL(wp), DIMENSION(A2D(0)) ::   data_tmp
       !!----------------------------------------------------------------------
       !
       IF( nxt_wgt > tot_wgts ) THEN
@@ -1155,9 +1166,9 @@ CONTAINS
          ELSE                 ;   ref_wgts(nxt_wgt)%numwgt = 16
          ENDIF
 
-         ALLOCATE( ref_wgts(nxt_wgt)%data_jpi(Nis0:Nie0,Njs0:Nje0,4) )
-         ALLOCATE( ref_wgts(nxt_wgt)%data_jpj(Nis0:Nie0,Njs0:Nje0,4) )
-         ALLOCATE( ref_wgts(nxt_wgt)%data_wgt(Nis0:Nie0,Njs0:Nje0,ref_wgts(nxt_wgt)%numwgt) )
+         ALLOCATE( ref_wgts(nxt_wgt)%data_jpi(A2D(0),4) )
+         ALLOCATE( ref_wgts(nxt_wgt)%data_jpj(A2D(0),4) )
+         ALLOCATE( ref_wgts(nxt_wgt)%data_wgt(A2D(0),ref_wgts(nxt_wgt)%numwgt) )
 
          DO jn = 1,4
             WRITE(clname,'(a3,i2.2)') 'src',jn
@@ -1332,7 +1343,9 @@ CONTAINS
       INTEGER, DIMENSION(3) ::   rec1_lsm, recn_lsm   ! temporary arrays for start and length in case of seaoverland
       INTEGER ::   ii_lsm1,ii_lsm2,ij_lsm1,ij_lsm2    ! temporary indices
       INTEGER ::   ji, jj, jk, jn, jir, jjr           ! loop counters
-      INTEGER ::   ipk
+      INTEGER ::   ipi, ipj, ipk
+      INTEGER ::   iisht, ijsht
+      INTEGER ::   ii, ij
       INTEGER ::   ni, nj                             ! lengths
       INTEGER ::   jpimin,jpiwid                      ! temporary indices
       INTEGER ::   jpimin_lsm,jpiwid_lsm              ! temporary indices
@@ -1343,7 +1356,11 @@ CONTAINS
       INTEGER ::   itmpi,itmpj,itmpz                     ! lengths
       REAL(wp),DIMENSION(:,:,:), ALLOCATABLE ::   ztmp_fly_dta                 ! local array of values on input grid     
       !!----------------------------------------------------------------------
+      ipi = SIZE(dta, 1)
+      ipj = SIZE(dta, 2)
       ipk = SIZE(dta, 3)
+      iisht = ( jpi - ipi ) / 2
+      ijsht = ( jpj - ipj ) / 2
       !
       !! for weighted interpolation we have weights at four corners of a box surrounding 
       !! a model grid point, each weight is multiplied by a grid value (bilinear case)
@@ -1438,7 +1455,9 @@ CONTAINS
          DO_3D( 0, 0, 0, 0, 1,ipk )
             ni = ref_wgts(kw)%data_jpi(ji,jj,jn) + 1
             nj = ref_wgts(kw)%data_jpj(ji,jj,jn) + 1
-            dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn) * ref_wgts(kw)%fly_dta(ni,nj,jk)
+            ii = ji - iisht
+            ij = jj - ijsht
+            dta(ii,ij,jk) = dta(ii,ij,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn) * ref_wgts(kw)%fly_dta(ni,nj,jk)
          END_3D
       END DO
 
@@ -1482,7 +1501,9 @@ CONTAINS
 !!$            DO_3D( 0, 0, 0, 0, 1,ipk )
 !!$               ni = ref_wgts(kw)%data_jpi(ji,jj,jn) + 1
 !!$               nj = ref_wgts(kw)%data_jpj(ji,jj,jn) + 1
-!!$               dta(ji,jj,jk) = dta(ji,jj,jk)   &
+!!$               ii = ji - iisht
+!!$               ij = jj - ijsht
+!!$               dta(ii,ij,jk) = dta(ii,ij,jk)   &
 !!$                  ! gradient in the i direction
 !!$                  &            + ref_wgts(kw)%data_wgt(ji,jj,jn+4) * 0.5_wp *                                    &
 !!$                  &                (ref_wgts(kw)%fly_dta(ni+1,nj  ,jk) - ref_wgts(kw)%fly_dta(ni-1,nj  ,jk))     &
@@ -1500,8 +1521,10 @@ CONTAINS
             DO_3D( 0, 0, 0, 0, 1,ipk )
                ni = ref_wgts(kw)%data_jpi(ji,jj,jn)
                nj = ref_wgts(kw)%data_jpj(ji,jj,jn)
+               ii = ji - iisht
+               ij = jj - ijsht
                ! gradient in the i direction
-               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+4) * 0.5_wp *         &
+               dta(ii,ij,jk) = dta(ii,ij,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+4) * 0.5_wp *         &
                   &                (ref_wgts(kw)%fly_dta(ni+2,nj+1,jk) - ref_wgts(kw)%fly_dta(ni  ,nj+1,jk))
             END_3D
          END DO
@@ -1509,8 +1532,10 @@ CONTAINS
             DO_3D( 0, 0, 0, 0, 1,ipk )
                ni = ref_wgts(kw)%data_jpi(ji,jj,jn)
                nj = ref_wgts(kw)%data_jpj(ji,jj,jn)
+               ii = ji - iisht
+               ij = jj - ijsht
                ! gradient in the j direction
-               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+8) * 0.5_wp *         &
+               dta(ii,ij,jk) = dta(ii,ij,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+8) * 0.5_wp *         &
                   &                (ref_wgts(kw)%fly_dta(ni+1,nj+2,jk) - ref_wgts(kw)%fly_dta(ni+1,nj  ,jk))
             END_3D
          END DO
@@ -1518,8 +1543,10 @@ CONTAINS
             DO_3D( 0, 0, 0, 0, 1,ipk )
                ni = ref_wgts(kw)%data_jpi(ji,jj,jn)
                nj = ref_wgts(kw)%data_jpj(ji,jj,jn)
+               ii = ji - iisht
+               ij = jj - ijsht
                ! gradient in the ij direction
-               dta(ji,jj,jk) = dta(ji,jj,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+12) * 0.25_wp * (     &
+               dta(ii,ij,jk) = dta(ii,ij,jk) + ref_wgts(kw)%data_wgt(ji,jj,jn+12) * 0.25_wp * (     &
                   &                (ref_wgts(kw)%fly_dta(ni+2,nj+2,jk) - ref_wgts(kw)%fly_dta(ni  ,nj+2,jk)) -   &
                   &                (ref_wgts(kw)%fly_dta(ni+2,nj  ,jk) - ref_wgts(kw)%fly_dta(ni  ,nj  ,jk)))
             END_3D
diff --git a/src/OCE/SBC/geo2ocean.F90 b/src/OCE/SBC/geo2ocean.F90
index 182e5e03..734ce4ef 100644
--- a/src/OCE/SBC/geo2ocean.F90
+++ b/src/OCE/SBC/geo2ocean.F90
@@ -57,15 +57,23 @@ CONTAINS
       !! ** Purpose :   Rotate the Repere: Change vector componantes between
       !!                geographic grid <--> stretched coordinates grid.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pxin, pyin   ! vector componantes
-      CHARACTER(len=1),             INTENT(in   ) ::   cd_type      ! define the nature of pt2d array grid-points
-      CHARACTER(len=5),             INTENT(in   ) ::   cdtodo       ! type of transpormation:
-      !                                                             ! 'en->i' = east-north to i-component
-      !                                                             ! 'en->j' = east-north to j-component
-      !                                                             ! 'ij->e' = (i,j) components to east
-      !                                                             ! 'ij->n' = (i,j) components to north
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   prot      
+      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pxin, pyin   ! vector componantes
+      CHARACTER(len=1),         INTENT(in   ) ::   cd_type      ! define the nature of pt2d array grid-points
+      CHARACTER(len=5),         INTENT(in   ) ::   cdtodo       ! type of transpormation:
+      !                                                         ! 'en->i' = east-north to i-component
+      !                                                         ! 'en->j' = east-north to j-component
+      !                                                         ! 'ij->e' = (i,j) components to east
+      !                                                         ! 'ij->n' = (i,j) components to north
+      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   prot      
+      !
+      INTEGER ::   ipi, ipj, iipi, ijpj
+      INTEGER ::   iisht, ijsht
+      INTEGER ::   ii, ij, ii1, ij1
       !!----------------------------------------------------------------------
+      ipi = SIZE(pxin, 1)         ;   ipj = SIZE(pxin, 2)
+      iisht = ( jpi - ipi ) / 2   ;   ijsht = ( jpj - ipj ) / 2
+      ii1  =   1 + iisht          ;   ij1  =   1 + iisht
+      iipi = ipi + iisht          ;   ijpj = ipj + ijsht
       !
       IF( lmust_init ) THEN      ! at 1st call only: set  gsin. & gcos.
          IF(lwp) WRITE(numout,*)
@@ -80,34 +88,50 @@ CONTAINS
       !
       CASE( 'en->i' )                  ! east-north to i-component
          SELECT CASE (cd_type)
-         CASE ('T')   ;   prot(:,:) = pxin(:,:) * gcost(:,:) + pyin(:,:) * gsint(:,:)
-         CASE ('U')   ;   prot(:,:) = pxin(:,:) * gcosu(:,:) + pyin(:,:) * gsinu(:,:)
-         CASE ('V')   ;   prot(:,:) = pxin(:,:) * gcosv(:,:) + pyin(:,:) * gsinv(:,:)
-         CASE ('F')   ;   prot(:,:) = pxin(:,:) * gcosf(:,:) + pyin(:,:) * gsinf(:,:)
+         CASE ('T')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcost(ii1:iipi,ij1:ijpj)   &
+            &                               + pyin(1:ipi,1:ipj) * gsint(ii1:iipi,ij1:ijpj)
+         CASE ('U')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosu(ii1:iipi,ij1:ijpj)   &
+            &                               + pyin(1:ipi,1:ipj) * gsinu(ii1:iipi,ij1:ijpj)
+         CASE ('V')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosv(ii1:iipi,ij1:ijpj)   &
+            &                               + pyin(1:ipi,1:ipj) * gsinv(ii1:iipi,ij1:ijpj)
+         CASE ('F')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosf(ii1:iipi,ij1:ijpj)   &
+            &                               + pyin(1:ipi,1:ipj) * gsinf(ii1:iipi,ij1:ijpj)
          CASE DEFAULT   ;   CALL ctl_stop( 'Only T, U, V and F grid points are coded' )
          END SELECT
       CASE ('en->j')                   ! east-north to j-component
          SELECT CASE (cd_type)
-         CASE ('T')   ;   prot(:,:) = pyin(:,:) * gcost(:,:) - pxin(:,:) * gsint(:,:)
-         CASE ('U')   ;   prot(:,:) = pyin(:,:) * gcosu(:,:) - pxin(:,:) * gsinu(:,:)
-         CASE ('V')   ;   prot(:,:) = pyin(:,:) * gcosv(:,:) - pxin(:,:) * gsinv(:,:)   
-         CASE ('F')   ;   prot(:,:) = pyin(:,:) * gcosf(:,:) - pxin(:,:) * gsinf(:,:)   
+         CASE ('T')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcost(ii1:iipi,ij1:ijpj)   &
+            &                               - pxin(1:ipi,1:ipj) * gsint(ii1:iipi,ij1:ijpj)
+         CASE ('U')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosu(ii1:iipi,ij1:ijpj)   &
+            &                               - pxin(1:ipi,1:ipj) * gsinu(ii1:iipi,ij1:ijpj)
+         CASE ('V')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosv(ii1:iipi,ij1:ijpj)   &
+            &                               - pxin(1:ipi,1:ipj) * gsinv(ii1:iipi,ij1:ijpj)   
+         CASE ('F')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosf(ii1:iipi,ij1:ijpj)   &
+            &                               - pxin(1:ipi,1:ipj) * gsinf(ii1:iipi,ij1:ijpj)   
          CASE DEFAULT   ;   CALL ctl_stop( 'Only T, U, V and F grid points are coded' )
          END SELECT
       CASE ('ij->e')                   ! (i,j)-components to east
          SELECT CASE (cd_type)
-         CASE ('T')   ;   prot(:,:) = pxin(:,:) * gcost(:,:) - pyin(:,:) * gsint(:,:)
-         CASE ('U')   ;   prot(:,:) = pxin(:,:) * gcosu(:,:) - pyin(:,:) * gsinu(:,:)
-         CASE ('V')   ;   prot(:,:) = pxin(:,:) * gcosv(:,:) - pyin(:,:) * gsinv(:,:)
-         CASE ('F')   ;   prot(:,:) = pxin(:,:) * gcosf(:,:) - pyin(:,:) * gsinf(:,:)
+         CASE ('T')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcost(ii1:iipi,ij1:ijpj)   &
+            &                               - pyin(1:ipi,1:ipj) * gsint(ii1:iipi,ij1:ijpj)
+         CASE ('U')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosu(ii1:iipi,ij1:ijpj)   &
+            &                               - pyin(1:ipi,1:ipj) * gsinu(ii1:iipi,ij1:ijpj)
+         CASE ('V')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosv(ii1:iipi,ij1:ijpj)   &
+            &                               - pyin(1:ipi,1:ipj) * gsinv(ii1:iipi,ij1:ijpj)
+         CASE ('F')   ;   prot(1:ipi,1:ipj) = pxin(1:ipi,1:ipj) * gcosf(ii1:iipi,ij1:ijpj)   &
+            &                               - pyin(1:ipi,1:ipj) * gsinf(ii1:iipi,ij1:ijpj)
          CASE DEFAULT   ;   CALL ctl_stop( 'Only T, U, V and F grid points are coded' )
          END SELECT
       CASE ('ij->n')                   ! (i,j)-components to north 
          SELECT CASE (cd_type)
-         CASE ('T')   ;   prot(:,:) = pyin(:,:) * gcost(:,:) + pxin(:,:) * gsint(:,:)
-         CASE ('U')   ;   prot(:,:) = pyin(:,:) * gcosu(:,:) + pxin(:,:) * gsinu(:,:)
-         CASE ('V')   ;   prot(:,:) = pyin(:,:) * gcosv(:,:) + pxin(:,:) * gsinv(:,:)
-         CASE ('F')   ;   prot(:,:) = pyin(:,:) * gcosf(:,:) + pxin(:,:) * gsinf(:,:)
+         CASE ('T')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcost(ii1:iipi,ij1:ijpj)   &
+            &                               + pxin(1:ipi,1:ipj) * gsint(ii1:iipi,ij1:ijpj)
+         CASE ('U')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosu(ii1:iipi,ij1:ijpj)   &
+            &                               + pxin(1:ipi,1:ipj) * gsinu(ii1:iipi,ij1:ijpj)
+         CASE ('V')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosv(ii1:iipi,ij1:ijpj)   &
+            &                               + pxin(1:ipi,1:ipj) * gsinv(ii1:iipi,ij1:ijpj)
+         CASE ('F')   ;   prot(1:ipi,1:ipj) = pyin(1:ipi,1:ipj) * gcosf(ii1:iipi,ij1:ijpj)   &
+            &                               + pxin(1:ipi,1:ipj) * gsinf(ii1:iipi,ij1:ijpj)
          CASE DEFAULT   ;   CALL ctl_stop( 'Only T, U, V and F grid points are coded' )
          END SELECT
       CASE DEFAULT   ;   CALL ctl_stop( 'rot_rep: Syntax Error in the definition of cdtodo' )
@@ -286,14 +310,17 @@ CONTAINS
       !! ** Method  :   Change a vector from geocentric to east/north 
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::  pxx, pyy, pzz
-      CHARACTER(len=1)            , INTENT(in   ) ::  cgrid
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::  pte, ptn
+      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::  pxx, pyy, pzz
+      CHARACTER(len=1)        , INTENT(in   ) ::  cgrid
+      REAL(wp), DIMENSION(:,:), INTENT(  out) ::  pte, ptn
       !
       REAL(wp), PARAMETER :: rpi = 3.141592653e0
       REAL(wp), PARAMETER :: rad = rpi / 180.e0
       INTEGER ::   ig     !
       INTEGER ::   ierr   ! local integer
+      INTEGER ::   ipi, ipj, iipi, ijpj
+      INTEGER ::   iisht, ijsht
+      INTEGER ::   ii, ij, ii1, ij1
       !!----------------------------------------------------------------------
       !
       IF( .NOT. ALLOCATED( gsinlon ) ) THEN
@@ -345,10 +372,16 @@ CONTAINS
          CALL ctl_stop( ctmp1 )
       END SELECT
       !
-      pte = - gsinlon(:,:,ig) * pxx + gcoslon(:,:,ig) * pyy
-      ptn = - gcoslon(:,:,ig) * gsinlat(:,:,ig) * pxx    &
-         &  - gsinlon(:,:,ig) * gsinlat(:,:,ig) * pyy    &
-         &  + gcoslat(:,:,ig) * pzz
+      ipi = SIZE(pxx, 1)          ;   ipj = SIZE(pxx, 2)
+      iisht = ( jpi - ipi ) / 2   ;   ijsht = ( jpj - ipj ) / 2
+      ii1  =   1 + iisht          ;   ij1  =   1 + iisht
+      iipi = ipi + iisht          ;   ijpj = ipj + ijsht
+      !
+      pte(1:ipi,1:ipj) = - gsinlon(ii1:iipi,ij1:ijpj,ig) * pxx(1:ipi,1:ipj)   &
+         &               + gcoslon(ii1:iipi,ij1:ijpj,ig) * pyy(1:ipi,1:ipj)
+      ptn(1:ipi,1:ipj) = - gcoslon(ii1:iipi,ij1:ijpj,ig) * gsinlat(ii1:iipi,ij1:ijpj,ig) * pxx(1:ipi,1:ipj)    &
+         &               - gsinlon(ii1:iipi,ij1:ijpj,ig) * gsinlat(ii1:iipi,ij1:ijpj,ig) * pyy(1:ipi,1:ipj)    &
+         &                                               + gcoslat(ii1:iipi,ij1:ijpj,ig) * pzz(1:ipi,1:ipj)
       !
    END SUBROUTINE geo2oce
 
@@ -371,6 +404,9 @@ CONTAINS
       REAL(wp), PARAMETER :: rad = rpi / 180.e0_wp
       INTEGER ::   ig     !
       INTEGER ::   ierr   ! local integer
+      INTEGER ::   ipi, ipj, iipi, ijpj
+      INTEGER ::   iisht, ijsht
+      INTEGER ::   ii, ij, ii1, ij1
       !!----------------------------------------------------------------------
 
       IF( .NOT. ALLOCATED( gsinlon ) ) THEN
@@ -422,9 +458,16 @@ CONTAINS
             CALL ctl_stop( ctmp1 )
       END SELECT
       !
-      pxx = - gsinlon(:,:,ig) * pte - gcoslon(:,:,ig) * gsinlat(:,:,ig) * ptn 
-      pyy =   gcoslon(:,:,ig) * pte - gsinlon(:,:,ig) * gsinlat(:,:,ig) * ptn
-      pzz =   gcoslat(:,:,ig) * ptn
+      ipi = SIZE(pte, 1)          ;   ipj = SIZE(pte, 2)
+      iisht = ( jpi - ipi ) / 2   ;   ijsht = ( jpj - ipj ) / 2
+      ii1  =   1 + iisht          ;   ij1  =   1 + iisht
+      iipi = ipi + iisht          ;   ijpj = ipj + ijsht
+      !
+      pxx(1:ipi,1:ipj) = - gsinlon(ii1:iipi,ij1:ijpj,ig)                                 * pte(1:ipi,1:ipj)   &
+         &               - gcoslon(ii1:iipi,ij1:ijpj,ig) * gsinlat(ii1:iipi,ij1:ijpj,ig) * ptn(1:ipi,1:ipj) 
+      pyy(1:ipi,1:ipj) =   gcoslon(ii1:iipi,ij1:ijpj,ig)                                 * pte(1:ipi,1:ipj)    &
+         &               - gsinlon(ii1:iipi,ij1:ijpj,ig) * gsinlat(ii1:iipi,ij1:ijpj,ig) * ptn(1:ipi,1:ipj)
+      pzz(1:ipi,1:ipj) =   gcoslat(ii1:iipi,ij1:ijpj,ig)                                 * ptn(1:ipi,1:ipj)
       !
    END SUBROUTINE oce2geo
 
diff --git a/src/OCE/SBC/ocealb.F90 b/src/OCE/SBC/ocealb.F90
index e40f6f20..6ea06868 100644
--- a/src/OCE/SBC/ocealb.F90
+++ b/src/OCE/SBC/ocealb.F90
@@ -17,7 +17,9 @@ MODULE ocealb
    PRIVATE
 
    PUBLIC   oce_alb   ! routine called by sbccpl
-  
+   
+   !! Substitution
+#  include "do_loop_substitute.h90"  
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: ocealb.F90 10069 2018-08-28 14:12:24Z nicolasmartin $
@@ -31,8 +33,8 @@ CONTAINS
       !! 
       !! ** Purpose :   Computation of the albedo of the ocean
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   palb_os   !  albedo of ocean under overcast sky
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   palb_cs   !  albedo of ocean under clear sky
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) ::   palb_os   !  albedo of ocean under overcast sky
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) ::   palb_cs   !  albedo of ocean under clear sky
       !!
       REAL(wp) ::   zcoef 
       REAL(wp) ::   rmue = 0.40    !  cosine of local solar altitude
diff --git a/src/OCE/SBC/sbc_ice.F90 b/src/OCE/SBC/sbc_ice.F90
index acc6adf1..7cde0d4c 100644
--- a/src/OCE/SBC/sbc_ice.F90
+++ b/src/OCE/SBC/sbc_ice.F90
@@ -50,8 +50,8 @@ MODULE sbc_ice
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qcn_ice        !: heat conduction flux in the layer below surface   [W/m2]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qtr_ice_top    !: solar flux transmitted below the ice surface      [W/m2]
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   utau_ice       !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts   [N/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vtau_ice       !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts   [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   utau_ice       !: atmos-ice u-stress. T-pts                  [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vtau_ice       !: atmos-ice v-stress. T-pts                  [N/m2]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice        !: sublimation - precip over sea ice          [kg/m2/s]
 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt            !: category topmelt
@@ -103,6 +103,8 @@ MODULE sbc_ice
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_mass_b      !: mass of snow and ice at previous ice time step   [Kg/m2]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_fmass       !: time evolution of mass of snow+ice               [Kg/m2/s]
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbc_ice.F90 14072 2020-12-04 07:48:38Z laurent $
@@ -114,36 +116,49 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                     ***  FUNCTION sbc_ice_alloc  ***
       !!----------------------------------------------------------------------
-      INTEGER :: ierr(4)
+      INTEGER :: ierr(5), ii
       !!----------------------------------------------------------------------
       ierr(:) = 0
+      ii = 0
 
-      ALLOCATE( snwice_mass(jpi,jpj) , snwice_mass_b(jpi,jpj), snwice_fmass(jpi,jpj) , STAT=ierr(1) )
+      ii = ii + 1
+      ALLOCATE( snwice_mass(jpi,jpj) , snwice_mass_b(jpi,jpj), snwice_fmass(jpi,jpj) , STAT=ierr(ii) )
 
 #if defined key_si3
-      ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice  (jpi,jpj,jpl) ,     &
-         &      qla_ice (jpi,jpj,jpl) , dqla_ice (jpi,jpj,jpl) ,     &
-         &      dqns_ice(jpi,jpj,jpl) , tn_ice   (jpi,jpj,jpl) , alb_ice    (jpi,jpj,jpl) ,   &
-         &      qml_ice (jpi,jpj,jpl) , qcn_ice  (jpi,jpj,jpl) , qtr_ice_top(jpi,jpj,jpl) ,   &
-         &      utau_ice(jpi,jpj)     , vtau_ice (jpi,jpj)     , wndm_ice   (jpi,jpj)     ,   &
-         &      evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice  (jpi,jpj)     ,   &
-         &      qemp_ice(jpi,jpj)     , qevap_ice(jpi,jpj,jpl) , qemp_oce   (jpi,jpj)     ,   &
-         &      qns_oce (jpi,jpj)     , qsr_oce  (jpi,jpj)     , emp_oce    (jpi,jpj)     ,   &
-         &      emp_ice (jpi,jpj)     , sstfrz   (jpi,jpj)     , rCdU_ice   (jpi,jpj)     , STAT= ierr(2) )
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ii = ii + 1
+      ALLOCATE( utau_ice(jpi,jpj) , vtau_ice(jpi,jpj) ,  &
+         &      rCdU_ice(A2D(1))                      , STAT= ierr(ii) )
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ii = ii + 1
+      ALLOCATE( wndm_ice(A2D(0))     , &
+         &      qns_ice (A2D(0),jpl) , qsr_ice  (A2D(0),jpl) ,     &
+         &      qla_ice (A2D(0),jpl) , dqla_ice (A2D(0),jpl) ,     &
+         &      dqns_ice(A2D(0),jpl) , tn_ice   (A2D(0),jpl) , alb_ice    (A2D(0),jpl) ,   &
+         &      qml_ice (A2D(0),jpl) , qcn_ice  (A2D(0),jpl) , qtr_ice_top(A2D(0),jpl) ,   &
+         &      evap_ice(A2D(0),jpl) , devap_ice(A2D(0),jpl) , qprec_ice  (A2D(0))     ,   &
+         &      qemp_ice(A2D(0))     , qevap_ice(A2D(0),jpl) , qemp_oce   (A2D(0))     ,   &
+         &      qns_oce (A2D(0))     , qsr_oce  (A2D(0))     , emp_oce    (A2D(0))     ,   &
+         &      emp_ice (A2D(0))     , sstfrz   (A2D(0))     , STAT= ierr(ii) )
 #endif
 
 #if defined key_cice
+      ii = ii + 1
       ALLOCATE( qla_ice(jpi,jpj,1)    , qlw_ice(jpi,jpj,1)    , qsr_ice(jpi,jpj,1)    , &
                 wndi_ice(jpi,jpj)     , tatm_ice(jpi,jpj)     , qatm_ice(jpi,jpj)     , &
                 wndj_ice(jpi,jpj)     , nfrzmlt(jpi,jpj)      , ss_iou(jpi,jpj)       , &
                 ss_iov(jpi,jpj)       , fr_iu(jpi,jpj)        , fr_iv(jpi,jpj)        , &
                 a_i(jpi,jpj,ncat)     , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , &
-                STAT= ierr(2) )
+                STAT= ierr(ii) )
+      ii = ii + 1
       IF( ln_cpl )   ALLOCATE( u_ice(jpi,jpj)        , tn_ice (jpi,jpj,1)    , &
          &                     v_ice(jpi,jpj)        , alb_ice(jpi,jpj,1)    , &
          &                     emp_ice(jpi,jpj)      , qns_ice(jpi,jpj,1)    , dqns_ice(jpi,jpj,1)   , &
-         &                     STAT= ierr(3) )
-      IF( ln_cpl )   ALLOCATE( h_i(jpi,jpj,jpl) , h_s(jpi,jpj,jpl) , STAT=ierr(4) )
+         &                     h_i(jpi,jpj,jpl) , h_s(jpi,jpj,jpl) ,STAT= ierr(ii) )
 #endif
 
       sbc_ice_alloc = MAXVAL( ierr )
diff --git a/src/OCE/SBC/sbc_oce.F90 b/src/OCE/SBC/sbc_oce.F90
index 3098b586..d4eea489 100644
--- a/src/OCE/SBC/sbc_oce.F90
+++ b/src/OCE/SBC/sbc_oce.F90
@@ -103,34 +103,36 @@ MODULE sbc_oce
    INTEGER , PUBLIC ::  ncpl_qsr_freq = 0        !: qsr coupling frequency per days from atmosphere (used by top)
    !
    !!                                   !!   now    ! before   !!
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau_icb, vtau_icb !: sea surface (i,j)-stress used by icebergs   [N/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau               !: sea surface i-stress (ocean referential) T-pt [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau               !: sea surface j-stress (ocean referential) T-pt [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utauU  , utau_b    !: sea surface i-stress (ocean referential) U-pt [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtauV  , vtau_b    !: sea surface j-stress (ocean referential) V-pt [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau_icb, vtau_icb !: sea surface (i,j)-stress used by icebergs     [N/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum               !: module of sea surface stress (at T-point)     [N/m2]
    !! wndm is used compute surface gases exchanges in ice-free ocean or leads
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rhoa              !: air density at "rn_zu" m above the sea       [kg/m3]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSS.kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff                                 [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwficb , fwficb_b !: iceberg melting                              [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm               !: wind speed module at T-point (=|U10m-Uoce|)   [m/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rhoa               !: air density at "rn_zu" m above the sea        [kg/m3]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr                !: sea heat flux:     solar                      [W/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b     !: sea heat flux: non solar                      [W/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot            !: total     solar heat flux (over sea and ice)  [W/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot            !: total non solar heat flux (over sea and ice)  [W/m2]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b     !: freshwater budget: volume flux                [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b     !: salt flux                                     [PSS.kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot            !: total E-P over ocean and ice                  [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfice             !: ice-ocean freshwater budget (>0 to the ocean) [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b     !: river runoff                                  [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwficb             !: iceberg melting                               [Kg/m2/s]
    !!
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
    !!
    !!
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   cloud_fra         !: cloud cover (fraction of cloud in a gridcell) [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip            !: total precipitation                           [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip            !: solid precipitation                           [Kg/m2/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i               !: ice fraction = 1 - lead fraction       (between 0 to 1)
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2            !: atmospheric pCO2                              [ppm]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask           !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   cloud_fra          !: cloud cover (fraction of cloud in a gridcell) [-]
 
    !!---------------------------------------------------------------------
    !! ABL Vertical Domain size
@@ -173,30 +175,40 @@ CONTAINS
       !!---------------------------------------------------------------------
       !!                  ***  FUNCTION sbc_oce_alloc  ***
       !!---------------------------------------------------------------------
-      INTEGER :: ierr(6)
+      INTEGER :: ierr(8)
       !!---------------------------------------------------------------------
       ierr(:) = 0
       !
-      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
-         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , rhoa(jpi,jpj) , STAT=ierr(1) )
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , utauU(jpi,jpj) , &
+         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , vtauV(jpi,jpj) , STAT=ierr(1) )
       !
-      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
-         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
-         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
-         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
+      ALLOCATE( emp(jpi,jpj) , emp_b(jpi,jpj) ,  &
+         &      STAT=ierr(2) )
       !
-      ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,  &
-         &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) ,  &
-         &      fwficb  (jpi,jpj), fwficb_b(jpi,jpj), STAT=ierr(3) )
+      ALLOCATE( rnf(jpi,jpj), rnf_b(jpi,jpj), STAT=ierr(3) )
       !
-      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
-         &      atm_co2(jpi,jpj) , tsk_m(jpi,jpj) , cloud_fra(jpi,jpj),   &
+      ALLOCATE( fr_i(jpi,jpj) ,     &
          &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      &
-         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) )
+         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , e3t_m(jpi,jpj) , STAT=ierr(4) )
       !
-      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) )
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( qns    (A2D(0)) , qns_b  (A2D(0)) , qsr   (A2D(0))     ,  &
+         &      qns_tot(A2D(0)) , qsr_tot(A2D(0)) , qsr_hc(A2D(0),jpk) , qsr_hc_b(A2D(0),jpk) , STAT=ierr(5) )
+      !
+      ALLOCATE( sbc_tsc(A2D(0),jpts) , sbc_tsc_b(A2D(0),jpts) ,  &
+         &      sfx (A2D(0)) , sfx_b(A2D(0)) , emp_tot(A2D(0)), fwfice(A2D(0)), fwficb(A2D(0)), &
+         &      wndm(A2D(0)) , taum (A2D(0)) , STAT=ierr(6) )
+      !
+      ALLOCATE( tprecip(A2D(0)) , sprecip(A2D(0)) ,    &
+         &      atm_co2(A2D(0)) , tsk_m  (A2D(0)) , cloud_fra(A2D(0)), STAT=ierr(7) )
+
+      ALLOCATE( rhoa(A2D(0)) , q_air_zt(A2D(0)) , theta_air_zt(A2D(0)) , STAT=ierr(8) )
       !
-      ALLOCATE( q_air_zt(jpi,jpj) , theta_air_zt(jpi,jpj) , STAT=ierr(6) ) !#LB
       !
       sbc_oce_alloc = MAXVAL( ierr )
       CALL mpp_sum ( 'sbc_oce', sbc_oce_alloc )
@@ -205,9 +217,10 @@ CONTAINS
    END FUNCTION sbc_oce_alloc
 
 
+   !!clem => this subroutine is never used in nemo
    SUBROUTINE sbc_tau2wnd
       !!---------------------------------------------------------------------
-      !!                    ***  ROUTINE sbc_tau2wnd  ***
+      !!                    ***  ROUTINE   ***
       !!
       !! ** Purpose : Estimation of wind speed as a function of wind stress
       !!
@@ -217,17 +230,14 @@ CONTAINS
       USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
       REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
       REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
-      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
+      REAL(wp) ::   ztau, zcoef           ! temporary variables
       INTEGER  ::   ji, jj                ! dummy indices
       !!---------------------------------------------------------------------
       zcoef = 0.5 / ( zrhoa * zcdrag )
       DO_2D( 0, 0, 0, 0 )
-         ztx = utau(ji-1,jj  ) + utau(ji,jj)
-         zty = vtau(ji  ,jj-1) + vtau(ji,jj)
-         ztau = SQRT( ztx * ztx + zty * zty )
-         wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
+         ztau = SQRT( utau(ji,jj)*utau(ji,jj) + vtau(ji,jj)*vtau(ji,jj) )
+         wndm(ji,jj) = SQRT ( ztau * zcoef ) * smask0(ji,jj)
       END_2D
-      CALL lbc_lnk( 'sbc_oce', wndm(:,:) , 'T', 1.0_wp )
       !
    END SUBROUTINE sbc_tau2wnd
 
diff --git a/src/OCE/SBC/sbc_phy.F90 b/src/OCE/SBC/sbc_phy.F90
index cabec70f..2a845e3a 100644
--- a/src/OCE/SBC/sbc_phy.F90
+++ b/src/OCE/SBC/sbc_phy.F90
@@ -223,9 +223,9 @@ CONTAINS
 
    FUNCTION virt_temp_vctr( pta, pqa )
 
-      REAL(wp), DIMENSION(jpi,jpj)             :: virt_temp_vctr !: virtual temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta !: absolute or potential air temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa !: specific humidity of air   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0))             :: virt_temp_vctr !: virtual temperature [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pta !: absolute or potential air temperature [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pqa !: specific humidity of air   [kg/kg]
 
       virt_temp_vctr(:,:) = pta(:,:) * (1._wp + rctv0*pqa(:,:))
 
@@ -290,25 +290,25 @@ CONTAINS
       !! ** Author: G. Samson, Feb 2021
       !!-------------------------------------------------------------------------------
 
-      REAL(wp), DIMENSION(jpi,jpj)                          :: pres_temp_vctr    ! air pressure              [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in )             :: pqspe             ! air specific humidity     [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in )             :: pslp              ! sea-level pressure        [Pa]
-      REAL(wp),                     INTENT(in )             :: pz                ! height above surface      [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in )  , OPTIONAL :: ptpot             ! air potential temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: pta               ! air absolute temperature  [K]
-      INTEGER                                               :: ji, jj            ! loop indices
-      LOGICAL                     , INTENT(in)   , OPTIONAL :: l_ice             ! sea-ice presence
-      LOGICAL                                               :: lice              ! sea-ice presence
+      REAL(wp), DIMENSION(A2D(0))                          :: pres_temp_vctr    ! air pressure              [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in )             :: pqspe             ! air specific humidity     [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in )             :: pslp              ! sea-level pressure        [Pa]
+      REAL(wp),                    INTENT(in )             :: pz                ! height above surface      [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in )  , OPTIONAL :: ptpot             ! air potential temperature [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(inout), OPTIONAL :: pta               ! air absolute temperature  [K]
+      INTEGER                                              :: ji, jj            ! loop indices
+      LOGICAL                    , INTENT(in)   , OPTIONAL :: l_ice             ! sea-ice presence
+      LOGICAL                                              :: lice              ! sea-ice presence
  
       lice = .FALSE.
       IF( PRESENT(l_ice) ) lice = l_ice
 
       IF( PRESENT(ptpot) ) THEN
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             pres_temp_vctr(ji,jj) = pres_temp_sclr( pqspe(ji,jj), pslp(ji,jj), pz, ptpot=ptpot(ji,jj), pta=pta(ji,jj), l_ice=lice )
          END_2D
       ELSE
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             pres_temp_vctr(ji,jj) = pres_temp_sclr( pqspe(ji,jj), pslp(ji,jj), pz, pta=pta(ji,jj), l_ice=lice )
          END_2D
       ENDIF
@@ -344,12 +344,12 @@ CONTAINS
       !! ** Author: G. Samson, Feb 2021
       !!-------------------------------------------------------------------------------
 
-      REAL(wp), DIMENSION(jpi,jpj)             :: theta_exner_vctr   ! air/surface potential temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta                ! air/surface absolute temperature  [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa                ! air/surface pressure              [Pa]
-      INTEGER                                  :: ji, jj             ! loop indices
+      REAL(wp), DIMENSION(A2D(0))             :: theta_exner_vctr   ! air/surface potential temperature [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pta                ! air/surface absolute temperature  [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppa                ! air/surface pressure              [Pa]
+      INTEGER                                 :: ji, jj             ! loop indices
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          theta_exner_vctr(ji,jj) = theta_exner_sclr( pta(ji,jj), ppa(ji,jj) )
       END_2D
 
@@ -364,10 +364,10 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!-------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak      ! air temperature             [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa       ! air specific humidity   [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ppa      ! pressure in                [Pa]
-      REAL(wp), DIMENSION(jpi,jpj)             ::   rho_air_vctr   ! density of moist air   [kg/m^3]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   ptak      ! air temperature             [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pqa       ! air specific humidity   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   ppa      ! pressure in                [Pa]
+      REAL(wp), DIMENSION(A2D(0))             ::   rho_air_vctr   ! density of moist air   [kg/m^3]
       !!-------------------------------------------------------------------------------
 
       rho_air_vctr = MAX( ppa / (R_dry*ptak * ( 1._wp + rctv0*pqa )) , 0.8_wp )
@@ -412,11 +412,11 @@ CONTAINS
 
    FUNCTION visc_air_vctr(ptak)
 
-      REAL(wp), DIMENSION(jpi,jpj)             ::   visc_air_vctr   ! kinetic viscosity (m^2/s)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak       ! air temperature in (K)
+      REAL(wp), DIMENSION(A2D(0))             ::   visc_air_vctr   ! kinetic viscosity (m^2/s)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   ptak       ! air temperature in (K)
       INTEGER  ::   ji, jj      ! dummy loop indices
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          visc_air_vctr(ji,jj) = visc_air_sclr( ptak(ji,jj) )
       END_2D
 
@@ -431,8 +431,8 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             ::   L_vap_vctr   ! latent heat of vaporization   [J/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   psst   ! water temperature                [K]
+      REAL(wp), DIMENSION(A2D(0))             ::   L_vap_vctr   ! latent heat of vaporization   [J/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   psst   ! water temperature                [K]
       !!----------------------------------------------------------------------------------
       !
       L_vap_vctr = (  2.501_wp - 0.00237_wp * ( psst(:,:) - rt0)  ) * 1.e6_wp
@@ -464,8 +464,8 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!-------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa           ! air specific humidity         [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj)             ::   cp_air_vctr   ! specific heat of moist air   [J/K/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pqa           ! air specific humidity         [kg/kg]
+      REAL(wp), DIMENSION(A2D(0))             ::   cp_air_vctr   ! specific heat of moist air   [J/K/kg]
       !!-------------------------------------------------------------------------------
 
       cp_air_vctr = rCp_dry + rCp_vap * pqa
@@ -516,12 +516,12 @@ CONTAINS
 
    FUNCTION gamma_moist_vctr( ptak, pqa )
 
-      REAL(wp), DIMENSION(jpi,jpj)             ::   gamma_moist_vctr
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa
+      REAL(wp), DIMENSION(A2D(0))             ::   gamma_moist_vctr
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   ptak
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pqa
       INTEGER  :: ji, jj
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          gamma_moist_vctr(ji,jj) = gamma_moist_sclr( ptak(ji,jj), pqa(ji,jj) )
       END_2D
 
@@ -537,17 +537,17 @@ CONTAINS
       !! Author: L. Brodeau, June 2019 / AeroBulk
       !!         (https://github.com/brodeau/aerobulk/)
       !!------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: One_on_L     !: 1./(Obukhov length) [m^-1]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptha         !: reference potential temperature of air [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa          !: reference specific humidity of air   [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pus          !: u*: friction velocity [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pts, pqs     !: \theta* and q* friction aka turb. scales for temp. and spec. hum.
+      REAL(wp), DIMENSION(A2D(0))             :: One_on_L     !: 1./(Obukhov length) [m^-1]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptha         !: reference potential temperature of air [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pqa          !: reference specific humidity of air   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pus          !: u*: friction velocity [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pts, pqs     !: \theta* and q* friction aka turb. scales for temp. and spec. hum.
       !
       INTEGER  ::   ji, jj         ! dummy loop indices
       REAL(wp) ::     zqa          ! local scalar
       !!-------------------------------------------------------------------
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zqa = (1._wp + rctv0*pqa(ji,jj))
          !
          ! The main concern is to know whether, the vertical turbulent flux of virtual temperature, < u' theta_v' > is estimated with:
@@ -598,27 +598,27 @@ CONTAINS
 
    FUNCTION Ri_bulk_vctr( pz, psst, ptha, pssq, pqa, pub,  pta_layer, pqa_layer )
 
-      REAL(wp), DIMENSION(jpi,jpj)             :: Ri_bulk_vctr
-      REAL(wp)                    , INTENT(in) :: pz    ! height above the sea (aka "delta z")  [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psst  ! SST                                   [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptha  ! pot. air temp. at height "pz"         [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pssq  ! 0.98*q_sat(SST)                   [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa   ! air spec. hum. at height "pz"     [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pub   ! bulk wind speed                     [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pta_layer ! when possible, a better guess of absolute temperature WITHIN the layer [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pqa_layer ! when possible, a better guess of specific humidity    WITHIN the layer [kg/kg]
+      REAL(wp), DIMENSION(A2D(0))             :: Ri_bulk_vctr
+      REAL(wp)                   , INTENT(in) :: pz    ! height above the sea (aka "delta z")  [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: psst  ! SST                                   [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptha  ! pot. air temp. at height "pz"         [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pssq  ! 0.98*q_sat(SST)                   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pqa   ! air spec. hum. at height "pz"     [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pub   ! bulk wind speed                     [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL :: pta_layer ! when possible, a better guess of absolute temperature WITHIN the layer [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL :: pqa_layer ! when possible, a better guess of specific humidity    WITHIN the layer [kg/kg]
       !!
       LOGICAL  :: l_ptqa_l_prvd = .FALSE.
       INTEGER  ::   ji, jj
 
       IF( PRESENT(pta_layer) .AND. PRESENT(pqa_layer) ) l_ptqa_l_prvd = .TRUE.
       IF( l_ptqa_l_prvd ) THEN
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj), &
                &                                pta_layer=pta_layer(ji,jj ),  pqa_layer=pqa_layer(ji,jj ) )
          END_2D
       ELSE
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj) )
          END_2D
       END IF
@@ -652,10 +652,10 @@ CONTAINS
    END FUNCTION e_sat_sclr
 
    FUNCTION e_sat_vctr(ptak)
-      REAL(wp), DIMENSION(jpi,jpj)             :: e_sat_vctr !: vapour pressure at saturation  [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak    !: temperature (K)
+      REAL(wp), DIMENSION(A2D(0))             :: e_sat_vctr !: vapour pressure at saturation  [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptak    !: temperature (K)
       INTEGER  ::   ji, jj         ! dummy loop indices
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
       e_sat_vctr(ji,jj) = e_sat_sclr(ptak(ji,jj))
       END_2D
    END FUNCTION e_sat_vctr
@@ -681,11 +681,11 @@ CONTAINS
 
    FUNCTION e_sat_ice_vctr(ptak)
       !! Same as "e_sat" but over ice rather than water!
-      REAL(wp), DIMENSION(jpi,jpj) :: e_sat_ice_vctr !: vapour pressure at saturation in presence of ice [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak
+      REAL(wp), DIMENSION(A2D(0)) :: e_sat_ice_vctr !: vapour pressure at saturation in presence of ice [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptak
       INTEGER  :: ji, jj
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          e_sat_ice_vctr(ji,jj) = e_sat_ice_sclr( ptak(ji,jj) )
       END_2D
 
@@ -712,11 +712,11 @@ CONTAINS
 
    FUNCTION de_sat_dt_ice_vctr(ptak)
       !! Same as "e_sat" but over ice rather than water!
-      REAL(wp), DIMENSION(jpi,jpj) :: de_sat_dt_ice_vctr !: vapour pressure at saturation in presence of ice [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak
+      REAL(wp), DIMENSION(A2D(0)) :: de_sat_dt_ice_vctr !: vapour pressure at saturation in presence of ice [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptak
       INTEGER  :: ji, jj
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          de_sat_dt_ice_vctr(ji,jj) = de_sat_dt_ice_sclr( ptak(ji,jj) )
       END_2D
 
@@ -751,16 +751,16 @@ CONTAINS
 
    FUNCTION q_sat_vctr( pta, ppa,  l_ice )
 
-      REAL(wp), DIMENSION(jpi,jpj) :: q_sat_vctr
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta  !: absolute temperature of air [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa  !: atmospheric pressure        [Pa]
+      REAL(wp), DIMENSION(A2D(0)) :: q_sat_vctr
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pta  !: absolute temperature of air [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppa  !: atmospheric pressure        [Pa]
       LOGICAL,  INTENT(in), OPTIONAL :: l_ice  !: we are above ice
       LOGICAL  :: lice
       INTEGER  :: ji, jj
       !!----------------------------------------------------------------------------------
       lice = .FALSE.
       IF( PRESENT(l_ice) ) lice = l_ice
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          q_sat_vctr(ji,jj) = q_sat_sclr( pta(ji,jj) , ppa(ji,jj), l_ice=lice )
       END_2D
 
@@ -790,12 +790,12 @@ CONTAINS
 
    FUNCTION dq_sat_dt_ice_vctr( pta, ppa )
 
-      REAL(wp), DIMENSION(jpi,jpj) :: dq_sat_dt_ice_vctr
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta  !: absolute temperature of air [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa  !: atmospheric pressure        [Pa]
+      REAL(wp), DIMENSION(A2D(0)) :: dq_sat_dt_ice_vctr
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pta  !: absolute temperature of air [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppa  !: atmospheric pressure        [Pa]
       INTEGER  :: ji, jj
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          dq_sat_dt_ice_vctr(ji,jj) = dq_sat_dt_ice_sclr( pta(ji,jj) , ppa(ji,jj) )
       END_2D
 
@@ -808,16 +808,16 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: q_air_rh
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: prha        !: relative humidity      [fraction, not %!!!]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak        !: air temperature        [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa        !: atmospheric pressure   [Pa]
+      REAL(wp), DIMENSION(A2D(0))             :: q_air_rh
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: prha        !: relative humidity      [fraction, not %!!!]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ptak        !: air temperature        [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppa        !: atmospheric pressure   [Pa]
       !
       INTEGER  ::   ji, jj      ! dummy loop indices
       REAL(wp) ::   ze      ! local scalar
       !!----------------------------------------------------------------------------------
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ze = prha(ji,jj)*e_sat_sclr(ptak(ji,jj))
          q_air_rh(ji,jj) = ze*reps0/(ppa(ji,jj) - (1. - reps0)*ze)
       END_2D
@@ -833,29 +833,29 @@ CONTAINS
       !!          and the module of the wind stress => pTau = Tau
       !! ** Author: L. Brodeau, Sept. 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp),                     INTENT(in)  :: pzu  ! height above the sea-level where all this takes place (normally 10m)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pTs  ! water temperature at the air-sea interface [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pqs  ! satur. spec. hum. at T=pTs   [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pTa  ! potential air temperature at z=pzu [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pqa  ! specific humidity at z=pzu [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pust ! u*
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: ptst ! t*
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pqst ! q*
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pwnd ! wind speed module at z=pzu [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pUb  ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: ppa ! sea-level atmospheric pressure [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: prlw ! downwelling longwave radiative flux [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: prhoa ! air density [kg/m3]
+      REAL(wp),                    INTENT(in)  :: pzu  ! height above the sea-level where all this takes place (normally 10m)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pTs  ! water temperature at the air-sea interface [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pqs  ! satur. spec. hum. at T=pTs   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pTa  ! potential air temperature at z=pzu [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pqa  ! specific humidity at z=pzu [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pust ! u*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: ptst ! t*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pqst ! q*
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pwnd ! wind speed module at z=pzu [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pUb  ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: ppa ! sea-level atmospheric pressure [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: prlw ! downwelling longwave radiative flux [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: prhoa ! air density [kg/m3]
       !
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQns ! non-solar heat flux to the ocean aka "Qlat + Qsen + Qlw" [W/m^2]]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pTau ! module of the wind stress [N/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pQns ! non-solar heat flux to the ocean aka "Qlat + Qsen + Qlw" [W/m^2]]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pTau ! module of the wind stress [N/m^2]
       !
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(out) :: Qlat
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(out) :: Qlat
       !
       REAL(wp) :: zdt, zdq, zCd, zCh, zCe, zz0, zQlat, zQsen, zQlw
       INTEGER  ::   ji, jj     ! dummy loop indices
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zdt = pTa(ji,jj) - pTs(ji,jj) ;  zdt = SIGN( MAX(ABS(zdt),1.E-6_wp), zdt )
          zdq = pqa(ji,jj) - pqs(ji,jj) ;  zdq = SIGN( MAX(ABS(zdq),1.E-9_wp), zdq )
@@ -929,25 +929,25 @@ CONTAINS
       &                          pTau, pQsen, pQlat,      &
       &                          pEvap, pfact_evap )
       !!----------------------------------------------------------------------------------
-      REAL(wp),                     INTENT(in)  :: pzu   ! height above the sea-level where all this takes place (normally 10m)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pTs   ! water temperature at the air-sea interface [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pqs   ! satur. spec. hum. at T=pTs   [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pTa   ! potential air temperature at z=pzu [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pqa   ! specific humidity at z=pzu [kg/kg]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pCd
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pCh
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pCe
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pwnd  ! wind speed module at z=pzu [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pUb   ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: ppa   ! sea-level atmospheric pressure [Pa]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: prhoa ! Air density at z=pzu [kg/m^3] 
+      REAL(wp),                    INTENT(in)  :: pzu   ! height above the sea-level where all this takes place (normally 10m)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pTs   ! water temperature at the air-sea interface [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pqs   ! satur. spec. hum. at T=pTs   [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pTa   ! potential air temperature at z=pzu [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pqa   ! specific humidity at z=pzu [kg/kg]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pCd
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pCh
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pCe
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pwnd  ! wind speed module at z=pzu [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pUb   ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: ppa   ! sea-level atmospheric pressure [Pa]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: prhoa ! Air density at z=pzu [kg/m^3] 
       !!
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pTau  ! module of the wind stress [N/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQsen !  [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQlat !  [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pTau  ! module of the wind stress [N/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pQsen !  [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out) :: pQlat !  [W/m^2]
       !!
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s]
-      REAL(wp),                     INTENT(in) , OPTIONAL :: pfact_evap  ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s]
+      REAL(wp),                    INTENT(in) , OPTIONAL :: pfact_evap  ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent)
       !!
       REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap, zfact_evap
       INTEGER  :: ji, jj
@@ -955,7 +955,7 @@ CONTAINS
       zfact_evap = 1._wp
       IF( PRESENT(pfact_evap) ) zfact_evap = pfact_evap
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), &
             &                    pCd(ji,jj), pCh(ji,jj), pCe(ji,jj),                  &
@@ -977,8 +977,8 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             ::   alpha_sw_vctr   ! thermal expansion coefficient of sea-water [1/K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   psst   ! water temperature                [K]
+      REAL(wp), DIMENSION(A2D(0))             ::   alpha_sw_vctr   ! thermal expansion coefficient of sea-water [1/K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   psst   ! water temperature                [K]
       !!----------------------------------------------------------------------------------
       alpha_sw_vctr = 2.1e-5_wp * MAX(psst(:,:)-rt0 + 3.2_wp, 0._wp)**0.79
 
@@ -1027,16 +1027,16 @@ CONTAINS
 
    FUNCTION qlw_net_vctr( pdwlw, pts,  l_ice )
 
-      REAL(wp), DIMENSION(jpi,jpj) :: qlw_net_vctr
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pdwlw !: downwelling longwave (aka infrared, aka thermal) radiation [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pts   !: surface temperature [K]
+      REAL(wp), DIMENSION(A2D(0)) :: qlw_net_vctr
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pdwlw !: downwelling longwave (aka infrared, aka thermal) radiation [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pts   !: surface temperature [K]
       LOGICAL,  INTENT(in), OPTIONAL :: l_ice  !: we are above ice
       LOGICAL  :: lice
       INTEGER  :: ji, jj
       !!----------------------------------------------------------------------------------
       lice = .FALSE.
       IF( PRESENT(l_ice) ) lice = l_ice
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          qlw_net_vctr(ji,jj) = qlw_net_sclr( pdwlw(ji,jj) , pts(ji,jj), l_ice=lice )
       END_2D
 
@@ -1045,10 +1045,10 @@ CONTAINS
 
    FUNCTION z0_from_Cd( pzu, pCd,  ppsi )
 
-      REAL(wp), DIMENSION(jpi,jpj) :: z0_from_Cd        !: roughness length [m]
-      REAL(wp)                    , INTENT(in) :: pzu   !: reference height zu [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCd   !: (neutral or non-neutral) drag coefficient []
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
+      REAL(wp), DIMENSION(A2D(0)) :: z0_from_Cd        !: roughness length [m]
+      REAL(wp)                   , INTENT(in) :: pzu   !: reference height zu [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pCd   !: (neutral or non-neutral) drag coefficient []
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
       !!
       !! If pCd is the NEUTRAL-STABILITY drag coefficient then ppsi must be 0 or not given
       !! If pCd is the drag coefficient (in stable or unstable conditions) then pssi must be provided
@@ -1066,10 +1066,10 @@ CONTAINS
 
    FUNCTION Cd_from_z0( pzu, pz0,  ppsi )
 
-      REAL(wp), DIMENSION(jpi,jpj) :: Cd_from_z0        !: (neutral or non-neutral) drag coefficient []
-      REAL(wp)                    , INTENT(in) :: pzu   !: reference height zu [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0   !: roughness length [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
+      REAL(wp), DIMENSION(A2D(0)) :: Cd_from_z0        !: (neutral or non-neutral) drag coefficient []
+      REAL(wp)                   , INTENT(in) :: pzu   !: reference height zu [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pz0   !: roughness length [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
       !!
       !! If we want to return the NEUTRAL-STABILITY drag coefficient then ppsi must be 0 or not given
       !! If we want to return the stability-corrected Cd (i.e. in stable or unstable conditions) then pssi must be provided
@@ -1111,14 +1111,14 @@ CONTAINS
 
    FUNCTION f_m_louis_vctr( pzu, pRib, pCdn, pz0 )
 
-      REAL(wp), DIMENSION(jpi,jpj)             :: f_m_louis_vctr
-      REAL(wp),                     INTENT(in) :: pzu
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pRib
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCdn
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0
+      REAL(wp), DIMENSION(A2D(0))             :: f_m_louis_vctr
+      REAL(wp),                    INTENT(in) :: pzu
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pRib
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pCdn
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pz0
       INTEGER  :: ji, jj
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          f_m_louis_vctr(ji,jj) = f_m_louis_sclr( pzu, pRib(ji,jj), pCdn(ji,jj), pz0(ji,jj) )
       END_2D
 
@@ -1150,14 +1150,14 @@ CONTAINS
 
    FUNCTION f_h_louis_vctr( pzu, pRib, pChn, pz0 )
 
-      REAL(wp), DIMENSION(jpi,jpj)             :: f_h_louis_vctr
-      REAL(wp),                     INTENT(in) :: pzu
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pRib
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pChn
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0
+      REAL(wp), DIMENSION(A2D(0))             :: f_h_louis_vctr
+      REAL(wp),                    INTENT(in) :: pzu
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pRib
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pChn
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pz0
       INTEGER  :: ji, jj
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          f_h_louis_vctr(ji,jj) = f_h_louis_sclr( pzu, pRib(ji,jj), pChn(ji,jj), pz0(ji,jj) )
       END_2D
 
@@ -1168,11 +1168,11 @@ CONTAINS
       !!----------------------------------------------------------------------------------
       !!  Provides the neutral-stability wind speed at 10 m
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: UN10_from_ustar  !: neutral stability wind speed at 10m [m/s]
-      REAL(wp),                     INTENT(in) :: pzu   !: measurement heigh of wind speed   [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUzu  !: bulk wind speed at height pzu m   [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pus   !: friction velocity                 [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
+      REAL(wp), DIMENSION(A2D(0))             :: UN10_from_ustar  !: neutral stability wind speed at 10m [m/s]
+      REAL(wp),                    INTENT(in) :: pzu   !: measurement heigh of wind speed   [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pUzu  !: bulk wind speed at height pzu m   [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pus   !: friction velocity                 [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
       !!----------------------------------------------------------------------------------
       UN10_from_ustar(:,:) = pUzu(:,:) - pus(:,:)/vkarmn * ( LOG(pzu/10._wp) - ppsi(:,:) )
       !!
@@ -1183,11 +1183,11 @@ CONTAINS
       !!----------------------------------------------------------------------------------
       !!  Provides the neutral-stability wind speed at 10 m
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: UN10_from_CD  !: [m/s]
-      REAL(wp),                     INTENT(in) :: pzu  !: measurement heigh of bulk wind speed
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb  !: bulk wind speed at height pzu m   [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCd  !: drag coefficient
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
+      REAL(wp), DIMENSION(A2D(0))             :: UN10_from_CD  !: [m/s]
+      REAL(wp),                    INTENT(in) :: pzu  !: measurement heigh of bulk wind speed
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pUb  !: bulk wind speed at height pzu m   [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pCd  !: drag coefficient
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: ppsi !: "Psi_m(pzu/L)" stability correction profile for momentum []
       !!----------------------------------------------------------------------------------
       !! Reminder: UN10 = u*/vkarmn * log(10/z0)
       !!     and: u* = sqrt(Cd) * Ub
@@ -1214,10 +1214,10 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, April 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: z0tq_LKB
-      INTEGER,                      INTENT(in) :: iflag     !: 1 => dealing with temperature; 2 => dealing with humidity
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pRer      !: roughness Reynolds number  [z_0 u*]/Nu_{air}
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0       !: roughness length (for momentum) [m]
+      REAL(wp), DIMENSION(A2D(0))             :: z0tq_LKB
+      INTEGER,                     INTENT(in) :: iflag     !: 1 => dealing with temperature; 2 => dealing with humidity
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pRer      !: roughness Reynolds number  [z_0 u*]/Nu_{air}
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pz0       !: roughness length (for momentum) [m]
       !-------------------------------------------------------------------
       ! Scalar Re_r relation from Liu et al.
       REAL(wp), DIMENSION(8,2), PARAMETER :: &
@@ -1250,7 +1250,7 @@ CONTAINS
 
       z0tq_LKB(:,:) = -999._wp
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
       zrr    = pRer(ji,jj)
       lfound = .FALSE.
diff --git a/src/OCE/SBC/sbcblk.F90 b/src/OCE/SBC/sbcblk.F90
index aa3668c3..c6da0220 100644
--- a/src/OCE/SBC/sbcblk.F90
+++ b/src/OCE/SBC/sbcblk.F90
@@ -124,7 +124,7 @@ MODULE sbcblk
    !
    INTEGER          :: nn_iter_algo   !  Number of iterations in bulk param. algo ("stable ABL + weak wind" requires more)
 
-   REAL(wp),         ALLOCATABLE, DIMENSION(:,:) ::   theta_zu, q_zu                 ! air temp. and spec. hum. at wind speed height (L15 bulk scheme)
+   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   theta_zu, q_zu           ! air temp. and spec. hum. at wind speed height (L15 bulk scheme)
 
 #if defined key_si3
    REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: Cd_ice , Ch_ice , Ce_ice   !#LB transfert coefficients over ice
@@ -180,7 +180,7 @@ CONTAINS
       !!-------------------------------------------------------------------
       !!             ***  ROUTINE sbc_blk_alloc ***
       !!-------------------------------------------------------------------
-      ALLOCATE( theta_zu(jpi,jpj), q_zu(jpi,jpj),  STAT=sbc_blk_alloc )
+      ALLOCATE( theta_zu(A2D(0)), q_zu(A2D(0)), STAT=sbc_blk_alloc )
       CALL mpp_sum ( 'sbcblk', sbc_blk_alloc )
       IF( sbc_blk_alloc /= 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_alloc: failed to allocate arrays' )
    END FUNCTION sbc_blk_alloc
@@ -190,8 +190,7 @@ CONTAINS
       !!-------------------------------------------------------------------
       !!             ***  ROUTINE sbc_blk_ice_alloc ***
       !!-------------------------------------------------------------------
-      ALLOCATE( Cd_ice (jpi,jpj), Ch_ice (jpi,jpj), Ce_ice (jpi,jpj),         &
-         &      theta_zu_i(jpi,jpj), q_zu_i(jpi,jpj),  STAT=sbc_blk_ice_alloc )
+      ALLOCATE( Cd_ice(A2D(0)), Ch_ice(A2D(0)), Ce_ice(A2D(0)), theta_zu_i(A2D(0)), q_zu_i(A2D(0)), STAT=sbc_blk_ice_alloc )
       CALL mpp_sum ( 'sbcblk', sbc_blk_ice_alloc )
       IF( sbc_blk_ice_alloc /= 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_ice_alloc: failed to allocate arrays' )
    END FUNCTION sbc_blk_ice_alloc
@@ -362,7 +361,7 @@ CONTAINS
             ipka = 1
          ENDIF
          !
-         ALLOCATE( sf(jfpr)%fnow(jpi,jpj,ipka) )
+         ALLOCATE( sf(jfpr)%fnow(A2D(0),ipka) )
          !
          IF( TRIM(sf(jfpr)%clrootname) == 'NOT USED' ) THEN    !--  not used field  --!   (only now allocated and set to default)
             IF(     jfpr == jp_slp ) THEN
@@ -384,7 +383,7 @@ CONTAINS
                CALL ctl_stop( ctmp1 )
             ENDIF
          ELSE                                                  !-- used field  --!
-            IF( sf(jfpr)%ln_tint )   ALLOCATE( sf(jfpr)%fdta(jpi,jpj,ipka,2) )   ! allocate array for temporal interpolation
+            IF( sf(jfpr)%ln_tint )   ALLOCATE( sf(jfpr)%fdta(A2D(0),ipka,2) )   ! allocate array for temporal interpolation
             !
             IF( sf(jfpr)%freqh > 0. .AND. MOD( NINT(3600. * sf(jfpr)%freqh), nn_fsbc * NINT(rn_Dt) ) /= 0 )   &
          &  CALL ctl_warn( 'sbc_blk_init: sbcmod timestep rn_Dt*nn_fsbc is NOT a submultiple of atmospheric forcing frequency.',   &
@@ -493,7 +492,7 @@ CONTAINS
       !!                      the stress is assumed to be in the (i,j) mesh referential
       !!
       !! ** Action  :   defined at each time-step at the air-sea interface
-      !!              - utau, vtau  i- and j-component of the wind stress
+      !!              - utau, vtau  i- and j-component of the wind stress at T-point
       !!              - taum        wind stress module at T-point
       !!              - wndm        wind speed  module at T-point over free ocean or leads in presence of sea-ice
       !!              - qns, qsr    non-solar and solar heat fluxes
@@ -505,9 +504,10 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ocean time step
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) ::   zssq, zcd_du, zsen, zlat, zevp, zpre, ztheta
+      REAL(wp), DIMENSION(A2D(0)) ::   zssq, zcd_du, zsen, zlat, zevp, zpre, ztheta
       REAL(wp) :: ztst
       LOGICAL  :: llerr
+      INTEGER  :: ji, jj 
       !!----------------------------------------------------------------------
       !
       CALL fld_read( kt, nn_fsbc, sf )             ! input fields provided at the current time-step
@@ -515,7 +515,8 @@ CONTAINS
       ! Sanity/consistence test on humidity at first time step to detect potential screw-up:
       IF( kt == nit000 ) THEN
          ! mean humidity over ocean on proc
-         ztst = glob_sum( 'sbcblk', sf(jp_humi)%fnow(:,:,1) * e1e2t(:,:) * tmask(:,:,1) ) / glob_sum( 'sbcblk', e1e2t(:,:) * tmask(:,:,1) )
+         ztst =   glob_sum( 'sbcblk', sf(jp_humi)%fnow(:,:,1) * e1e2t(A2D(0)) * smask0(:,:) ) &
+            &   / glob_sum( 'sbcblk', e1e2t(A2D(0)) * smask0(:,:) )
          llerr = .FALSE.
          SELECT CASE( nhumi )
          CASE( np_humi_sph ) ! specific humidity => expect: 0. <= something < 0.065 [kg/kg] (0.061 is saturation at 45degC !!!)
@@ -558,6 +559,7 @@ CONTAINS
          ! Potential temperature of air at z=rn_zqt (most reanalysis products provide absolute temp., not potential temp.)
          IF( ln_tair_pot ) THEN
             ! temperature read into file is already potential temperature, do nothing...
+            IF((kt==nit000).AND.lwp) WRITE(numout,*) ' *** sbc_blk() => air temperature already converted to POTENTIAL!'
             theta_air_zt(:,:) = sf(jp_tair )%fnow(:,:,1)
          ELSE
             ! temperature read into file is ABSOLUTE temperature (that's the case for ECMWF products for example...)
@@ -568,7 +570,7 @@ CONTAINS
          !
          CALL blk_oce_1( kt, sf(jp_wndi )%fnow(:,:,1), sf(jp_wndj )%fnow(:,:,1),   &   !   <<= in
             &                theta_air_zt(:,:), q_air_zt(:,:),                     &   !   <<= in
-            &                sf(jp_slp  )%fnow(:,:,1), sst_m, ssu_m, ssv_m,        &   !   <<= in
+            &                sf(jp_slp  )%fnow(:,:,1), sst_m(A2D(0)), ssu_m(A2D(0)), ssv_m(A2D(0)),        &   !   <<= in
             &                sf(jp_uoatm)%fnow(:,:,1), sf(jp_voatm)%fnow(:,:,1),   &   !   <<= in
             &                sf(jp_qsr  )%fnow(:,:,1), sf(jp_qlw  )%fnow(:,:,1),   &   !   <<= in (wl/cs)
             &                tsk_m, zssq, zcd_du, zsen, zlat, zevp )                   !   =>> out
@@ -600,7 +602,9 @@ CONTAINS
       IF( ln_trcdc2dm )  THEN      !  diurnal cycle in TOP
          IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN
             IF( ln_dm2dc )  THEN
-                qsr_mean(:,:) = ( 1. - albo )  * sf(jp_qsr)%fnow(:,:,1)  * tmask(:,:,1)
+              DO_2D( 0, 0, 0, 0 )
+                qsr_mean(ji,jj) = ( 1. - albo )  * sf(jp_qsr)%fnow(ji,jj,1)  * smask0(ji,jj)
+              END_2D
             ELSE
                 ncpl_qsr_freq = sf(jp_qsr)%freqh * 3600 !   qsr_mean will be computed in TOP
             ENDIF
@@ -611,10 +615,10 @@ CONTAINS
    END SUBROUTINE sbc_blk
 
 
-   SUBROUTINE blk_oce_1( kt, pwndi, pwndj, ptair, pqair,         &  ! inp
-      &                      pslp , pst  , pu   , pv,            &  ! inp
-      &                      puatm, pvatm, pdqsr , pdqlw ,       &  ! inp
-      &                      ptsk , pssq , pcd_du, psen, plat, pevp ) ! out
+   SUBROUTINE blk_oce_1( kt, pwndi, pwndj, ptair, pqair,         &    ! <<= in
+      &                      pslp , pst  , pu   , pv,            &    ! <<= in
+      &                      puatm, pvatm, pdqsr , pdqlw ,       &    ! <<= in
+      &                      ptsk , pssq , pcd_du, psen, plat, pevp ) ! =>> out
       !!---------------------------------------------------------------------
       !!                     ***  ROUTINE blk_oce_1  ***
       !!
@@ -631,40 +635,39 @@ CONTAINS
       !!              - plat    : latent heat flux   (W/m^2)
       !!              - pevp    : evaporation        (mm/s) #lolo
       !!---------------------------------------------------------------------
-      INTEGER , INTENT(in   )                 ::   kt     ! time step index
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pwndi  ! atmospheric wind at T-point              [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pwndj  ! atmospheric wind at T-point              [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pqair  ! specific humidity at T-points            [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   ptair  ! potential temperature at T-points        [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pslp   ! sea-level pressure                       [Pa]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pst    ! surface temperature                      [Celsius]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pu     ! surface current at U-point (i-component) [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pv     ! surface current at V-point (j-component) [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   puatm  ! surface current seen by the atm at T-point (i-component) [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pvatm  ! surface current seen by the atm at T-point (j-component) [m/s]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pdqsr  ! downwelling solar (shortwave) radiation at surface [W/m^2]
-      REAL(wp), INTENT(in   ), DIMENSION(:,:) ::   pdqlw  ! downwelling longwave radiation at surface [W/m^2]
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   ptsk   ! skin temp. (or SST if CS & WL not used)  [Celsius]
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   pssq   ! specific humidity at pst                 [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   pcd_du
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   psen
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   plat
-      REAL(wp), INTENT(  out), DIMENSION(:,:) ::   pevp
+      INTEGER , INTENT(in   )                    ::   kt     ! time step index
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pwndi  ! atmospheric wind at T-point              [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pwndj  ! atmospheric wind at T-point              [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pqair  ! specific humidity at T-points            [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   ptair  ! potential temperature at T-points        [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pslp   ! sea-level pressure                       [Pa]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pst    ! surface temperature                      [Celsius]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pu     ! surface current at U-point (i-component) [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pv     ! surface current at V-point (j-component) [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   puatm  ! surface current seen by the atm at T-point (i-component) [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pvatm  ! surface current seen by the atm at T-point (j-component) [m/s]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pdqsr  ! downwelling solar (shortwave) radiation at surface [W/m^2]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   pdqlw  ! downwelling longwave radiation at surface [W/m^2]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   ptsk   ! skin temp. (or SST if CS & WL not used)  [Celsius]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   pssq   ! specific humidity at pst                 [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   pcd_du
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   psen
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   plat
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   pevp
       !
       INTEGER  ::   ji, jj               ! dummy loop indices
       REAL(wp) ::   zztmp                ! local variable
       REAL(wp) ::   zstmax, zstau
 #if defined key_cyclone
-      REAL(wp), DIMENSION(jpi,jpj) ::   zwnd_i, zwnd_j    ! wind speed components at T-point
+      REAL(wp), DIMENSION(A2D(0)) ::   zwnd_i, zwnd_j    ! wind speed components at T-point
 #endif
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztau_i, ztau_j    ! wind stress components at T-point
-      REAL(wp), DIMENSION(jpi,jpj) ::   zU_zu             ! bulk wind speed at height zu  [m/s]
-      REAL(wp), DIMENSION(jpi,jpj) ::   zcd_oce           ! momentum transfert coefficient over ocean
-      REAL(wp), DIMENSION(jpi,jpj) ::   zch_oce           ! sensible heat transfert coefficient over ocean
-      REAL(wp), DIMENSION(jpi,jpj) ::   zce_oce           ! latent   heat transfert coefficient over ocean
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsspt             ! potential sea-surface temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj) ::   zpre, ztabs       ! air pressure [Pa] & absolute temperature [K]
-      REAL(wp), DIMENSION(jpi,jpj) ::   zztmp1, zztmp2
+      REAL(wp), DIMENSION(A2D(0)) ::   zU_zu             ! bulk wind speed at height zu  [m/s]
+      REAL(wp), DIMENSION(A2D(0)) ::   zcd_oce           ! momentum transfert coefficient over ocean
+      REAL(wp), DIMENSION(A2D(0)) ::   zch_oce           ! sensible heat transfert coefficient over ocean
+      REAL(wp), DIMENSION(A2D(0)) ::   zce_oce           ! latent   heat transfert coefficient over ocean
+      REAL(wp), DIMENSION(A2D(0)) ::   zsspt             ! potential sea-surface temperature [K]
+      REAL(wp), DIMENSION(A2D(0)) ::   zpre, ztabs       ! air pressure [Pa] & absolute temperature [K]
+      REAL(wp), DIMENSION(A2D(0)) ::   zztmp1, zztmp2
       !!---------------------------------------------------------------------
       !
       ! local scalars ( place there for vector optimisation purposes)
@@ -686,7 +689,7 @@ CONTAINS
       zwnd_i(:,:) = 0._wp
       zwnd_j(:,:) = 0._wp
       CALL wnd_cyc( kt, zwnd_i, zwnd_j )    ! add analytical tropical cyclone (Vincent et al. JGR 2012)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zwnd_i(ji,jj) = pwndi(ji,jj) + zwnd_i(ji,jj)
          zwnd_j(ji,jj) = pwndj(ji,jj) + zwnd_j(ji,jj)
          ! ... scalar wind at T-point (not masked)
@@ -694,23 +697,21 @@ CONTAINS
       END_2D
 #else
       ! ... scalar wind module at T-point (not masked)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         wndm(ji,jj) = SQRT(  pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj)  )
+      DO_2D( 0, 0, 0, 0 )
+         wndm(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) )
       END_2D
 #endif
       ! ----------------------------------------------------------------------------- !
       !      I   Solar FLUX                                                           !
       ! ----------------------------------------------------------------------------- !
 
-      ! ocean albedo assumed to be constant + modify now Qsr to include the diurnal cycle                    ! Short Wave
-      zztmp = 1. - albo
+      ! ocean albedo assumed to be constant + modify now Qsr to include the diurnal cycle
       IF( ln_dm2dc ) THEN
-         qsr(:,:) = zztmp * sbc_dcy( pdqsr(:,:) ) * tmask(:,:,1)
+         qsr(:,:) = ( 1._wp - albo ) * sbc_dcy( pdqsr(:,:) ) * smask0(:,:)
       ELSE
-         qsr(:,:) = zztmp *          pdqsr(:,:)   * tmask(:,:,1)
+         qsr(:,:) = ( 1._wp - albo ) *          pdqsr(:,:)   * smask0(:,:)
       ENDIF
 
-
       ! ----------------------------------------------------------------------------- !
       !     II   Turbulent FLUXES                                                     !
       ! ----------------------------------------------------------------------------- !
@@ -718,69 +719,62 @@ CONTAINS
       ! specific humidity at SST
       pssq(:,:) = rdct_qsat_salt * q_sat( ptsk(:,:), pslp(:,:) )
 
+      ! Backup "bulk SST" and associated spec. hum.
       IF( ln_skin_cs .OR. ln_skin_wl ) THEN
-         !! Backup "bulk SST" and associated spec. hum.
          zztmp1(:,:) = zsspt(:,:)
-         zztmp2(:,:) = pssq(:,:)
+         zztmp2(:,:) = pssq (:,:)
       ENDIF
 
-      !! Time to call the user-selected bulk parameterization for
-      !!  ==  transfer coefficients  ==!   Cd, Ch, Ce at T-point, and more...
-      SELECT CASE( nblk )
-
+      ! transfer coefficients (Cd, Ch, Ce at T-point, and more)
+      SELECT CASE( nblk )   ! user-selected bulk parameterization
+         !
       CASE( np_NCAR      )
          CALL turb_ncar    (     rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, &
-            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu , &
+            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu ,  &
             &                nb_iter=nn_iter_algo )
-         !
       CASE( np_COARE_3p0 )
          CALL turb_coare3p0( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, &
-            &                ln_skin_cs, ln_skin_wl,                            &
-            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,  &
-            &                nb_iter=nn_iter_algo,                              &
+            &                ln_skin_cs, ln_skin_wl,                             &
+            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,   &
+            &                nb_iter=nn_iter_algo,                               &
             &                Qsw=qsr(:,:), rad_lw=pdqlw(:,:), slp=pslp(:,:) )
-         !
       CASE( np_COARE_3p6 )
          CALL turb_coare3p6( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, &
-            &                ln_skin_cs, ln_skin_wl,                            &
-            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,  &
-            &                nb_iter=nn_iter_algo,                              &
+            &                ln_skin_cs, ln_skin_wl,                             &
+            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,   &
+            &                nb_iter=nn_iter_algo,                               &
             &                Qsw=qsr(:,:), rad_lw=pdqlw(:,:), slp=pslp(:,:) )
-         !
       CASE( np_ECMWF     )
          CALL turb_ecmwf   ( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, &
-            &                ln_skin_cs, ln_skin_wl,                            &
-            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,  &
-            &                nb_iter=nn_iter_algo,                              &
+            &                ln_skin_cs, ln_skin_wl,                             &
+            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,   &
+            &                nb_iter=nn_iter_algo,                               &
             &                Qsw=qsr(:,:), rad_lw=pdqlw(:,:), slp=pslp(:,:) )
-         !
       CASE( np_ANDREAS   )
          CALL turb_andreas (     rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, &
-            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu , &
+            &                zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu,   &
             &                nb_iter=nn_iter_algo   )
-         !
       CASE DEFAULT
          CALL ctl_stop( 'STOP', 'sbc_oce: non-existing bulk parameterizaton selected' )
-         !
       END SELECT
 
-      IF( iom_use('Cd_oce') )   CALL iom_put("Cd_oce",   zcd_oce * tmask(:,:,1))
-      IF( iom_use('Ce_oce') )   CALL iom_put("Ce_oce",   zce_oce * tmask(:,:,1))
-      IF( iom_use('Ch_oce') )   CALL iom_put("Ch_oce",   zch_oce * tmask(:,:,1))
+      ! outputs
+      IF( iom_use('Cd_oce') )   CALL iom_put( "Cd_oce",   zcd_oce * smask0(:,:) )
+      IF( iom_use('Ce_oce') )   CALL iom_put( "Ce_oce",   zce_oce * smask0(:,:) )
+      IF( iom_use('Ch_oce') )   CALL iom_put( "Ch_oce",   zch_oce * smask0(:,:) )
       !! LB: mainly here for debugging purpose:
-      IF( iom_use('theta_zt') ) CALL iom_put("theta_zt", (ptair-rt0) * tmask(:,:,1)) ! potential temperature at z=zt
-      IF( iom_use('q_zt') )     CALL iom_put("q_zt",     pqair       * tmask(:,:,1)) ! specific humidity       "
-      IF( iom_use('theta_zu') ) CALL iom_put("theta_zu", (theta_zu -rt0) * tmask(:,:,1)) ! potential temperature at z=zu
-      IF( iom_use('q_zu') )     CALL iom_put("q_zu",     q_zu        * tmask(:,:,1)) ! specific humidity       "
-      IF( iom_use('ssq') )      CALL iom_put("ssq",      pssq        * tmask(:,:,1)) ! saturation specific humidity at z=0
-      IF( iom_use('wspd_blk') ) CALL iom_put("wspd_blk", zU_zu       * tmask(:,:,1)) ! bulk wind speed at z=zu
-
+      IF( iom_use('theta_zt') ) CALL iom_put( "theta_zt", (ptair-rt0) * smask0(:,:) ) ! potential temperature at z=zt
+      IF( iom_use('q_zt') )     CALL iom_put( "q_zt",     pqair       * smask0(:,:) ) ! specific humidity       "
+      IF( iom_use('theta_zu') ) CALL iom_put( "theta_zu", (theta_zu -rt0) * smask0(:,:) ) ! potential temperature at z=zu
+      IF( iom_use('q_zu') )     CALL iom_put( "q_zu",     q_zu        * smask0(:,:) ) ! specific humidity       "
+      IF( iom_use('ssq') )      CALL iom_put( "ssq",      pssq        * smask0(:,:) ) ! saturation specific humidity at z=0
+      IF( iom_use('wspd_blk') ) CALL iom_put( "wspd_blk", zU_zu       * smask0(:,:) ) ! bulk wind speed at z=zu
+
+      ! In the presence of sea-ice we do not use the cool-skin/warm-layer update of zsspt, pssq & ptsk from turb_*()
       IF( ln_skin_cs .OR. ln_skin_wl ) THEN
-         !! In the presence of sea-ice we forget about the cool-skin/warm-layer update of zsspt, pssq & ptsk:
-         WHERE ( fr_i(:,:) > 0.001_wp )
-            ! sea-ice present, we forget about the update, using what we backed up before call to turb_*()
+         WHERE ( fr_i(A2D(0)) > 0.001_wp )
             zsspt(:,:) = zztmp1(:,:)
-            pssq(:,:)  = zztmp2(:,:)
+            pssq (:,:) = zztmp2(:,:)
          END WHERE
          ! apply potential temperature increment to abolute SST
          ptsk(:,:) = ptsk(:,:) + ( zsspt(:,:) - zztmp1(:,:) )
@@ -791,7 +785,7 @@ CONTAINS
 
       IF( ln_abl ) THEN         !==  ABL formulation  ==!   multiplication by rho_air and turbulent fluxes computation done in ablstp
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             zztmp = zU_zu(ji,jj)
             wndm(ji,jj)   = zztmp                   ! Store zU_zu in wndm to compute ustar2 in ablmod
             pcd_du(ji,jj) = zztmp * zcd_oce(ji,jj)
@@ -803,81 +797,66 @@ CONTAINS
 
       ELSE                      !==  BLK formulation  ==!   turbulent fluxes computation
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             zpre(ji,jj) = pres_temp( q_zu(ji,jj), pslp(ji,jj), rn_zu, ptpot=theta_zu(ji,jj), pta=ztabs(ji,jj) )
             rhoa(ji,jj) = rho_air( ztabs(ji,jj), q_zu(ji,jj), zpre(ji,jj) )
          END_2D
 
          CALL BULK_FORMULA( rn_zu, zsspt(:,:), pssq(:,:), theta_zu(:,:), q_zu(:,:), &
-            &               zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:),          &
-            &               wndm(:,:), zU_zu(:,:), pslp(:,:), rhoa(:,:),       &
-            &               taum(:,:), psen(:,:), plat(:,:),                   &
-            &               pEvap=pevp(:,:), pfact_evap=rn_efac )
+            &                      zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:),        &
+            &                      wndm(:,:), zU_zu(:,:), pslp(:,:), rhoa(:,:),     &
+            &                      taum(:,:), psen(:,:), plat(:,:),                 &
+            &                      pEvap=pevp(:,:), pfact_evap=rn_efac )
 
-         psen(:,:) = psen(:,:) * tmask(:,:,1)
-         plat(:,:) = plat(:,:) * tmask(:,:,1)
-         taum(:,:) = taum(:,:) * tmask(:,:,1)
-         pevp(:,:) = pevp(:,:) * tmask(:,:,1)
+         psen(:,:) = psen(:,:) * smask0(:,:)
+         plat(:,:) = plat(:,:) * smask0(:,:)
+         taum(:,:) = taum(:,:) * smask0(:,:)
+         pevp(:,:) = pevp(:,:) * smask0(:,:)
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( wndm(ji,jj) > 0._wp ) THEN
-              zztmp = taum(ji,jj) / wndm(ji,jj)
+               zztmp = taum(ji,jj) / wndm(ji,jj)
 #if defined key_cyclone
-               ztau_i(ji,jj) = zztmp * zwnd_i(ji,jj)
-               ztau_j(ji,jj) = zztmp * zwnd_j(ji,jj)
+               utau(ji,jj) = zztmp * zwnd_i(ji,jj)
+               vtau(ji,jj) = zztmp * zwnd_j(ji,jj)
 #else
-               ztau_i(ji,jj) = zztmp * pwndi(ji,jj)
-               ztau_j(ji,jj) = zztmp * pwndj(ji,jj)
+               utau(ji,jj) = zztmp * pwndi(ji,jj)
+               vtau(ji,jj) = zztmp * pwndj(ji,jj)
 #endif
             ELSE
-               ztau_i(ji,jj) = 0._wp
-               ztau_j(ji,jj) = 0._wp
+               utau(ji,jj) = 0._wp
+               vtau(ji,jj) = 0._wp
             ENDIF
          END_2D
 
          IF( ln_crt_fbk ) THEN   ! aply eq. 10 and 11 of Renault et al. 2020 (doi: 10.1029/2019MS001715)
             zstmax = MIN( rn_stau_a * 3._wp + rn_stau_b, 0._wp )   ! set the max value of Stau corresponding to a wind of 3 m/s (<0)
-            DO_2D( 0, 1, 0, 1 )   ! end at jpj and jpi, as ztau_j(ji,jj+1) ztau_i(ji+1,jj) used in the next loop
-               zstau = MIN( rn_stau_a * wndm(ji,jj) + rn_stau_b, zstmax )   ! stau (<0) must be smaller than zstmax
-               ztau_i(ji,jj) = ztau_i(ji,jj) + zstau * ( 0.5_wp * ( pu(ji-1,jj  ) + pu(ji,jj) ) - puatm(ji,jj) )
-               ztau_j(ji,jj) = ztau_j(ji,jj) + zstau * ( 0.5_wp * ( pv(ji  ,jj-1) + pv(ji,jj) ) - pvatm(ji,jj) )
-               taum(ji,jj) = SQRT( ztau_i(ji,jj) * ztau_i(ji,jj) + ztau_j(ji,jj) * ztau_j(ji,jj) )
+            DO_2D( 0, 0, 0, 0 )
+               zstau = MIN( rn_stau_a * wndm(ji,jj) + rn_stau_b, zstmax ) * smask0(ji,jj)   ! stau (<0) must be smaller than zstmax
+               utau(ji,jj) = utau(ji,jj) + zstau * ( 0.5_wp * ( pu(ji-1,jj  ) + pu(ji,jj) ) - puatm(ji,jj) )
+               vtau(ji,jj) = vtau(ji,jj) + zstau * ( 0.5_wp * ( pv(ji  ,jj-1) + pv(ji,jj) ) - pvatm(ji,jj) )
+               taum(ji,jj) = SQRT( utau(ji,jj) * utau(ji,jj) + vtau(ji,jj) * vtau(ji,jj) )
             END_2D
+            CALL lbc_lnk( 'sbcblk', utau, 'T', -1._wp, vtau, 'T', -1._wp )
          ENDIF
 
-         ! ... utau, vtau at U- and V_points, resp.
-         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
-         !     Note that coastal wind stress is not used in the code... so this extra care has no effect
-         DO_2D( 0, 0, 0, 0 )              ! start loop at 2, in case ln_crt_fbk = T
-            utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( ztau_i(ji,jj) + ztau_i(ji+1,jj  ) ) &
-               &              * MAX(tmask(ji,jj,1),tmask(ji+1,jj,1))
-            vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( ztau_j(ji,jj) + ztau_j(ji  ,jj+1) ) &
-               &              * MAX(tmask(ji,jj,1),tmask(ji,jj+1,1))
-         END_2D
-
-         IF( ln_crt_fbk ) THEN
-            CALL lbc_lnk( 'sbcblk', utau, 'U', -1._wp, vtau, 'V', -1._wp, taum, 'T', 1._wp )
-         ELSE
-            CALL lbc_lnk( 'sbcblk', utau, 'U', -1._wp, vtau, 'V', -1._wp )
-         ENDIF
-
-         ! Saving open-ocean wind-stress (module and components) on T-points:
-         CALL iom_put( "taum_oce",   taum(:,:)*tmask(:,:,1) )   ! output wind stress module
-         !#LB: These 2 lines below mostly here for 'STATION_ASF' test-case, otherwize "utau" (U-grid) and vtau" (V-grid) does the job in: [DYN/dynatf.F90])
-         CALL iom_put( "utau_oce", ztau_i(:,:)*tmask(:,:,1) )  ! utau at T-points!
-         CALL iom_put( "vtau_oce", ztau_j(:,:)*tmask(:,:,1) )  ! vtau at T-points!
+         ! Saving open-ocean wind-stress (module and components)
+         CALL iom_put( "taum_oce", taum(:,:) )   ! wind stress module
+         !                                       ! LB: These 2 lines below mostly here for 'STATION_ASF' test-case
+         CALL iom_put( "utau_oce", utau(:,:) )   ! utau
+         CALL iom_put( "vtau_oce", vtau(:,:) )   ! vtau
 
          IF(sn_cfctl%l_prtctl) THEN
             CALL prt_ctl( tab2d_1=pssq   , clinfo1=' blk_oce_1: pssq   : ', mask1=tmask )
             CALL prt_ctl( tab2d_1=wndm   , clinfo1=' blk_oce_1: wndm   : ', mask1=tmask )
-            CALL prt_ctl( tab2d_1=utau   , clinfo1=' blk_oce_1: utau   : ', mask1=umask,   &
-               &          tab2d_2=vtau   , clinfo2='            vtau   : ', mask2=vmask )
+            CALL prt_ctl( tab2d_1=utau   , clinfo1=' blk_oce_1: utau   : ', mask1=tmask,   &
+               &          tab2d_2=vtau   , clinfo2='            vtau   : ', mask2=tmask )
             CALL prt_ctl( tab2d_1=zcd_oce, clinfo1=' blk_oce_1: Cd     : ', mask1=tmask )
          ENDIF
          !
       ENDIF ! ln_blk / ln_abl
 
-      ptsk(:,:) = ( ptsk(:,:) - rt0 ) * tmask(:,:,1)  ! Back to Celsius
+      ptsk(:,:) = ( ptsk(:,:) - rt0 ) * smask0(:,:)  ! Back to Celsius
 
       IF( ln_skin_cs .OR. ln_skin_wl ) THEN
          CALL iom_put( "t_skin" ,  ptsk        )  ! T_skin in Celsius
@@ -896,68 +875,74 @@ CONTAINS
       !!                at the ocean surface at each time step knowing Cd, Ch, Ce and
       !!                atmospheric variables (from ABL or external data)
       !!
-      !! ** Outputs : - utau    : i-component of the stress at U-point  (N/m2)
-      !!              - vtau    : j-component of the stress at V-point  (N/m2)
+      !! ** Outputs : - utau    : i-component of the stress at T-point  (N/m2)
+      !!              - vtau    : j-component of the stress at T-point  (N/m2)
       !!              - taum    : Wind stress module at T-point         (N/m2)
       !!              - wndm    : Wind speed module at T-point          (m/s)
       !!              - qsr     : Solar heat flux over the ocean        (W/m2)
       !!              - qns     : Non Solar heat flux over the ocean    (W/m2)
       !!              - emp     : evaporation minus precipitation       (kg/m2/s)
       !!---------------------------------------------------------------------
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptair   ! potential temperature of air #LB: confirm!
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   pdqlw   ! downwelling longwave radiation at surface [W/m^2]
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   pprec
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   psnow
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptsk   ! SKIN surface temperature   [Celsius]
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   psen
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   plat
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   pevp
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   ptair   ! potential temperature of air #LB: confirm!
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   pdqlw   ! downwelling longwave radiation at surface [W/m^2]
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   pprec
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   psnow
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   ptsk   ! SKIN surface temperature   [Celsius]
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   psen
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   plat
+      REAL(wp), INTENT(in), DIMENSION(A2D(0)) ::   pevp
       !
       INTEGER  ::   ji, jj               ! dummy loop indices
       REAL(wp) ::   zztmp,zz1,zz2,zz3    ! local variable
-      REAL(wp), DIMENSION(jpi,jpj) ::   zqlw              ! net long wave radiative heat flux
-      REAL(wp), DIMENSION(jpi,jpj) ::   zcptrain, zcptsnw, zcptn ! Heat content per unit mass (J/kg)
+      REAL(wp), DIMENSION(A2D(0)) ::   zqlw              ! net long wave radiative heat flux
+      REAL(wp), DIMENSION(A2D(0)) ::   zcptrain, zcptsnw, zcptn ! Heat content per unit mass (J/kg)
       !!---------------------------------------------------------------------
       !
-      ! Heat content per unit mass (J/kg)
-      zcptrain(:,:) = (      ptair        - rt0 ) * rcp  * tmask(:,:,1)
-      zcptsnw (:,:) = ( MIN( ptair, rt0 ) - rt0 ) * rcpi * tmask(:,:,1)
-      zcptn   (:,:) =        ptsk                 * rcp  * tmask(:,:,1)
-      !
+      DO_2D( 0, 0, 0, 0 )
+         ! Heat content per unit mass (J/kg)
+         zcptrain(ji,jj) = (      ptair(ji,jj)        - rt0 ) * rcp  * smask0(ji,jj)
+         zcptsnw (ji,jj) = ( MIN( ptair(ji,jj), rt0 ) - rt0 ) * rcpi * smask0(ji,jj)
+         zcptn   (ji,jj) =        ptsk (ji,jj)                * rcp  * smask0(ji,jj)
+         !
+      END_2D
       ! ----------------------------------------------------------------------------- !
       !     III    Net longwave radiative FLUX                                        !
       ! ----------------------------------------------------------------------------- !
       !! #LB: now moved after Turbulent fluxes because must use the skin temperature rather than bulk SST
       !! (ptsk is skin temperature if ln_skin_cs==.TRUE. .OR. ln_skin_wl==.TRUE.)
       zqlw(:,:) = qlw_net( pdqlw(:,:), ptsk(:,:)+rt0 )
-
+      
       ! ----------------------------------------------------------------------------- !
       !     IV    Total FLUXES                                                       !
       ! ----------------------------------------------------------------------------- !
       !
-      emp (:,:) = ( pevp(:,:) - pprec(:,:) * rn_pfac ) * tmask(:,:,1)      ! mass flux (evap. - precip.)
-      !
-      qns(:,:) = zqlw(:,:) + psen(:,:) + plat(:,:)                     &   ! Downward Non Solar
-         &     - psnow(:,:) * rn_pfac * rLfus                          &   ! remove latent melting heat for solid precip
-         &     - pevp(:,:) * zcptn(:,:)                                &   ! remove evap heat content at SST
-         &     + ( pprec(:,:) - psnow(:,:) ) * rn_pfac * zcptrain(:,:) &   ! add liquid precip heat content at Tair
-         &     + psnow(:,:) * rn_pfac * zcptsnw(:,:)                       ! add solid  precip heat content at min(Tair,Tsnow)
-      qns(:,:) = qns(:,:) * tmask(:,:,1)
+      DO_2D( 0, 0, 0, 0 )
+         emp (ji,jj) = ( pevp(ji,jj) - pprec(ji,jj) * rn_pfac ) * smask0(ji,jj)          ! mass flux (evap. - precip.)
+         !
+         qns(ji,jj) =    zqlw(ji,jj) + psen(ji,jj) + plat(ji,jj)                     &   ! Downward Non Solar
+            &         - psnow(ji,jj) * rn_pfac * rLfus                               &   ! remove latent melting heat for solid precip
+            &         -  pevp(ji,jj) * zcptn(ji,jj)                                  &   ! remove evap heat content at SST
+            &         + ( pprec(ji,jj) - psnow(ji,jj) ) * rn_pfac * zcptrain(ji,jj)  &   ! add liquid precip heat content at Tair
+            &         + psnow(ji,jj) * rn_pfac * zcptsnw(ji,jj)                          ! add solid  precip heat content at min(Tair,Tsnow)
+         qns(ji,jj) = qns(ji,jj) * smask0(ji,jj)
+      END_2D
       !
 #if defined key_si3
       IF ( nn_ice == 2 ) THEN
-         qns_oce(:,:) = zqlw(:,:) + psen(:,:) + plat(:,:)                  ! non solar without emp (only needed by SI3)
-         qsr_oce(:,:) = qsr(:,:)
+         DO_2D( 0, 0, 0, 0 )
+            qns_oce(ji,jj) = zqlw(ji,jj) + psen(ji,jj) + plat(ji,jj)                  ! non solar without emp (only needed by SI3)
+            qsr_oce(ji,jj) = qsr(ji,jj)
+         END_2D
       ENDIF
 #endif
       !
-      CALL iom_put( "rho_air"  , rhoa*tmask(:,:,1) )       ! output air density [kg/m^3]
+      CALL iom_put( "rho_air"  , rhoa*smask0(:,:) )       ! output air density [kg/m^3]
       CALL iom_put( "evap_oce" , pevp )                    ! evaporation
       CALL iom_put( "qlw_oce"  , zqlw )                    ! output downward longwave heat over the ocean
       CALL iom_put( "qsb_oce"  , psen )                    ! output downward sensible heat over the ocean
       CALL iom_put( "qla_oce"  , plat )                    ! output downward latent   heat over the ocean
-      tprecip(:,:) = pprec(:,:) * rn_pfac * tmask(:,:,1)   ! output total precipitation [kg/m2/s]
-      sprecip(:,:) = psnow(:,:) * rn_pfac * tmask(:,:,1)   ! output solid precipitation [kg/m2/s]
+      tprecip(:,:) = pprec(:,:) * rn_pfac * smask0(:,:)   ! output total precipitation [kg/m2/s]
+      sprecip(:,:) = psnow(:,:) * rn_pfac * smask0(:,:)   ! output solid precipitation [kg/m2/s]
       CALL iom_put( 'snowpre', sprecip )                   ! Snow
       CALL iom_put( 'precip' , tprecip )                   ! Total precipitation
       !
@@ -988,8 +973,8 @@ CONTAINS
    !!   blk_ice_qcn : provide ice surface temperature and snow/ice conduction flux (emulating conduction flux)
    !!----------------------------------------------------------------------
 
-   SUBROUTINE blk_ice_1( pwndi, pwndj, ptair, pqair, pslp , puice, pvice, ptsui,  &   ! inputs
-      &                  putaui, pvtaui, pseni, pevpi, pssqi, pcd_dui             )   ! optional outputs
+   SUBROUTINE blk_ice_1( pwndi, pwndj, ptair, pqair, pslp, ptsui,     &   ! inputs
+      &                  putaui, pvtaui, pseni, pevpi, pssqi, pcd_dui )   ! optional outputs
       !!---------------------------------------------------------------------
       !!                     ***  ROUTINE blk_ice_1  ***
       !!
@@ -999,32 +984,35 @@ CONTAINS
       !!                formulea, ice variables and read atmospheric fields.
       !!                NB: ice drag coefficient is assumed to be a constant
       !!---------------------------------------------------------------------
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pslp    ! sea-level pressure [Pa]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pwndi   ! atmospheric wind at T-point [m/s]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pwndj   ! atmospheric wind at T-point [m/s]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   ptair   ! atmospheric potential temperature at T-point [K]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pqair   ! atmospheric specific humidity at T-point [kg/kg]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   puice   ! sea-ice velocity on I or C grid [m/s]
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   pvice   ! "
-      REAL(wp) , INTENT(in   ), DIMENSION(:,:  ) ::   ptsui   ! sea-ice surface temperature [K]
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   putaui  ! if ln_blk
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   pvtaui  ! if ln_blk
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   pseni   ! if ln_abl
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   pevpi   ! if ln_abl
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   pssqi   ! if ln_abl
-      REAL(wp) , INTENT(  out), DIMENSION(:,:  ), OPTIONAL ::   pcd_dui ! if ln_abl
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   pslp    ! sea-level pressure [Pa]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   pwndi   ! atmospheric wind at T-point [m/s]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   pwndj   ! atmospheric wind at T-point [m/s]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   ptair   ! atmospheric potential temperature at T-point [K]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   pqair   ! atmospheric specific humidity at T-point [kg/kg]
+      REAL(wp) , INTENT(in   ), DIMENSION(A2D(0)  ) ::   ptsui   ! sea-ice surface temperature [K]
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   putaui  ! if ln_blk
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   pvtaui  ! if ln_blk
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   pseni   ! if ln_abl
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   pevpi   ! if ln_abl
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   pssqi   ! if ln_abl
+      REAL(wp) , INTENT(  out), DIMENSION(A2D(0)  ), OPTIONAL ::   pcd_dui ! if ln_abl
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
-      REAL(wp) ::   zootm_su                      ! sea-ice surface mean temperature
-      REAL(wp) ::   zztmp1, zztmp2                ! temporary scalars
-      REAL(wp), DIMENSION(jpi,jpj) :: ztmp, zsipt ! temporary array
+      REAL(wp) ::   zztmp                           ! temporary scalars
+      REAL(wp), DIMENSION(A2D(0)) ::   ztmp, zsipt  ! temporary array
+      REAL(wp), DIMENSION(A2D(0)) ::   zmsk00       ! O% concentration ice mask
       !!---------------------------------------------------------------------
       !
+      ! treshold for outputs
+      DO_2D( 0, 0, 0, 0 )
+         zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , fr_i(ji,jj) - 1.e-6_wp  ) ) ! 1 if ice, 0 if no ice
+      END_2D
+
       ! ------------------------------------------------------------ !
       !    Wind module relative to the moving ice ( U10m - U_ice )   !
       ! ------------------------------------------------------------ !
       ! C-grid ice dynamics :   U & V-points (same as ocean)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          wndm_ice(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) )
       END_2D
       !
@@ -1032,9 +1020,9 @@ CONTAINS
       zsipt(:,:) = theta_exner( ptsui(:,:), pslp(:,:) )
 
       ! sea-ice <-> atmosphere bulk transfer coefficients
-      SELECT CASE( nblk_ice )
-
-      CASE( np_ice_cst      )
+      SELECT CASE( nblk_ice )   ! user-selected bulk parameterization
+         !
+      CASE( np_ice_cst  )
          ! Constant bulk transfer coefficients over sea-ice:
          Cd_ice(:,:) = rn_Cd_i
          Ch_ice(:,:) = rn_Ch_i
@@ -1042,73 +1030,61 @@ CONTAINS
          ! no height adjustment, keeping zt values:
          theta_zu_i(:,:) = ptair(:,:)
          q_zu_i(:,:)     = pqair(:,:)
-
-      CASE( np_ice_an05 )  ! calculate new drag from Lupkes(2015) equations
+         !
+      CASE( np_ice_an05 )  ! from Andreas(2005) equations
          ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ
          CALL turb_ice_an05( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice,       &
             &                      Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i )
-         !!
-      CASE( np_ice_lu12 )
+         !
+      CASE( np_ice_lu12 )  ! from Lupkes(2012) equations
          ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ
-         CALL turb_ice_lu12( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i, &
+         CALL turb_ice_lu12( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i(A2D(0)), &
             &                      Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i )
-         !!
-      CASE( np_ice_lg15 )  ! calculate new drag from Lupkes(2015) equations
+         !
+      CASE( np_ice_lg15 )  ! from Lupkes and Gryanik (2015) equations
          ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ
-         CALL turb_ice_lg15( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i, &
+         CALL turb_ice_lg15( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i(A2D(0)), &
             &                      Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i )
-         !!
+         !
       END SELECT
 
-      IF( iom_use('Cd_ice').OR.iom_use('Ce_ice').OR.iom_use('Ch_ice').OR.iom_use('taum_ice').OR.iom_use('utau_ice').OR.iom_use('vtau_ice') ) &
-         & ztmp(:,:) = ( 1._wp - MAX(0._wp, SIGN( 1._wp, 1.E-6_wp - fr_i )) )*tmask(:,:,1) ! mask for presence of ice !
-
-      IF( iom_use('Cd_ice') ) CALL iom_put("Cd_ice", Cd_ice*ztmp)
-      IF( iom_use('Ce_ice') ) CALL iom_put("Ce_ice", Ce_ice*ztmp)
-      IF( iom_use('Ch_ice') ) CALL iom_put("Ch_ice", Ch_ice*ztmp)
-
 
       IF( ln_blk ) THEN
          ! ---------------------------------------------------- !
          !    Wind stress relative to nonmoving ice ( U10m )    !
          ! ---------------------------------------------------- !
          ! supress moving ice in wind stress computation as we don't know how to do it properly...
-         DO_2D( 0, 1, 0, 1 )    ! at T point
-            zztmp1        = rhoa(ji,jj) * Cd_ice(ji,jj) * wndm_ice(ji,jj)
-            putaui(ji,jj) = zztmp1 * pwndi(ji,jj)
-            pvtaui(ji,jj) = zztmp1 * pwndj(ji,jj)
+         DO_2D( 0, 0, 0, 0 )
+            zztmp         = rhoa(ji,jj) * Cd_ice(ji,jj) * wndm_ice(ji,jj)
+            putaui(ji,jj) = zztmp * pwndi(ji,jj)
+            pvtaui(ji,jj) = zztmp * pwndj(ji,jj)
          END_2D
 
-         !#LB: saving the module, and x-y components, of the ai wind-stress at T-points: NOT weighted by the ice concentration !!!
-         IF(iom_use('taum_ice')) CALL iom_put('taum_ice', SQRT( putaui*putaui + pvtaui*pvtaui )*ztmp )
-         !#LB: These 2 lines below mostly here for 'STATION_ASF' test-case, otherwize "utau_oi" (U-grid) and vtau_oi" (V-grid) does the job in: [ICE/icedyn_rhg_evp.F90])
-         IF(iom_use('utau_ice')) CALL iom_put("utau_ice", putaui*ztmp)  ! utau at T-points!
-         IF(iom_use('vtau_ice')) CALL iom_put("vtau_ice", pvtaui*ztmp)  ! vtau at T-points!
-
+         ! outputs
+         !        LB: not weighted by the ice concentration
+         IF( iom_use('taum_ice') ) CALL iom_put( 'taum_ice', SQRT( putaui*putaui + pvtaui*pvtaui ) * zmsk00 )
+         !        LB: These 2 lines below mostly here for 'STATION_ASF' test-case
+         IF( iom_use('utau_ice') ) CALL iom_put( "utau_ice", putaui * zmsk00 )
+         IF( iom_use('vtau_ice') ) CALL iom_put( "vtau_ice", pvtaui * zmsk00 )
          !
-         DO_2D( 0, 0, 0, 0 )    ! U & V-points (same as ocean).
-            !#LB: QUESTION?? so SI3 expects wind stress vector to be provided at U & V points? Not at T-points ?
-            ! take care of the land-sea mask to avoid "pollution" of coastal stress. p[uv]taui used in frazil and  rheology
-            zztmp1 = 0.5_wp * ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1),tmask(ji+1,jj  ,1) )
-            zztmp2 = 0.5_wp * ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1),tmask(ji  ,jj+1,1) )
-            putaui(ji,jj) = zztmp1 * ( putaui(ji,jj) + putaui(ji+1,jj  ) )
-            pvtaui(ji,jj) = zztmp2 * ( pvtaui(ji,jj) + pvtaui(ji  ,jj+1) )
-         END_2D
-         CALL lbc_lnk( 'sbcblk', putaui, 'U', -1._wp, pvtaui, 'V', -1._wp )
-         !
-         IF(sn_cfctl%l_prtctl)  CALL prt_ctl( tab2d_1=putaui  , clinfo1=' blk_ice: putaui : ', mask1=umask   &
-            &                               , tab2d_2=pvtaui  , clinfo2='          pvtaui : ', mask2=vmask )
+         IF(sn_cfctl%l_prtctl)  CALL prt_ctl( tab2d_1=putaui  , clinfo1=' blk_ice: putaui : ', mask1=tmask   &
+            &                               , tab2d_2=pvtaui  , clinfo2='          pvtaui : ', mask2=tmask )
       ELSE ! ln_abl
 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             pcd_dui(ji,jj) = wndm_ice(ji,jj) * Cd_ice(ji,jj)
             pseni  (ji,jj) = wndm_ice(ji,jj) * Ch_ice(ji,jj)
             pevpi  (ji,jj) = wndm_ice(ji,jj) * Ce_ice(ji,jj)
          END_2D
-         pssqi(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ; ! more accurate way to obtain ssq !
+         pssqi(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! more accurate way to obtain ssq
 
       ENDIF ! ln_blk  / ln_abl
       !
+      ! outputs
+      IF( iom_use('Cd_ice') ) CALL iom_put( "Cd_ice", Cd_ice * zmsk00 )
+      IF( iom_use('Ce_ice') ) CALL iom_put( "Ce_ice", Ce_ice * zmsk00 )
+      IF( iom_use('Ch_ice') ) CALL iom_put( "Ch_ice", Ch_ice * zmsk00 )
+      !
       IF(sn_cfctl%l_prtctl)  CALL prt_ctl(tab2d_1=wndm_ice  , clinfo1=' blk_ice: wndm_ice : ', mask1=tmask )
       !
    END SUBROUTINE blk_ice_1
@@ -1126,30 +1102,30 @@ CONTAINS
       !!
       !! caution : the net upward water flux has with mm/day unit
       !!---------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   ptsu   ! sea ice surface temperature [K]
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phs    ! snow thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phi    ! ice thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   palb   ! ice albedo (all skies)
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   ptair  ! potential temperature of air #LB: okay ???
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   pqair  ! specific humidity of air
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   pslp
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   pdqlw
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   pprec
-      REAL(wp), DIMENSION(:,:  ), INTENT(in)  ::   psnow
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in)  ::   ptsu   ! sea ice surface temperature [K]
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in)  ::   phs    ! snow thickness
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in)  ::   phi    ! ice thickness
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in)  ::   palb   ! ice albedo (all skies)
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   ptair  ! potential temperature of air #LB: okay ???
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   pqair  ! specific humidity of air
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   pslp
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   pdqlw
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   pprec
+      REAL(wp), DIMENSION(A2D(0)    ), INTENT(in)  ::   psnow
       !!
       INTEGER  ::   ji, jj, jl               ! dummy loop indices
       REAL(wp) ::   zst, zst3, zsq, zsipt    ! local variable
       REAL(wp) ::   zcoef_dqlw, zcoef_dqla   !   -      -
       REAL(wp) ::   zztmp, zzblk, zztmp1, z1_rLsub   !   -      -
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zmsk   ! temporary mask for prt_ctl
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_qlw         ! long wave heat flux over ice
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_qsb         ! sensible  heat flux over ice
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_dqlw        ! long wave heat sensitivity over ice
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_dqsb        ! sensible  heat sensitivity over ice
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zevap, zsnw   ! evaporation and snw distribution after wind blowing (SI3)
-      REAL(wp), DIMENSION(jpi,jpj)     ::   ztmp, ztmp2
-      REAL(wp), DIMENSION(jpi,jpj)     ::   ztri
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zcptrain, zcptsnw, zcptn ! Heat content per unit mass (J/kg)
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   z_qlw         ! long wave heat flux over ice
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   z_qsb         ! sensible  heat flux over ice
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   z_dqlw        ! long wave heat sensitivity over ice
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   z_dqsb        ! sensible  heat sensitivity over ice
+      REAL(wp), DIMENSION(A2D(0))     ::   zevap, zsnw   ! evaporation and snw distribution after wind blowing (SI3)
+      REAL(wp), DIMENSION(A2D(0))     ::   ztmp, ztmp2
+      REAL(wp), DIMENSION(A2D(0))     ::   ztri
+      REAL(wp), DIMENSION(A2D(0))     ::   zcptrain, zcptsnw, zcptn ! Heat content per unit mass (J/kg)
       !!---------------------------------------------------------------------
       !
       zcoef_dqlw = 4._wp * emiss_i * stefan             ! local scalars
@@ -1157,14 +1133,14 @@ CONTAINS
       dqla_ice(:,:,:) = 0._wp
 
       ! Heat content per unit mass (J/kg)
-      zcptrain(:,:) = (      ptair        - rt0 ) * rcp  * tmask(:,:,1)
-      zcptsnw (:,:) = ( MIN( ptair, rt0 ) - rt0 ) * rcpi * tmask(:,:,1)
-      zcptn   (:,:) =        sst_m                * rcp  * tmask(:,:,1)
+      zcptrain(:,:) = (      ptair(:,:)        - rt0 ) * rcp  * smask0(:,:)
+      zcptsnw (:,:) = ( MIN( ptair(:,:), rt0 ) - rt0 ) * rcpi * smask0(:,:)
+      zcptn   (:,:) =        sst_m(A2D(0))             * rcp  * smask0(:,:)
       !
       !                                     ! ========================== !
       DO jl = 1, jpl                        !  Loop over ice categories  !
          !                                  ! ========================== !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
 
             zst   = ptsu(ji,jj,jl)                                ! surface temperature of sea-ice [K]
             zsq   = q_sat( zst, pslp(ji,jj), l_ice=.TRUE. )       ! surface saturation specific humidity when ice present
@@ -1178,7 +1154,7 @@ CONTAINS
 
             ! Long  Wave (lw)
             zst3 = zst * zst * zst
-            z_qlw(ji,jj,jl)   = emiss_i * ( pdqlw(ji,jj) - stefan * zst * zst3 ) * tmask(ji,jj,1)
+            z_qlw(ji,jj,jl)   = emiss_i * ( pdqlw(ji,jj) - stefan * zst * zst3 ) * smask0(ji,jj)
             ! lw sensitivity
             z_dqlw(ji,jj,jl)  = zcoef_dqlw * zst3
 
@@ -1205,7 +1181,6 @@ CONTAINS
             !qla_ice( ji,jj,jl) = zztmp1 * (zsq - q_zu_i(ji,jj))
             !dqla_ice(ji,jj,jl) = zztmp1 * dq_sat_dt_ice(zst, pslp(ji,jj)) ! ==> Qlat sensitivity  (dQlat/dT)
 
-
             ! ----------------------------!
             !     III    Total FLUXES     !
             ! ----------------------------!
@@ -1218,43 +1193,48 @@ CONTAINS
          !
       END DO
       !
-      tprecip(:,:) = pprec(:,:) * rn_pfac * tmask(:,:,1)  ! total precipitation [kg/m2/s]
-      sprecip(:,:) = psnow(:,:) * rn_pfac * tmask(:,:,1)  ! solid precipitation [kg/m2/s]
-      CALL iom_put( 'snowpre', sprecip )                  ! Snow precipitation
-      CALL iom_put( 'precip' , tprecip )                  ! Total precipitation
-
-      ! --- evaporation --- !
       z1_rLsub = 1._wp / rLsub
-      evap_ice (:,:,:) = rn_efac * qla_ice (:,:,:) * z1_rLsub    ! sublimation
-      devap_ice(:,:,:) = rn_efac * dqla_ice(:,:,:) * z1_rLsub    ! d(sublimation)/dT
-      zevap    (:,:)   = emp(:,:) + tprecip(:,:)   ! evaporation over ocean  !LB: removed rn_efac here, correct???
+      DO_2D( 0, 0, 0, 0 )
+         ! --- precipitation --- !
+         tprecip(ji,jj) = pprec(ji,jj) * rn_pfac * smask0(ji,jj)  ! total precipitation [kg/m2/s]
+         sprecip(ji,jj) = psnow(ji,jj) * rn_pfac * smask0(ji,jj)  ! solid precipitation [kg/m2/s]
+
+         ! --- evaporation --- !
+         zevap(ji,jj) = emp(ji,jj) + tprecip(ji,jj)   ! evaporation over ocean  !LB: removed rn_efac here, correct???
+         DO jl = 1, jpl
+            evap_ice (ji,jj,jl) = rn_efac * qla_ice (ji,jj,jl) * z1_rLsub    ! sublimation
+            devap_ice(ji,jj,jl) = rn_efac * dqla_ice(ji,jj,jl) * z1_rLsub    ! d(sublimation)/dT
+         ENDDO
+      END_2D
 
-      ! --- evaporation minus precipitation --- !
       zsnw(:,:) = 0._wp
-      CALL ice_var_snwblow( (1.-at_i_b(:,:)), zsnw )  ! snow distribution over ice after wind blowing
-      emp_oce(:,:) = ( 1._wp - at_i_b(:,:) ) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw )
-      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw
-      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:)
-
-      ! --- heat flux associated with emp --- !
-      qemp_oce(:,:) = - ( 1._wp - at_i_b(:,:) ) * zevap(:,:) * zcptn(:,:)         & ! evap at sst
-         &          + ( tprecip(:,:) - sprecip(:,:) )   *   zcptrain(:,:)         & ! liquid precip at Tair
-         &          +   sprecip(:,:) * ( 1._wp - zsnw ) * ( zcptsnw (:,:) - rLfus ) ! solid precip at min(Tair,Tsnow)
-      qemp_ice(:,:) =   sprecip(:,:) *           zsnw   * ( zcptsnw (:,:) - rLfus ) ! solid precip (only)
-
-      ! --- total solar and non solar fluxes --- !
-      qns_tot(:,:) = ( 1._wp - at_i_b(:,:) ) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 )  &
-         &           + qemp_ice(:,:) + qemp_oce(:,:)
-      qsr_tot(:,:) = ( 1._wp - at_i_b(:,:) ) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 )
-
-      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- !
-      qprec_ice(:,:) = rhos * ( zcptsnw(:,:) - rLfus )
-
-      ! --- heat content of evap over ice in W/m2 (to be used in 1D-thermo) ---
-      DO jl = 1, jpl
-         qevap_ice(:,:,jl) = 0._wp ! should be -evap_ice(:,:,jl)*( ( Tice - rt0 ) * rcpi * tmask(:,:,1) )
-         !                         ! But we do not have Tice => consider it at 0degC => evap=0
-      END DO
+      CALL ice_var_snwblow( (1.-at_i_b(:,:)), zsnw(:,:) )  ! snow distribution over ice after wind blowing
+      DO_2D( 0, 0, 0, 0 )
+         ! --- evaporation minus precipitation --- !
+         emp_oce(ji,jj) = ( 1._wp - at_i_b(ji,jj) ) * zevap(ji,jj) - ( tprecip(ji,jj) - sprecip(ji,jj) ) - sprecip(ji,jj) * (1._wp - zsnw(ji,jj) )
+         emp_ice(ji,jj) = SUM( a_i_b(ji,jj,:) * evap_ice(ji,jj,:) ) - sprecip(ji,jj) * zsnw(ji,jj)
+         emp_tot(ji,jj) = emp_oce(ji,jj) + emp_ice(ji,jj)
+         
+         ! --- heat flux associated with emp --- !
+         qemp_oce(ji,jj) = - ( 1._wp - at_i_b(ji,jj) ) * zevap(ji,jj) * zcptn(ji,jj)         & ! evap at sst
+            &          + ( tprecip(ji,jj) - sprecip(ji,jj) )   *   zcptrain(ji,jj)         & ! liquid precip at Tair
+            &          +   sprecip(ji,jj) * ( 1._wp - zsnw(ji,jj) ) * ( zcptsnw (ji,jj) - rLfus ) ! solid precip at min(Tair,Tsnow)
+         qemp_ice(ji,jj) = sprecip(ji,jj) *           zsnw(ji,jj)   * ( zcptsnw (ji,jj) - rLfus ) ! solid precip (only)
+         
+         ! --- total solar and non solar fluxes --- !
+         qns_tot(ji,jj) = ( 1._wp - at_i_b(ji,jj) ) * qns_oce(ji,jj) + SUM( a_i_b(ji,jj,:) * qns_ice(ji,jj,:) )  &
+            &           + qemp_ice(ji,jj) + qemp_oce(ji,jj)
+         qsr_tot(ji,jj) = ( 1._wp - at_i_b(ji,jj) ) * qsr_oce(ji,jj) + SUM( a_i_b(ji,jj,:) * qsr_ice(ji,jj,:) )
+         
+         ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- !
+         qprec_ice(ji,jj) = rhos * ( zcptsnw(ji,jj) - rLfus )
+         
+         ! --- heat content of evap over ice in W/m2 (to be used in 1D-thermo) ---
+         DO jl = 1, jpl
+            qevap_ice(ji,jj,jl) = 0._wp ! should be -evap_ice(ji,jj,jl)*( ( Tice - rt0 ) * rcpi * smask0(ji,jj) )
+            !                         ! But we do not have Tice => consider it at 0degC => evap=0
+         ENDDO
+      END_2D
 
       ! --- shortwave radiation transmitted thru the surface scattering layer (W/m2) --- !
       IF( nn_qtrice == 0 ) THEN
@@ -1279,9 +1259,11 @@ CONTAINS
          qtr_ice_top(:,:,:) = 0.3_wp * qsr_ice(:,:,:)
       ENDIF
       !
+      CALL iom_put( 'snowpre', sprecip )                 ! Snow precipitation
+      CALL iom_put( 'precip' , tprecip )                 ! Total precipitation
       IF( iom_use('evap_ao_cea') .OR. iom_use('hflx_evap_cea') ) THEN
-         CALL iom_put( 'evap_ao_cea'  , zevap(:,:) * ( 1._wp - at_i_b(:,:) ) * tmask(:,:,1)              )   ! ice-free oce evap (cell average)
-         CALL iom_put( 'hflx_evap_cea', zevap(:,:) * ( 1._wp - at_i_b(:,:) ) * tmask(:,:,1) * zcptn(:,:) )   ! heat flux from evap (cell average)
+         CALL iom_put( 'evap_ao_cea'  , zevap(:,:) * ( 1._wp - at_i_b(:,:) ) * smask0(:,:)              )   ! ice-free oce evap (cell average)
+         CALL iom_put( 'hflx_evap_cea', zevap(:,:) * ( 1._wp - at_i_b(:,:) ) * smask0(:,:) * zcptn(:,:) )   ! heat flux from evap (cell average)
       ENDIF
       IF( iom_use('rain') .OR. iom_use('rain_ao_cea') .OR. iom_use('hflx_rain_cea') ) THEN
          CALL iom_put( 'rain'         ,   tprecip(:,:) - sprecip(:,:)                             )          ! liquid precipitation 
@@ -1301,14 +1283,14 @@ CONTAINS
             &                          + ( tprecip(:,:) - sprecip(:,:) ) *   zcptrain(:,:) )
       ENDIF
       IF( iom_use('subl_ai_cea') .OR. iom_use('hflx_subl_cea') ) THEN
-         CALL iom_put( 'subl_ai_cea'  , SUM( a_i_b(:,:,:) *  evap_ice(:,:,:), dim=3 ) * tmask(:,:,1) ) ! Sublimation over sea-ice (cell average)
-         CALL iom_put( 'hflx_subl_cea', SUM( a_i_b(:,:,:) * qevap_ice(:,:,:), dim=3 ) * tmask(:,:,1) ) ! Heat flux from sublimation (cell average)
+         CALL iom_put( 'subl_ai_cea'  , SUM( a_i_b(:,:,:) *  evap_ice(:,:,:), dim=3 ) * smask0(:,:) ) ! Sublimation over sea-ice (cell average)
+         CALL iom_put( 'hflx_subl_cea', SUM( a_i_b(:,:,:) * qevap_ice(:,:,:), dim=3 ) * smask0(:,:) ) ! Heat flux from sublimation (cell average)
       ENDIF
       !
       IF(sn_cfctl%l_prtctl) THEN
-         ALLOCATE(zmsk(jpi,jpj,jpl))
+         ALLOCATE(zmsk(A2D(0),jpl))
          DO jl = 1, jpl
-            zmsk(:,:,jl) = tmask(:,:,1)
+            zmsk(:,:,jl) = smask0(:,:)
          END DO
          CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice: qla_ice  : ', mask1=zmsk,   &
             &         tab3d_2=z_qsb   , clinfo2=' z_qsb    : '         , mask2=zmsk, kdim=jpl)
@@ -1321,7 +1303,7 @@ CONTAINS
          CALL prt_ctl(tab3d_1=ptsu    , clinfo1=' blk_ice: ptsu     : ', mask1=zmsk,   &
             &         tab3d_2=qns_ice , clinfo2=' qns_ice  : '         , mask2=zmsk, kdim=jpl)
          CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice: tprecip  : ', mask1=tmask,   &
-            &         tab2d_2=sprecip , clinfo2=' sprecip  : '         , mask2=tmask         )
+            &         tab2d_2=sprecip , clinfo2=' sprecip  : '         , mask2=tmask        )
          DEALLOCATE(zmsk)
       ENDIF
 
@@ -1335,7 +1317,9 @@ CONTAINS
    END SUBROUTINE blk_ice_2
 
 
-   SUBROUTINE blk_ice_qcn( ld_virtual_itd, ptsu, ptb, phs, phi )
+   SUBROUTINE blk_ice_qcn( ld_virtual_itd, ptb, phs, phi,      &   ! <<== in
+      &                                    pqcn_ice, pqml_ice, &   ! ==>> out
+      &                                    pqns_ice, ptsu )        ! ==>> inout
       !!---------------------------------------------------------------------
       !!                     ***  ROUTINE blk_ice_qcn  ***
       !!
@@ -1350,12 +1334,15 @@ CONTAINS
       !!              - qcn_ice : surface inner conduction flux (W/m2)
       !!
       !!---------------------------------------------------------------------
-      LOGICAL                   , INTENT(in   ) ::   ld_virtual_itd  ! single-category option
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptsu            ! sea ice / snow surface temperature
-      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   ptb             ! sea ice base temperature
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   phs             ! snow thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   phi             ! sea ice thickness
-      !
+      LOGICAL                        , INTENT(in   ) ::   ld_virtual_itd  ! single-category option
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in   ) ::   ptb             ! sea ice base temperature
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   phs             ! snow thickness
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(in   ) ::   phi             ! sea ice thickness
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(  out) ::   pqcn_ice
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(  out) ::   pqml_ice
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   pqns_ice
+      REAL(wp), DIMENSION(A2D(0),jpl), INTENT(inout) ::   ptsu            ! sea ice / snow surface temperature
+     !
       INTEGER , PARAMETER ::   nit = 10                  ! number of iterations
       REAL(wp), PARAMETER ::   zepsilon = 0.1_wp         ! characteristic thickness for enhanced conduction
       !
@@ -1365,7 +1352,7 @@ CONTAINS
       REAL(wp) ::   zkeff_h, ztsu, ztsu0 !
       REAL(wp) ::   zqc, zqnet           !
       REAL(wp) ::   zhe, zqa0            !
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zgfac   ! enhanced conduction factor
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   zgfac   ! enhanced conduction factor
       !!---------------------------------------------------------------------
 
       ! -------------------------------------!
@@ -1383,7 +1370,7 @@ CONTAINS
          zfac3 = 2._wp / zepsilon
          !
          DO jl = 1, jpl
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zhe = ( rn_cnd_s * phi(ji,jj,jl) + rcnd_i * phs(ji,jj,jl) ) * zfac                            ! Effective thickness
                IF( zhe >=  zfac2 )   zgfac(ji,jj,jl) = MIN( 2._wp, 0.5_wp * ( 1._wp + LOG( zhe * zfac3 ) ) ) ! Enhanced conduction factor
             END_2D
@@ -1398,13 +1385,13 @@ CONTAINS
       zfac = rcnd_i * rn_cnd_s
       !
       DO jl = 1, jpl
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             !
             zkeff_h = zfac * zgfac(ji,jj,jl) / &                                    ! Effective conductivity of the snow-ice system divided by thickness
                &      ( rcnd_i * phs(ji,jj,jl) + rn_cnd_s * MAX( 0.01, phi(ji,jj,jl) ) )
             ztsu    = ptsu(ji,jj,jl)                                                ! Store current iteration temperature
             ztsu0   = ptsu(ji,jj,jl)                                                ! Store initial surface temperature
-            zqa0    = qsr_ice(ji,jj,jl) - qtr_ice_top(ji,jj,jl) + qns_ice(ji,jj,jl) ! Net initial atmospheric heat flux
+            zqa0    = qsr_ice(ji,jj,jl) - qtr_ice_top(ji,jj,jl) + pqns_ice(ji,jj,jl) ! Net initial atmospheric heat flux
             !
             DO iter = 1, nit     ! --- Iterative loop
                zqc   = zkeff_h * ( ztsu - ptb(ji,jj) )                              ! Conduction heat flux through snow-ice system (>0 downwards)
@@ -1412,10 +1399,10 @@ CONTAINS
                ztsu  = ztsu - zqnet / ( dqns_ice(ji,jj,jl) - zkeff_h )              ! Temperature update
             END DO
             !
-            ptsu   (ji,jj,jl) = MIN( rt0, ztsu )
-            qcn_ice(ji,jj,jl) = zkeff_h * ( ptsu(ji,jj,jl) - ptb(ji,jj) )
-            qns_ice(ji,jj,jl) = qns_ice(ji,jj,jl) + dqns_ice(ji,jj,jl) * ( ptsu(ji,jj,jl) - ztsu0 )
-            qml_ice(ji,jj,jl) = ( qsr_ice(ji,jj,jl) - qtr_ice_top(ji,jj,jl) + qns_ice(ji,jj,jl) - qcn_ice(ji,jj,jl) )  &
+            ptsu    (ji,jj,jl) = MIN( rt0, ztsu )
+            pqcn_ice(ji,jj,jl) = zkeff_h * ( ptsu(ji,jj,jl) - ptb(ji,jj) )
+            pqns_ice(ji,jj,jl) = pqns_ice(ji,jj,jl) + dqns_ice(ji,jj,jl) * ( ptsu(ji,jj,jl) - ztsu0 )
+            pqml_ice(ji,jj,jl) = ( qsr_ice(ji,jj,jl) - qtr_ice_top(ji,jj,jl) + pqns_ice(ji,jj,jl) - pqcn_ice(ji,jj,jl) )  &
                &   * MAX( 0._wp , SIGN( 1._wp, ptsu(ji,jj,jl) - rt0 ) )
 
             ! --- Diagnose the heat loss due to changing non-solar flux (as in icethd_zdf_bl99) --- !
diff --git a/src/OCE/SBC/sbcblk_algo_andreas.F90 b/src/OCE/SBC/sbcblk_algo_andreas.F90
index 5a2eb411..7145a156 100644
--- a/src/OCE/SBC/sbcblk_algo_andreas.F90
+++ b/src/OCE/SBC/sbcblk_algo_andreas.F90
@@ -85,34 +85,34 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   sst      ! sea surface temperature                [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   ssq      ! sea surface specific humidity           [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
+      REAL(wp), INTENT(in   )                     ::   zt      ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in   )                     ::   zu      ! height for U_zu                             [m]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   sst      ! sea surface temperature                [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   t_zt     ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   ssq      ! sea surface specific humidity           [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   q_zt     ! specific air humidity at zt             [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   U_zu     ! relative wind module at zu                [m/s]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Cd       ! transfer coefficient for momentum         (tau)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ubzu     ! bulk wind speed at zu                     [m/s]
       !
       INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CdN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   ChN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CeN
       !
       INTEGER :: nbit, jit                    ! iterations...
       LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
       !!
-      REAL(wp), DIMENSION(jpi,jpj) ::   u_star, t_star, q_star
-      REAL(wp), DIMENSION(jpi,jpj) ::   z0       ! roughness length (momentum) [m]
-      REAL(wp), DIMENSION(jpi,jpj) ::   UN10     ! Neutral wind speed at zu [m/s]
-      REAL(wp), DIMENSION(jpi,jpj) ::   zeta_u   ! stability parameter at height zu
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztmp0, ztmp1, ztmp2
-      REAL(wp), DIMENSION(jpi,jpj) ::   RiB       ! square root of Cd
+      REAL(wp), DIMENSION(A2D(0)) ::   u_star, t_star, q_star
+      REAL(wp), DIMENSION(A2D(0)) ::   z0       ! roughness length (momentum) [m]
+      REAL(wp), DIMENSION(A2D(0)) ::   UN10     ! Neutral wind speed at zu [m/s]
+      REAL(wp), DIMENSION(A2D(0)) ::   zeta_u   ! stability parameter at height zu
+      REAL(wp), DIMENSION(A2D(0)) ::   ztmp0, ztmp1, ztmp2
+      REAL(wp), DIMENSION(A2D(0)) ::   RiB      ! square root of Cd
       !!
       !!----------------------------------------------------------------------------------
       nbit = nb_iter0
@@ -217,13 +217,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, April 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pun10          !: neutral-stability scalar wind speed at 10m (m/s)
-      REAL(wp), DIMENSION(jpi,jpj)             :: u_star_andreas !: friction velocity    [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pun10          !: neutral-stability scalar wind speed at 10m (m/s)
+      REAL(wp), DIMENSION(A2D(0))             :: u_star_andreas !: friction velocity    [m/s]
       !
       INTEGER  ::     ji, jj ! dummy loop indices
       REAL(wp) :: za, zt, zw ! local scalars
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             zw  = pun10(ji,jj)
             za = zw - 8.271_wp
             zt = za + SQRT( 0.12_wp*za*za + 0.181_wp )
@@ -243,8 +243,8 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, April 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_andreas
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_andreas
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       REAL(wp), PARAMETER :: zam  = 5._wp      ! a_m (just below Eq.(9b)
       REAL(wp), PARAMETER :: zbm = zam/6.5_wp  ! b_m (just below Eq.(9b)
@@ -255,7 +255,7 @@ CONTAINS
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zx2, zx, zpsi_unst, zbbm, zpsi_stab,  zstab   ! local scalars
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = MIN( pzeta(ji,jj) , 15._wp ) !! Very stable conditions (L positif and big!)
             !
@@ -298,8 +298,8 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_andreas
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_andreas
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       REAL(wp), PARAMETER ::  zah = 5._wp       ! a_h (just below Eq.(9b)
       REAL(wp), PARAMETER ::  zbh = 5._wp       ! b_h (just below Eq.(9b)
@@ -309,7 +309,7 @@ CONTAINS
       INTEGER  ::   ji, jj     ! dummy loop indices
       REAL(wp) :: zta, zz, zx2, zpsi_unst, zpsi_stab, zstab  ! local scalars
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = MIN( pzeta(ji,jj) , 15._wp ) !! Very stable conditions (L positif and large!)
             !
diff --git a/src/OCE/SBC/sbcblk_algo_coare3p0.F90 b/src/OCE/SBC/sbcblk_algo_coare3p0.F90
index 2ad244fc..cd3da3eb 100644
--- a/src/OCE/SBC/sbcblk_algo_coare3p0.F90
+++ b/src/OCE/SBC/sbcblk_algo_coare3p0.F90
@@ -71,7 +71,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       IF( l_use_wl ) THEN
          ierr = 0
-         ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), dT_wl(jpi,jpj), Hz_wl(jpi,jpj), STAT=ierr )
+         ALLOCATE ( Tau_ac(A2D(0)) , Qnt_ac(A2D(0)), dT_wl(A2D(0)), Hz_wl(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_COARE3P0_INIT => allocation of Tau_ac, Qnt_ac, dT_wl & Hz_wl failed!' )
          Tau_ac(:,:) = 0._wp
          Qnt_ac(:,:) = 0._wp
@@ -80,7 +80,7 @@ CONTAINS
       ENDIF
       IF( l_use_cs ) THEN
          ierr = 0
-         ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr )
+         ALLOCATE ( dT_cs(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_COARE3P0_INIT => allocation of dT_cs failed!' )
          dT_cs(:,:) = -0.25_wp  ! First guess of skin correction
       ENDIF
@@ -151,44 +151,44 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      INTEGER,  INTENT(in   )                     ::   kt       ! current time step
-      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   T_s      ! sea surface temperature                [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   q_s      ! sea surface specific humidity           [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
-      LOGICAL , INTENT(in   )                     ::   l_use_cs ! use the cool-skin parameterization
-      LOGICAL , INTENT(in   )                     ::   l_use_wl ! use the warm-layer parameterization
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
+      INTEGER,  INTENT(in   )                    ::   kt       ! current time step
+      REAL(wp), INTENT(in   )                    ::   zt       ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in   )                    ::   zu       ! height for U_zu                             [m]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   T_s      ! sea surface temperature                [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   t_zt     ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   q_s      ! sea surface specific humidity           [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   q_zt     ! specific air humidity at zt             [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   U_zu     ! relative wind module at zu                [m/s]
+      LOGICAL , INTENT(in   )                    ::   l_use_cs ! use the cool-skin parameterization
+      LOGICAL , INTENT(in   )                    ::   l_use_wl ! use the warm-layer parameterization
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Cd       ! transfer coefficient for momentum         (tau)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ubzu     ! bulk wind speed at zu                     [m/s]
       !
-      INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_cs
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_wl   !             [K]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pHz_wl   !             [m]
+      INTEGER , INTENT(in   ), OPTIONAL                    :: nb_iter    ! number of iterations
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CdN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   ChN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CeN
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   Qsw      !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   rad_lw   !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   slp      !             [Pa]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_cs
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_wl   !             [K]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pHz_wl   !             [m]
       !
       INTEGER :: nbit, jit
       LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
       !
-      REAL(wp), DIMENSION(jpi,jpj) :: u_star, t_star, q_star
-      REAL(wp), DIMENSION(jpi,jpj) :: dt_zu, dq_zu
-      REAL(wp), DIMENSION(jpi,jpj) :: znu_a         !: Nu_air, Viscosity of air
-      REAL(wp), DIMENSION(jpi,jpj) :: z0, z0t
-      REAL(wp), DIMENSION(jpi,jpj) :: zeta_u        ! stability parameter at height zu
-      REAL(wp), DIMENSION(jpi,jpj) :: ztmp0, ztmp1, ztmp2
-      REAL(wp), DIMENSION(jpi,jpj) :: zpre, zrhoa, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
+      REAL(wp), DIMENSION(A2D(0)) :: u_star, t_star, q_star
+      REAL(wp), DIMENSION(A2D(0)) :: dt_zu, dq_zu
+      REAL(wp), DIMENSION(A2D(0)) :: znu_a         !: Nu_air, Viscosity of air
+      REAL(wp), DIMENSION(A2D(0)) :: z0, z0t
+      REAL(wp), DIMENSION(A2D(0)) :: zeta_u        ! stability parameter at height zu
+      REAL(wp), DIMENSION(A2D(0)) :: ztmp0, ztmp1, ztmp2
+      REAL(wp), DIMENSION(A2D(0)) :: zpre, zrhoa, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
       !
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zeta_t  ! stability parameter at height zt
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zsst    ! to back up the initial bulk SST
@@ -201,7 +201,7 @@ CONTAINS
       IF( PRESENT(nb_iter) ) nbit = nb_iter
 
       l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision
-      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(jpi,jpj) )
+      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(A2D(0)) )
 
       !! Initializations for cool skin and warm layer:
       IF( l_use_cs .AND. (.NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp))) ) &
@@ -211,7 +211,7 @@ CONTAINS
          &   CALL ctl_stop( '['//TRIM(crtnm)//'] => ' , 'you need to provide Qsw, rad_lw & slp to use warm-layer param!' )
 
       IF( l_use_cs .OR. l_use_wl ) THEN
-         ALLOCATE ( zsst(jpi,jpj) )
+         ALLOCATE ( zsst(A2D(0)) )
          zsst = T_s ! backing up the bulk SST
          IF( l_use_cs ) T_s = T_s - 0.25_wp   ! First guess of correction
          q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s
@@ -334,8 +334,8 @@ CONTAINS
 
             CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 )  ! ! Qnsol -> ztmp1 / Qlat -> ztmp2
 
-            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*tmask(:,:,1)
-            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*smask0(:,:)
+            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
          ENDIF
 
@@ -347,8 +347,8 @@ CONTAINS
             CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nbit,jit) )
 
             !! Updating T_s and q_s !!!
-            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*tmask(:,:,1)
-            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*smask0(:,:)
+            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
          ENDIF
 
@@ -392,13 +392,13 @@ CONTAINS
       !!
       !! Author: L. Brodeau, June 2016 / AeroBulk  (https://github.com/brodeau/aerobulk/)
       !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: charn_coare3p0
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd   ! wind speed
+      REAL(wp), DIMENSION(A2D(0)) :: charn_coare3p0
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pwnd   ! wind speed
       !
       INTEGER  ::   ji, jj         ! dummy loop indices
       REAL(wp) :: zw, zgt10, zgt18
       !!-------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zw = pwnd(ji,jj)   ! wind speed
             !
@@ -426,13 +426,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_coare
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_coare
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zphi_m, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = pzeta(ji,jj)
             !
@@ -474,13 +474,13 @@ CONTAINS
       !! Author: L. Brodeau, June 2016 / AeroBulk
       !!         (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_coare
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_coare
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj     ! dummy loop indices
       REAL(wp) :: zta, zphi_h, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
       !!----------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = pzeta(ji,jj)
             !
diff --git a/src/OCE/SBC/sbcblk_algo_coare3p6.F90 b/src/OCE/SBC/sbcblk_algo_coare3p6.F90
index cb7fff12..50f6800a 100644
--- a/src/OCE/SBC/sbcblk_algo_coare3p6.F90
+++ b/src/OCE/SBC/sbcblk_algo_coare3p6.F90
@@ -61,7 +61,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       IF( l_use_wl ) THEN
          ierr = 0
-         ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), dT_wl(jpi,jpj), Hz_wl(jpi,jpj), STAT=ierr )
+         ALLOCATE ( Tau_ac(A2D(0)) , Qnt_ac(A2D(0)), dT_wl(A2D(0)), Hz_wl(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_COARE3P6_INIT => allocation of Tau_ac, Qnt_ac, dT_wl & Hz_wl failed!' )
          Tau_ac(:,:) = 0._wp
          Qnt_ac(:,:) = 0._wp
@@ -70,7 +70,7 @@ CONTAINS
       ENDIF
       IF( l_use_cs ) THEN
          ierr = 0
-         ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr )
+         ALLOCATE ( dT_cs(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_COARE3P6_INIT => allocation of dT_cs failed!' )
          dT_cs(:,:) = -0.25_wp  ! First guess of skin correction
       ENDIF
@@ -141,44 +141,44 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      INTEGER,  INTENT(in   )                     ::   kt       ! current time step
-      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   T_s      ! sea surface temperature                [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   q_s      ! sea surface specific humidity           [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
-      LOGICAL , INTENT(in   )                     ::   l_use_cs ! use the cool-skin parameterization
-      LOGICAL , INTENT(in   )                     ::   l_use_wl ! use the warm-layer parameterization
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
+      INTEGER,  INTENT(in   )                    ::   kt       ! current time step
+      REAL(wp), INTENT(in   )                    ::   zt       ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in   )                    ::   zu       ! height for U_zu                             [m]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   T_s      ! sea surface temperature                [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   t_zt     ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   q_s      ! sea surface specific humidity           [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   q_zt     ! specific air humidity at zt             [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   U_zu     ! relative wind module at zu                [m/s]
+      LOGICAL , INTENT(in   )                    ::   l_use_cs ! use the cool-skin parameterization
+      LOGICAL , INTENT(in   )                    ::   l_use_wl ! use the warm-layer parameterization
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Cd       ! transfer coefficient for momentum         (tau)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ubzu     ! bulk wind speed at zu                     [m/s]
       !
-      INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_cs
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_wl   !             [K]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pHz_wl   !             [m]
+      INTEGER , INTENT(in   ), OPTIONAL                    :: nb_iter    ! number of iterations
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CdN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   ChN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CeN
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   Qsw      !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   rad_lw   !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   slp      !             [Pa]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_cs
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_wl   !             [K]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pHz_wl   !             [m]
       !
       INTEGER :: nbit, jit
       LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
       !
-      REAL(wp), DIMENSION(jpi,jpj) :: u_star, t_star, q_star
-      REAL(wp), DIMENSION(jpi,jpj) :: dt_zu, dq_zu
-      REAL(wp), DIMENSION(jpi,jpj) :: znu_a         !: Nu_air, Viscosity of air
-      REAL(wp), DIMENSION(jpi,jpj) :: z0, z0t
-      REAL(wp), DIMENSION(jpi,jpj) :: zeta_u        ! stability parameter at height zu
-      REAL(wp), DIMENSION(jpi,jpj) :: ztmp0, ztmp1, ztmp2
-      REAL(wp), DIMENSION(jpi,jpj) :: zpre, zrhoa, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
+      REAL(wp), DIMENSION(A2D(0)) :: u_star, t_star, q_star
+      REAL(wp), DIMENSION(A2D(0)) :: dt_zu, dq_zu
+      REAL(wp), DIMENSION(A2D(0)) :: znu_a         !: Nu_air, Viscosity of air
+      REAL(wp), DIMENSION(A2D(0)) :: z0, z0t
+      REAL(wp), DIMENSION(A2D(0)) :: zeta_u        ! stability parameter at height zu
+      REAL(wp), DIMENSION(A2D(0)) :: ztmp0, ztmp1, ztmp2
+      REAL(wp), DIMENSION(A2D(0)) :: zpre, zrhoa, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
       !
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zeta_t  ! stability parameter at height zt
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zsst    ! to back up the initial bulk SST
@@ -191,7 +191,7 @@ CONTAINS
       IF( PRESENT(nb_iter) ) nbit = nb_iter
 
       l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp ) ! testing "zu == zt" is risky with double precision
-      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(jpi,jpj) )
+      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(A2D(0)) )
 
       !! Initializations for cool skin and warm layer:
       IF( l_use_cs .AND. (.NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp))) ) &
@@ -201,7 +201,7 @@ CONTAINS
          &   CALL ctl_stop( '['//TRIM(crtnm)//'] => ' , 'you need to provide Qsw, rad_lw & slp to use warm-layer param!' )
 
       IF( l_use_cs .OR. l_use_wl ) THEN
-         ALLOCATE ( zsst(jpi,jpj) )
+         ALLOCATE ( zsst(A2D(0)) )
          zsst = T_s ! backing up the bulk SST
          IF( l_use_cs ) T_s = T_s - 0.25_wp   ! First guess of correction
          q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s
@@ -324,8 +324,8 @@ CONTAINS
 
             CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 )  ! ! Qnsol -> ztmp1 / Qlat -> ztmp2
 
-            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*tmask(:,:,1)
-            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*smask0(:,:)
+            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
          ENDIF
 
@@ -337,8 +337,8 @@ CONTAINS
             CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nbit,jit) )
 
             !! Updating T_s and q_s !!!
-            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*tmask(:,:,1)
-            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*smask0(:,:)
+            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
          ENDIF
 
@@ -378,8 +378,8 @@ CONTAINS
       !!
       !! Author: L. Brodeau, July 2019 / AeroBulk  (https://github.com/brodeau/aerobulk/)
       !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: charn_coare3p6
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd   ! neutral wind speed at 10m
+      REAL(wp), DIMENSION(A2D(0)) :: charn_coare3p6
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pwnd   ! neutral wind speed at 10m
       !
       REAL(wp), PARAMETER :: charn0_max = 0.028  !: value above which the Charnock parameter levels off for winds > 18 m/s
       !!-------------------------------------------------------------------
@@ -395,10 +395,10 @@ CONTAINS
       !!
       !! Author: L. Brodeau, October 2019 / AeroBulk  (https://github.com/brodeau/aerobulk/)
       !!-------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: charn_coare3p6_wave
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pus   ! friction velocity             [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwsh  ! significant wave height       [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwps  ! phase speed of dominant waves [m/s]
+      REAL(wp), DIMENSION(A2D(0)) :: charn_coare3p6_wave
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pus   ! friction velocity             [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pwsh  ! significant wave height       [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pwps  ! phase speed of dominant waves [m/s]
       !!-------------------------------------------------------------------
       charn_coare3p6_wave = ( pwsh*0.2_wp*(pus/pwps)**2.2_wp ) * grav/(pus*pus)
       !!
@@ -418,13 +418,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_coare
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_coare
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zphi_m, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = pzeta(ji,jj)
             !
@@ -466,13 +466,13 @@ CONTAINS
       !! Author: L. Brodeau, June 2016 / AeroBulk
       !!         (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_coare
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_coare
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj     ! dummy loop indices
       REAL(wp) :: zta, zphi_h, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
       !!----------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = pzeta(ji,jj)
             !
diff --git a/src/OCE/SBC/sbcblk_algo_ecmwf.F90 b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
index d86c9975..eb316c81 100644
--- a/src/OCE/SBC/sbcblk_algo_ecmwf.F90
+++ b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
@@ -69,14 +69,14 @@ CONTAINS
       !!---------------------------------------------------------------------
       IF( l_use_wl ) THEN
          ierr = 0
-         ALLOCATE ( dT_wl(jpi,jpj), Hz_wl(jpi,jpj), STAT=ierr )
+         ALLOCATE ( dT_wl(A2D(0)), Hz_wl(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_ECMWF_INIT => allocation of dT_wl & Hz_wl failed!' )
          dT_wl(:,:)  = 0._wp
          Hz_wl(:,:)  = rd0 ! (rd0, constant, = 3m is default for Zeng & Beljaars)
       ENDIF
       IF( l_use_cs ) THEN
          ierr = 0
-         ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr )
+         ALLOCATE ( dT_cs(A2D(0)), STAT=ierr )
          IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_ECMWF_INIT => allocation of dT_cs failed!' )
          dT_cs(:,:) = -0.25_wp  ! First guess of skin correction
       ENDIF
@@ -147,48 +147,48 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      INTEGER,  INTENT(in   )                     ::   kt       ! current time step
-      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   T_s      ! sea surface temperature                [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   q_s      ! sea surface specific humidity           [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
-      LOGICAL , INTENT(in   )                     ::   l_use_cs ! use the cool-skin parameterization
-      LOGICAL , INTENT(in   )                     ::   l_use_wl ! use the warm-layer parameterization
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
+      INTEGER,  INTENT(in   )                    ::   kt       ! current time step
+      REAL(wp), INTENT(in   )                    ::   zt       ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in   )                    ::   zu       ! height for U_zu                             [m]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   T_s      ! sea surface temperature                [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   t_zt     ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   q_s      ! sea surface specific humidity           [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   q_zt     ! specific air humidity at zt             [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   U_zu     ! relative wind module at zu                [m/s]
+      LOGICAL , INTENT(in   )                    ::   l_use_cs ! use the cool-skin parameterization
+      LOGICAL , INTENT(in   )                    ::   l_use_wl ! use the warm-layer parameterization
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Cd       ! transfer coefficient for momentum         (tau)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ubzu     ! bulk wind speed at zu                     [m/s]
       !
-      INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
-      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_cs
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_wl   !             [K]
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pHz_wl   !             [m]
+      INTEGER , INTENT(in   ), OPTIONAL                    :: nb_iter    ! number of iterations
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CdN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   ChN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CeN
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   Qsw      !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   rad_lw   !             [W/m^2]
+      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(A2D(0)) ::   slp      !             [Pa]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_cs
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pdT_wl   !             [K]
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   pHz_wl   !             [m]
       !
       INTEGER :: nbit, jit
       LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
       !
-      REAL(wp), DIMENSION(jpi,jpj) :: u_star, t_star, q_star
-      REAL(wp), DIMENSION(jpi,jpj) :: dt_zu, dq_zu
-      REAL(wp), DIMENSION(jpi,jpj) :: znu_a         !: Nu_air, Viscosity of air
-      REAL(wp), DIMENSION(jpi,jpj) :: Linv  !: 1/L (inverse of Monin Obukhov length...
-      REAL(wp), DIMENSION(jpi,jpj) :: z0, z0t, z0q
-      REAL(wp), DIMENSION(jpi,jpj) :: zrhoa, zpre, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
+      REAL(wp), DIMENSION(A2D(0)) :: u_star, t_star, q_star
+      REAL(wp), DIMENSION(A2D(0)) :: dt_zu, dq_zu
+      REAL(wp), DIMENSION(A2D(0)) :: znu_a         !: Nu_air, Viscosity of air
+      REAL(wp), DIMENSION(A2D(0)) :: Linv  !: 1/L (inverse of Monin Obukhov length...
+      REAL(wp), DIMENSION(A2D(0)) :: z0, z0t, z0q
+      REAL(wp), DIMENSION(A2D(0)) :: zrhoa, zpre, zta ! air pressure [Pa], density [kg/m3] & absolute temperature [k]
       !
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zsst  ! to back up the initial bulk SST
       !
-      REAL(wp), DIMENSION(jpi,jpj) :: func_m, func_h
-      REAL(wp), DIMENSION(jpi,jpj) :: ztmp0, ztmp1, ztmp2
+      REAL(wp), DIMENSION(A2D(0)) :: func_m, func_h
+      REAL(wp), DIMENSION(A2D(0)) :: ztmp0, ztmp1, ztmp2
       CHARACTER(len=40), PARAMETER :: crtnm = 'turb_ecmwf@sbcblk_algo_ecmwf.F90'
       !!----------------------------------------------------------------------------------
       IF( kt == nit000 ) CALL SBCBLK_ALGO_ECMWF_INIT(l_use_cs, l_use_wl)
@@ -206,7 +206,7 @@ CONTAINS
          &   CALL ctl_stop( '['//TRIM(crtnm)//'] => ' , 'you need to provide Qsw, rad_lw & slp to use warm-layer param!' )
 
       IF( l_use_cs .OR. l_use_wl ) THEN
-         ALLOCATE ( zsst(jpi,jpj) )
+         ALLOCATE ( zsst(A2D(0)) )
          zsst = T_s ! backing up the bulk SST
          IF( l_use_cs ) T_s = T_s - 0.25_wp   ! First guess of correction
          q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s
@@ -360,8 +360,8 @@ CONTAINS
 
             CALL CS_ECMWF( Qsw, ztmp1, u_star, zsst )  ! Qnsol -> ztmp1
 
-            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*tmask(:,:,1)
-            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_cs(:,:)*smask0(:,:)
+            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
 
          ENDIF
@@ -372,8 +372,8 @@ CONTAINS
                &                   ztmp1, ztmp2)  ! Qnsol -> ztmp1 / Tau -> ztmp2
             CALL WL_ECMWF( Qsw, ztmp1, u_star, zsst )
             !! Updating T_s and q_s !!!
-            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*tmask(:,:,1) !
-            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*tmask(:,:,1)
+            T_s(:,:) = zsst(:,:) + dT_wl(:,:)*smask0(:,:) !
+            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*smask0(:,:)
             q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
          ENDIF
 
@@ -413,14 +413,14 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_ecmwf
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_ecmwf
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zx2, zx, ztmp, zpsi_unst, zpsi_stab, zstab, zc
       !!----------------------------------------------------------------------------------
       zc = 5._wp/0.35_wp
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = MIN( pzeta(ji,jj) , 5._wp ) !! Very stable conditions (L positif and big!):
 
@@ -454,15 +454,15 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_ecmwf
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_ecmwf
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj     ! dummy loop indices
       REAL(wp) ::  zta, zx2, zpsi_unst, zpsi_stab, zstab, zc
       !!----------------------------------------------------------------------------------
       zc = 5._wp/0.35_wp
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = MIN(pzeta(ji,jj) , 5._wp)   ! Very stable conditions (L positif and big!):
             !
diff --git a/src/OCE/SBC/sbcblk_algo_ice_an05.F90 b/src/OCE/SBC/sbcblk_algo_ice_an05.F90
index 50ea20f6..36ed050e 100644
--- a/src/OCE/SBC/sbcblk_algo_ice_an05.F90
+++ b/src/OCE/SBC/sbcblk_algo_ice_an05.F90
@@ -79,26 +79,26 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, January 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(in )                     :: zt    ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in )                     :: zu    ! height for U_zu                             [m]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: Ts_i  ! ice surface temperature                [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: t_zt  ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: q_zt  ! spec. air humidity at zt               [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: U_zu  ! relative wind module at zu                [m/s]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Cd_i  ! drag coefficient over sea-ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ch_i  ! transfert coefficient for heat over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ce_i  ! transfert coefficient for sublimation over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(in )                    :: zt    ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in )                    :: zu    ! height for U_zu                             [m]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: Ts_i  ! ice surface temperature                [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: t_zt  ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: q_zt  ! spec. air humidity at zt               [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: U_zu  ! relative wind module at zu                [m/s]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Cd_i  ! drag coefficient over sea-ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ch_i  ! transfert coefficient for heat over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ce_i  ! transfert coefficient for sublimation over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CdN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: ChN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CeN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xu_star  ! u*, friction velocity
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xL  ! zeta (zu/L)
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xUN10  ! Neutral wind at zu
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CdN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: ChN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CeN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xu_star  ! u*, friction velocity
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xL  ! zeta (zu/L)
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xUN10  ! Neutral wind at zu
       !!----------------------------------------------------------------------------------
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: Ubzu
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ztmp0, ztmp1, ztmp2      ! temporary stuff
@@ -116,10 +116,10 @@ CONTAINS
       !!
       CHARACTER(len=40), PARAMETER :: crtnm = 'turb_ice_an05@sbcblk_algo_ice_an05.f90'
       !!----------------------------------------------------------------------------------
-      ALLOCATE (  Ubzu(jpi,jpj), u_star(jpi,jpj),  t_star(jpi,jpj),  q_star(jpi,jpj),  &
-         &      zeta_u(jpi,jpj),  dt_zu(jpi,jpj),   dq_zu(jpi,jpj),  &
-         &       znu_a(jpi,jpj),  ztmp1(jpi,jpj),   ztmp2(jpi,jpj),  &
-         &          z0(jpi,jpj),   z0tq(jpi,jpj,2), ztmp0(jpi,jpj)   )
+      ALLOCATE (  Ubzu(A2D(0)), u_star(A2D(0)),  t_star(A2D(0)),  q_star(A2D(0)),  &
+         &      zeta_u(A2D(0)),  dt_zu(A2D(0)),   dq_zu(A2D(0)),  &
+         &       znu_a(A2D(0)),  ztmp1(A2D(0)),   ztmp2(A2D(0)),  &
+         &          z0(A2D(0)),   z0tq(A2D(0),2), ztmp0(A2D(0))   )
 
       lreturn_cdn   = PRESENT(CdN)
       lreturn_chn   = PRESENT(ChN)
@@ -130,7 +130,7 @@ CONTAINS
       lreturn_UN10  = PRESENT(xUN10)
 
       l_zt_equal_zu = ( ABS(zu - zt) < 0.01_wp )
-      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(jpi,jpj) )
+      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(A2D(0)) )
 
       !! Scalar wind speed cannot be below 0.2 m/s
       Ubzu = MAX( U_zu, wspd_thrshld_ice )
@@ -227,14 +227,14 @@ CONTAINS
       !!
       !! Author: L. Brodeau, January 2020 / AeroBulk  (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: rough_leng_m      ! roughness length over sea-ice [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pus   ! u* = friction velocity    [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pnua  ! kinematic viscosity of air [m^2/s]
+      REAL(wp), DIMENSION(A2D(0)) :: rough_leng_m      ! roughness length over sea-ice [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pus   ! u* = friction velocity    [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pnua  ! kinematic viscosity of air [m^2/s]
       !!
       INTEGER  :: ji, jj    ! dummy loop indices
       REAL(wp) :: zus, zz
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             zus = MAX( pus(ji,jj) , 1.E-9_wp )
 
             zz = (zus - 0.18_wp) / 0.1_wp
@@ -251,16 +251,16 @@ CONTAINS
       !!
       !! Author: L. Brodeau, January 2020 / AeroBulk  (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,2)           :: rough_leng_tq     ! temp.,hum. roughness lengthes over sea-ice [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0   ! roughness length            [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pus   ! u* = friction velocity    [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pnua  ! kinematic viscosity of air [m^2/s]
+      REAL(wp), DIMENSION(A2D(0),2)           :: rough_leng_tq     ! temp.,hum. roughness lengthes over sea-ice [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pz0   ! roughness length            [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pus   ! u* = friction velocity    [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pnua  ! kinematic viscosity of air [m^2/s]
       !!
       INTEGER  :: ji, jj    ! dummy loop indices
       REAL(wp) :: zz0, zus, zre, zsmoot, ztrans, zrough
       REAL(wp) :: zb0, zb1, zb2, zlog, zlog2, zlog_z0s_on_z0
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             zz0 = pz0(ji,jj)
             zus = MAX( pus(ji,jj) , 1.E-9_wp )
             zre = MAX( zus*zz0/pnua(ji,jj) , 0._wp ) ! Roughness Reynolds number
@@ -315,13 +315,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_ice
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_ice
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zx, zpsi_u, zpsi_s, zstab
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )            !
+      DO_2D( 0, 0, 0, 0 )            !
             zta = pzeta(ji,jj)
             !
             ! Unstable stratification:
@@ -360,13 +360,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_ice
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_ice
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zx, zpsi_u, zpsi_s, zstab
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )            !
+      DO_2D( 0, 0, 0, 0 )            !
             zta = pzeta(ji,jj)
             !
             ! Unstable stratification:
diff --git a/src/OCE/SBC/sbcblk_algo_ice_cdn.F90 b/src/OCE/SBC/sbcblk_algo_ice_cdn.F90
index 87932e39..0a9103f8 100644
--- a/src/OCE/SBC/sbcblk_algo_ice_cdn.F90
+++ b/src/OCE/SBC/sbcblk_algo_ice_cdn.F90
@@ -59,12 +59,12 @@ CONTAINS
       !! ** References : Lupkes et al. JGR 2012 (theory)
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)                       ::   CdN10_f_LU12  ! neutral FORM drag coefficient contribution over sea-ice
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pz0w   ! roughness length over water  [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pSc2   ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
+      REAL(wp), DIMENSION(A2D(0))                       ::   CdN10_f_LU12  ! neutral FORM drag coefficient contribution over sea-ice
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)           ::   pz0w   ! roughness length over water  [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   pSc2   ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
       !!----------------------------------------------------------------------
       LOGICAL  ::   l_known_Sc2=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
       REAL(wp) ::   ztmp, zrlog, zfri, zfrw, zSc2, zhf, zDi
@@ -74,7 +74,7 @@ CONTAINS
       l_known_hf    = PRESENT(phf)
       l_known_Di    = PRESENT(pDi)
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             
          zfri = pfrice(ji,jj)
          zfrw = (1._wp - zfri)
@@ -113,9 +113,9 @@ CONTAINS
    
    FUNCTION CdN_f_LU12_eq36( pzu, pfrice )
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             ::   CdN_f_LU12_eq36 ! neutral FORM drag coefficient contribution over sea-ice
-      REAL(wp),                     INTENT(in) ::   pzu    ! reference height                       [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
+      REAL(wp), DIMENSION(A2D(0))             ::   CdN_f_LU12_eq36 ! neutral FORM drag coefficient contribution over sea-ice
+      REAL(wp),                    INTENT(in) ::   pzu    ! reference height                       [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
       !!----------------------------------------------------------------------
       REAL(wp) :: ztmp, zrlog, zfri, zhf, zDi
       INTEGER  :: ji, jj
@@ -127,7 +127,7 @@ CONTAINS
       ztmp  = 1._wp/rz0_w_0
       zrlog = LOG(zhf*ztmp) / LOG(pzu*ztmp)
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zfri = pfrice(ji,jj)
          CdN_f_LU12_eq36(ji,jj) = 0.5_wp* 0.3_wp * zrlog*zrlog * zhf/zDi  * (1._wp - zfri)**rBeta_0 ! Eq.(35) & (36)
          !!                       1/2      Ce
@@ -167,8 +167,8 @@ CONTAINS
       !!                 Lupkes et al. GRL 2013 (application to GCM)
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)              ::   CdN10_f_LU13  ! neutral FORM drag coefficient contribution over sea-ice
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  ::   pfrice           ! ice concentration [fraction]  => at_i_b
+      REAL(wp), DIMENSION(A2D(0))              ::   CdN10_f_LU13  ! neutral FORM drag coefficient contribution over sea-ice
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  ::   pfrice           ! ice concentration [fraction]  => at_i_b
       !!----------------------------------------------------------------------
       INTEGER  ::   ji, jj
       REAL(wp) ::   zcoef
@@ -178,7 +178,7 @@ CONTAINS
       !! We are not an AGCM, we are an OGCM!!! => we drop term "(1 - A)*Cd_w"
       !!  => so we keep only the last rhs terms of Eq.(1) of Lupkes et al, 2013 that we divide by "A":
       !! (we multiply Cd_i_s and Cd_i_f by A later, when applying ocean-ice partitioning...
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          CdN10_f_LU13(ji,jj) = rCe_0 * pfrice(ji,jj)**(rMu_0 - 1._wp) * (1._wp - pfrice(ji,jj))**zcoef
       END_2D
       !! => seems okay for winter 100% sea-ice as second rhs term vanishes as pfrice == 1....
@@ -203,13 +203,13 @@ CONTAINS
       !! ** References : Lupkes & Gryanik (2015)
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)                       ::   CdN_f_LG15  ! neutral FORM drag coefficient contribution over sea-ice
-      REAL(wp),                     INTENT(in )          ::   pzu    ! reference height                       [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pz0i   ! roughness length over ICE  [m] (in LU12, it's over water ???)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pSc2   ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
+      REAL(wp), DIMENSION(A2D(0))                       ::   CdN_f_LG15  ! neutral FORM drag coefficient contribution over sea-ice
+      REAL(wp),                    INTENT(in )          ::   pzu    ! reference height                       [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc2, phf and pDi all provided...
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)           ::   pz0i   ! roughness length over ICE  [m] (in LU12, it's over water ???)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   pSc2   ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
       !!----------------------------------------------------------------------
       LOGICAL  ::   l_known_Sc2=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
       REAL(wp) ::   ztmp, zrlog, zfri, zfrw, zSc2, zhf, zDi
@@ -219,7 +219,7 @@ CONTAINS
       l_known_hf    = PRESENT(phf)
       l_known_Di    = PRESENT(pDi)
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zfri = pfrice(ji,jj)
          zfrw = (1._wp - zfri)
@@ -270,15 +270,15 @@ CONTAINS
       !! ** References : Lupkes & Gryanik (2015)
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             ::   CdN_f_LG15_light  ! neutral FORM drag coefficient contribution over sea-ice
-      REAL(wp),                     INTENT(in) ::   pzu    ! reference height [m]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pfrice ! ice concentration [fraction]  => at_i_b
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pz0w   ! roughness length over water  [m]
+      REAL(wp), DIMENSION(A2D(0))             ::   CdN_f_LG15_light  ! neutral FORM drag coefficient contribution over sea-ice
+      REAL(wp),                    INTENT(in) ::   pzu    ! reference height [m]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pfrice ! ice concentration [fraction]  => at_i_b
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pz0w   ! roughness length over water  [m]
       !!----------------------------------------------------------------------
       REAL(wp) ::   ztmp, zrlog, zfri
       INTEGER  ::   ji, jj
       !!----------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zfri = pfrice(ji,jj)
          
diff --git a/src/OCE/SBC/sbcblk_algo_ice_lg15.F90 b/src/OCE/SBC/sbcblk_algo_ice_lg15.F90
index 62ec01b8..9c9302fa 100644
--- a/src/OCE/SBC/sbcblk_algo_ice_lg15.F90
+++ b/src/OCE/SBC/sbcblk_algo_ice_lg15.F90
@@ -42,6 +42,8 @@ MODULE sbcblk_algo_ice_lg15
 
    INTEGER , PARAMETER ::   nbit = 8        ! number of itterations
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
 CONTAINS
 
@@ -92,27 +94,27 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, January 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(in )                     :: zt    ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in )                     :: zu    ! height for U_zu                             [m]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: Ts_i  ! ice surface temperature                [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: t_zt  ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: q_zt  ! spec. air humidity at zt               [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: U_zu  ! relative wind module at zu                [m/s]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: frice ! sea-ice concentration        (fraction)
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Cd_i  ! drag coefficient over sea-ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ch_i  ! transfert coefficient for heat over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ce_i  ! transfert coefficient for sublimation over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(in )                    :: zt    ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in )                    :: zu    ! height for U_zu                             [m]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: Ts_i  ! ice surface temperature                [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: t_zt  ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: q_zt  ! spec. air humidity at zt               [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: U_zu  ! relative wind module at zu                [m/s]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: frice ! sea-ice concentration        (fraction)
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Cd_i  ! drag coefficient over sea-ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ch_i  ! transfert coefficient for heat over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ce_i  ! transfert coefficient for sublimation over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CdN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: ChN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CeN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xu_star  ! u*, friction velocity
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xL  ! zeta (zu/L)
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xUN10  ! Neutral wind at zu
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CdN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: ChN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CeN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xu_star  ! u*, friction velocity
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xL  ! zeta (zu/L)
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xUN10  ! Neutral wind at zu
       !!----------------------------------------------------------------------------------
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: Ubzu
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ztmp1, ztmp2      ! temporary stuff
@@ -128,11 +130,11 @@ CONTAINS
       !!
       CHARACTER(len=40), PARAMETER :: crtnm = 'turb_ice_lg15@sbcblk_algo_ice_lg15.f90'
       !!----------------------------------------------------------------------------------
-      ALLOCATE ( Ubzu(jpi,jpj) )
-      ALLOCATE ( ztmp1(jpi,jpj),  ztmp2(jpi,jpj) )
-      ALLOCATE ( dt_zu(jpi,jpj),  dq_zu(jpi,jpj) )
-      ALLOCATE ( zz0_s(jpi,jpj),  zz0_f(jpi,jpj),    RiB(jpi,jpj), &
-         &      zCdN_s(jpi,jpj), zChN_s(jpi,jpj), zCdN_f(jpi,jpj), zChN_f(jpi,jpj) )
+      ALLOCATE ( Ubzu(A2D(0)) )
+      ALLOCATE ( ztmp1(A2D(0)),  ztmp2(A2D(0)) )
+      ALLOCATE ( dt_zu(A2D(0)),  dq_zu(A2D(0)) )
+      ALLOCATE ( zz0_s(A2D(0)),  zz0_f(A2D(0)),    RiB(A2D(0)), &
+         &      zCdN_s(A2D(0)), zChN_s(A2D(0)), zCdN_f(A2D(0)), zChN_f(A2D(0)) )
 
       lreturn_cdn   = PRESENT(CdN)
       lreturn_chn   = PRESENT(ChN)
diff --git a/src/OCE/SBC/sbcblk_algo_ice_lu12.F90 b/src/OCE/SBC/sbcblk_algo_ice_lu12.F90
index d46534a3..10a4dbf6 100644
--- a/src/OCE/SBC/sbcblk_algo_ice_lu12.F90
+++ b/src/OCE/SBC/sbcblk_algo_ice_lu12.F90
@@ -32,6 +32,8 @@ MODULE sbcblk_algo_ice_lu12
    REAL(wp), PARAMETER :: rz0_i_s_0  = 0.69e-3_wp  ! Eq.(43) of Lupkes & Gryanik (2015) [m] => to estimate CdN10 for skin drag!
    REAL(wp), PARAMETER :: rz0_i_f_0  = 4.54e-4_wp  ! bottom p.562 MIZ [m] (LG15)   
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
 CONTAINS
 
@@ -79,27 +81,27 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, January 2020 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(in )                     :: zt    ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in )                     :: zu    ! height for U_zu                             [m]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: Ts_i  ! ice surface temperature                [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: t_zt  ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: q_zt  ! spec. air humidity at zt               [kg/kg]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: U_zu  ! relative wind module at zu                [m/s]
-      REAL(wp), INTENT(in ), DIMENSION(jpi,jpj) :: frice ! sea-ice concentration        (fraction)
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Cd_i  ! drag coefficient over sea-ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ch_i  ! transfert coefficient for heat over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: Ce_i  ! transfert coefficient for sublimation over ice
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(in )                    :: zt    ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in )                    :: zu    ! height for U_zu                             [m]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: Ts_i  ! ice surface temperature                [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: t_zt  ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: qs_i  ! sat. spec. hum. at ice/air interface    [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: q_zt  ! spec. air humidity at zt               [kg/kg]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: U_zu  ! relative wind module at zu                [m/s]
+      REAL(wp), INTENT(in ), DIMENSION(A2D(0)) :: frice ! sea-ice concentration        (fraction)
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Cd_i  ! drag coefficient over sea-ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ch_i  ! transfert coefficient for heat over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: Ce_i  ! transfert coefficient for sublimation over ice
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: t_zu_i ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)) :: q_zu_i ! spec. humidity adjusted at zu           [kg/kg]
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CdN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: ChN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: CeN
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xu_star  ! u*, friction velocity
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xL  ! zeta (zu/L)
-      REAL(wp), INTENT(out), DIMENSION(jpi,jpj), OPTIONAL :: xUN10  ! Neutral wind at zu
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CdN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: ChN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: CeN
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xz0  ! Aerodynamic roughness length   [m]
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xu_star  ! u*, friction velocity
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xL  ! zeta (zu/L)
+      REAL(wp), INTENT(out), DIMENSION(A2D(0)), OPTIONAL :: xUN10  ! Neutral wind at zu
       !!----------------------------------------------------------------------------------
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: dt_zu, dq_zu, z0
       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: Ubzu
@@ -109,8 +111,8 @@ CONTAINS
       !!
       CHARACTER(len=40), PARAMETER :: crtnm = 'turb_ice_lu12@sbcblk_algo_ice_lu12.f90'
       !!----------------------------------------------------------------------------------
-      ALLOCATE ( Ubzu(jpi,jpj) )
-      ALLOCATE ( dt_zu(jpi,jpj), dq_zu(jpi,jpj), z0(jpi,jpj) )
+      ALLOCATE ( Ubzu(A2D(0)) )
+      ALLOCATE ( dt_zu(A2D(0)), dq_zu(A2D(0)), z0(A2D(0)) )
 
       lreturn_cdn   = PRESENT(CdN)
       lreturn_chn   = PRESENT(ChN)
diff --git a/src/OCE/SBC/sbcblk_algo_ncar.F90 b/src/OCE/SBC/sbcblk_algo_ncar.F90
index bb520dbf..4e218454 100644
--- a/src/OCE/SBC/sbcblk_algo_ncar.F90
+++ b/src/OCE/SBC/sbcblk_algo_ncar.F90
@@ -79,32 +79,32 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
-      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   sst      ! sea surface temperature                [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   ssq      ! sea surface specific humidity           [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
+      REAL(wp), INTENT(in   )                    ::   zt       ! height for t_zt and q_zt                    [m]
+      REAL(wp), INTENT(in   )                    ::   zu       ! height for U_zu                             [m]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   sst      ! sea surface temperature                [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   t_zt     ! potential air temperature              [Kelvin]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   ssq      ! sea surface specific humidity           [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   q_zt     ! specific air humidity at zt             [kg/kg]
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0)) ::   U_zu     ! relative wind module at zu                [m/s]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Cd       ! transfer coefficient for momentum         (tau)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
+      REAL(wp), INTENT(  out), DIMENSION(A2D(0)) ::   Ubzu     ! bulk wind speed at zu                     [m/s]
       !
-      INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
+      INTEGER , INTENT(in   ), OPTIONAL                    :: nb_iter  ! number of iterations
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CdN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   ChN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(A2D(0)) ::   CeN
       !
       INTEGER :: nbit, jit                    ! iterations...
       LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
       !
-      REAL(wp), DIMENSION(jpi,jpj) ::   zCdN, zCeN, zChN        ! 10m neutral latent/sensible coefficient
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsqrt_Cd, zsqrt_CdN   ! root square of Cd and Cd_neutral
-      REAL(wp), DIMENSION(jpi,jpj) ::   zeta_u        ! stability parameter at height zu
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztmp0, ztmp1, ztmp2
+      REAL(wp), DIMENSION(A2D(0)) ::   zCdN, zCeN, zChN        ! 10m neutral latent/sensible coefficient
+      REAL(wp), DIMENSION(A2D(0)) ::   zsqrt_Cd, zsqrt_CdN   ! root square of Cd and Cd_neutral
+      REAL(wp), DIMENSION(A2D(0)) ::   zeta_u        ! stability parameter at height zu
+      REAL(wp), DIMENSION(A2D(0)) ::   ztmp0, ztmp1, ztmp2
       !!----------------------------------------------------------------------------------
       nbit = nb_iter0
       IF( PRESENT(nb_iter) ) nbit = nb_iter
@@ -119,7 +119,7 @@ CONTAINS
 
       !! Neutral coefficients at 10m:
       IF( ln_cdgw ) THEN      ! wave drag case
-         cdn_wave(:,:) = cdn_wave(:,:) + rsmall * ( 1._wp - tmask(:,:,1) )
+         cdn_wave(:,:) = cdn_wave(:,:) + rsmall * ( 1._wp - smask0(:,:) )
          zCdN   (:,:) = cdn_wave(:,:)
       ELSE
       zCdN = cd_n10_ncar( Ubzu )
@@ -231,14 +231,14 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pw10           ! scalar wind speed at 10m (m/s)
-      REAL(wp), DIMENSION(jpi,jpj)             :: cd_n10_ncar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pw10           ! scalar wind speed at 10m (m/s)
+      REAL(wp), DIMENSION(A2D(0))             :: cd_n10_ncar
       !
       INTEGER  ::     ji, jj     ! dummy loop indices
       REAL(wp) :: zgt33, zw, zw6 ! local scalars
       !!----------------------------------------------------------------------------------
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zw  = pw10(ji,jj)
             zw6 = zw*zw*zw
@@ -264,9 +264,9 @@ CONTAINS
       !! Origin: Large & Yeager 2008, Eq. (9) and (12)
 
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: ch_n10_ncar
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psqrtcdn10 ! sqrt( CdN10 )
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pstab      ! stable ABL => 1 / unstable ABL => 0
+      REAL(wp), DIMENSION(A2D(0))             :: ch_n10_ncar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: psqrtcdn10 ! sqrt( CdN10 )
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pstab      ! stable ABL => 1 / unstable ABL => 0
       !!----------------------------------------------------------------------------------
       IF( ANY(pstab < -0.00001) .OR. ANY(pstab >  1.00001) ) THEN
          PRINT *, 'ERROR: ch_n10_ncar@mod_blk_ncar.f90: pstab ='
@@ -283,8 +283,8 @@ CONTAINS
       !! Estimate of the neutral heat transfer coefficient at 10m      !!
       !! Origin: Large & Yeager 2008, Eq. (9) and (13)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)             :: ce_n10_ncar
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psqrtcdn10 ! sqrt( CdN10 )
+      REAL(wp), DIMENSION(A2D(0))             :: ce_n10_ncar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: psqrtcdn10 ! sqrt( CdN10 )
       !!----------------------------------------------------------------------------------
       ce_n10_ncar = MAX( 1.e-3_wp * ( 34.6_wp * psqrtcdn10 ) , Cx_min )
       !
@@ -301,13 +301,13 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_ncar
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_m_ncar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
       REAL(wp) :: zta, zx2, zx, zpsi_unst, zpsi_stab,  zstab   ! local scalars
       !!----------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             zta = pzeta(ji,jj)
             !
             zx2 = SQRT( ABS(1._wp - 16._wp*zta) )  ! (1 - 16z)^0.5
@@ -339,14 +339,14 @@ CONTAINS
       !!
       !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
       !!----------------------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_ncar
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
+      REAL(wp), DIMENSION(A2D(0)) :: psi_h_ncar
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj     ! dummy loop indices
       REAL(wp) :: zta, zx2, zpsi_unst, zpsi_stab, zstab  ! local scalars
       !!----------------------------------------------------------------------------------
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
             !
             zta = pzeta(ji,jj)
             !
diff --git a/src/OCE/SBC/sbcblk_skin_coare.F90 b/src/OCE/SBC/sbcblk_skin_coare.F90
index 42720bd9..ddd6af7f 100644
--- a/src/OCE/SBC/sbcblk_skin_coare.F90
+++ b/src/OCE/SBC/sbcblk_skin_coare.F90
@@ -79,16 +79,16 @@ CONTAINS
       !!     *pSST*       bulk SST (taken at depth gdept_1d(1))          [K]
       !!     *pQlat*      surface latent heat flux                       [K]
       !!------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQnsol ! non-solar heat flux to the ocean [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pSST ! bulk SST [K]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQlat  ! latent heat flux [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pQnsol ! non-solar heat flux to the ocean [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pSST ! bulk SST [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pQlat  ! latent heat flux [W/m^2]
       !!---------------------------------------------------------------------
       INTEGER  :: ji, jj, jc
       REAL(wp) :: zQabs, zdlt, zfr, zalfa, zqlat, zus
       !!---------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zQabs = pQnsol(ji,jj) ! first guess of heat flux absorbed within the viscous sublayer of thicknes delta,
          !                     !   => we DO not miss a lot assuming 0 solar flux absorbed in the tiny layer of thicknes zdlt...
@@ -129,11 +129,11 @@ CONTAINS
       !!     *pSST*       bulk SST  (taken at depth gdept_1d(1))         [K]
       !!     *iwait*      if /= 0 then wait before updating accumulated fluxes, we are within a converging itteration loop...
       !!---------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQsw     ! surface net solar radiation into the ocean [W/m^2]     => >= 0 !
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQnsol   ! surface net non-solar heat flux into the ocean [W/m^2] => normally < 0 !
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pTau     ! wind stress [N/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pSST     ! bulk SST at depth gdept_1d(1) [K]
-      INTEGER ,                     INTENT(in)  :: iwait    ! if /= 0 then wait before updating accumulated fluxes
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pQsw     ! surface net solar radiation into the ocean [W/m^2]     => >= 0 !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pQnsol   ! surface net non-solar heat flux into the ocean [W/m^2] => normally < 0 !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pTau     ! wind stress [N/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pSST     ! bulk SST at depth gdept_1d(1) [K]
+      INTEGER ,                    INTENT(in)  :: iwait    ! if /= 0 then wait before updating accumulated fluxes
       !!
       INTEGER :: ji,jj
       !
@@ -155,7 +155,7 @@ CONTAINS
 
       ztime = REAL(nsec_day,wp)/(24._wp*3600._wp) ! time of current time step since 00:00 for current day (UTC) -> ztime = 0 -> 00:00 / ztime = 0.5 -> 12:00 ...
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          l_exit       = .FALSE.
          l_destroy_wl = .FALSE.
diff --git a/src/OCE/SBC/sbcblk_skin_ecmwf.F90 b/src/OCE/SBC/sbcblk_skin_ecmwf.F90
index 0f4cf8d5..e3843716 100644
--- a/src/OCE/SBC/sbcblk_skin_ecmwf.F90
+++ b/src/OCE/SBC/sbcblk_skin_ecmwf.F90
@@ -87,15 +87,15 @@ CONTAINS
       !!     *pustar*     friction velocity u*                           [m/s]
       !!     *pSST*       bulk SST (taken at depth gdept_1d(1))          [K]
       !!------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQnsol ! non-solar heat flux to the ocean [W/m^2]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*)
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pSST ! bulk SST [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pQnsol ! non-solar heat flux to the ocean [W/m^2]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*)
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pSST ! bulk SST [K]
       !!---------------------------------------------------------------------
       INTEGER  :: ji, jj, jc
       REAL(wp) :: zQabs, zdlt, zfr, zalfa, zus
       !!---------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zQabs = pQnsol(ji,jj) ! first guess of heat flux absorbed within the viscous sublayer of thicknes delta,
          !                     !   => we DO not miss a lot assuming 0 solar flux absorbed in the tiny layer of thicknes zdlt...
@@ -147,12 +147,12 @@ CONTAINS
       !!     *pustar*     friction velocity u*                           [m/s]
       !!     *pSST*       bulk SST  (taken at depth gdept_1d(1))         [K]
       !!------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQsw     ! surface net solar radiation into the ocean [W/m^2]     => >= 0 !
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQnsol   ! surface net non-solar heat flux into the ocean [W/m^2] => normally < 0 !
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pustar   ! friction velocity [m/s]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pSST     ! bulk SST at depth gdept_1d(1) [K]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pQsw     ! surface net solar radiation into the ocean [W/m^2]     => >= 0 !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pQnsol   ! surface net non-solar heat flux into the ocean [W/m^2] => normally < 0 !
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pustar   ! friction velocity [m/s]
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in)  :: pSST     ! bulk SST at depth gdept_1d(1) [K]
       !!
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) :: pustk ! surface Stokes velocity [m/s]
+      REAL(wp), DIMENSION(A2D(0)), OPTIONAL, INTENT(in) :: pustk ! surface Stokes velocity [m/s]
       !
       INTEGER :: ji, jj, jc
       !
@@ -173,7 +173,7 @@ CONTAINS
       l_pustk_known = .FALSE.
       IF( PRESENT(pustk) ) l_pustk_known = .TRUE.
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
 
          zHwl = Hz_wl(ji,jj) ! first guess for warm-layer depth (and unique..., less advanced than COARE3p6 !)
          ! it is = rd0 (3m) in default Zeng & Beljaars case...
diff --git a/src/OCE/SBC/sbcclo.F90 b/src/OCE/SBC/sbcclo.F90
index ba956f5e..1f48db25 100644
--- a/src/OCE/SBC/sbcclo.F90
+++ b/src/OCE/SBC/sbcclo.F90
@@ -44,6 +44,8 @@ MODULE sbcclo
    !
    INTEGER, SAVE, ALLOCATABLE, DIMENSION(:)  :: mcsgrpg, mcsgrpr, mcsgrpe !: closed sea group for glo, rnf and emp
    !
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    CONTAINS
    !
    !!----------------------------------------------------------------------
@@ -120,8 +122,8 @@ MODULE sbcclo
       CALL iom_put('qclosea',zqcs)
       !
       ! 3. update emp and qns
-      emp(:,:) = emp(:,:) + zwcs(:,:)
-      qns(:,:) = qns(:,:) + zqcs(:,:)
+      emp(A2D(0)) = emp(A2D(0)) + zwcs(A2D(0))
+      qns(:,:)    = qns(:,:)    + zqcs(A2D(0))
       !
    END SUBROUTINE sbc_clo
    !
@@ -289,7 +291,7 @@ MODULE sbcclo
          !! 1. Work out net freshwater over the closed sea from EMP - RNF.
          !!    Work out net heat associated with the correction (needed for conservation)
          !!    (PM: should we consider used delayed glob sum ?)
-         zcsfw  = glob_sum( 'closea', e1e2t(:,:) * ( emp(:,:)-rnf(:,:) ) * imsk_src(:,:) )
+         zcsfw  = glob_sum( 'closea', e1e2t(A2D(0)) * ( emp(A2D(0))-rnf(A2D(0)) ) * imsk_src(A2D(0)) )
          !
          !! 2. Deal with runoff special case (net evaporation spread globally)
          !!    and compute trg mask
diff --git a/src/OCE/SBC/sbccpl.F90 b/src/OCE/SBC/sbccpl.F90
index eddf626a..4daed864 100644
--- a/src/OCE/SBC/sbccpl.F90
+++ b/src/OCE/SBC/sbccpl.F90
@@ -65,18 +65,19 @@ MODULE sbccpl
    PUBLIC   sbc_cpl_ice_flx   ! routine called by icestp.F90
    PUBLIC   sbc_cpl_alloc     ! routine called in sbcice_cice.F90
 
+   !! received fields are only in the interior (without halos)
    INTEGER, PARAMETER ::   jpr_otx1   =  1   ! 3 atmosphere-ocean stress components on grid 1
    INTEGER, PARAMETER ::   jpr_oty1   =  2   !
    INTEGER, PARAMETER ::   jpr_otz1   =  3   !
-   INTEGER, PARAMETER ::   jpr_otx2   =  4   ! 3 atmosphere-ocean stress components on grid 2
-   INTEGER, PARAMETER ::   jpr_oty2   =  5   !
-   INTEGER, PARAMETER ::   jpr_otz2   =  6   !
+!!$   INTEGER, PARAMETER ::   jpr_otx2   =  4   ! 3 atmosphere-ocean stress components on grid 2
+!!$   INTEGER, PARAMETER ::   jpr_oty2   =  5   !
+!!$   INTEGER, PARAMETER ::   jpr_otz2   =  6   !
    INTEGER, PARAMETER ::   jpr_itx1   =  7   ! 3 atmosphere-ice   stress components on grid 1
    INTEGER, PARAMETER ::   jpr_ity1   =  8   !
    INTEGER, PARAMETER ::   jpr_itz1   =  9   !
-   INTEGER, PARAMETER ::   jpr_itx2   = 10   ! 3 atmosphere-ice   stress components on grid 2
-   INTEGER, PARAMETER ::   jpr_ity2   = 11   !
-   INTEGER, PARAMETER ::   jpr_itz2   = 12   !
+!!$   INTEGER, PARAMETER ::   jpr_itx2   = 10   ! 3 atmosphere-ice   stress components on grid 2
+!!$   INTEGER, PARAMETER ::   jpr_ity2   = 11   !
+!!$   INTEGER, PARAMETER ::   jpr_itz2   = 12   !
    INTEGER, PARAMETER ::   jpr_qsroce = 13   ! Qsr above the ocean
    INTEGER, PARAMETER ::   jpr_qsrice = 14   ! Qsr above the ice
    INTEGER, PARAMETER ::   jpr_qsrmix = 15
@@ -128,10 +129,11 @@ MODULE sbccpl
    INTEGER, PARAMETER ::   jpr_isf    = 60
    INTEGER, PARAMETER ::   jpr_icb    = 61
    INTEGER, PARAMETER ::   jpr_ts_ice = 62   ! Sea ice surface temp
-   !!INTEGER, PARAMETER ::   jpr_qtrice = 63   ! Transmitted solar thru sea-ice
-
-   INTEGER, PARAMETER ::   jprcv      = 62   ! total number of fields received
+   INTEGER, PARAMETER ::   jpr_qtrice = 63   ! Transmitted solar thru sea-ice
 
+   INTEGER, PARAMETER ::   jprcv      = 63   ! total number of fields received
+   
+   !! sent fields are only in the interior (without halos)
    INTEGER, PARAMETER ::   jps_fice   =  1   ! ice fraction sent to the atmosphere
    INTEGER, PARAMETER ::   jps_toce   =  2   ! ocean temperature
    INTEGER, PARAMETER ::   jps_tice   =  3   ! ice   temperature
@@ -194,7 +196,7 @@ MODULE sbccpl
       &             sn_snd_thick1, sn_snd_cond, sn_snd_mpnd , sn_snd_sstfrz, sn_snd_ttilyr
    !                                   ! Received from the atmosphere
    TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr,  &
-      &             sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf, sn_rcv_ts_ice
+      &             sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf, sn_rcv_ts_ice, sn_rcv_qtrice
    TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf
    !                                   ! Send to waves
    TYPE(FLD_C) ::   sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev
@@ -202,7 +204,6 @@ MODULE sbccpl
    TYPE(FLD_C) ::   sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, &
       &             sn_rcv_wstrf, sn_rcv_wdrag, sn_rcv_charn, sn_rcv_taw, sn_rcv_bhd, sn_rcv_tusd, sn_rcv_tvsd
    !                                   ! Other namelist parameters
-!!   TYPE(FLD_C) ::   sn_rcv_qtrice
    INTEGER     ::   nn_cplmodel           ! Maximum number of models to/from which NEMO is potentialy sending/receiving data
    LOGICAL     ::   ln_usecplmask         !  use a coupling mask file to merge data received from several models
                                           !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel)
@@ -239,12 +240,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       ierr(:) = 0
       !
-      ALLOCATE( alb_oce_mix(jpi,jpj), nrcvinfo(jprcv),  STAT=ierr(1) )
+      ALLOCATE( alb_oce_mix(A2D(0)), nrcvinfo(jprcv),  STAT=ierr(1) )
 
 #if ! defined key_si3 && ! defined key_cice
       ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init)
 #endif
-      ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) )
+      ALLOCATE( xcplmask(A2D(0),0:nn_cplmodel) , STAT=ierr(3) )
       !
       IF( .NOT. ln_apr_dyn ) ALLOCATE( ssh_ib(jpi,jpj), ssh_ibb(jpi,jpj), apr(jpi, jpj), STAT=ierr(4) )
 
@@ -271,7 +272,7 @@ CONTAINS
       !
       INTEGER ::   jn          ! dummy loop index
       INTEGER ::   ios, inum   ! Local integer
-      REAL(wp), DIMENSION(jpi,jpj) ::   zacs, zaos
+      REAL(wp), DIMENSION(A2D(0)) ::   zacs, zaos
       !!
       NAMELIST/namsbc_cpl/  nn_cplmodel  , ln_usecplmask, nn_cats_cpl , ln_scale_ice_flux,             &
          &                  sn_snd_temp  , sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2   ,  &
@@ -281,7 +282,7 @@ CONTAINS
          &                  sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum  , sn_rcv_wstrf ,  &
          &                  sn_rcv_charn , sn_rcv_taw   , sn_rcv_bhd  , sn_rcv_tusd  , sn_rcv_tvsd,    &
          &                  sn_rcv_wdrag , sn_rcv_qns   , sn_rcv_emp  , sn_rcv_rnf   , sn_rcv_cal  ,   &
-         &                  sn_rcv_iceflx, sn_rcv_co2   , sn_rcv_icb  , sn_rcv_isf   , sn_rcv_ts_ice,  & !!, sn_rcv_qtrice
+         &                  sn_rcv_iceflx, sn_rcv_co2   , sn_rcv_icb  , sn_rcv_isf   , sn_rcv_ts_ice, sn_rcv_qtrice, &
          &                  sn_rcv_mslp
 
       !!---------------------------------------------------------------------
@@ -313,7 +314,6 @@ CONTAINS
          WRITE(numout,*)'      surface stress                  = ', TRIM(sn_rcv_tau%cldes   ), ' (', TRIM(sn_rcv_tau%clcat   ), ')'
          WRITE(numout,*)'                     - referential    = ', sn_rcv_tau%clvref
          WRITE(numout,*)'                     - orientation    = ', sn_rcv_tau%clvor
-         WRITE(numout,*)'                     - mesh           = ', sn_rcv_tau%clvgrd
          WRITE(numout,*)'      non-solar heat flux sensitivity = ', TRIM(sn_rcv_dqnsdt%cldes), ' (', TRIM(sn_rcv_dqnsdt%clcat), ')'
          WRITE(numout,*)'      solar heat flux                 = ', TRIM(sn_rcv_qsr%cldes   ), ' (', TRIM(sn_rcv_qsr%clcat   ), ')'
          WRITE(numout,*)'      non-solar heat flux             = ', TRIM(sn_rcv_qns%cldes   ), ' (', TRIM(sn_rcv_qns%clcat   ), ')'
@@ -323,7 +323,7 @@ CONTAINS
          WRITE(numout,*)'      iceberg                         = ', TRIM(sn_rcv_icb%cldes   ), ' (', TRIM(sn_rcv_icb%clcat   ), ')'
          WRITE(numout,*)'      ice shelf                       = ', TRIM(sn_rcv_isf%cldes   ), ' (', TRIM(sn_rcv_isf%clcat   ), ')'
          WRITE(numout,*)'      sea ice heat fluxes             = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')'
-!!       WRITE(numout,*)'      transmitted solar thru sea-ice  = ', TRIM(sn_rcv_qtrice%cldes), ' (', TRIM(sn_rcv_qtrice%clcat), ')'
+         WRITE(numout,*)'      transmitted solar thru sea-ice  = ', TRIM(sn_rcv_qtrice%cldes), ' (', TRIM(sn_rcv_qtrice%clcat), ')'
          WRITE(numout,*)'      atm co2                         = ', TRIM(sn_rcv_co2%cldes   ), ' (', TRIM(sn_rcv_co2%clcat   ), ')'
          WRITE(numout,*)'      Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')'
          WRITE(numout,*)'      surface waves:'
@@ -358,7 +358,7 @@ CONTAINS
          WRITE(numout,*)'                      - mesh          = ', sn_snd_crtw%clvgrd
       ENDIF
       IF( lwp .AND. ln_wave) THEN                        ! control print
-      WRITE(numout,*)'      surface waves:'
+         WRITE(numout,*)'      surface waves:'
          WRITE(numout,*)'      Significant wave heigth         = ', TRIM(sn_rcv_hsig%cldes  ), ' (', TRIM(sn_rcv_hsig%clcat  ), ')'
          WRITE(numout,*)'      Wave to oce energy flux         = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')'
          WRITE(numout,*)'      Surface Stokes drift grid u     = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')'
@@ -368,8 +368,8 @@ CONTAINS
          WRITE(numout,*)'      Stress frac adsorbed by waves   = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')'
          WRITE(numout,*)'      Neutral surf drag coefficient   = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')'
          WRITE(numout,*)'      Charnock coefficient            = ', TRIM(sn_rcv_charn%cldes ), ' (', TRIM(sn_rcv_charn%clcat ), ')'
-         WRITE(numout,*)' Transport associated to Stokes drift grid u = ', TRIM(sn_rcv_tusd%cldes ), ' (', TRIM(sn_rcv_tusd%clcat ), ')'
-         WRITE(numout,*)' Transport associated to Stokes drift grid v = ', TRIM(sn_rcv_tvsd%cldes ), ' (', TRIM(sn_rcv_tvsd%clcat ), ')'
+         WRITE(numout,*)' Transport associated to Stokes drift u = ', TRIM(sn_rcv_tusd%cldes ), ' (', TRIM(sn_rcv_tusd%clcat ), ')'
+         WRITE(numout,*)' Transport associated to Stokes drift v = ', TRIM(sn_rcv_tvsd%cldes ), ' (', TRIM(sn_rcv_tvsd%clcat ), ')'
          WRITE(numout,*)'      Bernouilli pressure head        = ', TRIM(sn_rcv_bhd%cldes   ), ' (', TRIM(sn_rcv_bhd%clcat  ), ')'
          WRITE(numout,*)'Wave to ocean momentum flux and Net wave-supported stress = ', TRIM(sn_rcv_taw%cldes ), ' (', TRIM(sn_rcv_taw%clcat ), ')'
          WRITE(numout,*)'      Surface current to waves        = ', TRIM(sn_snd_crtw%cldes  ), ' (', TRIM(sn_snd_crtw%clcat  ), ')'
@@ -390,6 +390,7 @@ CONTAINS
       !                 define the north fold type of lbc                  (srcv(:)%nsgn)
 
       ! default definitions of srcv
+      ALLOCATE( srcv(jprcv) )
       srcv(:)%laction = .FALSE.   ;   srcv(:)%clgrid = 'T'   ;   srcv(:)%nsgn = 1.   ;   srcv(:)%nct = 1
 
       !                                                      ! ------------------------- !
@@ -399,87 +400,26 @@ CONTAINS
       srcv(jpr_otx1)%clname = 'O_OTaux1'      ! 1st ocean component on grid ONE (T or U)
       srcv(jpr_oty1)%clname = 'O_OTauy1'      ! 2nd   -      -         -     -
       srcv(jpr_otz1)%clname = 'O_OTauz1'      ! 3rd   -      -         -     -
-      srcv(jpr_otx2)%clname = 'O_OTaux2'      ! 1st ocean component on grid TWO (V)
-      srcv(jpr_oty2)%clname = 'O_OTauy2'      ! 2nd   -      -         -     -
-      srcv(jpr_otz2)%clname = 'O_OTauz2'      ! 3rd   -      -         -     -
       !
       srcv(jpr_itx1)%clname = 'O_ITaux1'      ! 1st  ice  component on grid ONE (T, F, I or U)
       srcv(jpr_ity1)%clname = 'O_ITauy1'      ! 2nd   -      -         -     -
       srcv(jpr_itz1)%clname = 'O_ITauz1'      ! 3rd   -      -         -     -
-      srcv(jpr_itx2)%clname = 'O_ITaux2'      ! 1st  ice  component on grid TWO (V)
-      srcv(jpr_ity2)%clname = 'O_ITauy2'      ! 2nd   -      -         -     -
-      srcv(jpr_itz2)%clname = 'O_ITauz2'      ! 3rd   -      -         -     -
       !
       ! Vectors: change of sign at north fold ONLY if on the local grid
       IF(       TRIM( sn_rcv_tau%cldes ) == 'oce only' .OR. TRIM( sn_rcv_tau%cldes ) == 'oce and ice'  &
            .OR. TRIM( sn_rcv_tau%cldes ) == 'mixed oce-ice' ) THEN ! avoid working with the atmospheric fields if they are not coupled
       !
-      IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' )   srcv(jpr_otx1:jpr_itz2)%nsgn = -1.
-
-      !                                                           ! Set grid and action
-      SELECT CASE( TRIM( sn_rcv_tau%clvgrd ) )      !  'T', 'U,V', 'U,V,I', 'U,V,F', 'T,I', 'T,F', or 'T,U,V'
-      CASE( 'T' )
-         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
-         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
-      CASE( 'U,V' )
-         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
-         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'U'        ! ice components given at U-point
-         srcv(jpr_itx2:jpr_itz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_otx1:jpr_itz2)%laction = .TRUE.     ! receive oce and ice components on both grid 1 & 2
-      CASE( 'U,V,T' )
-         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
-         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'T'        ! ice components given at T-point
-         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
-      CASE( 'U,V,I' )
-         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
-         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'I'        ! ice components given at I-point
-         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
-      CASE( 'U,V,F' )
-         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
-         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point
-         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
-      CASE( 'T,I' )
-         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'I'        ! ice components given at I-point
-         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
-      CASE( 'T,F' )
-         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point
-         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
-         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
-      CASE( 'T,U,V' )
-         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'T'        ! oce components given at T-point
-         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'U'        ! ice components given at U-point
-         srcv(jpr_itx2:jpr_itz2)%clgrid  = 'V'        !           and           V-point
-         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1 only
-         srcv(jpr_itx1:jpr_itz2)%laction = .TRUE.     ! receive ice components on grid 1 & 2
-      CASE default
-         CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_tau%clvgrd' )
-      END SELECT
+      IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' )   srcv(jpr_otx1:jpr_itz1)%nsgn = -1.
+
+      !                                                            ! Set grid and action
+      srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
+      srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
       !
       IF( TRIM( sn_rcv_tau%clvref ) == 'spherical' )   &           ! spherical: 3rd component not received
-         &     srcv( (/jpr_otz1, jpr_otz2, jpr_itz1, jpr_itz2/) )%laction = .FALSE.
-      !
-      IF( TRIM( sn_rcv_tau%clvor  ) == 'local grid' ) THEN        ! already on local grid -> no need of the second grid
-            srcv(jpr_otx2:jpr_otz2)%laction = .FALSE.
-            srcv(jpr_itx2:jpr_itz2)%laction = .FALSE.
-            srcv(jpr_oty1)%clgrid = srcv(jpr_oty2)%clgrid   ! not needed but cleaner...
-            srcv(jpr_ity1)%clgrid = srcv(jpr_ity2)%clgrid   ! not needed but cleaner...
-      ENDIF
+         &     srcv( (/jpr_otz1, jpr_itz1/) )%laction = .FALSE.
       !
-      IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN        ! 'oce and ice' case ocean stress on ocean mesh used
-         srcv(jpr_itx1:jpr_itz2)%laction = .FALSE.    ! ice components not received
-         srcv(jpr_itx1)%clgrid = 'U'                  ! ocean stress used after its transformation
-         srcv(jpr_ity1)%clgrid = 'V'                  ! i.e. it is always at U- & V-points for i- & j-comp. resp.
+      IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN         ! 'oce and ice' case ocean stress on ocean mesh used
+         srcv(jpr_itx1:jpr_itz1)%laction = .FALSE.    ! ice components not received
       ENDIF
       ENDIF
 
@@ -612,18 +552,18 @@ CONTAINS
          ENDIF
          srcv(jpr_topm:jpr_botm)%laction = .TRUE.
       ENDIF
-!!      !                                                      ! --------------------------- !
-!!      !                                                      ! transmitted solar thru ice  !   
-!!      !                                                      ! --------------------------- !
-!!      srcv(jpr_qtrice)%clname = 'OQtr'
-!!      IF( TRIM(sn_rcv_qtrice%cldes) == 'coupled' ) THEN
-!!         IF ( TRIM( sn_rcv_qtrice%clcat ) == 'yes' ) THEN
-!!            srcv(jpr_qtrice)%nct = nn_cats_cpl
-!!         ELSE
-!!           CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qtrice%clcat should always be set to yes currently' )
-!!         ENDIF
-!!         srcv(jpr_qtrice)%laction = .TRUE.
-!!      ENDIF
+      !                                                      ! --------------------------- !
+      !                                                      ! transmitted solar thru ice  !   
+      !                                                      ! --------------------------- !
+      srcv(jpr_qtrice)%clname = 'OQtr'
+      IF( TRIM(sn_rcv_qtrice%cldes) == 'coupled' ) THEN
+         IF ( TRIM( sn_rcv_qtrice%clcat ) == 'yes' ) THEN
+            srcv(jpr_qtrice)%nct = nn_cats_cpl
+         ELSE
+           CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qtrice%clcat should always be set to yes currently' )
+         ENDIF
+         srcv(jpr_qtrice)%laction = .TRUE.
+      ENDIF
       !                                                      ! ------------------------- !
       !                                                      !    ice skin temperature   !
       !                                                      ! ------------------------- !
@@ -725,11 +665,10 @@ CONTAINS
          srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling
          srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling
          srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE.
-         srcv(jpr_otx1)%clgrid = 'U'        ! oce components given at U-point
-         srcv(jpr_oty1)%clgrid = 'V'        !           and           V-point
+         srcv(jpr_otx1)%clgrid = 'T'        ! oce components given at T-point
+         srcv(jpr_oty1)%clgrid = 'T'        
          ! Vectors: change of sign at north fold ONLY if on the local grid
          srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1.
-         sn_rcv_tau%clvgrd = 'U,V'
          sn_rcv_tau%clvor = 'local grid'
          sn_rcv_tau%clvref = 'spherical'
          sn_rcv_emp%cldes = 'oce only'
@@ -802,19 +741,19 @@ CONTAINS
       ! Allocate all parts of frcv used for received fields !
       ! =================================================== !
       DO jn = 1, jprcv
-         IF( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) )
+         IF( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(A2D(0),srcv(jn)%nct) )
       END DO
       ! Allocate taum part of frcv which is used even when not received as coupling field
-      IF( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) )
+      IF( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(A2D(0),srcv(jpr_taum)%nct) )
       ! Allocate w10m part of frcv which is used even when not received as coupling field
-      IF( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) )
+      IF( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(A2D(0),srcv(jpr_w10m)%nct) )
       ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field
-      IF( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) )
-      IF( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) )
+      IF( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(A2D(0),srcv(jpr_otx1)%nct) )
+      IF( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(A2D(0),srcv(jpr_oty1)%nct) )
       ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE.
       IF( k_ice /= 0 ) THEN
-         IF( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jpr_itx1)%nct) )
-         IF( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jpr_ity1)%nct) )
+         IF( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(A2D(0),srcv(jpr_itx1)%nct) )
+         IF( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(A2D(0),srcv(jpr_ity1)%nct) )
       ENDIF
 
       ! ================================ !
@@ -823,8 +762,9 @@ CONTAINS
       ! for each field: define the OASIS name                           (ssnd(:)%clname)
       !                 define send or not from the namelist parameters (ssnd(:)%laction)
       !                 define the north fold type of lbc               (ssnd(:)%nsgn)
-
+      
       ! default definitions of nsnd
+      ALLOCATE( ssnd(jpsnd) )
       ssnd(:)%laction = .FALSE.   ;   ssnd(:)%clgrid = 'T'   ;   ssnd(:)%nsgn = 1.  ; ssnd(:)%nct = 1
 
       !                                                      ! ------------------------- !
@@ -1113,15 +1053,14 @@ CONTAINS
       IF(ln_usecplmask) THEN
          xcplmask(:,:,:) = 0.
          CALL iom_open( 'cplmask', inum )
-         CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(1:jpi,1:jpj,1:nn_cplmodel),   &
-            &          kstart = (/ mig(1),mjg(1),1 /), kcount = (/ jpi,jpj,nn_cplmodel /) )
+         CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(:,:,1:nn_cplmodel),   &
+            &          kstart = (/ mig(Nis0,0),mjg(Njs0,0),1 /), kcount = (/ Ni_0,Nj_0,nn_cplmodel /) )
          CALL iom_close( inum )
       ELSE
          xcplmask(:,:,:) = 1.
       ENDIF
       xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 )
       !
-      !
    END SUBROUTINE sbc_cpl_init
 
 
@@ -1162,7 +1101,7 @@ CONTAINS
       !! ** Method  :   receive all fields from the atmosphere and transform
       !!              them into ocean surface boundary condition fields
       !!
-      !! ** Action  :   update  utau, vtau   ocean stress at U,V grid
+      !! ** Action  :   update  utau, vtau   ocean stress at T-point
       !!                        taum         wind stress module at T-point
       !!                        wndm         wind speed  module at T-point over free ocean or leads in presence of sea-ice
       !!                        qns          non solar heat fluxes including emp heat content    (ocean only case)
@@ -1186,7 +1125,8 @@ CONTAINS
       REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient
       REAL(wp) ::   zzx, zzy               ! temporary variables
       REAL(wp) ::   r1_grau                ! = 1.e0 / (grav * rho0)
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty, zmsk, zemp, zqns, zqsr, zcloud_fra
+      REAL(wp), DIMENSION(A2D(0)) ::   ztx, zty, zmsk, zemp
+      REAL(wp), DIMENSION(A2D(0)) ::   zqns, zqsr, zcloud_fra
       !!----------------------------------------------------------------------
       !
       IF( kt == nit000 ) THEN
@@ -1201,7 +1141,7 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0)
+      IF( ln_mixcpl )   zmsk (:,:) = 1. - xcplmask (:,:,0)
       !
       !                                                      ! ======================================================= !
       !                                                      ! Receive all the atmos. fields (including ice information)
@@ -1221,39 +1161,20 @@ CONTAINS
             IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN            ! 2 components on the sphere
                !                                                       ! (cartesian to spherical -> 3 to 2 components)
                !
-               CALL geo2oce( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), frcv(jpr_otz1)%z3(:,:,1),   &
-                  &          srcv(jpr_otx1)%clgrid, ztx, zty )
+               CALL geo2oce( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), frcv(jpr_otz1)%z3(:,:,1), 'T', ztx, zty )
                frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 1st grid
                frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 1st grid
                !
-               IF( srcv(jpr_otx2)%laction ) THEN
-                  CALL geo2oce( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), frcv(jpr_otz2)%z3(:,:,1),   &
-                     &          srcv(jpr_otx2)%clgrid, ztx, zty )
-                  frcv(jpr_otx2)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 2nd grid
-                  frcv(jpr_oty2)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 2nd grid
-               ENDIF
-               !
             ENDIF
             !
             IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid
                !                                                       ! (geographical to local grid -> rotate the components)
-               CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )
-               IF( srcv(jpr_otx2)%laction ) THEN
-                  CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )
-               ELSE
-                  CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty )
-               ENDIF
+               CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), 'T', 'en->i', ztx )
+               CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), 'T', 'en->j', zty )
                frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid
                frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid
             ENDIF
             !
-            IF( srcv(jpr_otx1)%clgrid == 'T' ) THEN
-               DO_2D( 0, 0, 0, 0 )                                        ! T ==> (U,V)
-                  frcv(jpr_otx1)%z3(ji,jj,1) = 0.5 * ( frcv(jpr_otx1)%z3(ji+1,jj  ,1) + frcv(jpr_otx1)%z3(ji,jj,1) )
-                  frcv(jpr_oty1)%z3(ji,jj,1) = 0.5 * ( frcv(jpr_oty1)%z3(ji  ,jj+1,1) + frcv(jpr_oty1)%z3(ji,jj,1) )
-               END_2D
-               CALL lbc_lnk( 'sbccpl', frcv(jpr_otx1)%z3(:,:,1), 'U',  -1.0_wp, frcv(jpr_oty1)%z3(:,:,1), 'V',  -1.0_wp )
-            ENDIF
             llnewtx = .TRUE.
          ELSE
             llnewtx = .FALSE.
@@ -1273,11 +1194,10 @@ CONTAINS
          ! => need to be done only when otx1 was changed
          IF( llnewtx ) THEN
             DO_2D( 0, 0, 0, 0 )
-               zzx = frcv(jpr_otx1)%z3(ji-1,jj  ,1) + frcv(jpr_otx1)%z3(ji,jj,1)
-               zzy = frcv(jpr_oty1)%z3(ji  ,jj-1,1) + frcv(jpr_oty1)%z3(ji,jj,1)
+               zzx = frcv(jpr_otx1)%z3(ji,jj,1)
+               zzy = frcv(jpr_oty1)%z3(ji,jj,1) 
                frcv(jpr_taum)%z3(ji,jj,1) = 0.5 * SQRT( zzx * zzx + zzy * zzy )
             END_2D
-            CALL lbc_lnk( 'sbccpl', frcv(jpr_taum)%z3(:,:,1), 'T', 1.0_wp )
             llnewtau = .TRUE.
          ELSE
             llnewtau = .FALSE.
@@ -1286,7 +1206,7 @@ CONTAINS
          llnewtau = nrcvinfo(jpr_taum) == OASIS_Rcv
          ! Stress module can be negative when received (interpolation problem)
          IF( llnewtau ) THEN
-            frcv(jpr_taum)%z3(:,:,1) = MAX( 0._wp, frcv(jpr_taum)%z3(:,:,1) )
+            frcv(jpr_taum)%z3(A2D(0),1) = MAX( 0._wp, frcv(jpr_taum)%z3(A2D(0),1) )
          ENDIF
       ENDIF
       !
@@ -1297,7 +1217,7 @@ CONTAINS
          ! => need to be done only when taumod was changed
          IF( llnewtau ) THEN
             zcoef = 1. / ( zrhoa * zcdrag )
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                frcv(jpr_w10m)%z3(ji,jj,1) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef )
             END_2D
          ENDIF
@@ -1305,7 +1225,7 @@ CONTAINS
 !!$      !                                                      ! ========================= !
 !!$      SELECT CASE( TRIM( sn_rcv_clouds%cldes ) )             !       cloud fraction      !
 !!$      !                                                      ! ========================= !
-!!$      cloud_fra(:,:) = frcv(jpr_clfra)*z3(:,:,1)
+!!$      cloud_fra(:,:) = frcv(jpr_clfra)*z3(A2D(0),1)
 !!$      END SELECT
 !!$
       zcloud_fra(:,:) = pp_cldf   ! should be real cloud fraction instead (as in the bulk) but needs to be read from atm.
@@ -1343,13 +1263,14 @@ CONTAINS
       !                                                      ! Mean Sea Level Pressure   !   (taum)
       !                                                      ! ========================= !
       IF( srcv(jpr_mslp)%laction ) THEN                    ! UKMO SHELF effect of atmospheric pressure on SSH
-          IF( kt /= nit000 )   ssh_ibb(:,:) = ssh_ib(:,:)    !* Swap of ssh_ib fields
+          IF( kt /= nit000 )   ssh_ibb(A2D(0)) = ssh_ib(A2D(0))    !* Swap of ssh_ib fields
 
           r1_grau = 1.e0 / (grav * rho0)               !* constant for optimization
-          ssh_ib(:,:) = - ( frcv(jpr_mslp)%z3(:,:,1) - rpref ) * r1_grau    ! equivalent ssh (inverse barometer)
-          apr   (:,:) =     frcv(jpr_mslp)%z3(:,:,1)                         !atmospheric pressure
+          ssh_ib(A2D(0)) = - ( frcv(jpr_mslp)%z3(:,:,1) - rpref ) * r1_grau    ! equivalent ssh (inverse barometer)
+          apr   (A2D(0)) =     frcv(jpr_mslp)%z3(:,:,1)                        !atmospheric pressure
 
-          IF( kt == nit000 ) ssh_ibb(:,:) = ssh_ib(:,:)  ! correct this later (read from restart if possible)
+          IF( kt == nit000 ) ssh_ibb(A2D(0)) = ssh_ib(A2D(0))  ! correct this later (read from restart if possible)
+          CALL lbc_lnk( 'sbccpl', ssh_ib, 'T', 1.0_wp, ssh_ibb, 'T', 1.0_wp )
       ENDIF
       !
       IF( ln_sdw ) THEN  ! Stokes Drift correction activated
@@ -1445,30 +1366,34 @@ CONTAINS
       !                                                      !        SST         !
       !                                                      ! ================== !
       IF( srcv(jpr_toce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
-         sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1)
-         IF( srcv(jpr_soce)%laction .AND. l_useCT ) THEN    ! make sure that sst_m is the potential temperature
-            sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) )
+         IF( srcv(jpr_soce)%laction .AND. l_useCT ) THEN     ! make sure that sst_m is the potential temperature
+            CALL eos_pt_from_ct( frcv(jpr_toce)%z3(:,:,1), sss_m(:,:), sst_m(:,:), kbnd=0 )
+         ELSE
+            sst_m(A2D(0)) = frcv(jpr_toce)%z3(:,:,1)
          ENDIF
+         CALL iom_put( 'sst_m', sst_m )
       ENDIF
       !                                                      ! ================== !
       !                                                      !        SSH         !
       !                                                      ! ================== !
       IF( srcv(jpr_ssh )%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
-         ssh_m(:,:) = frcv(jpr_ssh )%z3(:,:,1)
+         ssh_m(A2D(0)) = frcv(jpr_ssh )%z3(:,:,1)
          CALL iom_put( 'ssh_m', ssh_m )
       ENDIF
       !                                                      ! ================== !
       !                                                      !  surface currents  !
       !                                                      ! ================== !
       IF( srcv(jpr_ocx1)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
-         ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1)
-         uu(:,:,1,Kbb) = ssu_m(:,:)                          ! will be used in icestp in the call of ice_forcing_tau
+         ssu_m(A2D(0)) = frcv(jpr_ocx1)%z3(:,:,1)
+         CALL lbc_lnk( 'sbccpl', ssu_m, 'U', -1.0_wp )
+         uu(:,:,1,Kbb) = ssu_m(:,:)                          ! will be used in icestp in the call of ice_update_tau
          uu(:,:,1,Kmm) = ssu_m(:,:)                          ! will be used in sbc_cpl_snd if atmosphere coupling
          CALL iom_put( 'ssu_m', ssu_m )
       ENDIF
       IF( srcv(jpr_ocy1)%laction ) THEN
-         ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1)
-         vv(:,:,1,Kbb) = ssv_m(:,:)                          ! will be used in icestp in the call of ice_forcing_tau
+         ssv_m(A2D(0)) = frcv(jpr_ocy1)%z3(:,:,1)
+         CALL lbc_lnk( 'sbccpl', ssv_m, 'V', -1.0_wp )
+         vv(:,:,1,Kbb) = ssv_m(:,:)                          ! will be used in icestp in the call of ice_update_tau
          vv(:,:,1,Kmm) = ssv_m(:,:)                          ! will be used in sbc_cpl_snd if atmosphere coupling
          CALL iom_put( 'ssv_m', ssv_m )
       ENDIF
@@ -1476,14 +1401,14 @@ CONTAINS
       !                                                      !  first T level thickness !
       !                                                      ! ======================== !
       IF( srcv(jpr_e3t1st )%laction ) THEN                   ! received by sas in case of opa <-> sas coupling
-         e3t_m(:,:) = frcv(jpr_e3t1st )%z3(:,:,1)
-         CALL iom_put( 'e3t_m', e3t_m(:,:) )
+         e3t_m(A2D(0)) = frcv(jpr_e3t1st )%z3(:,:,1)
+         CALL iom_put( 'e3t_m', e3t_m )
       ENDIF
       !                                                      ! ================================ !
       !                                                      !  fraction of solar net radiation !
       !                                                      ! ================================ !
       IF( srcv(jpr_fraqsr)%laction ) THEN                    ! received by sas in case of opa <-> sas coupling
-         frq_m(:,:) = frcv(jpr_fraqsr)%z3(:,:,1)
+         frq_m(A2D(0)) = frcv(jpr_fraqsr)%z3(:,:,1)
          CALL iom_put( 'frq_m', frq_m )
       ENDIF
 
@@ -1506,12 +1431,12 @@ CONTAINS
          ENDIF
          !
          !                                                        ! runoffs and calving (added in emp)
-         IF( srcv(jpr_rnf)%laction )     rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1)
+         IF( srcv(jpr_rnf)%laction )     rnf(A2D(0)) = frcv(jpr_rnf)%z3(:,:,1)
          IF( srcv(jpr_cal)%laction )     zemp(:,:) = zemp(:,:) - frcv(jpr_cal)%z3(:,:,1)
 
          IF( srcv(jpr_icb)%laction )  THEN
              fwficb(:,:) = frcv(jpr_icb)%z3(:,:,1)
-             rnf(:,:)    = rnf(:,:) + fwficb(:,:)   ! iceberg added to runfofs
+             rnf(A2D(0)) = rnf(A2D(0)) + fwficb(:,:)   ! iceberg added to runfofs
          ENDIF
          !
          ! ice shelf fwf
@@ -1519,8 +1444,8 @@ CONTAINS
             fwfisf_oasis(:,:) = frcv(jpr_isf)%z3(:,:,1)  ! fresh water flux from the isf to the ocean ( > 0 = melting )
          END IF
 
-         IF( ln_mixcpl ) THEN   ;   emp(:,:) = emp(:,:) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:)
-         ELSE                   ;   emp(:,:) =                              zemp(:,:)
+         IF( ln_mixcpl ) THEN   ;   emp(A2D(0)) = emp(A2D(0)) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:)
+         ELSE                   ;   emp(A2D(0)) =                                 zemp(:,:)
          ENDIF
          !
          !                                                       ! non solar heat flux over the ocean (qns)
@@ -1530,7 +1455,7 @@ CONTAINS
          ENDIF
          ! update qns over the free ocean with:
          IF( nn_components /= jp_iam_oce ) THEN
-            zqns(:,:) =  zqns(:,:) - zemp(:,:) * sst_m(:,:) * rcp         ! remove heat content due to mass flux (assumed to be at SST)
+            zqns(:,:) =  zqns(:,:) - zemp(:,:) * sst_m(A2D(0)) * rcp      ! remove heat content due to mass flux (assumed to be at SST)
             IF( srcv(jpr_snow  )%laction ) THEN
                zqns(:,:) = zqns(:,:) - frcv(jpr_snow)%z3(:,:,1) * rLfus   ! energy for melting solid precipitation over the free ocean
             ENDIF
@@ -1593,13 +1518,13 @@ CONTAINS
       !!
       !! ** Action  :   return ptau_i, ptau_j, the stress over the ice
       !!----------------------------------------------------------------------
-      REAL(wp), INTENT(inout), DIMENSION(:,:) ::   p_taui   ! i- & j-components of atmos-ice stress [N/m2]
-      REAL(wp), INTENT(inout), DIMENSION(:,:) ::   p_tauj   ! at I-point (B-grid) or U & V-point (C-grid)
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   p_taui   ! i- & j-components of atmos-ice stress [N/m2]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0)) ::   p_tauj   !                   at T-point
       !!
       INTEGER ::   ji, jj   ! dummy loop indices
       INTEGER ::   itx      ! index of taux over ice
-      REAL(wp)                     ::   zztmp1, zztmp2
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty
+      REAL(wp)                    ::   zztmp1, zztmp2
+      REAL(wp), DIMENSION(A2D(0)) ::   ztx, zty
       !!----------------------------------------------------------------------
       !
 #if defined key_si3 || defined key_cice
@@ -1616,28 +1541,16 @@ CONTAINS
             !
             IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN            ! 2 components on the sphere
                !                                                       ! (cartesian to spherical -> 3 to 2 components)
-               CALL geo2oce(  frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), frcv(jpr_itz1)%z3(:,:,1),   &
-                  &          srcv(jpr_itx1)%clgrid, ztx, zty )
+               CALL geo2oce(  frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), frcv(jpr_itz1)%z3(:,:,1), 'T', ztx, zty )
                frcv(jpr_itx1)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 1st grid
                frcv(jpr_ity1)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 1st grid
                !
-               IF( srcv(jpr_itx2)%laction ) THEN
-                  CALL geo2oce( frcv(jpr_itx2)%z3(:,:,1), frcv(jpr_ity2)%z3(:,:,1), frcv(jpr_itz2)%z3(:,:,1),   &
-                     &          srcv(jpr_itx2)%clgrid, ztx, zty )
-                  frcv(jpr_itx2)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 2nd grid
-                  frcv(jpr_ity2)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 2nd grid
-               ENDIF
-               !
             ENDIF
             !
             IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid
                !                                                       ! (geographical to local grid -> rotate the components)
-               CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), srcv(jpr_itx1)%clgrid, 'en->i', ztx )
-               IF( srcv(jpr_itx2)%laction ) THEN
-                  CALL rot_rep( frcv(jpr_itx2)%z3(:,:,1), frcv(jpr_ity2)%z3(:,:,1), srcv(jpr_itx2)%clgrid, 'en->j', zty )
-               ELSE
-                  CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), srcv(jpr_itx1)%clgrid, 'en->j', zty )
-               ENDIF
+               CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), 'T', 'en->i', ztx )
+               CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), 'T', 'en->j', zty )
                frcv(jpr_itx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid
                frcv(jpr_ity1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 1st grid
             ENDIF
@@ -1651,29 +1564,8 @@ CONTAINS
          !                                                      ! ======================= !
          !                                                      !     put on ice grid     !
          !                                                      ! ======================= !
-         !
-         !                                                  j+1   j     -----V---F
-         ! ice stress on ice velocity point                              !       |
-         ! (C-grid ==>(U,V))                                      j      |   T   U
-         !                                                               |       |
-         !                                                   j    j-1   -I-------|
-         !                                               (for I)         |       |
-         !                                                              i-1  i   i
-         !                                                               i      i+1 (for I)
-         SELECT CASE ( srcv(jpr_itx1)%clgrid )
-         CASE( 'U' )
-            p_taui(:,:) = frcv(jpr_itx1)%z3(:,:,1)                   ! (U,V) ==> (U,V)
-            p_tauj(:,:) = frcv(jpr_ity1)%z3(:,:,1)
-         CASE( 'T' )
-            DO_2D( 0, 0, 0, 0 )                    ! T ==> (U,V)
-               ! take care of the land-sea mask to avoid "pollution" of coastal stress. p[uv]taui used in frazil and  rheology
-               zztmp1 = 0.5_wp * ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1),tmask(ji+1,jj  ,1) )
-               zztmp2 = 0.5_wp * ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1),tmask(ji  ,jj+1,1) )
-               p_taui(ji,jj) = zztmp1 * ( frcv(jpr_itx1)%z3(ji+1,jj  ,1) + frcv(jpr_itx1)%z3(ji,jj,1) )
-               p_tauj(ji,jj) = zztmp2 * ( frcv(jpr_ity1)%z3(ji  ,jj+1,1) + frcv(jpr_ity1)%z3(ji,jj,1) )
-            END_2D
-            CALL lbc_lnk( 'sbccpl', p_taui, 'U',  -1., p_tauj, 'V',  -1. )
-         END SELECT
+         p_taui(:,:) = frcv(jpr_itx1)%z3(:,:,1)
+         p_tauj(:,:) = frcv(jpr_ity1)%z3(:,:,1)
 
       ENDIF
       !
@@ -1739,22 +1631,23 @@ CONTAINS
       !!                   dqns_ice          d(non-solar heat flux)/d(Temperature) over the ice
       !!                   sprecip           solid precipitation over the ocean
       !!----------------------------------------------------------------------
-      INTEGER,  INTENT(in)                                ::   kt         ! ocean model time step index (only for a_i_last_couple)
-      REAL(wp), INTENT(in)   , DIMENSION(:,:)             ::   picefr     ! ice fraction                [0 to 1]
-      !                                                   !!           ! optional arguments, used only in 'mixed oce-ice' case or for Met-Office coupling
-      REAL(wp), INTENT(in)   , DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo
-      REAL(wp), INTENT(in)   , DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius]
-      REAL(wp), INTENT(inout), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] => inout for Met-Office
-      REAL(wp), INTENT(in)   , DIMENSION(:,:,:), OPTIONAL ::   phs        ! snow depth                  [m]
-      REAL(wp), INTENT(in)   , DIMENSION(:,:,:), OPTIONAL ::   phi        ! ice thickness               [m]
+      INTEGER,  INTENT(in)                                     ::   kt         ! ocean model time step index (only for a_i_last_couple)
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0))               ::   picefr     ! ice fraction                [0 to 1]
+      !                                                        !!   optional arguments, used only in 'mixed oce-ice' case or for Met-Office coupling
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0),jpl), OPTIONAL ::   palbi      ! all skies ice albedo
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0)    ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius]
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0),jpl), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] => inout for Met-Office
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0),jpl), OPTIONAL ::   phs        ! snow depth                  [m]
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0),jpl), OPTIONAL ::   phi        ! ice thickness               [m]
       !
       INTEGER  ::   ji, jj, jl   ! dummy loop index
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip  , zevap_oce, zdevap_ice
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zevap_ice_total
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice, zevap_ice, zqtr_ice_top, ztsu
-      REAL(wp), DIMENSION(jpi,jpj)     ::   ztri
+      REAL(wp), DIMENSION(A2D(0))     ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw
+      REAL(wp), DIMENSION(A2D(0))     ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip  , zevap_oce, zdevap_ice
+      REAL(wp), DIMENSION(A2D(0))     ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice
+      REAL(wp), DIMENSION(A2D(0))     ::   zevap_ice_total
+      REAL(wp), DIMENSION(A2D(0))     ::   ztri
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice, zevap_ice, zqtr_ice_top
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   ztsu
       !!----------------------------------------------------------------------
       !
 #if defined key_si3 || defined key_cice
@@ -1768,7 +1661,7 @@ CONTAINS
       !
       IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0)
       ziceld(:,:) = 1._wp - picefr(:,:)
-      zcptn (:,:) = rcp * sst_m(:,:)
+      zcptn (:,:) = rcp * sst_m(A2D(0))
       !
       !                                                      ! ========================= !
       !                                                      !    freshwater budget      !   (emp_tot)
@@ -1780,9 +1673,9 @@ CONTAINS
       !                                                           ! sublimation - solid precipitation (cell average)   (emp_ice)
       SELECT CASE( TRIM( sn_rcv_emp%cldes ) )
       CASE( 'conservative' )   ! received fields: jpr_rain, jpr_snow, jpr_ievp, jpr_tevp
-         zsprecip(:,:) =   frcv(jpr_snow)%z3(:,:,1)                  ! May need to ensure positive here
-         ztprecip(:,:) =   frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here
-         zemp_tot(:,:) =   frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:)
+         zsprecip(:,:) = frcv(jpr_snow)%z3(:,:,1)                  ! May need to ensure positive here
+         ztprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here
+         zemp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:)
       CASE( 'oce and ice'   )   ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp
          zemp_tot(:,:) = ziceld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + picefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1)
          zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) * picefr(:,:)
@@ -1794,17 +1687,19 @@ CONTAINS
       END SELECT
 
       ! --- evaporation over ice (kg/m2/s) --- !
-      IF (ln_scale_ice_flux) THEN ! typically met-office requirements
-         IF (sn_rcv_emp%clcat == 'yes') THEN
-            WHERE( a_i(:,:,:) > 1.e-10 )  ; zevap_ice(:,:,:) = frcv(jpr_ievp)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:)
-            ELSEWHERE                     ; zevap_ice(:,:,:) = 0._wp
+      IF( ln_scale_ice_flux ) THEN ! typically met-office requirements
+         IF( sn_rcv_emp%clcat == 'yes' ) THEN
+            WHERE( a_i(A2D(0),:) > 1.e-10 ) ; zevap_ice(:,:,:) = frcv(jpr_ievp)%z3(:,:,:) * &
+               &                                                 a_i_last_couple(A2D(0),:) / a_i(A2D(0),:)
+            ELSEWHERE                       ; zevap_ice(:,:,:) = 0._wp
             END WHERE
-            WHERE( picefr(:,:) > 1.e-10 ) ; zevap_ice_total(:,:) = SUM( zevap_ice(:,:,:) * a_i(:,:,:), dim=3 ) / picefr(:,:)
-            ELSEWHERE                     ; zevap_ice_total(:,:) = 0._wp
+            WHERE( picefr(:,:) > 1.e-10 )   ; zevap_ice_total(:,:) = SUM( zevap_ice(:,:,:) * a_i(A2D(0),:), dim=3 ) / picefr(:,:)
+            ELSEWHERE                       ; zevap_ice_total(:,:) = 0._wp
             END WHERE
          ELSE
-            WHERE( picefr(:,:) > 1.e-10 ) ; zevap_ice(:,:,1) = frcv(jpr_ievp)%z3(:,:,1) * SUM( a_i_last_couple, dim=3 ) / picefr(:,:)
-            ELSEWHERE                     ; zevap_ice(:,:,1) = 0._wp
+            WHERE( picefr(:,:) > 1.e-10 )   ; zevap_ice(:,:,1) = frcv(jpr_ievp)%z3(:,:,1) * &
+               &                                                 SUM( a_i_last_couple(A2D(0),:), dim=3 ) / picefr(:,:)
+            ELSEWHERE                       ; zevap_ice(:,:,1) = 0._wp
             END WHERE
             zevap_ice_total(:,:) = zevap_ice(:,:,1)
             DO jl = 2, jpl
@@ -1812,9 +1707,9 @@ CONTAINS
             ENDDO
          ENDIF
       ELSE
-         IF (sn_rcv_emp%clcat == 'yes') THEN
+         IF( sn_rcv_emp%clcat == 'yes' ) THEN
             zevap_ice(:,:,1:jpl) = frcv(jpr_ievp)%z3(:,:,1:jpl)
-            WHERE( picefr(:,:) > 1.e-10 ) ; zevap_ice_total(:,:) = SUM( zevap_ice(:,:,:) * a_i(:,:,:), dim=3 ) / picefr(:,:)
+            WHERE( picefr(:,:) > 1.e-10 ) ; zevap_ice_total(:,:) = SUM( zevap_ice(:,:,:) * a_i(A2D(0),:), dim=3 ) / picefr(:,:)
             ELSEWHERE                     ; zevap_ice_total(:,:) = 0._wp
             END WHERE
          ELSE
@@ -1826,7 +1721,7 @@ CONTAINS
          ENDIF
       ENDIF
 
-      IF ( TRIM( sn_rcv_emp%cldes ) == 'conservative' ) THEN
+      IF( TRIM( sn_rcv_emp%cldes ) == 'conservative' ) THEN
          ! For conservative case zemp_ice has not been defined yet. Do it now.
          zemp_ice(:,:) = zevap_ice_total(:,:) * picefr(:,:) - frcv(jpr_snow)%z3(:,:,1) * picefr(:,:)
       ENDIF
@@ -1847,7 +1742,7 @@ CONTAINS
 
       ! --- Continental fluxes --- !
       IF( srcv(jpr_rnf)%laction ) THEN   ! runoffs (included in emp later on)
-         rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1)
+         rnf(A2D(0)) = frcv(jpr_rnf)%z3(:,:,1)
       ENDIF
       IF( srcv(jpr_cal)%laction ) THEN   ! calving (put in emp_tot and emp_oce)
          zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1)
@@ -1855,7 +1750,7 @@ CONTAINS
       ENDIF
       IF( srcv(jpr_icb)%laction ) THEN   ! iceberg added to runoffs
          fwficb(:,:) = frcv(jpr_icb)%z3(:,:,1)
-         rnf(:,:)    = rnf(:,:) + fwficb(:,:)
+         rnf(A2D(0)) = rnf(A2D(0)) + fwficb(:,:)
       ENDIF
       IF( srcv(jpr_isf)%laction ) THEN   ! iceshelf (fwfisf > 0 mean melting)
         fwfisf_oasis(:,:) = frcv(jpr_isf)%z3(:,:,1)
@@ -1913,29 +1808,29 @@ CONTAINS
 !!$      ENDIF
       !
       ! outputs
-      IF( srcv(jpr_cal)%laction )    CALL iom_put( 'calving_cea' , frcv(jpr_cal)%z3(:,:,1) * tmask(:,:,1)                )  ! calving
-      IF( srcv(jpr_icb)%laction )    CALL iom_put( 'iceberg_cea' , frcv(jpr_icb)%z3(:,:,1) * tmask(:,:,1)                )  ! icebergs
+      IF( srcv(jpr_cal)%laction )    CALL iom_put( 'calving_cea' , frcv(jpr_cal)%z3(:,:,1) * tmask(A2D(0),1)             )  ! calving
+      IF( srcv(jpr_icb)%laction )    CALL iom_put( 'iceberg_cea' , frcv(jpr_icb)%z3(:,:,1) * tmask(A2D(0),1)             )  ! icebergs
       IF( iom_use('snowpre') )       CALL iom_put( 'snowpre'     , sprecip(:,:)                                          )  ! Snow
       IF( iom_use('precip') )        CALL iom_put( 'precip'      , tprecip(:,:)                                          )  ! total  precipitation
       IF( iom_use('rain') )          CALL iom_put( 'rain'        , tprecip(:,:) - sprecip(:,:)                           )  ! liquid precipitation
       IF( iom_use('snow_ao_cea') )   CALL iom_put( 'snow_ao_cea' , sprecip(:,:) * ( 1._wp - zsnw(:,:) )                  )  ! Snow over ice-free ocean  (cell average)
       IF( iom_use('snow_ai_cea') )   CALL iom_put( 'snow_ai_cea' , sprecip(:,:) *           zsnw(:,:)                    )  ! Snow over sea-ice         (cell average)
       IF( iom_use('rain_ao_cea') )   CALL iom_put( 'rain_ao_cea' , ( tprecip(:,:) - sprecip(:,:) ) * ziceld(:,:)         )  ! liquid precipitation over ocean (cell average)
-      IF( iom_use('subl_ai_cea') )   CALL iom_put( 'subl_ai_cea' , zevap_ice_total(:,:) * picefr(:,:) * tmask(:,:,1)     )  ! Sublimation over sea-ice (cell average)
+      IF( iom_use('subl_ai_cea') )   CALL iom_put( 'subl_ai_cea' , zevap_ice_total(:,:) * picefr(:,:) * smask0(:,:)      )  ! Sublimation over sea-ice (cell average)
       IF( iom_use('evap_ao_cea') )   CALL iom_put( 'evap_ao_cea' , ( frcv(jpr_tevp)%z3(:,:,1)  &
-         &                                                         - zevap_ice_total(:,:) * picefr(:,:) ) * tmask(:,:,1) )  ! ice-free oce evap (cell average)
+         &                                                         - zevap_ice_total(:,:) * picefr(:,:) ) * smask0(:,:)  )  ! ice-free oce evap (cell average)
       ! note: runoff output is done in sbcrnf (which includes icebergs too) and iceshelf output is done in sbcisf
 !!      IF( srcv(jpr_rnf)%laction )   CALL iom_put( 'runoffs' , rnf(:,:) * tmask(:,:,1)                                 )  ! runoff
-!!      IF( srcv(jpr_isf)%laction )   CALL iom_put( 'iceshelf_cea', fwfisf(:,:) * tmask(:,:,1)                         )  ! iceshelf
+      IF( srcv(jpr_isf)%laction )    CALL iom_put( 'iceshelf_cea', frcv(jpr_isf)%z3(:,:,1) * smask0(:,:)                 )  ! iceshelf
       !
       !                                                      ! ========================= !
       SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !  ice topmelt and botmelt  !
       !                                                      ! ========================= !
-      CASE ('coupled')
-         IF (ln_scale_ice_flux) THEN
-            WHERE( a_i(:,:,:) > 1.e-10_wp )
-               qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:)
-               qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:)
+      CASE( 'coupled' )
+         IF( ln_scale_ice_flux ) THEN
+            WHERE( a_i(A2D(0),:) > 1.e-10_wp )
+               qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) * a_i_last_couple(A2D(0),:) / a_i(A2D(0),:)
+               qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) * a_i_last_couple(A2D(0),:) / a_i(A2D(0),:)
             ELSEWHERE
                qml_ice(:,:,:) = 0.0_wp
                qcn_ice(:,:,:) = 0.0_wp
@@ -1958,7 +1853,7 @@ CONTAINS
          ENDIF
          ! Calculate the total non solar heat flux. The ocean only non solar heat flux (zqns_oce) will be recalculated after this CASE
          ! statement to be consistent with other coupling methods even though .zqns_oce = frcv(jpr_qnsoce)%z3(:,:,1)
-         zqns_tot(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) + SUM( zqns_ice(:,:,:) * a_i(:,:,:), dim=3 )
+         zqns_tot(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) + SUM( zqns_ice(:,:,:) * a_i(A2D(0),:), dim=3 )
       CASE( 'conservative' )     ! the required fields are directly provided
          zqns_tot(:,:) = frcv(jpr_qnsmix)%z3(:,:,1)
          IF( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN
@@ -1972,7 +1867,7 @@ CONTAINS
          zqns_tot(:,:) =  ziceld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1)
          IF( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN
             DO jl=1,jpl
-               zqns_tot(:,:   ) = zqns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)
+               zqns_tot(:,:   ) = zqns_tot(:,:) + a_i(A2D(0),jl) * frcv(jpr_qnsice)%z3(:,:,jl)
                zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl)
             ENDDO
          ELSE
@@ -2001,21 +1896,22 @@ CONTAINS
       !
       ! --- calving (removed from qns_tot) --- !
       IF( srcv(jpr_cal)%laction )   zqns_tot(:,:) = zqns_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) * rLfus  ! remove latent heat of calving
-                                                                                                     ! we suppose it melts at 0deg, though it should be temp. of surrounding ocean
+                                                                                                        ! we suppose it melts at 0deg, though it should be temp. of surrounding ocean
       ! --- iceberg (removed from qns_tot) --- !
       IF( srcv(jpr_icb)%laction )   zqns_tot(:,:) = zqns_tot(:,:) - frcv(jpr_icb)%z3(:,:,1) * rLfus  ! remove latent heat of iceberg melting
 
       ! --- non solar flux over ocean --- !
       !         note: ziceld cannot be = 0 since we limit the ice concentration to amax
       zqns_oce = 0._wp
-      WHERE( ziceld /= 0._wp )   zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:)
+      WHERE( ziceld /= 0._wp )   zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i(A2D(0),:) * zqns_ice(:,:,:), dim=3 ) ) / ziceld(:,:)
 
       ! Heat content per unit mass of snow (J/kg)
-      WHERE( SUM( a_i, dim=3 ) > 1.e-10 )   ;   zcptsnw(:,:) = rcpi * SUM( (tn_ice - rt0) * a_i, dim=3 ) / SUM( a_i, dim=3 )
-      ELSEWHERE                             ;   zcptsnw(:,:) = zcptn(:,:)
+      WHERE( SUM( a_i(A2D(0),:), dim=3 ) > 1.e-10 ) ; zcptsnw(:,:) = rcpi * SUM( (tn_ice(:,:,:) - rt0) * a_i(A2D(0),:), dim=3 ) &
+         &                                                                / SUM( a_i(A2D(0),:), dim=3 )
+      ELSEWHERE                                     ; zcptsnw(:,:) = zcptn(:,:)
       ENDWHERE
       ! Heat content per unit mass of rain (J/kg)
-      zcptrain(:,:) = rcp * ( SUM( (tn_ice(:,:,:) - rt0) * a_i(:,:,:), dim=3 ) + sst_m(:,:) * ziceld(:,:) )
+      zcptrain(:,:) = rcp * ( SUM( (tn_ice(:,:,:) - rt0) * a_i(A2D(0),:), dim=3 ) + sst_m(A2D(0)) * ziceld(:,:) )
 
       ! --- enthalpy of snow precip over ice in J/m3 (to be used in 1D-thermo) --- !
       zqprec_ice(:,:) = rhos * ( zcptsnw(:,:) - rLfus )
@@ -2086,7 +1982,7 @@ CONTAINS
          &   CALL iom_put('hflx_rain_cea' , ( tprecip(:,:) - sprecip(:,:) ) * zcptrain(:,:) )
       IF (        iom_use('hflx_evap_cea') )    &                                                    ! heat flux from evap (cell average)
          &   CALL iom_put('hflx_evap_cea' , ( frcv(jpr_tevp)%z3(:,:,1) - zevap_ice_total(:,:) * picefr(:,:) )  &
-         &                                  * zcptn(:,:) * tmask(:,:,1) )
+         &                                  * zcptn(:,:) * smask0(:,:) )
       IF (        iom_use('hflx_prec_cea') )    &                                                    ! heat flux from all precip (cell avg)
          &   CALL iom_put('hflx_prec_cea' ,    sprecip(:,:) * ( zcptsnw(:,:) - rLfus )  &
          &                                 + ( tprecip(:,:) - sprecip(:,:) ) * zcptrain(:,:) )
@@ -2097,7 +1993,7 @@ CONTAINS
       IF (        iom_use('hflx_snow_ai_cea') ) &                                                    ! heat flux from snow (over ice)
          &   CALL iom_put('hflx_snow_ai_cea', sprecip(:,:) * ( zcptsnw(:,:) - rLfus ) *  zsnw(:,:) )
       IF(         iom_use('hflx_subl_cea') )    &                                                    ! heat flux from sublimation
-         &   CALL iom_put('hflx_subl_cea' ,   SUM( qevap_ice(:,:,:) * a_i(:,:,:), dim=3 ) * tmask(:,:,1) )
+         &   CALL iom_put('hflx_subl_cea' ,   SUM( qevap_ice(:,:,:) * a_i(A2D(0),:), dim=3 ) * smask0(:,:) )
       ! note: hflx for runoff and iceshelf are done in sbcrnf and sbcisf resp.
       !
       !                                                      ! ========================= !
@@ -2145,7 +2041,7 @@ CONTAINS
          zqsr_tot(:,:  ) =  ziceld(:,:) * frcv(jpr_qsroce)%z3(:,:,1)
          IF( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN
             DO jl = 1, jpl
-               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)
+               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(A2D(0),jl) * frcv(jpr_qsrice)%z3(:,:,jl)
                zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl)
             END DO
          ELSE
@@ -2162,14 +2058,14 @@ CONTAINS
          IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN
             DO jl = 1, jpl
                zqsr_ice(:,:,jl) = frcv(jpr_qsrmix)%z3(:,:,jl) * ( 1.- palbi(:,:,jl) )   &
-                  &            / (  1.- ( alb_oce_mix(:,:   ) * ziceld(:,:)       &
-                  &                     + palbi      (:,:,jl) * picefr(:,:) ) )
+                  &               / (  1.- ( alb_oce_mix(:,:   ) * ziceld(:,:)       &
+                  &                        + palbi      (:,:,jl) * picefr(:,:) ) )
             END DO
          ELSE
             DO jl = 1, jpl
                zqsr_ice(:,:,jl) = frcv(jpr_qsrmix)%z3(:,:, 1) * ( 1.- palbi(:,:,jl) )   &
-                  &            / (  1.- ( alb_oce_mix(:,:   ) * ziceld(:,:)       &
-                  &                     + palbi      (:,:,jl) * picefr(:,:) ) )
+                  &               / (  1.- ( alb_oce_mix(:,:   ) * ziceld(:,:)       &
+                  &                        + palbi      (:,:,jl) * picefr(:,:) ) )
             END DO
          ENDIF
       CASE( 'none'      )       ! Not available as for now: needs additional coding
@@ -2177,7 +2073,7 @@ CONTAINS
          CALL ctl_stop('STOP', 'sbccpl/sbc_cpl_ice_flx: some fields are not defined. Change sn_rcv_qsr value in namelist namsbc_cpl')
       END SELECT
       IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle
-         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) )
+         zqsr_tot(:,:) = sbc_dcy( zqsr_tot(:,:) )
          DO jl = 1, jpl
             zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) )
          END DO
@@ -2213,33 +2109,34 @@ CONTAINS
          !
       ELSEIF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN      !==  conduction flux as surface forcing  ==!
          !
-!!         SELECT CASE( TRIM( sn_rcv_qtrice%cldes ) )
-!!            !
-!!            !      ! ===> here we receive the qtr_ice_top array from the coupler
-!!         CASE ('coupled')
-!!            IF (ln_scale_ice_flux) THEN
-!!               WHERE( a_i(:,:,:) > 1.e-10_wp )
-!!                  zqtr_ice_top(:,:,:) = frcv(jpr_qtrice)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:)
-!!               ELSEWHERE
-!!                  zqtr_ice_top(:,:,:) = 0.0_wp
-!!               ENDWHERE
-!!            ELSE
-!!               zqtr_ice_top(:,:,:) = frcv(jpr_qtrice)%z3(:,:,:)
-!!            ENDIF
-!!           
-!!            ! Add retrieved transmitted solar radiation onto the ice and total solar radiation
-!!            zqsr_ice(:,:,:) = zqsr_ice(:,:,:) + zqtr_ice_top(:,:,:)
-!!            zqsr_tot(:,:)   = zqsr_tot(:,:) + SUM( zqtr_ice_top(:,:,:) * a_i(:,:,:), dim=3 )
-!!            
-!!            !      if we are not getting this data from the coupler then assume zero (fully opaque ice)
-!!         CASE ('none')
-         zqtr_ice_top(:,:,:) = 0._wp
-!!         END SELECT
+         !
+         SELECT CASE( TRIM( sn_rcv_qtrice%cldes ) )
+            !
+            !      ! ===> here we receive the qtr_ice_top array from the coupler
+         CASE ('coupled')
+            IF (ln_scale_ice_flux) THEN
+               WHERE( a_i(A2D(0),:) > 1.e-10_wp )
+                  zqtr_ice_top(:,:,:) = frcv(jpr_qtrice)%z3(:,:,:) * a_i_last_couple(A2D(0),:) / a_i(A2D(0),:)
+               ELSEWHERE
+                  zqtr_ice_top(:,:,:) = 0.0_wp
+               ENDWHERE
+            ELSE
+               zqtr_ice_top(:,:,:) = frcv(jpr_qtrice)%z3(:,:,:)
+            ENDIF
+           
+            ! Add retrieved transmitted solar radiation onto the ice and total solar radiation
+            zqsr_ice(:,:,:) = zqsr_ice(:,:,:) + zqtr_ice_top(:,:,:)
+            zqsr_tot(:,:)   = zqsr_tot(:,:) + SUM( zqtr_ice_top(:,:,:) * a_i(A2D(0),:), dim=3 )
+            
+            !      if we are not getting this data from the coupler then assume zero (fully opaque ice)
+         CASE ('none')
+            zqtr_ice_top(:,:,:) = 0._wp
+         END SELECT
             !
       ENDIF
 
       IF( ln_mixcpl ) THEN
-         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk
+         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(A2D(0),:), dim=3 )   ! total flux from blk
          qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) + zqsr_tot(:,:) * zmsk(:,:)
          DO jl = 1, jpl
             qsr_ice    (:,:,jl) = qsr_ice    (:,:,jl) * xcplmask(:,:,0) + zqsr_ice    (:,:,jl) * zmsk(:,:)
@@ -2254,7 +2151,7 @@ CONTAINS
       ! --- solar flux over ocean --- !
       !         note: ziceld cannot be = 0 since we limit the ice concentration to amax
       zqsr_oce = 0._wp
-      WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / ziceld(:,:)
+      WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i(A2D(0),:) * zqsr_ice(:,:,:), dim=3 ) ) / ziceld(:,:)
 
       IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:)
       ELSE                   ;   qsr_oce(:,:) = zqsr_oce(:,:)   ;   ENDIF
@@ -2299,25 +2196,27 @@ CONTAINS
       INTEGER ::   ji, jj, jl   ! dummy loop indices
       INTEGER ::   isec, info   ! local integer
       REAL(wp) ::   zumax, zvmax
-      REAL(wp), DIMENSION(jpi,jpj)     ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1
-      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   ztmp3, ztmp4
+      REAL(wp), DIMENSION(A2D(0))     ::   zat_i, zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1
+      REAL(wp), DIMENSION(A2D(0),1)   ::   ze3t_i
+      REAL(wp), DIMENSION(A2D(0),jpl) ::   ztmp3, ztmp4
       !!----------------------------------------------------------------------
       !
       isec = ( kt - nit000 ) * NINT( rn_Dt )        ! date of exchanges
       info = OASIS_idle
 
-      zfr_l(:,:) = 1.- fr_i(:,:)
+      zfr_l(:,:) = 1.- fr_i(A2D(0))
+      zat_i(:,:) = SUM( a_i(A2D(0),:), dim=3 )
       !                                                      ! ------------------------- !
       !                                                      !    Surface temperature    !   in Kelvin
       !                                                      ! ------------------------- !
       IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN
 
          IF( nn_components == jp_iam_oce ) THEN
-            ztmp1(:,:) = ts(:,:,1,jp_tem,Kmm)   ! send temperature as it is (potential or conservative) -> use of l_useCT on the received part
+            ztmp1(:,:) = ts(A2D(0),1,jp_tem,Kmm)   ! send temperature as it is (potential or conservative) -> use of l_useCT on the received part
          ELSE
             ! we must send the surface potential temperature
-            IF( l_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm) )
-            ELSE                   ;   ztmp1(:,:) = ts(:,:,1,jp_tem,Kmm)
+            IF( l_useCT )  THEN ; CALL eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm), ztmp1(:,:), kbnd=0 )
+            ELSE                ; ztmp1(:,:) = ts(A2D(0),1,jp_tem,Kmm)
             ENDIF
             !
             SELECT CASE( sn_snd_temp%cldes)
@@ -2327,8 +2226,8 @@ CONTAINS
                CASE( 'yes' )
                   ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl)
                CASE( 'no' )
-                  WHERE( SUM( a_i, dim=3 ) /= 0. )
-                     ztmp3(:,:,1) = SUM( tn_ice * a_i, dim=3 ) / SUM( a_i, dim=3 )
+                  WHERE( zat_i(:,:) /= 0. )
+                     ztmp3(:,:,1) = SUM( tn_ice(:,:,:) * a_i(A2D(0),:), dim=3 ) / zat_i(:,:)
                   ELSEWHERE
                      ztmp3(:,:,1) = rt0
                   END WHERE
@@ -2337,36 +2236,36 @@ CONTAINS
             CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)
                SELECT CASE( sn_snd_temp%clcat )
                CASE( 'yes' )
-                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
+                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl)
                CASE( 'no' )
                   ztmp3(:,:,:) = 0.0
                   DO jl=1,jpl
-                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl)
+                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(A2D(0),jl)
                   ENDDO
                CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )
                END SELECT
-            CASE( 'oce and weighted ice')    ;   ztmp1(:,:) =   ts(:,:,1,jp_tem,Kmm) + rt0
+            CASE( 'oce and weighted ice')    ;   ztmp1(:,:) =   ts(A2D(0),1,jp_tem,Kmm) + rt0
                SELECT CASE( sn_snd_temp%clcat )
                CASE( 'yes' )
-                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
+                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl)
                CASE( 'no' )
                   ztmp3(:,:,:) = 0.0
                   DO jl=1,jpl
-                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl)
+                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(A2D(0),jl)
                   ENDDO
                CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )
                END SELECT
             CASE( 'mixed oce-ice'        )
                ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)
                DO jl=1,jpl
-                  ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl)
+                  ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(A2D(0),jl)
                ENDDO
             CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' )
             END SELECT
          ENDIF
-         IF( ssnd(jps_toce)%laction )   CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
+         IF( ssnd(jps_toce)%laction )   CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info )
          IF( ssnd(jps_tice)%laction )   CALL cpl_snd( jps_tice, isec, ztmp3, info )
-         IF( ssnd(jps_tmix)%laction )   CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
+         IF( ssnd(jps_tmix)%laction )   CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !
       !                                                      ! ------------------------- !
@@ -2377,7 +2276,7 @@ CONTAINS
       IF( ssnd(jps_ttilyr)%laction) THEN
          SELECT CASE( sn_snd_ttilyr%cldes)
          CASE ('weighted ice')
-            ztmp3(:,:,1:jpl) = t1_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
+            ztmp3(:,:,1:jpl) = t1_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl)
          CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_ttilyr%cldes' )
          END SELECT
          IF( ssnd(jps_ttilyr)%laction )   CALL cpl_snd( jps_ttilyr, isec, ztmp3, info )
@@ -2393,8 +2292,8 @@ CONTAINS
              CASE( 'yes' )
                 ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl)
              CASE( 'no' )
-                WHERE( SUM( a_i, dim=3 ) /= 0. )
-                   ztmp1(:,:) = SUM( alb_ice (:,:,1:jpl) * a_i(:,:,1:jpl), dim=3 ) / SUM( a_i(:,:,1:jpl), dim=3 )
+                WHERE( zat_i(:,:) /= 0. )
+                   ztmp1(:,:) = SUM( alb_ice (:,:,1:jpl) * a_i(A2D(0),1:jpl), dim=3 ) / zat_i(:,:)
                 ELSEWHERE
                    ztmp1(:,:) = alb_oce_mix(:,:)
                 END WHERE
@@ -2403,10 +2302,10 @@ CONTAINS
           CASE( 'weighted ice' )   ;
              SELECT CASE( sn_snd_alb%clcat )
              CASE( 'yes' )
-                ztmp3(:,:,1:jpl) =  alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
+                ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl)
              CASE( 'no' )
-                WHERE( fr_i (:,:) > 0. )
-                   ztmp1(:,:) = SUM (  alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl), dim=3 )
+                WHERE( fr_i (A2D(0)) > 0. )
+                   ztmp1(:,:) = SUM ( alb_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl), dim=3 )
                 ELSEWHERE
                    ztmp1(:,:) = 0.
                 END WHERE
@@ -2419,16 +2318,16 @@ CONTAINS
             CASE( 'yes' )
                CALL cpl_snd( jps_albice, isec, ztmp3, info )      !-> MV this has never been checked in coupled mode
             CASE( 'no'  )
-               CALL cpl_snd( jps_albice, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
+               CALL cpl_snd( jps_albice, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info )
          END SELECT
       ENDIF
 
       IF( ssnd(jps_albmix)%laction ) THEN                         ! mixed ice-ocean
          ztmp1(:,:) = alb_oce_mix(:,:) * zfr_l(:,:)
          DO jl = 1, jpl
-            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl)
+            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(A2D(0),jl)
          END DO
-         CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !                                                      ! ------------------------- !
       !                                                      !  Ice fraction & Thickness !
@@ -2436,8 +2335,8 @@ CONTAINS
       ! Send ice fraction field to atmosphere
       IF( ssnd(jps_fice)%laction ) THEN
          SELECT CASE( sn_snd_thick%clcat )
-         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl)
-         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      )
+         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(A2D(0),1:jpl)
+         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(A2D(0)      )
          CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' )
          END SELECT
          CALL cpl_snd( jps_fice, isec, ztmp3, info )
@@ -2457,8 +2356,8 @@ CONTAINS
 
       IF( ssnd(jps_fice1)%laction ) THEN
          SELECT CASE( sn_snd_thick1%clcat )
-         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl)
-         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      )
+         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(A2D(0),1:jpl)
+         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(A2D(0)      )
          CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick1%clcat' )
          END SELECT
          CALL cpl_snd( jps_fice1, isec, ztmp3, info )
@@ -2466,7 +2365,7 @@ CONTAINS
 
       ! Send ice fraction field to OCE (sent by SAS in SAS-OCE coupling)
       IF( ssnd(jps_fice2)%laction ) THEN
-         ztmp3(:,:,1) = fr_i(:,:)
+         ztmp3(:,:,1) = fr_i(A2D(0))
          IF( ssnd(jps_fice2)%laction )   CALL cpl_snd( jps_fice2, isec, ztmp3, info )
       ENDIF
 
@@ -2477,25 +2376,25 @@ CONTAINS
          CASE( 'weighted ice and snow' )
             SELECT CASE( sn_snd_thick%clcat )
             CASE( 'yes' )
-               ztmp3(:,:,1:jpl) =  h_i(:,:,1:jpl) * a_i(:,:,1:jpl)
-               ztmp4(:,:,1:jpl) =  h_s(:,:,1:jpl) * a_i(:,:,1:jpl)
+               ztmp3(:,:,1:jpl) =  h_i(A2D(0),1:jpl) * a_i(A2D(0),1:jpl)
+               ztmp4(:,:,1:jpl) =  h_s(A2D(0),1:jpl) * a_i(A2D(0),1:jpl)
             CASE( 'no' )
                ztmp3(:,:,:) = 0.0   ;  ztmp4(:,:,:) = 0.0
                DO jl=1,jpl
-                  ztmp3(:,:,1) = ztmp3(:,:,1) + h_i(:,:,jl) * a_i(:,:,jl)
-                  ztmp4(:,:,1) = ztmp4(:,:,1) + h_s(:,:,jl) * a_i(:,:,jl)
+                  ztmp3(:,:,1) = ztmp3(:,:,1) + h_i(A2D(0),jl) * a_i(A2D(0),jl)
+                  ztmp4(:,:,1) = ztmp4(:,:,1) + h_s(A2D(0),jl) * a_i(A2D(0),jl)
                ENDDO
             CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' )
             END SELECT
          CASE( 'ice and snow'         )
             SELECT CASE( sn_snd_thick%clcat )
             CASE( 'yes' )
-               ztmp3(:,:,1:jpl) = h_i(:,:,1:jpl)
-               ztmp4(:,:,1:jpl) = h_s(:,:,1:jpl)
+               ztmp3(:,:,1:jpl) = h_i(A2D(0),1:jpl)
+               ztmp4(:,:,1:jpl) = h_s(A2D(0),1:jpl)
             CASE( 'no' )
                WHERE( SUM( a_i, dim=3 ) /= 0. )
-                  ztmp3(:,:,1) = SUM( h_i * a_i, dim=3 ) / SUM( a_i, dim=3 )
-                  ztmp4(:,:,1) = SUM( h_s * a_i, dim=3 ) / SUM( a_i, dim=3 )
+                  ztmp3(:,:,1) = SUM( h_i(A2D(0),:) * a_i(A2D(0),:), dim=3 ) / zat_i(:,:)
+                  ztmp4(:,:,1) = SUM( h_s(A2D(0),:) * a_i(A2D(0),:), dim=3 ) / zat_i(:,:)
                ELSEWHERE
                  ztmp3(:,:,1) = 0.
                  ztmp4(:,:,1) = 0.
@@ -2519,13 +2418,13 @@ CONTAINS
             SELECT CASE( sn_snd_mpnd%clcat )
             CASE( 'yes' )
                ztmp3(:,:,1:jpl) =  a_ip_eff(:,:,1:jpl)
-               ztmp4(:,:,1:jpl) =  h_ip(:,:,1:jpl)
+               ztmp4(:,:,1:jpl) =  h_ip(A2D(0),1:jpl)
             CASE( 'no' )
                ztmp3(:,:,:) = 0.0
                ztmp4(:,:,:) = 0.0
                DO jl=1,jpl
                  ztmp3(:,:,1) = ztmp3(:,:,1) + a_ip_frac(:,:,jpl)
-                 ztmp4(:,:,1) = ztmp4(:,:,1) + h_ip(:,:,jpl)
+                 ztmp4(:,:,1) = ztmp4(:,:,1) + h_ip(A2D(0),jpl)
                ENDDO
             CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_mpnd%clcat' )
             END SELECT
@@ -2544,11 +2443,11 @@ CONTAINS
          CASE( 'weighted ice' )
             SELECT CASE( sn_snd_cond%clcat )
             CASE( 'yes' )
-	       ztmp3(:,:,1:jpl) =  cnd_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
+	       ztmp3(:,:,1:jpl) =  cnd_ice(:,:,1:jpl) * a_i(A2D(0),1:jpl)
             CASE( 'no' )
                ztmp3(:,:,:) = 0.0
                DO jl=1,jpl
-                 ztmp3(:,:,1) = ztmp3(:,:,1) + cnd_ice(:,:,jl) * a_i(:,:,jl)
+                 ztmp3(:,:,1) = ztmp3(:,:,1) + cnd_ice(:,:,jl) * a_i(A2D(0),jl)
                ENDDO
             CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_cond%clcat' )
             END SELECT
@@ -2564,25 +2463,26 @@ CONTAINS
       !                                                      !  CO2 flux from PISCES     !
       !                                                      ! ------------------------- !
       IF( ssnd(jps_co2)%laction .AND. l_co2cpl )   THEN
-         ztmp1(:,:) = oce_co2(:,:) * 1000.  ! conversion in molC/m2/s
-         CALL cpl_snd( jps_co2, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ) , info )
+         ztmp1(:,:) = oce_co2(A2D(0)) * 1000.  ! conversion in molC/m2/s
+         CALL cpl_snd( jps_co2, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ) , info )
       ENDIF
       !
       !                                                      ! ------------------------- !
       IF( ssnd(jps_ocx1)%laction ) THEN                      !      Surface current      !
          !                                                   ! ------------------------- !
          !
-         !                                                  j+1   j     -----V---F
-         ! surface velocity always sent from T point                     !       |
-         !                                                        j      |   T   U
-         !                                                               |       |
-         !                                                   j    j-1   -I-------|
-         !                                               (for I)         |       |
-         !                                                              i-1  i   i
-         !                                                               i      i+1 (for I)
+         !                                                  j     -----V---F
+         ! surface velocity always sent from T point               !       |
+         !                                                  j      |   T   U
+         !                                                         |       |
+         !                                                  j-1   -I-------|
+         !                                                         |       |
+         !                                                        i-1  i   i
+         !!clem: make a new variable at T-point to replace uu and vv => uuT and vvT for instance
          IF( nn_components == jp_iam_oce ) THEN
-            zotx1(:,:) = uu(:,:,1,Kmm)
-            zoty1(:,:) = vv(:,:,1,Kmm)
+            zotx1(:,:) = uu(A2D(0),1,Kmm)
+            zoty1(:,:) = vv(A2D(0),1,Kmm)
+            !!clem : should be demi sum, no? Or uuT and vvT
          ELSE
             SELECT CASE( TRIM( sn_snd_crt%cldes ) )
             CASE( 'oce only'             )      ! C-grid ==> T
@@ -2597,7 +2497,7 @@ CONTAINS
                   zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  )     + u_ice(ji-1,jj    )     ) *  fr_i(ji,jj)
                   zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  )     + v_ice(ji  ,jj-1  )     ) *  fr_i(ji,jj)
                END_2D
-               CALL lbc_lnk( 'sbccpl', zitx1, 'T', -1.0_wp, zity1, 'T', -1.0_wp )
+!!$               CALL lbc_lnk( 'sbccpl', zitx1, 'T', -1.0_wp, zity1, 'T', -1.0_wp )
             CASE( 'mixed oce-ice'        )      ! Ocean and Ice on C-grid ==> T
                DO_2D( 0, 0, 0, 0 )
                   zotx1(ji,jj) = 0.5 * ( uu   (ji,jj,1,Kmm) + uu   (ji-1,jj  ,1,Kmm) ) * zfr_l(ji,jj)   &
@@ -2606,7 +2506,7 @@ CONTAINS
                      &         + 0.5 * ( v_ice(ji,jj  )     + v_ice(ji  ,jj-1  )     ) *  fr_i(ji,jj)
                END_2D
             END SELECT
-            CALL lbc_lnk( 'sbccpl', zotx1, ssnd(jps_ocx1)%clgrid, -1.0_wp,  zoty1, ssnd(jps_ocy1)%clgrid, -1.0_wp )
+!!$            CALL lbc_lnk( 'sbccpl', zotx1, ssnd(jps_ocx1)%clgrid, -1.0_wp,  zoty1, ssnd(jps_ocy1)%clgrid, -1.0_wp )
             !
          ENDIF
          !
@@ -2638,13 +2538,13 @@ CONTAINS
             ENDIF
          ENDIF
          !
-         IF( ssnd(jps_ocx1)%laction )   CALL cpl_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid
-         IF( ssnd(jps_ocy1)%laction )   CALL cpl_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid
-         IF( ssnd(jps_ocz1)%laction )   CALL cpl_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info )   ! ocean z current 1st grid
+         IF( ssnd(jps_ocx1)%laction )   CALL cpl_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/Ni_0,Nj_0,1/) ), info )   ! ocean x current 1st grid
+         IF( ssnd(jps_ocy1)%laction )   CALL cpl_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/Ni_0,Nj_0,1/) ), info )   ! ocean y current 1st grid
+         IF( ssnd(jps_ocz1)%laction )   CALL cpl_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/Ni_0,Nj_0,1/) ), info )   ! ocean z current 1st grid
          !
-         IF( ssnd(jps_ivx1)%laction )   CALL cpl_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info )   ! ice   x current 1st grid
-         IF( ssnd(jps_ivy1)%laction )   CALL cpl_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info )   ! ice   y current 1st grid
-         IF( ssnd(jps_ivz1)%laction )   CALL cpl_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info )   ! ice   z current 1st grid
+         IF( ssnd(jps_ivx1)%laction )   CALL cpl_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/Ni_0,Nj_0,1/) ), info )   ! ice   x current 1st grid
+         IF( ssnd(jps_ivy1)%laction )   CALL cpl_snd( jps_ivy1, isec, RESHAPE ( zity1, (/Ni_0,Nj_0,1/) ), info )   ! ice   y current 1st grid
+         IF( ssnd(jps_ivz1)%laction )   CALL cpl_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/Ni_0,Nj_0,1/) ), info )   ! ice   z current 1st grid
          !
       ENDIF
       !
@@ -2652,42 +2552,42 @@ CONTAINS
       !                                                      !  Surface current to waves !
       !                                                      ! ------------------------- !
       IF( ssnd(jps_ocxw)%laction .OR. ssnd(jps_ocyw)%laction ) THEN
-          !
-          !                                                  j+1  j     -----V---F
-          ! surface velocity always sent from T point                    !       |
-          !                                                       j      |   T   U
-          !                                                              |       |
-          !                                                   j   j-1   -I-------|
-          !                                               (for I)        |       |
-          !                                                             i-1  i   i
-          !                                                              i      i+1 (for I)
-          SELECT CASE( TRIM( sn_snd_crtw%cldes ) )
-          CASE( 'oce only'             )      ! C-grid ==> T
-             DO_2D( 0, 0, 0, 0 )
-                zotx1(ji,jj) = 0.5 * ( uu(ji,jj,1,Kmm) + uu(ji-1,jj  ,1,Kmm) )
-                zoty1(ji,jj) = 0.5 * ( vv(ji,jj,1,Kmm) + vv(ji , jj-1,1,Kmm) )
-             END_2D
-          CASE( 'weighted oce and ice' )      ! Ocean and Ice on C-grid ==> T
-             DO_2D( 0, 0, 0, 0 )
-                zotx1(ji,jj) = 0.5 * ( uu   (ji,jj,1,Kmm) + uu   (ji-1,jj  ,1,Kmm) ) * zfr_l(ji,jj)
-                zoty1(ji,jj) = 0.5 * ( vv   (ji,jj,1,Kmm) + vv   (ji  ,jj-1,1,Kmm) ) * zfr_l(ji,jj)
-                zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
-                zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
-             END_2D
-             CALL lbc_lnk( 'sbccpl', zitx1, 'T', -1.0_wp,  zity1, 'T', -1.0_wp )
-          CASE( 'mixed oce-ice'        )      ! Ocean and Ice on C-grid ==> T
-             DO_2D( 0, 0, 0, 0 )
-                zotx1(ji,jj) = 0.5 * ( uu   (ji,jj,1,Kmm) + uu   (ji-1,jj  ,1,Kmm) ) * zfr_l(ji,jj)   &
-                   &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
-                zoty1(ji,jj) = 0.5 * ( vv   (ji,jj,1,Kmm) + vv   (ji  ,jj-1,1,Kmm) ) * zfr_l(ji,jj)   &
-                   &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
-             END_2D
-          END SELECT
-         CALL lbc_lnk( 'sbccpl', zotx1, ssnd(jps_ocxw)%clgrid, -1.0_wp, zoty1, ssnd(jps_ocyw)%clgrid, -1.0_wp )
+         !
+         !                                                  j     -----V---F
+         ! surface velocity always sent from T point               !       |
+         !                                                  j      |   T   U
+         !                                                         |       |
+         !                                                  j-1   -I-------|
+         !                                                         |       |
+         !                                                        i-1  i   i
+         !!clem: make a new variable at T-point to replace uu and vv => uuT and vvT for instance
+         SELECT CASE( TRIM( sn_snd_crtw%cldes ) )
+         CASE( 'oce only'             )      ! C-grid ==> T
+            DO_2D( 0, 0, 0, 0 )
+               zotx1(ji,jj) = 0.5 * ( uu(ji,jj,1,Kmm) + uu(ji-1,jj  ,1,Kmm) )
+               zoty1(ji,jj) = 0.5 * ( vv(ji,jj,1,Kmm) + vv(ji , jj-1,1,Kmm) )
+            END_2D
+         CASE( 'weighted oce and ice' )      ! Ocean and Ice on C-grid ==> T
+            DO_2D( 0, 0, 0, 0 )
+               zotx1(ji,jj) = 0.5 * ( uu   (ji,jj,1,Kmm) + uu   (ji-1,jj  ,1,Kmm) ) * zfr_l(ji,jj)
+               zoty1(ji,jj) = 0.5 * ( vv   (ji,jj,1,Kmm) + vv   (ji  ,jj-1,1,Kmm) ) * zfr_l(ji,jj)
+               zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
+               zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
+            END_2D
+!!$            CALL lbc_lnk( 'sbccpl', zitx1, 'T', -1.0_wp,  zity1, 'T', -1.0_wp )
+         CASE( 'mixed oce-ice'        )      ! Ocean and Ice on C-grid ==> T
+            DO_2D( 0, 0, 0, 0 )
+               zotx1(ji,jj) = 0.5 * ( uu   (ji,jj,1,Kmm) + uu   (ji-1,jj  ,1,Kmm) ) * zfr_l(ji,jj)   &
+                  &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
+               zoty1(ji,jj) = 0.5 * ( vv   (ji,jj,1,Kmm) + vv   (ji  ,jj-1,1,Kmm) ) * zfr_l(ji,jj)   &
+                  &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
+            END_2D
+         END SELECT
+!!$         CALL lbc_lnk( 'sbccpl', zotx1, ssnd(jps_ocxw)%clgrid, -1.0_wp, zoty1, ssnd(jps_ocyw)%clgrid, -1.0_wp )
          !
          !
          IF( TRIM( sn_snd_crtw%clvor ) == 'eastward-northward' ) THEN             ! Rotation of the components
-         !                                                                        ! Ocean component
+            !                                                                        ! Ocean component
             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->e', ztmp1 )       ! 1st component
             CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->n', ztmp2 )       ! 2nd component
             zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components
@@ -2700,26 +2600,26 @@ CONTAINS
             ENDIF
          ENDIF
          !
-!         ! spherical coordinates to cartesian -> 2 components to 3 components
-!         IF( TRIM( sn_snd_crtw%clvref ) == 'cartesian' ) THEN
-!            ztmp1(:,:) = zotx1(:,:)                     ! ocean currents
-!            ztmp2(:,:) = zoty1(:,:)
-!            CALL oce2geo ( ztmp1, ztmp2, 'T', zotx1, zoty1, zotz1 )
-!            !
-!            IF( ssnd(jps_ivx1)%laction ) THEN           ! ice velocities
-!               ztmp1(:,:) = zitx1(:,:)
-!               ztmp1(:,:) = zity1(:,:)
-!               CALL oce2geo ( ztmp1, ztmp2, 'T', zitx1, zity1, zitz1 )
-!            ENDIF
-!         ENDIF
+         !         ! spherical coordinates to cartesian -> 2 components to 3 components
+         !         IF( TRIM( sn_snd_crtw%clvref ) == 'cartesian' ) THEN
+         !            ztmp1(:,:) = zotx1(:,:)                     ! ocean currents
+         !            ztmp2(:,:) = zoty1(:,:)
+         !            CALL oce2geo ( ztmp1, ztmp2, 'T', zotx1, zoty1, zotz1 )
+         !            !
+         !            IF( ssnd(jps_ivx1)%laction ) THEN           ! ice velocities
+         !               ztmp1(:,:) = zitx1(:,:)
+         !               ztmp1(:,:) = zity1(:,:)
+         !               CALL oce2geo ( ztmp1, ztmp2, 'T', zitx1, zity1, zitz1 )
+         !            ENDIF
+         !         ENDIF
          !
-         IF( ssnd(jps_ocxw)%laction )   CALL cpl_snd( jps_ocxw, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid
-         IF( ssnd(jps_ocyw)%laction )   CALL cpl_snd( jps_ocyw, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid
+         IF( ssnd(jps_ocxw)%laction )   CALL cpl_snd( jps_ocxw, isec, RESHAPE ( zotx1, (/Ni_0,Nj_0,1/) ), info )   ! ocean x current 1st grid
+         IF( ssnd(jps_ocyw)%laction )   CALL cpl_snd( jps_ocyw, isec, RESHAPE ( zoty1, (/Ni_0,Nj_0,1/) ), info )   ! ocean y current 1st grid
          !
       ENDIF
       !
       IF( ssnd(jps_ficet)%laction ) THEN
-         CALL cpl_snd( jps_ficet, isec, RESHAPE ( fr_i, (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_ficet, isec, RESHAPE ( fr_i(A2D(0)), (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !                                                      ! ------------------------- !
       !                                                      !   Water levels to waves   !
@@ -2727,14 +2627,14 @@ CONTAINS
       IF( ssnd(jps_wlev)%laction ) THEN
          IF( ln_apr_dyn ) THEN
             IF( kt /= nit000 ) THEN
-               ztmp1(:,:) = ssh(:,:,Kbb) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) )
+               ztmp1(:,:) = ssh(A2D(0),Kbb) - 0.5 * ( ssh_ib(A2D(0)) + ssh_ibb(A2D(0)) )
             ELSE
-               ztmp1(:,:) = ssh(:,:,Kbb)
+               ztmp1(:,:) = ssh(A2D(0),Kbb)
             ENDIF
          ELSE
-            ztmp1(:,:) = ssh(:,:,Kmm)
+            ztmp1(:,:) = ssh(A2D(0),Kmm)
          ENDIF
-         CALL cpl_snd( jps_wlev  , isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_wlev  , isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !
       !  Fields sent by OCE to SAS when doing OCE<->SAS coupling
@@ -2742,44 +2642,45 @@ CONTAINS
       IF( ssnd(jps_ssh )%laction )  THEN
          !                          ! removed inverse barometer ssh when Patm
          !                          forcing is used (for sea-ice dynamics)
-         IF( ln_apr_dyn ) THEN   ;   ztmp1(:,:) = ssh(:,:,Kbb) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) )
-         ELSE                    ;   ztmp1(:,:) = ssh(:,:,Kmm)
+         IF( ln_apr_dyn ) THEN   ;   ztmp1(:,:) = ssh(A2D(0),Kbb) - 0.5 * ( ssh_ib(A2D(0)) + ssh_ibb(A2D(0)) )
+         ELSE                    ;   ztmp1(:,:) = ssh(A2D(0),Kmm)
          ENDIF
-         CALL cpl_snd( jps_ssh   , isec, RESHAPE ( ztmp1            , (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_ssh   , isec, RESHAPE ( ztmp1 , (/Ni_0,Nj_0,1/) ), info )
 
       ENDIF
       !                                                        ! SSS
       IF( ssnd(jps_soce  )%laction )  THEN
-         CALL cpl_snd( jps_soce  , isec, RESHAPE ( ts(:,:,1,jp_sal,Kmm), (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_soce  , isec, RESHAPE ( ts(A2D(0),1,jp_sal,Kmm), (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !                                                        ! first T level thickness
+      ze3t_i(A2D(0),1) = e3t(Nis0:Nie0,Njs0:Nje0,1,Kmm)
       IF( ssnd(jps_e3t1st )%laction )  THEN
-         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( e3t(:,:,1,Kmm)   , (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( ze3t_i , (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !                                                        ! Qsr fraction
       IF( ssnd(jps_fraqsr)%laction )  THEN
-         CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(:,:) , (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(A2D(0)) , (/Ni_0,Nj_0,1/) ), info )
       ENDIF
       !
       !  Fields sent by SAS to OCE when OASIS coupling
       !                                                        ! Solar heat flux
-      IF( ssnd(jps_qsroce)%laction )  CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr , (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_qnsoce)%laction )  CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns , (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_oemp  )%laction )  CALL cpl_snd( jps_oemp  , isec, RESHAPE ( emp , (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_sflx  )%laction )  CALL cpl_snd( jps_sflx  , isec, RESHAPE ( sfx , (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_otx1  )%laction )  CALL cpl_snd( jps_otx1  , isec, RESHAPE ( utau, (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_oty1  )%laction )  CALL cpl_snd( jps_oty1  , isec, RESHAPE ( vtau, (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_rnf   )%laction )  CALL cpl_snd( jps_rnf   , isec, RESHAPE ( rnf , (/jpi,jpj,1/) ), info )
-      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info )
+      IF( ssnd(jps_qsroce)%laction )  CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr (:,:)   , (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_qnsoce)%laction )  CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns (:,:)   , (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_oemp  )%laction )  CALL cpl_snd( jps_oemp  , isec, RESHAPE ( emp (A2D(0)), (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_sflx  )%laction )  CALL cpl_snd( jps_sflx  , isec, RESHAPE ( sfx (:,:)   , (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_otx1  )%laction )  CALL cpl_snd( jps_otx1  , isec, RESHAPE ( utau(A2D(0)), (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_oty1  )%laction )  CALL cpl_snd( jps_oty1  , isec, RESHAPE ( vtau(A2D(0)), (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_rnf   )%laction )  CALL cpl_snd( jps_rnf   , isec, RESHAPE ( rnf (A2D(0)), (/Ni_0,Nj_0,1/) ), info )
+      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum(:,:)   , (/Ni_0,Nj_0,1/) ), info )
 
 #if defined key_si3
       !                                                      ! ------------------------- !
       !                                                      ! Sea surface freezing temp !
       !                                                      ! ------------------------- !
       ! needed by Met Office
-      CALL eos_fzp(ts(:,:,1,jp_sal,Kmm), sstfrz)
+      CALL eos_fzp( ts(:,:,1,jp_sal,Kmm), sstfrz(:,:), kbnd=0 )
       ztmp1(:,:) = sstfrz(:,:) + rt0
-      IF( ssnd(jps_sstfrz)%laction )  CALL cpl_snd( jps_sstfrz, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info)
+      IF( ssnd(jps_sstfrz)%laction )  CALL cpl_snd( jps_sstfrz, isec, RESHAPE ( ztmp1, (/Ni_0,Nj_0,1/) ), info)
 #endif
       !
    END SUBROUTINE sbc_cpl_snd
diff --git a/src/OCE/SBC/sbcdcy.F90 b/src/OCE/SBC/sbcdcy.F90
index a6ccd033..5ccd7ec7 100644
--- a/src/OCE/SBC/sbcdcy.F90
+++ b/src/OCE/SBC/sbcdcy.F90
@@ -49,8 +49,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  FUNCTION sbc_dcy_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( raa (jpi,jpj) , rbb  (jpi,jpj) , rcc  (jpi,jpj) , rab  (jpi,jpj) ,     &
-         &      rtmd(jpi,jpj) , rdawn_dcy(jpi,jpj) , rdusk_dcy(jpi,jpj) , rscal(jpi,jpj) , STAT=sbc_dcy_alloc )
+      ALLOCATE( raa (A2D(0)) , rbb  (A2D(0)) , rcc  (A2D(0)) , rab  (A2D(0)) ,     &
+         &      rtmd(A2D(0)) , rdawn_dcy(A2D(0)) , rdusk_dcy(A2D(0)) , rscal(A2D(0)) , STAT=sbc_dcy_alloc )
       !
       CALL mpp_sum ( 'sbcdcy', sbc_dcy_alloc )
       IF( sbc_dcy_alloc /= 0 )   CALL ctl_stop( 'STOP', 'sbc_dcy_alloc: failed to allocate arrays' )
@@ -71,12 +71,12 @@ CONTAINS
       !!              Impact of resolving the diurnal cycle in an ocean--atmosphere GCM.
       !!              Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590.
       !!----------------------------------------------------------------------
-      LOGICAL , OPTIONAL          , INTENT(in) ::   l_mask    ! use the routine for night mask computation
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqsrin    ! input daily QSR flux
-      REAL(wp), DIMENSION(jpi,jpj)             ::   zqsrout   ! output QSR flux with diurnal cycle
+      LOGICAL , OPTIONAL         , INTENT(in) ::   l_mask    ! use the routine for night mask computation
+      REAL(wp), DIMENSION(A2D(0)), INTENT(in) ::   pqsrin    ! input daily QSR flux
+      REAL(wp), DIMENSION(A2D(0))             ::   zqsrout   ! output QSR flux with diurnal cycle
       !!
       INTEGER  ::   ji, jj                                       ! dummy loop indices
-      INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask
+      INTEGER, DIMENSION(A2D(0)) :: imask_night ! night mask
       REAL(wp) ::   zlo, zup, zlousd, zupusd
       REAL(wp) ::   ztmp, ztmp1, ztmp2
       REAL(wp) ::   ztmpm, ztmpm1, ztmpm2
@@ -100,16 +100,16 @@ CONTAINS
       ! Setting parameters for each new day:
       CALL sbc_dcy_param()
 
-      !CALL iom_put( "rdusk_dcy", rdusk_dcy(:,:)*tmask(:,:,1) ) !LB
-      !CALL iom_put( "rdawn_dcy", rdawn_dcy(:,:)*tmask(:,:,1) ) !LB
-      !CALL iom_put( "rscal_dcy", rscal(:,:)*tmask(:,:,1) ) !LB
+      !CALL iom_put( "rdusk_dcy", rdusk_dcy(:,:)*smask0(:,:) ) !LB
+      !CALL iom_put( "rdawn_dcy", rdawn_dcy(:,:)*smask0(:,:) ) !LB
+      !CALL iom_put( "rscal_dcy", rscal(:,:)*smask0(:,:) ) !LB
 
 
       !     3. update qsr with the diurnal cycle
       !     ------------------------------------
 
       imask_night(:,:) = 0
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ztmpm = 0._wp
          IF( ABS(rab(ji,jj)) < 1. ) THEN         ! day duration is less than 24h
             !
@@ -161,7 +161,7 @@ CONTAINS
    SUBROUTINE sbc_dcy_param( )
       !!
       INTEGER  ::   ji, jj                                       ! dummy loop indices
-      !INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask
+      !INTEGER, DIMENSION(A2D(0)) :: imask_night ! night mask
       REAL(wp) ::   zdsws, zdecrad, ztx, zsin, zcos
       REAL(wp) ::   ztmp, ztest
       !---------------------------statement functions------------------------
@@ -192,7 +192,7 @@ CONTAINS
          ! Compute A and B needed to compute the time integral of the diurnal cycle
 
          zsin = SIN( zdecrad )   ;   zcos = COS( zdecrad )
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             ztmp = rad * gphit(ji,jj)
             raa(ji,jj) = SIN( ztmp ) * zsin
             rbb(ji,jj) = COS( ztmp ) * zcos
@@ -201,7 +201,7 @@ CONTAINS
 
          ! rab to test if the day time is equal to 0, less than 24h of full day
          rab(:,:) = -raa(:,:) / rbb(:,:)
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( ABS(rab(ji,jj)) < 1._wp ) THEN         ! day duration is less than 24h
                ! When is it night?
                ztx = 1._wp/(2._wp*rpi) * (ACOS(rab(ji,jj)) - rcc(ji,jj))
@@ -225,7 +225,7 @@ CONTAINS
          !         S* = the inverse of the time integral of the diurnal cycle from dawn to dusk
          !         Avoid possible infinite scaling factor, associated with very short daylight
          !         periods, by ignoring periods less than 1/1000th of a day (ticket #1040)
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( ABS(rab(ji,jj)) < 1._wp ) THEN         ! day duration is less than 24h
                rscal(ji,jj) = 0.0_wp
                IF( rdawn_dcy(ji,jj) < rdusk_dcy(ji,jj) ) THEN      ! day time in one part
diff --git a/src/OCE/SBC/sbcflx.F90 b/src/OCE/SBC/sbcflx.F90
index c9ad4fcb..eae94f9f 100644
--- a/src/OCE/SBC/sbcflx.F90
+++ b/src/OCE/SBC/sbcflx.F90
@@ -34,8 +34,12 @@ MODULE sbcflx
    INTEGER , PARAMETER ::   jp_qtot = 3   ! index of total (non solar+solar) heat file
    INTEGER , PARAMETER ::   jp_qsr  = 4   ! index of solar heat file
    INTEGER , PARAMETER ::   jp_emp  = 5   ! index of evaporation-precipation file
- !!INTEGER , PARAMETER ::   jp_sfx  = 6   ! index of salt flux flux
-   INTEGER , PARAMETER ::   jpfld   = 5 !! 6 ! maximum number of files to read
+!!$   INTEGER , PARAMETER ::   jp_sfx  = 6   ! index of salt flux flux
+!!$   INTEGER , PARAMETER ::   jp_sithic = 7 ! index of sea ice thickness
+!!$   INTEGER , PARAMETER ::   jp_sivolu = 8 ! index of sea ice volume per area
+!!$   INTEGER , PARAMETER ::   jp_siconc = 9 ! index of sea ice fraction
+   INTEGER , PARAMETER ::   jpfld   = 5   ! maximum number of files to read
+!!$   INTEGER , PARAMETER ::   jpfld   = 9   ! maximum number of files to read
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf    ! structure of input fields (file informations, fields read)
 
    !! * Substitutions
@@ -88,7 +92,7 @@ CONTAINS
       CHARACTER(len=100) ::  cn_dir                               ! Root directory for location of flx files
       TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i                    ! array of namelist information structures
       TYPE(FLD_N) ::   sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, sn_sfx ! informations about the fields to be read
-      NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, sn_sfx
+      NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, sn_sfx, sn_sithic, sn_sivolu, sn_siconc
       !!---------------------------------------------------------------------
       !
       IF( kt == nit000 ) THEN                ! First call kt=nit000
@@ -108,19 +112,22 @@ CONTAINS
          slf_i(jp_utau) = sn_utau   ;   slf_i(jp_vtau) = sn_vtau
          slf_i(jp_qtot) = sn_qtot   ;   slf_i(jp_qsr ) = sn_qsr
          slf_i(jp_emp ) = sn_emp !! ;   slf_i(jp_sfx ) = sn_sfx
+         !!slf_i(jp_sithic) = sn_sithic
+         !!slf_i(jp_sivolu) = sn_sivolu
+         !!slf_i(jp_siconc) = sn_siconc
          !
          ALLOCATE( sf(jpfld), STAT=ierror )        ! set sf structure
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'sbc_flx: unable to allocate sf structure' )   ;   RETURN
          ENDIF
          DO ji= 1, jpfld
-            ALLOCATE( sf(ji)%fnow(jpi,jpj,1) )
-            IF( slf_i(ji)%ln_tint ) ALLOCATE( sf(ji)%fdta(jpi,jpj,1,2) )
+            ALLOCATE( sf(ji)%fnow(A2D(0),1) )
+            IF( slf_i(ji)%ln_tint ) ALLOCATE( sf(ji)%fdta(A2D(0),1,2) )
          END DO
          !                                         ! fill sf with slf_i and control print
          CALL fld_fill( sf, slf_i, cn_dir, 'sbc_flx', 'flux formulation for ocean surface boundary condition', 'namsbc_flx' )
-         sf(jp_utau)%cltype = 'U'   ;   sf(jp_utau)%zsgn = -1._wp   ! vector field at U point: overwrite default definition of cltype and zsgn
-         sf(jp_vtau)%cltype = 'V'   ;   sf(jp_vtau)%zsgn = -1._wp   ! vector field at V point: overwrite default definition of cltype and zsgn
+         sf(jp_utau)%cltype = 'T'   ;   sf(jp_utau)%zsgn = -1._wp   ! vector field at T point: overwrite default definition of cltype and zsgn
+         sf(jp_vtau)%cltype = 'T'   ;   sf(jp_vtau)%zsgn = -1._wp   ! vector field at T point: overwrite default definition of cltype and zsgn
          !
       ENDIF
 
@@ -129,33 +136,44 @@ CONTAINS
       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN                        ! update ocean fluxes at each SBC frequency
 
          IF( ln_dm2dc ) THEN   ! modify now Qsr to include the diurnal cycle
-            qsr(:,:) = sbc_dcy( sf(jp_qsr)%fnow(:,:,1) ) * tmask(:,:,1)
+            qsr(:,:) = sbc_dcy( sf(jp_qsr)%fnow(:,:,1) ) * smask0(:,:)
          ELSE
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-               qsr(ji,jj) =     sf(jp_qsr)%fnow(ji,jj,1) * tmask(ji,jj,1)
-            END_2D
+            qsr(:,:) =          sf(jp_qsr)%fnow(:,:,1)   * smask0(:,:)
          ENDIF
 #if defined key_top
       IF( ln_trcdc2dm )  THEN      !  diurnal cycle in TOP
          IF( ln_dm2dc )  THEN
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-               qsr_mean(ji,jj) = sf(jp_qsr)%fnow(ji,jj,1)  * tmask(ji,jj,1)
+            DO_2D( 0, 0, 0, 0 )                  ! set the ocean fluxes from read fields
+               qsr_mean(ji,jj) = sf(jp_qsr)%fnow(ji,jj,1) * smask0(ji,jj)
             END_2D
          ELSE
             ncpl_qsr_freq = sf(jp_qsr)%freqh * 3600 !  qsr_mean will be computed in TOP
          ENDIF
       ENDIF
 #endif
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                  ! set the ocean fluxes from read fields
-            utau(ji,jj) =   sf(jp_utau)%fnow(ji,jj,1)                              * umask(ji,jj,1)
-            vtau(ji,jj) =   sf(jp_vtau)%fnow(ji,jj,1)                              * vmask(ji,jj,1)
-            qns (ji,jj) = ( sf(jp_qtot)%fnow(ji,jj,1) - sf(jp_qsr)%fnow(ji,jj,1) ) * tmask(ji,jj,1)
-            emp (ji,jj) =   sf(jp_emp )%fnow(ji,jj,1)                              * tmask(ji,jj,1)
-            !!sfx (ji,jj) = sf(jp_sfx )%fnow(ji,jj,1)                              * tmask(ji,jj,1)
+         DO_2D( 0, 0, 0, 0 )                  ! set the ocean fluxes from read fields
+            utau(ji,jj) =   sf(jp_utau)%fnow(ji,jj,1)                              * smask0(ji,jj)
+            vtau(ji,jj) =   sf(jp_vtau)%fnow(ji,jj,1)                              * smask0(ji,jj)
+            qns (ji,jj) = ( sf(jp_qtot)%fnow(ji,jj,1) - sf(jp_qsr)%fnow(ji,jj,1) ) * smask0(ji,jj)
+            emp (ji,jj) =   sf(jp_emp )%fnow(ji,jj,1)                              * smask0(ji,jj)
+            !!sfx (ji,jj) = sf(jp_sfx )%fnow(ji,jj,1)                              * smask0(ji,jj)
+            !!hcpl_i(ji,jj) = sf(jp_sithic)%fnow(ji,jj,1)                          * smask0(ji,jj)
+            !!vcpl_i(ji,jj) = sf(jp_sivolu)%fnow(ji,jj,1)                          * smask0(ji,jj)
+            !!fr_i(ji,jj)   = sf(jp_siconc)%fnow(ji,jj,1)                          * smask0(ji,jj)
          END_2D
-         !                                                        ! add to qns the heat due to e-p
-         !!clem: I do not think it is needed
-         !!qns(:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp        ! mass flux is at SST
+         !
+         !! Yona : add global qfrz to qns
+         !!IF( ln_frz .AND. ln_frzglob ) THEN
+         !!   zqfrz = glob_sum(qfrz_m(:,:) * e1t(A2D(0)) * e2t(A2D(0)) * smask0(:,:)) / glob_sum(e1t(A2D(0)) * e2t(A2D(0)) * smask0(:,:))
+         !!   qns(:,:) = ( qns(:,:) - zqfrz ) * smask0(:,:)
+         !!ENDIF
+         !!Yona
+         !
+         !! Yona : add anomalies if they are activated
+         !!IF( ln_flx_ano ) THEN
+         !!   CALL sbc_flx_ano( kt )
+         !!ENDIF
+         !! Yona
          !
          IF( nitend-nit000 <= 100 .AND. lwp ) THEN                ! control print (if less than 100 time-step asked)
             WRITE(numout,*)
@@ -170,19 +188,15 @@ CONTAINS
          ENDIF
          !
       ENDIF
-      !                                                           ! module of wind stress and wind speed at T-point
-      ! Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+      !
+      ! module of wind stress and wind speed at T-point
       zcoef = 1. / ( zrhoa * zcdrag )
       DO_2D( 0, 0, 0, 0 )
-         ztx = ( utau(ji-1,jj  ) + utau(ji,jj) ) * 0.5_wp * ( 2._wp - MIN( umask(ji-1,jj  ,1), umask(ji,jj,1) ) )
-         zty = ( vtau(ji  ,jj-1) + vtau(ji,jj) ) * 0.5_wp * ( 2._wp - MIN( vmask(ji  ,jj-1,1), vmask(ji,jj,1) ) )
-         zmod = SQRT( ztx * ztx + zty * zty ) * tmask(ji,jj,1)
+         zmod = SQRT( utau(ji,jj) * utau(ji,jj) + vtau(ji,jj) * vtau(ji,jj) ) * smask0(ji,jj)
          taum(ji,jj) = zmod
          wndm(ji,jj) = SQRT( zmod * zcoef )  !!clem: not used?
       END_2D
       !
-      CALL lbc_lnk( 'sbcflx', taum, 'T', 1._wp, wndm, 'T', 1._wp )
-      !
    END SUBROUTINE sbc_flx
 
    !!======================================================================
diff --git a/src/OCE/SBC/sbcfwb.F90 b/src/OCE/SBC/sbcfwb.F90
index 3cb6d7e2..616267af 100644
--- a/src/OCE/SBC/sbcfwb.F90
+++ b/src/OCE/SBC/sbcfwb.F90
@@ -18,8 +18,8 @@ MODULE sbcfwb
    USE oce            ! ocean dynamics and tracers
    USE dom_oce        ! ocean space and time domain
    USE sbc_oce        ! surface ocean boundary condition
-   USE isf_oce , ONLY : fwfisf_cav, fwfisf_par                    ! ice shelf melting contribution
-   USE sbc_ice , ONLY : snwice_mass_b, snwice_fmass
+   USE isf_oce , ONLY : fwfisf_cav, fwfisf_par, ln_isfcpl, ln_isfcpl_cons, risfcpl_cons_ssh ! ice shelf melting contribution
+   USE sbc_ice , ONLY : snwice_mass, snwice_mass_b, snwice_fmass
    USE phycst         ! physical constants
    USE sbcrnf         ! ocean runoffs
    USE sbcssr         ! Sea-Surface damping terms
@@ -57,6 +57,8 @@ MODULE sbcfwb
 !$AGRIF_END_DO_NOT_TREAT
 #endif
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcfwb.F90 15439 2021-10-22 17:53:09Z clem $
@@ -168,8 +170,8 @@ CONTAINS
          IF ( Agrif_Root() ) THEN
 #if defined key_agrif
             ALLOCATE(agrif_tmp(Agrif_nb_fine_grids()+1))
-            agrif_tmp(:) = 1.e+40_dp                     ! Initialize to a big value
-            agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask_agrif(:,:)) ! Coarse grid value
+            agrif_tmp(:) = HUGE(1._wp)                     ! Initialize to a big value
+            agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * tmask_agrif(A2D(0)) ) ! Coarse grid value
             CALL Agrif_step_child_adj(glob_sum_area_agrif)                    ! Get value over child grids
             CALL mpp_min('sbcfwb', agrif_tmp(:)) ! Required with // sisters to populate the value of each grid on each processor
             area = SUM(agrif_tmp)                ! Sum over all grids
@@ -178,7 +180,7 @@ CONTAINS
                IF (lwp) WRITE(numout,*) '                                        ', igrid, agrif_tmp(igrid)/1000._wp/1000._wp
             END DO
 #else
-            area = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask(:,:,1))         ! interior global domain surface
+            area = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * smask0(:,:) )         ! interior global domain surface
 #endif
             IF (lwp) WRITE(numout,*) 'Total Domain area (km**2):', area/1000._wp/1000._wp
             !
@@ -230,15 +232,15 @@ CONTAINS
                IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
                   SELECT CASE (nn_fwb_voltype)
                   CASE( 1 )
-                     z_fwfprv(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * (  emp(:,:) - rnf(:,:)                & 
-                               &                                      - fwfisf_cav(:,:) - fwfisf_par(:,:) & 
-                               &                                      - snwice_fmass(:,:) ) )
-                     !y_fwfnow(1) = local_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) - snwice_fmass(:,:) ) )
+                     z_fwfprv(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * (  emp(A2D(0)) - rnf(A2D(0))                & 
+                               &                                      - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) & 
+                               &                                      - snwice_fmass(A2D(0)) ) )
+                     !y_fwfnow(1) = local_sum( e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) - snwice_fmass(A2D(0)) ) )
                      !CALL mpp_delay_sum( 'sbcfwb', 'fwb', y_fwfnow(:), z_fwfprv(:), kt == nitend - nn_fsbc + 1 )
                   CASE( 2 )
-                     z_fwfprv(1)  = glob_sum( 'sbcfwb', e1e2t(:,:) * (  emp(:,:) - rnf(:,:)                & 
-                                &                                      - fwfisf_cav(:,:) - fwfisf_par(:,:) ))
-                     !y_fwfnow(1) = local_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:)  ) )
+                     z_fwfprv(1)  = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * (  emp(A2D(0)) - rnf(A2D(0))                & 
+                                &                                      - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) ))
+                     !y_fwfnow(1) = local_sum( e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0))  ) )
                      !CALL mpp_delay_sum( 'sbcfwb', 'fwb', y_fwfnow(:), z_fwfprv(:), kt == nitend - nn_fsbc + 1 )
                   END SELECT
               ENDIF
@@ -271,12 +273,12 @@ CONTAINS
                !
                IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
                   a_fwb_b   = a_fwb                            ! time swap
-                  agrif_tmp(:) = 1.e+40_dp                     ! Initialize to a big value
+                  agrif_tmp(:) = HUGE(1._wp)                   ! Initialize to a big value
                   SELECT CASE (nn_fwb_voltype)
                   CASE( 1 )
-                     agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask_agrif(:,:) * ( ssh(:,:,Kmm) + snwice_mass_b(:,:) * r1_rho0 ))
+                     agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * tmask_agrif(A2D(0)) * ( ssh(A2D(0),Kmm) + snwice_mass_b(A2D(0)) * r1_rho0 ))
                   CASE( 2 )
-                     agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask_agrif(:,:) * ssh(:,:,Kmm))
+                     agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * tmask_agrif(A2D(0)) * ssh(A2D(0),Kmm))
                   END SELECT
                   CALL Agrif_step_child_adj(glob_sum_volume_agrif) ! Get value over child grids
                   CALL mpp_min('sbcfwb', agrif_tmp(:)) ! Required with // sisters to populate the value of each grid on each processor
@@ -295,8 +297,8 @@ CONTAINS
 #endif
          !
          IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN        ! correct the freshwater fluxes on all grids
-            emp(:,:) = emp(:,:) + emp_corr * tmask(:,:,1)
-            qns(:,:) = qns(:,:) - emp_corr * rcp * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction
+            emp(A2D(0)) = emp(A2D(0)) + emp_corr                       * smask0(:,:)
+            qns(:,:)    = qns(:,:)    - emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) ! account for change to the heat budget due to fw correction
          ENDIF
 
          IF ( Agrif_Root() ) THEN
@@ -316,8 +318,8 @@ CONTAINS
 
          ! outputs
          IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -emp_corr * rcp * sst_m(:,:) * tmask(:,:,1) )
-            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -emp_corr * tmask(:,:,1) )
+            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) )
+            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -emp_corr                       * smask0(:,:) )
          ENDIF   
          !
       CASE ( 2 )                             !==  set volume annual trend  ==!
@@ -350,12 +352,12 @@ CONTAINS
                a_fwb_b = a_fwb
                ! mean sea level taking into account ice+snow
 #if defined key_agrif
-               agrif_tmp(:) = 1.e+40_dp                     ! Initialize to a big value
+               agrif_tmp(:) = HUGE(1._wp)                     ! Initialize to a big value
                SELECT CASE (nn_fwb_voltype)
                CASE( 1 )
-                  agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask_agrif(:,:) * ( ssh(:,:,Kmm) + snwice_mass_b(:,:) * r1_rho0 ))
+                  agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * tmask_agrif(A2D(0)) * ( ssh(A2D(0),Kmm) + snwice_mass_b(A2D(0)) * r1_rho0 ))
                CASE( 2 )
-                  agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask_agrif(:,:) * ssh(:,:,Kmm) )
+                  agrif_tmp(1) = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * tmask_agrif(A2D(0)) * ssh(A2D(0),Kmm) )
                END SELECT
                CALL Agrif_step_child_adj(glob_sum_volume_agrif) ! Get value over child grids
                CALL mpp_min('sbcfwb', agrif_tmp(:)) ! Required with // sisters to populate the value of each grid on each processor
@@ -363,9 +365,9 @@ CONTAINS
 #else          
                SELECT CASE (nn_fwb_voltype)
                CASE( 1 )     
-                  a_fwb   = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass_b(:,:) * r1_rho0 ) )
+                  a_fwb   = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * ( ssh(A2D(0),Kmm) + snwice_mass_b(A2D(0)) * r1_rho0 ) )
                CASE( 2 )
-                  a_fwb   = glob_sum( 'sbcfwb', e1e2t(:,:) * ssh(:,:,Kmm)  )
+                  a_fwb   = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * ssh(A2D(0),Kmm)  )
                END SELECT
 #endif
                a_fwb = a_fwb * rho0 / area - hvolg_n * rho0
@@ -374,7 +376,7 @@ CONTAINS
                ! hence namelist rn_fwb0 still rules
                IF ( a_fwb_b == 999._wp ) a_fwb_b = a_fwb
                !
-               emp_corr = ( a_fwb - a_fwb_b ) / ( rday * REAL(nyear_len(0), wp) ) + emp_corr
+               emp_corr = ( a_fwb - a_fwb_b ) / ( rday * REAL(nyear_len(1), wp) ) + emp_corr
                IF(lwp)   WRITE(numout,*)
                IF(lwp)   WRITE(numout,*)'sbc_fwb : Compute new global mass at step = ', kt
                IF(lwp)   WRITE(numout,*)'sbc_fwb : New      averaged liquid height (ocean + snow + ice) = ',    a_fwb * r1_rho0, 'm'
@@ -390,11 +392,11 @@ CONTAINS
          ENDIF
          !
          IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN         ! correct the freshwater fluxes
-            emp(:,:) = emp(:,:) + emp_corr * tmask(:,:,1)
-            qns(:,:) = qns(:,:) - emp_corr * rcp * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction
+            emp(A2D(0)) = emp(A2D(0)) + emp_corr * smask0(:,:)
+            qns(:,:)    = qns(:,:)    - emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) ! account for change to the heat budget due to fw correction
             ! outputs
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -emp_corr * rcp * sst_m(:,:) * tmask(:,:,1) )
-            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -emp_corr * tmask(:,:,1) )
+            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) )
+            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -emp_corr                       * smask0(:,:) )
          ENDIF
 
          IF ( Agrif_Root() ) THEN
@@ -417,58 +419,55 @@ CONTAINS
          !
       CASE ( 3 )                   !==  set volume at each time step and spread out the correction over erp area  ==!
          !
-         ALLOCATE( ztmsk_neg(jpi,jpj) , ztmsk_pos(jpi,jpj) , ztmsk_tospread(jpi,jpj) , z_wgt(jpi,jpj) , zerp_cor(jpi,jpj) )
+         ALLOCATE( ztmsk_neg(A2D(0)) , ztmsk_pos(A2D(0)) , ztmsk_tospread(A2D(0)) , z_wgt(A2D(0)) , zerp_cor(A2D(0)) )
          !
          IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
-            ztmsk_pos(:,:) = tmask_i(:,:)                      ! Select <0 and >0 area of erp
+            ztmsk_pos(:,:) = smask0_i(:,:)                      ! Select <0 and >0 area of erp
             WHERE( erp < 0._wp )   ztmsk_pos = 0._wp
-            ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:)
+            ztmsk_neg(:,:) = smask0_i(:,:) - ztmsk_pos(:,:)
             !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges)
             SELECT CASE (nn_fwb_voltype)
             CASE( 1 )  
-               z_fwf     = -emp_ext + glob_sum( 'sbcfwb', e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) - snwice_fmass(:,:) ) ) / area
+               z_fwf     = -emp_ext + glob_sum( 'sbcfwb', e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) - snwice_fmass(A2D(0)) ) ) / area
             CASE( 2 )
-               z_fwf     = -emp_ext + glob_sum( 'sbcfwb', e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) ) / area
+               z_fwf     = -emp_ext + glob_sum( 'sbcfwb', e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) ) ) / area
             END SELECT
             !            
             IF( z_fwf < 0._wp ) THEN         ! spread out over >0 erp area to increase evaporation
-               zsurf_pos = glob_sum( 'sbcfwb', e1e2t(:,:)*ztmsk_pos(:,:) )
+               zsurf_pos = glob_sum( 'sbcfwb', e1e2t(A2D(0))*ztmsk_pos(:,:) )
                zsurf_tospread      = zsurf_pos
                ztmsk_tospread(:,:) = ztmsk_pos(:,:)
             ELSE                             ! spread out over <0 erp area to increase precipitation
-               zsurf_neg = glob_sum( 'sbcfwb', e1e2t(:,:)*ztmsk_neg(:,:) )  ! Area filled by <0 and >0 erp 
+               zsurf_neg = glob_sum( 'sbcfwb', e1e2t(A2D(0))*ztmsk_neg(:,:) )  ! Area filled by <0 and >0 erp 
                zsurf_tospread      = zsurf_neg
                ztmsk_tospread(:,:) = ztmsk_neg(:,:)
             ENDIF
             !
-            zsum_fwf   = glob_sum( 'sbcfwb', e1e2t(:,:) * z_fwf )         ! fwf global mean over <0 or >0 erp area
+            zsum_fwf   = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * z_fwf )         ! fwf global mean over <0 or >0 erp area
 !!gm :  zsum_fwf   = z_fwf * area   ???  it is right?  I think so....
             z_fwf_nsrf =  zsum_fwf / ( zsurf_tospread + rsmall )
             !                                                  ! weight to respect erp field 2D structure 
-            zsum_erp   = glob_sum( 'sbcfwb', ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) )
+            zsum_erp   = glob_sum( 'sbcfwb', ztmsk_tospread(:,:) * erp(:,:) * e1e2t(A2D(0)) )
             z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall )
             !                                                  ! final correction term to apply
             zerp_cor(:,:) = -1. * z_fwf_nsrf * zsurf_tospread * z_wgt(:,:)
             !
-!!gm   ===>>>>  lbc_lnk should be useless as all the computation is done over the whole domain !
-            CALL lbc_lnk( 'sbcfwb', zerp_cor, 'T', 1.0_wp )
-            !
-            emp(:,:) = emp(:,:) + zerp_cor(:,:)
-            qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:)  ! account for change to the heat budget due to fw correction
-            erp(:,:) = erp(:,:) + zerp_cor(:,:)
+            emp(A2D(0)) = emp(A2D(0)) + zerp_cor(:,:)
+            qns(:,:)    = qns(:,:)    - zerp_cor(:,:) * rcp * sst_m(A2D(0))  ! account for change to the heat budget due to fw correction
+            erp(:,:)    = erp(:,:)    + zerp_cor(:,:)
             ! outputs
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -zerp_cor(:,:) * rcp * sst_m(:,:) )
+            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -zerp_cor(:,:) * rcp * sst_m(A2D(0)) )
             IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -zerp_cor(:,:) )
             !
             IF( lwp ) THEN                   ! control print
                IF( z_fwf < 0._wp ) THEN
                   WRITE(numout,*)'   z_fwf < 0'
-                  WRITE(numout,*)'   SUM(erp+)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv'
+                  WRITE(numout,*)'   SUM(erp+)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(A2D(0)) )*1.e-9,' Sv'
                ELSE
                   WRITE(numout,*)'   z_fwf >= 0'
-                  WRITE(numout,*)'   SUM(erp-)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv'
+                  WRITE(numout,*)'   SUM(erp-)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(A2D(0)) )*1.e-9,' Sv'
                ENDIF
-               WRITE(numout,*)'   SUM(empG)     = ', SUM( z_fwf*e1e2t(:,:) )*1.e-9,' Sv'
+               WRITE(numout,*)'   SUM(empG)     = ', SUM( z_fwf*e1e2t(A2D(0)) )*1.e-9,' Sv'
                WRITE(numout,*)'   z_fwf         = ', z_fwf      ,' Kg/m2/s'
                WRITE(numout,*)'   z_fwf_nsrf    = ', z_fwf_nsrf ,' Kg/m2/s'
                WRITE(numout,*)'   MIN(zerp_cor) = ', MINVAL(zerp_cor) 
@@ -477,6 +476,37 @@ CONTAINS
          ENDIF
          DEALLOCATE( ztmsk_neg , ztmsk_pos , ztmsk_tospread , z_wgt , zerp_cor )
          !
+      CASE ( 4 )                             !==  global mean fwf set to zero (ISOMIP case) ==!
+         !
+         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
+            !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges) 
+            emp_corr = glob_sum( 'sbcfwb', e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) &
+               &                                                      - snwice_fmass(A2D(0)) ) ) / area
+            ! clem: use y_fwfnow instead to improve performance? 
+            !y_fwfnow(1) = local_sum( e1e2t(A2D(0)) * ( emp(A2D(0)) - rnf(A2D(0)) - fwfisf_cav(A2D(0)) - fwfisf_par(A2D(0)) &
+            !   &                                                   - snwice_fmass(A2D(0)) ) )
+            ! correction for ice sheet coupling testing (ie remove the excess through the surface)
+            ! test impact on the melt as conservation correction made in depth
+            ! test conservation level as sbcfwb is conserving
+            ! avoid the model to blow up for large ssh drop (isomip OCEAN3 with melt switch off and uniform T/S)
+            IF (ln_isfcpl .AND. ln_isfcpl_cons) THEN
+               emp_corr = emp_corr + glob_sum( 'sbcfwb',  e1e2t(A2D(0)) * risfcpl_cons_ssh(A2D(0)) * rho0 ) / area
+            !   y_fwfnow(1) = y_fwfnow(1) + local_sum( e1e2t(A2D(0)) * risfcpl_cons_ssh(A2D(0)) * rho0 )
+            END IF
+            !CALL mpp_delay_sum( 'sbcfwb', 'fwb', y_fwfnow(:), z_fwfprv(:), kt == nitend - nn_fsbc + 1 )
+            !emp_corr = z_fwfprv(1) / area
+            !
+            emp(A2D(0)) = emp(A2D(0)) - emp_corr                       * smask0(:,:) ! (Eq. 34 AD2015)
+            qns(:,:)    = qns(:,:)    + emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) ! (Eq. 35 AD2015) ! use sst_m to avoid generation of any bouyancy fluxes
+            sfx(:,:)    = sfx(:,:)    + emp_corr       * sss_m(A2D(0)) * smask0(:,:) ! (Eq. 36 AD2015) ! use sss_m to avoid generation of any bouyancy fluxes
+            !
+            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', emp_corr * rcp * sst_m(A2D(0)) * smask0(:,:) )
+            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', emp_corr                       * smask0(:,:) )
+         ENDIF
+         !
+      CASE DEFAULT                           !==  you should never be there  ==!
+         CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1, 2 or 3' )
+         !
       END SELECT
       !
    END SUBROUTINE sbc_fwb
diff --git a/src/OCE/SBC/sbcice_cice.F90 b/src/OCE/SBC/sbcice_cice.F90
index 5f7f7577..d05ccfd3 100644
--- a/src/OCE/SBC/sbcice_cice.F90
+++ b/src/OCE/SBC/sbcice_cice.F90
@@ -12,9 +12,9 @@ MODULE sbcice_cice
    USE oce             ! ocean dynamics and tracers
    USE dom_oce         ! ocean space and time domain
 # if defined key_qco
-   USE domqco         ! Variable volume
-# else
-   USE domvvl         ! Variable volume
+   USE domqco          ! Variable volume
+# elif defined key_linssh
+   !                   ! Fix in time volume
 # endif
    USE phycst, only : rcp, rho0, r1_rho0, rhos, rhoi
    USE in_out_manager  ! I/O manager
@@ -238,41 +238,8 @@ CONTAINS
 !!gm especially here it is assumed zstar coordinate, but it can be ztilde....
 #if defined key_qco
             IF( .NOT.ln_linssh )   CALL dom_qco_zgr( Kbb, Kmm )   ! interpolation scale factor, depth and water column
-#else
-            IF( .NOT.ln_linssh ) THEN
-               !
-               DO jk = 1,jpkm1                     ! adjust initial vertical scale factors
-                  e3t(:,:,jk,Kmm) = e3t_0(:,:,jk)*( 1._wp + ssh(:,:,Kmm)*r1_ht_0(:,:)*tmask(:,:,jk) )
-                  e3t(:,:,jk,Kbb) = e3t_0(:,:,jk)*( 1._wp + ssh(:,:,Kbb)*r1_ht_0(:,:)*tmask(:,:,jk) )
-               ENDDO
-               e3t(:,:,:,Krhs) = e3t(:,:,:,Kbb)
-               ! Reconstruction of all vertical scale factors at now and before time-steps
-               ! =============================================================================
-               ! Horizontal scale factor interpolations
-               ! --------------------------------------
-               CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3u(:,:,:,Kbb), 'U' )
-               CALL dom_vvl_interpol( e3t(:,:,:,Kbb), e3v(:,:,:,Kbb), 'V' )
-               CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3u(:,:,:,Kmm), 'U' )
-               CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3v(:,:,:,Kmm), 'V' )
-               CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3f(:,:,:), 'F' )
-               ! Vertical scale factor interpolations
-               ! ------------------------------------
-               CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3w (:,:,:,Kmm), 'W'  )
-               CALL dom_vvl_interpol( e3u(:,:,:,Kmm), e3uw(:,:,:,Kmm), 'UW' )
-               CALL dom_vvl_interpol( e3v(:,:,:,Kmm), e3vw(:,:,:,Kmm), 'VW' )
-               CALL dom_vvl_interpol( e3u(:,:,:,Kbb), e3uw(:,:,:,Kbb), 'UW' )
-               CALL dom_vvl_interpol( e3v(:,:,:,Kbb), e3vw(:,:,:,Kbb), 'VW' )
-               ! t- and w- points depth
-               ! ----------------------
-               gdept(:,:,1,Kmm) = 0.5_wp * e3w(:,:,1,Kmm)
-               gdepw(:,:,1,Kmm) = 0.0_wp
-               gde3w(:,:,1)     = gdept(:,:,1,Kmm) - ssh(:,:,Kmm)
-               DO jk = 2, jpk
-                  gdept(:,:,jk,Kmm) = gdept(:,:,jk-1,Kmm) + e3w(:,:,jk,Kmm)
-                  gdepw(:,:,jk,Kmm) = gdepw(:,:,jk-1,Kmm) + e3t(:,:,jk-1,Kmm)
-                  gde3w(:,:,jk)     = gdept(:,:,jk  ,Kmm) - sshn   (:,:)
-               END DO
-            ENDIF
+#elif defined key_linssh
+            !
 #endif
          ENDIF
       ENDIF
@@ -566,7 +533,7 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
       WHERE (ztmp1(:,:).lt.0.0) ztmp2(:,:)=MAX(ztmp2(:,:),ztmp1(:,:)*sss_m(:,:)/1000.0)
       sfx(:,:)=ztmp2(:,:)*1000.0
       emp(:,:)=emp(:,:)-ztmp1(:,:)
-      fmmflx(:,:) = ztmp1(:,:) !!Joakim edit
+      fwfice(:,:) = -ztmp1(:,:) !!Joakim edit
       
       CALL lbc_lnk( 'sbcice_cice', emp , 'T', 1.0_wp, sfx , 'T', 1.0_wp )
 
diff --git a/src/OCE/SBC/sbcice_if.F90 b/src/OCE/SBC/sbcice_if.F90
index d5acb291..c406c740 100644
--- a/src/OCE/SBC/sbcice_if.F90
+++ b/src/OCE/SBC/sbcice_if.F90
@@ -85,8 +85,8 @@ CONTAINS
 
          ALLOCATE( sf_ice(1), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' )
-         ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) )
-         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_ice(1)%fnow(A2D(0),1) )
+         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(A2D(0),1,2) )
 
          ! fill sf_ice with sn_ice and control print
          CALL fld_fill( sf_ice, (/ sn_ice /), cn_dir, 'sbc_ice_if', 'ice-if sea-ice model', 'namsbc_iif' )
@@ -108,8 +108,12 @@ CONTAINS
          IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)         
 
          ! Flux and ice fraction computation
-         DO_2D( 1, 1, 1, 1 )
-            !
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            zt_fzp  = fr_i(ji,jj)                        ! freezing point temperature
+            ts(ji,jj,1,jp_tem,Kmm) = MAX( ts(ji,jj,1,jp_tem,Kmm), zt_fzp )     ! avoid over-freezing point temperature
+         END_2D
+
+         DO_2D( 0, 0, 0, 0 )
             zt_fzp  = fr_i(ji,jj)                        ! freezing point temperature
             zfr_obs = sf_ice(1)%fnow(ji,jj,1)            ! observed ice cover
             !                                            ! ocean ice fraction (0/1) from the freezing point temperature
@@ -117,8 +121,6 @@ CONTAINS
             ELSE                                ;   fr_i(ji,jj) = 0.e0
             ENDIF
 
-            ts(ji,jj,1,jp_tem,Kmm) = MAX( ts(ji,jj,1,jp_tem,Kmm), zt_fzp )     ! avoid over-freezing point temperature
-
             qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj)   ! solar heat flux : zero below observed ice cover
 
             !                                            ! non solar heat flux : add a damping term 
@@ -127,7 +129,7 @@ CONTAINS
             zqri = ztrp * ( ts(ji,jj,1,jp_tem,Kbb) - ( zt_fzp - 1.) )
             zqrj = ztrp * MIN( 0., ts(ji,jj,1,jp_tem,Kbb) - zt_fzp )
             zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri    &
-              &                 +      fr_i(ji,jj)   * zqrj ) ) * tmask(ji,jj,1)
+              &                 +      fr_i(ji,jj)   * zqrj ) ) * smask0(ji,jj)
 
             !                                            ! non-solar heat flux 
             !      # qns unchanged              if no climatological ice              (zfr_obs=0)
@@ -136,7 +138,7 @@ CONTAINS
             !                                   (-2=arctic, -4=antarctic)   
             zqi = -3. + SIGN( 1._wp, ff_f(ji,jj) )
             qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj)                             &
-               &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * tmask(ji,jj,1)   &
+               &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * smask0(ji,jj)   &
                &       + zqrp
          END_2D
          !
diff --git a/src/OCE/SBC/sbcmod.F90 b/src/OCE/SBC/sbcmod.F90
index dbbb7c71..cb1c832f 100644
--- a/src/OCE/SBC/sbcmod.F90
+++ b/src/OCE/SBC/sbcmod.F90
@@ -162,8 +162,8 @@ CONTAINS
       !
       IF( .NOT.ln_usr ) THEN     ! the model calendar needs some specificities (except in user defined case)
          IF( MOD( rday , rn_Dt ) /= 0. )   CALL ctl_stop( 'the time step must devide the number of second of in a day' )
-         IF( MOD( rday , 2.  ) /= 0. )   CALL ctl_stop( 'the number of second of in a day must be an even number'    )
-         IF( MOD( rn_Dt  , 2.  ) /= 0. )   CALL ctl_stop( 'the time step (in second) must be an even number'           )
+         IF( MOD( rday , 2.    ) /= 0. )   CALL ctl_stop( 'the number of second of in a day must be an even number'    )
+         IF( MOD( rn_Dt, 2.    ) /= 0. )   CALL ctl_stop( 'the time step (in second) must be an even number'           )
       ENDIF
       !                       !**  check option consistency
       !
@@ -232,7 +232,7 @@ CONTAINS
       ENDIF
       !
       sfx   (:,:) = 0._wp           !* salt flux due to freezing/melting
-      fmmflx(:,:) = 0._wp           !* freezing minus melting flux
+      fwfice(:,:) = 0._wp           !* ice-ocean freshwater flux
       cloud_fra(:,:) = pp_cldf      !* cloud fraction over sea ice (used in si3)
 
       taum(:,:) = 0._wp             !* wind stress module (needed in GLS in case of reduced restart)
@@ -378,7 +378,7 @@ CONTAINS
       !!
       !! ** Action  : - set the ocean surface boundary condition at before and now
       !!                time step, i.e.
-      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, sfx_b, qrp_b, erp_b
+      !!                utau_b, vtau_b, qns_b, qsr_b, emp_b, sfx_b
       !!                utau  , vtau  , qns  , qsr  , emp  , sfx  , qrp  , erp
       !!              - updte the ice fraction : fr_i
       !!----------------------------------------------------------------------
@@ -386,12 +386,10 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices
       INTEGER  ::   jj, ji          ! dummy loop argument
       !
-      LOGICAL ::   ll_sas, ll_opa   ! local logical
+      LOGICAL  ::   ll_sas, ll_opa  ! local logical
       !
-      REAL(wp) ::     zthscl        ! wd  tanh scale
-      REAL(wp), DIMENSION(jpi,jpj) ::  zwdht, zwght  ! wd dep over wd limit, wgt
-      REAL(wp), DIMENSION(jpi,jpj) ::  z2d           ! temporary array used for iom_put
-
+      REAL(wp) ::  zthscl        ! wd  tanh scale
+      REAL(wp) ::  zwdht, zwght  ! wd dep over wd limit, wgt
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('sbc')
@@ -399,20 +397,22 @@ CONTAINS
       !                                            ! ---------------------------------------- !
       IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          !
          !                                         ! ---------------------------------------- !
-         utau_b(:,:) = utau(:,:)                         ! Swap the ocean forcing fields
-         vtau_b(:,:) = vtau(:,:)                         ! (except at nit000 where before fields
-         qns_b (:,:) = qns (:,:)                         !  are set at the end of the routine)
-         emp_b (:,:) = emp (:,:)
-         sfx_b (:,:) = sfx (:,:)
+         utau_b(:,:) = utauU(:,:)                        ! Swap the ocean forcing fields
+         vtau_b(:,:) = vtauV(:,:)                        ! (except at nit000 where before fields
+         qns_b (:,:) = qns  (:,:)                        !  are set at the end of the routine)
+         emp_b (:,:) = emp  (:,:)
+         sfx_b (:,:) = sfx  (:,:)
          IF( ln_rnf ) THEN
             rnf_b    (:,:  ) = rnf    (:,:  )
             rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:)
          ENDIF
-        !
+         !
       ENDIF
       !                                            ! ---------------------------------------- !
       !                                            !        forcing field computation         !
       !                                            ! ---------------------------------------- !
+      ! most of the following routines update fields only in the interior
+      ! with the exception of sbcssm, sbcrnf and sbcwave modules
       !
       ll_sas = nn_components == jp_iam_sas               ! component flags
       ll_opa = nn_components == jp_iam_oce
@@ -437,66 +437,75 @@ CONTAINS
       CASE( jp_abl     )   ;   CALL sbc_abl       ( kt )                             ! ABL  formulation for the ocean
       CASE( jp_purecpl )   ;   CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice, Kbb, Kmm )  ! pure coupled formulation
       CASE( jp_none    )
-         IF( ll_opa    )       CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice, Kbb, Kmm )  ! OCE-SAS coupling: OCE receiving fields from SAS
+         IF( ll_opa    )       CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice, Kbb, Kmm )   ! OCE-SAS coupling: OCE receiving fields from SAS
       END SELECT
-      IF( ln_mixcpl )          CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice, Kbb, Kmm )  ! forced-coupled mixed formulation after forcing
       !
-      IF( ln_wave .AND. ln_tauoc ) THEN            ! Wave stress reduction
-         DO_2D( 0, 0, 0, 0)
-            utau(ji,jj) = utau(ji,jj) * ( tauoc_wave(ji,jj) + tauoc_wave(ji+1,jj) ) * 0.5_wp
-            vtau(ji,jj) = vtau(ji,jj) * ( tauoc_wave(ji,jj) + tauoc_wave(ji,jj+1) ) * 0.5_wp
-         END_2D
-         !
-         CALL lbc_lnk( 'sbcwave', utau, 'U', -1. )
-         CALL lbc_lnk( 'sbcwave', vtau, 'V', -1. )
+      IF( ln_mixcpl )          CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice, Kbb, Kmm )   ! forced-coupled mixed formulation after forcing
+      !
+      IF( ln_wave .AND. ln_tauoc ) THEN             ! Wave stress reduction
          !
-         taum(:,:) = taum(:,:)*tauoc_wave(:,:)
+         DO_2D( 0, 0, 0, 0 )
+            utau(ji,jj) = utau(ji,jj) * tauoc_wave(ji,jj)
+            vtau(ji,jj) = vtau(ji,jj) * tauoc_wave(ji,jj)
+            taum(ji,jj) = taum(ji,jj) * tauoc_wave(ji,jj)
+         END_2D
          !
          IF( kt == nit000 )   CALL ctl_warn( 'sbc: You are subtracting the wave stress to the ocean.',   &
             &                                'If not requested select ln_tauoc=.false.' )
          !
-      ELSEIF( ln_wave .AND. ln_taw ) THEN                  ! Wave stress reduction
-         utau(:,:) = utau(:,:) - tawx(:,:) + twox(:,:)
-         vtau(:,:) = vtau(:,:) - tawy(:,:) + twoy(:,:)
-         CALL lbc_lnk( 'sbcwave', utau, 'U', -1. )
-         CALL lbc_lnk( 'sbcwave', vtau, 'V', -1. )
-         !
-         DO_2D( 0, 0, 0, 0)
-             taum(ji,jj) = sqrt((.5*(utau(ji-1,jj)+utau(ji,jj)))**2 + (.5*(vtau(ji,jj-1)+vtau(ji,jj)))**2)
+      ELSEIF( ln_wave .AND. ln_taw ) THEN           ! Wave stress reduction
+         DO_2D( 0, 0, 0, 0 )
+            utau(ji,jj) = utau(ji,jj) - ( tawx(ji,jj) - twox(ji,jj) )
+            vtau(ji,jj) = vtau(ji,jj) - ( tawy(ji,jj) - twoy(ji,jj) )
+            taum(ji,jj) = SQRT( utau(ji,jj)*utau(ji,jj) + vtau(ji,jj)*vtau(ji,jj) )
          END_2D
          !
          IF( kt == nit000 )   CALL ctl_warn( 'sbc: You are subtracting the wave stress to the ocean.',   &
             &                                'If not requested select ln_taw=.false.' )
          !
       ENDIF
-      CALL lbc_lnk( 'sbcmod', taum(:,:), 'T', 1. )
+      !
+      !clem: these calls are needed for sbccpl only => only for SAS I think?
+      IF( ll_sas .OR. ll_opa )   CALL lbc_lnk( 'sbcmod', sst_m, 'T', 1.0_wp, sss_m, 'T', 1.0_wp, ssh_m, 'T', 1.0_wp, &
+         &                                               frq_m, 'T', 1.0_wp, e3t_m, 'T', 1.0_wp, fr_i , 'T', 1.0_wp )
+      !clem : these calls are needed for sbccpl => it needs an IF statement but it's complicated
+      IF( ln_rnf .AND. l_rnfcpl )     CALL lbc_lnk( 'sbcmod', rnf, 'T', 1.0_wp )
       !
       IF( ln_icebergs ) THEN  ! save pure stresses (with no ice-ocean stress) for use by icebergs
-         utau_icb(:,:) = utau(:,:) ; vtau_icb(:,:) = vtau(:,:) 
+         !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+         !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+         CALL lbc_lnk( 'sbcmod', utau, 'T', -1.0_wp, vtau, 'T', -1.0_wp )
+         DO_2D( 0, 0, 0, 0 )
+            utau_icb(ji,jj) = 0.5_wp * ( utau(ji,jj) + utau(ji+1,jj) ) * &
+               &                       ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji+1,jj,1) )
+            vtau_icb(ji,jj) = 0.5_wp * ( vtau(ji,jj) + vtau(ji,jj+1) ) * &
+               &                       ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji,jj+1,1) )
+         END_2D
+         CALL lbc_lnk( 'sbcmod', utau_icb, 'U', -1.0_wp, vtau_icb, 'V', -1.0_wp )
       ENDIF
       !
       !                                            !==  Misc. Options  ==!
       !
-      SELECT CASE( nn_ice )                                       ! Update heat and freshwater fluxes over sea-ice areas
-      CASE(  1 )   ;         CALL sbc_ice_if   ( kt, Kbb, Kmm )   ! Ice-cover climatology ("Ice-if" model)
+      SELECT CASE( nn_ice )                                            ! Update heat and freshwater fluxes over sea-ice areas
+      CASE(  1 )   ;         CALL sbc_ice_if   ( kt, Kbb, Kmm )        ! Ice-cover climatology ("Ice-if" model)
 #if defined key_si3
-      CASE(  2 )   ;         CALL ice_stp  ( kt, Kbb, Kmm, nsbc ) ! SI3 ice model
+      CASE(  2 )   ;         CALL ice_stp  ( kt, Kbb, Kmm, nsbc )      ! SI3 ice model
 #endif
-      CASE(  3 )   ;         CALL sbc_ice_cice ( kt, nsbc )       ! CICE ice model
+      CASE(  3 )   ;         CALL sbc_ice_cice ( kt, nsbc )            ! CICE ice model
       END SELECT
-
-      IF( ln_icebergs    )   CALL icb_stp( kt, Kmm )              ! compute icebergs
+      !==> clem: from here on, the following fields are ok on the halos: snwice_mass, snwice_mass_b, snwice_fmass
+      !                        but not utau, vtau, emp (must be done later on)
+      
+      IF( ln_icebergs    )   CALL icb_stp( kt, Kmm )                   ! compute icebergs
 
       ! Icebergs do not melt over the haloes.
       ! So emp values over the haloes are no more consistent with the inner domain values.
       ! A lbc_lnk is therefore needed to ensure reproducibility and restartability.
       ! see ticket #2113 for discussion about this lbc_lnk.
-      ! The lbc_lnk is also needed for SI3 with nn_hls > 1 as emp is not yet defined for these points in iceupdate.F90
-      IF( (ln_icebergs .AND. .NOT. ln_passive_mode) .OR. (nn_ice == 2 .AND. nn_hls == 2) ) THEN
-         CALL lbc_lnk( 'sbcmod', emp, 'T', 1.0_wp )
-      ENDIF
-
-      IF( ln_rnf         )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes
+!!$      IF( ln_icebergs .AND. .NOT. ln_passive_mode )   CALL lbc_lnk( 'sbcmod', emp, 'T', 1.0_wp )
+      !clem: not needed anymore since lbc is done afterwards
+      
+      IF( ln_rnf         )   CALL sbc_rnf( kt )                        ! add runoffs to fresh water fluxes
 
       IF( ln_ssr         )   CALL sbc_ssr( kt )                        ! add SST/SSS damping term
 
@@ -506,33 +515,49 @@ CONTAINS
       ! Should not be run if ln_diurnal_only
       IF( l_sbc_clo      )   CALL sbc_clo( kt )
 
-!!$!RBbug do not understand why see ticket 667
-!!$!clem: it looks like it is necessary for the north fold (in certain circumstances). Don't know why.
-!!$      CALL lbc_lnk( 'sbcmod', emp, 'T', 1.0_wp )
       IF( ll_wd ) THEN     ! If near WAD point limit the flux for now
          zthscl = atanh(rn_wd_sbcfra)                     ! taper frac default is .999
-         zwdht(:,:) = ssh(:,:,Kmm) + ht_0(:,:) - rn_wdmin1   ! do this calc of water
-                                                     ! depth above wd limit once
-         WHERE( zwdht(:,:) <= 0.0 )
-            taum(:,:) = 0.0
-            utau(:,:) = 0.0
-            vtau(:,:) = 0.0
-            qns (:,:) = 0.0
-            qsr (:,:) = 0.0
-            emp (:,:) = min(emp(:,:),0.0) !can allow puddles to grow but not shrink
-            sfx (:,:) = 0.0
-         END WHERE
-         zwght(:,:) = tanh(zthscl*zwdht(:,:))
-         WHERE( zwdht(:,:) > 0.0  .and. zwdht(:,:) < rn_wd_sbcdep ) !  5 m hard limit here is arbitrary
-            qsr  (:,:) =  qsr(:,:)  * zwght(:,:)
-            qns  (:,:) =  qns(:,:)  * zwght(:,:)
-            taum (:,:) =  taum(:,:) * zwght(:,:)
-            utau (:,:) =  utau(:,:) * zwght(:,:)
-            vtau (:,:) =  vtau(:,:) * zwght(:,:)
-            sfx  (:,:) =  sfx(:,:)  * zwght(:,:)
-            emp  (:,:) =  emp(:,:)  * zwght(:,:)
-         END WHERE
+         DO_2D( 0, 0, 0, 0 )
+            zwdht = ssh(ji,jj,Kmm) + ht_0(ji,jj) - rn_wdmin1   ! do this calc of water depth above wd limit once
+            zwght = TANH(zthscl*zwdht)
+            IF( zwdht <= 0.0 ) THEN
+               taum(ji,jj) = 0.0
+               utau(ji,jj) = 0.0
+               vtau(ji,jj) = 0.0
+               qns (ji,jj) = 0.0
+               qsr (ji,jj) = 0.0
+               emp (ji,jj) = MIN(emp(ji,jj),0.0) !can allow puddles to grow but not shrink
+               sfx (ji,jj) = 0.0
+            ELSEIF( zwdht > 0.0  .AND. zwdht < rn_wd_sbcdep ) THEN !  5 m hard limit here is arbitrary
+               qsr  (ji,jj) =  qsr(ji,jj)  * zwght
+               qns  (ji,jj) =  qns(ji,jj)  * zwght
+               taum (ji,jj) =  taum(ji,jj) * zwght
+               utau (ji,jj) =  utau(ji,jj) * zwght
+               vtau (ji,jj) =  vtau(ji,jj) * zwght
+               sfx  (ji,jj) =  sfx(ji,jj)  * zwght
+               emp  (ji,jj) =  emp(ji,jj)  * zwght
+            ENDIF
+         END_2D
+      ENDIF
+
+      ! clem: these should be the only fields that are needed over the entire domain
+      !       (in addition to snwice_mass)
+      IF( ln_rnf ) THEN
+         CALL lbc_lnk( 'sbcmod', utau, 'T', -1.0_wp, vtau  , 'T', -1.0_wp, emp, 'T', 1.0_wp, &
+            &                    rnf , 'T',  1.0_wp )
+      ELSE
+         CALL lbc_lnk( 'sbcmod', utau, 'T', -1.0_wp, vtau  , 'T', -1.0_wp, emp, 'T', 1.0_wp )
       ENDIF
+      ! --- calculate utau and vtau on U,V-points --- !
+      !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
+      !      and the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
+      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         utauU  (ji,jj) = 0.5_wp * ( utau(ji,jj) + utau(ji+1,jj) ) * &
+            &                      ( 2. - umask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji+1,jj,1) )
+         vtauV  (ji,jj) = 0.5_wp * ( vtau(ji,jj) + vtau(ji,jj+1) ) * &
+            &                      ( 2. - vmask(ji,jj,1) ) * MAX( tmask(ji,jj,1), tmask(ji,jj+1,1) )
+      END_2D
+      IF( nn_hls == 1 )   CALL lbc_lnk( 'sbcmod', utauU, 'U', -1.0_wp, vtauV, 'V', -1.0_wp )
       !
       IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    !
          !                                             ! ---------------------------------------- !
@@ -542,27 +567,28 @@ CONTAINS
          IF( ln_rstart .AND. .NOT.l_1st_euler ) THEN            !* MLF: Restart: read in restart file
 #endif
             IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields read in the restart file'
-            CALL iom_get( numror, jpdom_auto, 'utau_b', utau_b )   ! i-stress
-            CALL iom_get( numror, jpdom_auto, 'vtau_b', vtau_b )   ! j-stress
-            CALL iom_get( numror, jpdom_auto,  'qns_b',  qns_b )   ! non solar heat flux
-            CALL iom_get( numror, jpdom_auto,  'emp_b',  emp_b )   ! freshwater flux
+            CALL iom_get( numror, jpdom_auto, 'utau_b', utau_b, cd_type = 'U', psgn = -1._wp )   ! i-stress
+            CALL iom_get( numror, jpdom_auto, 'vtau_b', vtau_b, cd_type = 'V', psgn = -1._wp )   ! j-stress
+            CALL iom_get( numror, jpdom_auto,  'qns_b',  qns_b, cd_type = 'T', psgn =  1._wp )   ! non solar heat flux
+            CALL iom_get( numror, jpdom_auto,  'emp_b',  emp_b, cd_type = 'T', psgn =  1._wp )   ! freshwater flux
             ! NB: The 3D heat content due to qsr forcing (qsr_hc_b) is treated in traqsr
             ! To ensure restart capability with 3.3x/3.4 restart files    !! to be removed in v3.6
             IF( iom_varid( numror, 'sfx_b', ldstop = .FALSE. ) > 0 ) THEN
-               CALL iom_get( numror, jpdom_auto, 'sfx_b', sfx_b )  ! before salt flux (T-point)
+               CALL iom_get( numror, jpdom_auto, 'sfx_b', sfx_b, cd_type = 'T', psgn = 1._wp )   ! before salt flux (T-point)
             ELSE
                sfx_b (:,:) = sfx(:,:)
             ENDIF
          ELSE                                                   !* no restart: set from nit000 values
             IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000'
-            utau_b(:,:) = utau(:,:)
-            vtau_b(:,:) = vtau(:,:)
+            utau_b(:,:) = utauU(:,:)
+            vtau_b(:,:) = vtauV(:,:)
             qns_b (:,:) = qns (:,:)
             emp_b (:,:) = emp (:,:)
             sfx_b (:,:) = sfx (:,:)
          ENDIF
       ENDIF
       !
+      !
 #if defined key_RK3
       !                                                ! ---------------------------------------- !
       IF( lrst_oce .AND. lk_SWE ) THEN                 !   RK3: Write in the ocean restart file   !
@@ -577,41 +603,26 @@ CONTAINS
          IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   &
             &                    'at it= ', kt,' date= ', ndastp
          IF(lwp) WRITE(numout,*) '~~~~'
-         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utau )
-         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtau )
-         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns  )
+         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utauU )
+         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtauV )
+         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns   )
          ! The 3D heat content due to qsr forcing is treated in traqsr
          ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  )
-         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  )
-         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b'  , sfx  )
+         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp   )
+         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b'  , sfx   )
       ENDIF
       !                                                ! ---------------------------------------- !
       !                                                !        Outputs and control print         !
       !                                                ! ---------------------------------------- !
       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN
-         IF( iom_use("empmr") ) THEN
-            DO_2D( 0, 0, 0, 0 )
-               z2d(ji,jj) =  emp(ji,jj) - rnf(ji,jj)
-            END_2D
-            CALL iom_put( "empmr"  , z2d      )                ! upward water flux
-         ENDIF
-         IF( iom_use("empbmr") ) THEN
-            DO_2D( 0, 0, 0, 0 )
-               z2d(ji,jj) =  emp_b(ji,jj) - rnf(ji,jj)
-            END_2D
-            CALL iom_put( "empbmr" , z2d      )                ! before upward water flux ( needed to recalculate the time evolution of ssh in offline )
-         ENDIF
-         CALL iom_put( "saltflx", sfx         )                ! downward salt flux (includes virtual salt flux beneath ice in linear free surface case)
-         CALL iom_put( "fmmflx" , fmmflx      )                ! Freezing-melting water flux
-         IF( iom_use("qt") ) THEN
-            DO_2D( 0, 0, 0, 0 )
-               z2d(ji,jj) =  qns(ji,jj) + qsr(ji,jj)
-            END_2D
-            CALL iom_put( "qt"  , z2d         )                ! total heat flux
-         ENDIF
+         CALL iom_put( "empmr"  , emp(A2D(0))-rnf(A2D(0))     )                ! upward water flux
+         CALL iom_put( "empbmr" , emp_b(A2D(0))-rnf(A2D(0))   )                ! before upward water flux (for ssh in offline )
+         CALL iom_put( "saltflx", sfx         )                ! downward salt flux
+         CALL iom_put( "fwfice" , fwfice      )                ! ice-ocean freshwater flux
+         CALL iom_put( "qt"     , qns+qsr     )                ! total heat flux
          CALL iom_put( "qns"    , qns         )                ! solar heat flux
          CALL iom_put( "qsr"    , qsr         )                ! solar heat flux
-         IF( nn_ice > 0 .OR. ll_opa )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction
+         IF( nn_ice > 0 .OR. ll_opa )   CALL iom_put( "ice_cover", fr_i(:,:) )   ! ice fraction
          CALL iom_put( "taum"   , taum        )                ! wind stress module
          CALL iom_put( "wspd"   , wndm        )                ! wind speed  module over free ocean or leads in presence of sea-ice
          CALL iom_put( "qrp"    , qrp         )                ! heat flux damping
@@ -621,14 +632,14 @@ CONTAINS
       IF(sn_cfctl%l_prtctl) THEN     ! print mean trends (used for debugging)
          CALL prt_ctl(tab2d_1=fr_i                , clinfo1=' fr_i     - : ', mask1=tmask )
          CALL prt_ctl(tab2d_1=(emp-rnf)           , clinfo1=' emp-rnf  - : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=(sfx-rnf)           , clinfo1=' sfx-rnf  - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=(sfx-rnf(A2D(0)))   , clinfo1=' sfx-rnf  - : ', mask1=tmask )
          CALL prt_ctl(tab2d_1=qns                 , clinfo1=' qns      - : ', mask1=tmask )
          CALL prt_ctl(tab2d_1=qsr                 , clinfo1=' qsr      - : ', mask1=tmask )
          CALL prt_ctl(tab3d_1=tmask               , clinfo1=' tmask    - : ', mask1=tmask, kdim=jpk )
-         CALL prt_ctl(tab3d_1=ts(:,:,:,jp_tem,Kmm), clinfo1=' sst      - : ', mask1=tmask, kdim=1   )
-         CALL prt_ctl(tab3d_1=ts(:,:,:,jp_sal,Kmm), clinfo1=' sss      - : ', mask1=tmask, kdim=1   )
-         CALL prt_ctl(tab2d_1=utau                , clinfo1=' utau     - : ', mask1=umask,                      &
-            &         tab2d_2=vtau                , clinfo2=' vtau     - : ', mask2=vmask )
+         CALL prt_ctl(tab2d_1=sst_m               , clinfo1=' sst      - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=sss_m               , clinfo1=' sss      - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=utau                , clinfo1=' utau     - : ', mask1=tmask,                      &
+            &         tab2d_2=vtau                , clinfo2=' vtau     - : ', mask2=tmask )
       ENDIF
 
       IF( kt == nitend )   CALL sbc_final         ! Close down surface module if necessary
diff --git a/src/OCE/SBC/sbcrnf.F90 b/src/OCE/SBC/sbcrnf.F90
index 758d4f4b..4ceb8bca 100644
--- a/src/OCE/SBC/sbcrnf.F90
+++ b/src/OCE/SBC/sbcrnf.F90
@@ -83,9 +83,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  ROUTINE sbc_rnf_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( rnfmsk(jpi,jpj)         , rnfmsk_z(jpk)          ,     &
-         &      h_rnf (jpi,jpj)         , nk_rnf  (jpi,jpj)      ,     &
-         &      rnf_tsc_b(jpi,jpj,jpts) , rnf_tsc (jpi,jpj,jpts) , STAT=sbc_rnf_alloc )
+      ALLOCATE( rnfmsk(jpi,jpj)        , rnfmsk_z(jpk)         ,     & ! needed over the whole domain by muscl (traadv_muscl)
+         &      h_rnf (A2D(0))         , nk_rnf  (A2D(0))      ,     &
+         &      rnf_tsc_b(A2D(0),jpts) , rnf_tsc (A2D(0),jpts) , STAT=sbc_rnf_alloc )
          !
       CALL mpp_sum ( 'sbcrnf', sbc_rnf_alloc )
       IF( sbc_rnf_alloc > 0 )   CALL ctl_warn('sbc_rnf_alloc: allocation of arrays failed')
@@ -109,8 +109,6 @@ CONTAINS
       INTEGER  ::   ji, jj    ! dummy loop indices
       INTEGER  ::   z_err = 0 ! dummy integer for error handling
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztfrz   ! freezing point used for temperature correction
-      !
       !
       !                                            !-------------------!
       !                                            !   Update runoff   !
@@ -118,8 +116,8 @@ CONTAINS
       !
       !
       IF( .NOT. l_rnfcpl )  THEN
-                            CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt ( runoffs + iceberg )
-         IF( ln_rnf_icb )   CALL fld_read ( kt, nn_fsbc, sf_i_rnf )    ! idem for iceberg flux if required
+                             CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt ( runoffs + iceberg )
+         IF( ln_rnf_icb )    CALL fld_read ( kt, nn_fsbc, sf_i_rnf )    ! idem for iceberg flux if required
       ENDIF
       IF(   ln_rnf_tem   )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required
       IF(   ln_rnf_sal   )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required
@@ -127,10 +125,10 @@ CONTAINS
       IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN
          !
          IF( .NOT. l_rnfcpl ) THEN
-             rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1)  ! updated runoff value at time step kt
+             rnf(A2D(0)) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * smask0(:,:)  ! updated runoff value at time step kt
              IF( ln_rnf_icb ) THEN
-                fwficb(:,:) = rn_rfact * ( sf_i_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1)  ! updated runoff value at time step kt
-                rnf(:,:) = rnf(:,:) + fwficb(:,:)
+                fwficb(:,:) = rn_rfact * ( sf_i_rnf(1)%fnow(:,:,1) ) * smask0(:,:)  ! updated runoff value at time step kt
+                rnf(A2D(0)) = rnf(A2D(0)) + fwficb(:,:)
                 qns(:,:) = qns(:,:) - fwficb(:,:) * rLfus
                 !!qns_tot(:,:) = qns_tot(:,:) - fwficb(:,:) * rLfus                
                 !!qns_oce(:,:) = qns_oce(:,:) - fwficb(:,:) * rLfus                
@@ -141,17 +139,16 @@ CONTAINS
          !
          !                                                           ! set temperature & salinity content of runoffs
          IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data
-            rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0
-            CALL eos_fzp( sss_m(:,:), ztfrz(:,:) )
+            rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(A2D(0)) * r1_rho0
             WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature
-               rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rho0
+               rnf_tsc(:,:,jp_tem) = sst_m(A2D(0)) * rnf(A2D(0)) * r1_rho0
             END WHERE
          ELSE                                                        ! use SST as runoffs temperature
             !CEOD River is fresh water so must at least be 0 unless we consider ice
-            rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:), 0.0_wp ) * rnf(:,:) * r1_rho0
+            rnf_tsc(:,:,jp_tem) = MAX( sst_m(A2D(0)), 0.0_wp ) * rnf(A2D(0)) * r1_rho0
          ENDIF
          !                                                           ! use runoffs salinity data
-         IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0
+         IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(A2D(0)) * r1_rho0
          !                                                           ! else use S=0 for runoffs (done one for all in the init)
                                          CALL iom_put( 'runoffs'     , rnf(:,:)                         )   ! output runoff mass flux
          IF( iom_use('hflx_rnf_cea') )   CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * rho0 * rcp )   ! output runoff sensible heat (W/m2)
@@ -168,13 +165,15 @@ CONTAINS
             CALL iom_get( numror, jpdom_auto, 'rnf_sc_b', rnf_tsc_b(:,:,jp_sal) )   ! before salinity content of runoff
          ELSE                                                !* no restart: set from nit000 values
             IF(lwp) WRITE(numout,*) '          nit000-1 runoff forcing fields set to nit000'
-            rnf_b    (:,:  ) = rnf    (:,:  )
-            rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:)
+            CALL lbc_lnk( 'sbcrnf', rnf, 'T', 1.0_wp )
+            rnf_b    (:,:)    = rnf    (:,:)
+            rnf_tsc_b(:,:,:)  = rnf_tsc(:,:,:)
          ENDIF
       ENDIF
       !                                                ! ---------------------------------------- !
       IF( lrst_oce ) THEN                              !      Write in the ocean restart file     !
          !                                             ! ---------------------------------------- !
+         !
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) 'sbcrnf : runoff forcing fields written in ocean restart file ',   &
             &                    'at it= ', kt,' date= ', ndastp
@@ -210,7 +209,7 @@ CONTAINS
       !
       IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN      !==   runoff distributed over several levels   ==!
          IF( ln_linssh ) THEN    !* constant volume case : just apply the runoff input flow
-            DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                DO jk = 1, nk_rnf(ji,jj)
 #if defined key_RK3
                   phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - rnf(ji,jj) * r1_rho0 / h_rnf(ji,jj)                    ! RK3: rnf forcing at n+1/2
@@ -220,14 +219,10 @@ CONTAINS
                END DO
             END_2D
          ELSE                    !* variable volume case
-            DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )         ! update the depth over which runoffs are distributed
+            DO_2D( 0, 0, 0, 0 )         ! update the depth over which runoffs are distributed
                h_rnf(ji,jj) = 0._wp
-               DO jk = 1, nk_rnf(ji,jj)                             ! recalculates h_rnf to be the depth in metres
-                  h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)   ! to the bottom of the relevant grid box
-               END DO
-            END_2D
-            DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )         ! apply the runoff input flow
                DO jk = 1, nk_rnf(ji,jj)
+                  h_rnf(ji,jj)     = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) ! recalculates h_rnf to be the depth in metres to the bottom of the relevant grid box
 #if defined key_RK3
                   phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - rnf(ji,jj) * r1_rho0 / h_rnf(ji,jj)                    ! RK3: rnf forcing at n+1/2
 #else
@@ -237,10 +232,8 @@ CONTAINS
             END_2D
          ENDIF
       ELSE                       !==   runoff put only at the surface   ==!
-         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             h_rnf (ji,jj)   = e3t(ji,jj,1,Kmm)        ! update h_rnf to be depth of top box
-         END_2D
-         DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls )
 #if defined key_RK3
             phdivn(ji,jj,1) = phdivn(ji,jj,1) - rnf(ji,jj) * r1_rho0 / e3t(ji,jj,1,Kmm)                    ! RK3: rnf forcing at n+1/2
 #else
@@ -269,7 +262,7 @@ CONTAINS
       INTEGER           ::   ios           ! Local integer output status for namelist read
       INTEGER           ::   nbrec         ! temporary integer
       REAL(wp)          ::   zacoef
-      REAL(wp), DIMENSION(jpi,jpj,2) :: zrnfcl
+      REAL(wp), DIMENSION(A2D(0),2) :: zrnfcl
       !!
       NAMELIST/namsbc_rnf/ cn_dir            , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, ln_rnf_icb,   &
          &                 sn_rnf, sn_cnf    , sn_i_rnf, sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   &
@@ -323,8 +316,8 @@ CONTAINS
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_rnf structure' )   ;   RETURN
          ENDIF
-         ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1)   )
-         IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_rnf(1)%fnow(A2D(0),1)   )
+         IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf', no_print )
          !
          IF( ln_rnf_icb ) THEN                      ! Create (if required) sf_i_rnf structure
@@ -334,11 +327,13 @@ CONTAINS
             IF( ierror > 0 ) THEN
                CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_i_rnf structure' )   ;   RETURN
             ENDIF
-            ALLOCATE( sf_i_rnf(1)%fnow(jpi,jpj,1)   )
-            IF( sn_i_rnf%ln_tint ) ALLOCATE( sf_i_rnf(1)%fdta(jpi,jpj,1,2) )
+            ALLOCATE( sf_i_rnf(1)%fnow(A2D(0),1)   )
+            IF( sn_i_rnf%ln_tint ) ALLOCATE( sf_i_rnf(1)%fdta(A2D(0),1,2) )
             CALL fld_fill (sf_i_rnf, (/ sn_i_rnf /), cn_dir, 'sbc_rnf_init', 'read iceberg flux data', 'namsbc_rnf' )
          ELSE
-            fwficb(:,:) = 0._wp
+            DO_2D( 0, 0, 0, 0 )
+               fwficb(ji,jj) = 0._wp
+            END_2D
          ENDIF
 
       ENDIF
@@ -350,8 +345,8 @@ CONTAINS
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' )   ;   RETURN
          ENDIF
-         ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1)   )
-         IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_t_rnf(1)%fnow(A2D(0),1)   )
+         IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf', no_print )
       ENDIF
       !
@@ -362,8 +357,8 @@ CONTAINS
          IF( ierror > 0 ) THEN
             CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' )   ;   RETURN
          ENDIF
-         ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1)   )
-         IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_s_rnf(1)%fnow(A2D(0),1)   )
+         IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(A2D(0),1,2) )
          CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf', no_print )
       ENDIF
       !
@@ -378,8 +373,7 @@ CONTAINS
          CALL iom_get  ( inum, jpdom_global, sn_dep_rnf%clvar, h_rnf, kfill = jpfillcopy )   ! read the river mouth. no 0 on halos!
          CALL iom_close( inum )                                                              ! close file
          !
-         nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )      ! set the number of level over which river runoffs are applied
             IF( h_rnf(ji,jj) > 0._wp ) THEN
                jk = 2
                DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1
@@ -392,7 +386,8 @@ CONTAINS
                WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj)
             ENDIF
          END_2D
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                           ! set the associated depth
+         !
+         DO_2D( 0, 0, 0, 0 )      ! set the associated depth
             h_rnf(ji,jj) = 0._wp
             DO jk = 1, nk_rnf(ji,jj)
                h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)
@@ -407,7 +402,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) '        depth over which runoffs is spread                        rn_dep_max = ', rn_dep_max
          IF(lwp) WRITE(numout,*) '        create (=1) a runoff depth file or not (=0)      nn_rnf_depth_file  = ', nn_rnf_depth_file
 
-         CALL iom_open( TRIM( sn_rnf%clname ), inum )    !  open runoff file
+         CALL iom_open( TRIM( sn_rnf%clname ), inum ) !  open runoff file
          nbrec = iom_getszuld( inum )
          zrnfcl(:,:,1) = 0._wp                                                            ! init the max to 0. in 1
          DO jm = 1, nbrec
@@ -416,21 +411,20 @@ CONTAINS
          END DO
          CALL iom_close( inum )
          !
-         h_rnf(:,:) = 1.
-         !
-         zacoef = rn_dep_max / rn_rnf_max            ! coef of linear relation between runoff and its depth (150m for max of runoff)
+         zacoef = rn_dep_max / rn_rnf_max             ! coef of linear relation between runoff and its depth (150m for max of runoff)
          !
-         WHERE( zrnfcl(:,:,1) > 0._wp )  h_rnf(:,:) = zacoef * zrnfcl(:,:,1)   ! compute depth for all runoffs
+         WHERE( zrnfcl(:,:,1) > 0._wp ) ; h_rnf(:,:) = zacoef * zrnfcl(:,:,1)   ! compute depth for all runoffs
+         ELSEWHERE                      ; h_rnf(:,:) = 1._wp
+         ENDWHERE
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                ! take in account min depth of ocean rn_hmin
+         DO_2D( 0, 0, 0, 0 )      ! take in account min depth of ocean rn_hmin
             IF( zrnfcl(ji,jj,1) > 0._wp ) THEN
                jk = mbkt(ji,jj)
                h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) )
             ENDIF
          END_2D
          !
-         nk_rnf(:,:) = 0                       ! number of levels on which runoffs are distributed
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )      ! number of levels on which runoffs are distributed
             IF( zrnfcl(ji,jj,1) > 0._wp ) THEN
                jk = 2
                DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1
@@ -441,27 +435,33 @@ CONTAINS
             ENDIF
          END_2D
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                          ! set the associated depth
+         DO_2D( 0, 0, 0, 0 )      ! set the associated depth
             h_rnf(ji,jj) = 0._wp
             DO jk = 1, nk_rnf(ji,jj)
                h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)
             END DO
          END_2D
          !
-         IF( nn_rnf_depth_file == 1 ) THEN      !  save  output nb levels for runoff
+         IF( nn_rnf_depth_file == 1 ) THEN            !  save  output nb levels for runoff
             IF(lwp) WRITE(numout,*) '   ==>>>   create runoff depht file'
             CALL iom_open  ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE. )
             CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf )
             CALL iom_close ( inum )
          ENDIF
-      ELSE                                       ! runoffs applied at the surface
-         nk_rnf(:,:) = 1
-         h_rnf (:,:) = e3t(:,:,1,Kmm)
+      ELSE                                            ! runoffs applied at the surface
+         DO_2D( 0, 0, 0, 0 )
+            nk_rnf(ji,jj) = 1
+            h_rnf (ji,jj) = e3t(ji,jj,1,Kmm)
+         END_2D
       ENDIF
       !
-      rnf(:,:) =  0._wp                         ! runoff initialisation
-      rnf_tsc(:,:,:) = 0._wp                    ! runoffs temperature & salinty contents initilisation
-      !
+      DO_2D( 0, 0, 0, 0 )
+         rnf(ji,jj) =  0._wp                          ! runoff initialisation
+      END_2D
+      DO_3D( 0, 0, 0, 0, 1, jpts )
+         rnf_tsc(ji,jj,jk) = 0._wp                    ! runoffs temperature & salinty contents initilisation
+      END_3D
+         !
       !                                   ! ========================
       !                                   !   River mouth vicinity
       !                                   ! ========================
@@ -479,7 +479,7 @@ CONTAINS
             nkrnf = 2
             DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1
             END DO
-            IF( ln_sco )   CALL ctl_warn( 'sbc_rnf_init: number of levels over which Kz is increased is computed for zco...' )
+            IF( l_sco )   CALL ctl_warn( 'sbc_rnf_init: number of levels over which Kz is increased is computed for zco...' )
          ENDIF
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   Specific treatment used in vicinity of river mouths :'
@@ -493,11 +493,13 @@ CONTAINS
       ELSE                                      ! No treatment at river mouths
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   No specific treatment at river mouths'
-         rnfmsk  (:,:) = 0._wp
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            rnfmsk(ji,jj) = 0._wp
+         END_2D
          rnfmsk_z(:)   = 0._wp
          nkrnf = 0
       ENDIF
-      !
+     !
    END SUBROUTINE sbc_rnf_init
 
 
@@ -535,9 +537,9 @@ CONTAINS
       ENDIF
       !
       ! horizontal mask (read in NetCDF file)
-      CALL iom_open ( cl_rnfile, inum )                             ! open file
-      CALL iom_get  ( inum, jpdom_global, sn_cnf%clvar, rnfmsk )    ! read the river mouth array
-      CALL iom_close( inum )                                        ! close file
+      CALL iom_open ( cl_rnfile, inum )                                     ! open file
+      CALL iom_get  ( inum, jpdom_global, sn_cnf%clvar, rnfmsk(A2D(0)) )    ! read the river mouth array
+      CALL iom_close( inum )                                                ! close file
       !
       IF( l_clo_rnf )   CALL clo_rnf( rnfmsk )   ! closed sea inflow set as river mouth
       !
@@ -548,6 +550,8 @@ CONTAINS
       rnfmsk_z(4)   = 0.25                                        ! **********
       rnfmsk_z(5)   = 0.125
       !
+      CALL lbc_lnk( 'rnf_mouth', rnfmsk, 'T', 1._wp )   ! needed by muscl scheme (traadv_muscl)
+      !
    END SUBROUTINE rnf_mouth
 
    !!======================================================================
diff --git a/src/OCE/SBC/sbcssm.F90 b/src/OCE/SBC/sbcssm.F90
index 1db7fb00..e00f4d24 100644
--- a/src/OCE/SBC/sbcssm.F90
+++ b/src/OCE/SBC/sbcssm.F90
@@ -31,6 +31,7 @@ MODULE sbcssm
 
    LOGICAL, SAVE ::   l_ssm_mean = .FALSE.   ! keep track of whether means have been read from restart file
 
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -58,6 +59,7 @@ CONTAINS
       INTEGER  ::   ji, jj               ! loop index
       REAL(wp) ::   zcoef, zf_sbc       ! local scalar
       REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ztc    ! Working array for conservative temperature calculation
       !!---------------------------------------------------------------------
       !
       !                                        !* surface T-, U-, V- ocean level variables (T, S, depth, velocity)
@@ -74,7 +76,7 @@ CONTAINS
          !                                                ! ---------------------------------------- !
          ssu_m(:,:) = uu(:,:,1,Kbb)
          ssv_m(:,:) = vv(:,:,1,Kbb)
-         IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
+         IF( l_useCT )  THEN    ;   CALL eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal), sst_m(:,:) )
          ELSE                   ;   sst_m(:,:) = zts(:,:,jp_tem)
          ENDIF
          sss_m(:,:) = zts(:,:,jp_sal)
@@ -92,6 +94,8 @@ CONTAINS
          frq_m(:,:) = fraqsr_1lev(:,:)
          !
       ELSE
+         IF( l_useCT ) ALLOCATE( ztc(A2D(nn_hls)) )
+         !
          !                                                ! ----------------------------------------------- !
          IF( kt == nit000 .AND. .NOT. l_ssm_mean ) THEN   !   Initialisation: 1st time-step, no input means !
             !                                             ! ----------------------------------------------- !
@@ -101,8 +105,11 @@ CONTAINS
             zcoef = REAL( nn_fsbc - 1, wp )
             ssu_m(:,:) = zcoef * uu(:,:,1,Kbb)
             ssv_m(:,:) = zcoef * vv(:,:,1,Kbb)
-            IF( l_useCT   )  THEN   ;   sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
-            ELSE                    ;   sst_m(:,:) = zcoef * zts(:,:,jp_tem)
+            IF( l_useCT   )  THEN
+               CALL eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal), ztc(:,:) )
+               sst_m(:,:) = zcoef * ztc(:,:)
+            ELSE
+               sst_m(:,:) = zcoef * zts(:,:,jp_tem)
             ENDIF
             sss_m(:,:) = zcoef * zts(:,:,jp_sal)
             !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics)
@@ -133,8 +140,11 @@ CONTAINS
          !                                                ! ---------------------------------------- !
          ssu_m(:,:) = ssu_m(:,:) + uu(:,:,1,Kbb)
          ssv_m(:,:) = ssv_m(:,:) + vv(:,:,1,Kbb)
-         IF( l_useCT )  THEN     ;   sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
-         ELSE                    ;   sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem)
+         IF( l_useCT )  THEN
+            CALL eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal), ztc(:,:) )
+            sst_m(:,:) = sst_m(:,:) + ztc(:,:)
+         ELSE
+            sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem)
          ENDIF
          sss_m(:,:) = sss_m(:,:) + zts(:,:,jp_sal)
          !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics)
@@ -182,6 +192,8 @@ CONTAINS
             !
          ENDIF
          !
+         IF( l_useCT ) DEALLOCATE( ztc )
+         !
       ENDIF
       !
       IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   !
@@ -258,7 +270,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) '   default initialisation of ss._m arrays'
          ssu_m(:,:) = uu(:,:,1,Kbb)
          ssv_m(:,:) = vv(:,:,1,Kbb)
-         IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm) )
+         IF( l_useCT )  THEN    ;   CALL eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm), sst_m(:,:) )
          ELSE                   ;   sst_m(:,:) = ts(:,:,1,jp_tem,Kmm)
          ENDIF
          sss_m(:,:) = ts  (:,:,1,jp_sal,Kmm)
diff --git a/src/OCE/SBC/sbcssr.F90 b/src/OCE/SBC/sbcssr.F90
index 09088c45..2b607dbb 100644
--- a/src/OCE/SBC/sbcssr.F90
+++ b/src/OCE/SBC/sbcssr.F90
@@ -97,8 +97,8 @@ CONTAINS
             erp(:,:) = 0._wp
             !
             IF( nn_sstr == 1 ) THEN                                   !* Temperature restoring term
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-                  zqrp = rn_dqdt * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj,1) ) * tmask(ji,jj,1)
+               DO_2D( 0, 0, 0, 0 )
+                  zqrp = rn_dqdt * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj,1) ) * smask0(ji,jj)
                   qns(ji,jj) = qns(ji,jj) + zqrp
                   qrp(ji,jj) = zqrp
                END_2D
@@ -107,7 +107,7 @@ CONTAINS
             IF( nn_sssr /= 0 .AND. nn_sssr_ice /= 1 ) THEN
               ! use fraction of ice ( fr_i ) to adjust relaxation under ice if nn_sssr_ice .ne. 1
               ! n.b. coefice is initialised and fixed to 1._wp if nn_sssr_ice = 1
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               DO_2D( 0, 0, 0, 0 )
                   SELECT CASE ( nn_sssr_ice )
                     CASE ( 0 )    ;  coefice(ji,jj) = 1._wp - fr_i(ji,jj)              ! no/reduced damping under ice
                     CASE  DEFAULT ;  coefice(ji,jj) = 1._wp + ( nn_sssr_ice - 1 ) * fr_i(ji,jj) ! reinforced damping (x nn_sssr_ice) under ice )
@@ -117,10 +117,10 @@ CONTAINS
             !
             IF( nn_sssr == 1 ) THEN                                   !* Salinity damping term (salt flux only (sfx))
                zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s]
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               DO_2D( 0, 0, 0, 0 )
                   zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths
                      &        *   coefice(ji,jj)            &      ! Optional control of damping under sea-ice
-                     &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) * tmask(ji,jj,1)
+                     &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) * smask0(ji,jj)
                   sfx(ji,jj) = sfx(ji,jj) + zerp                 ! salt flux
                   erp(ji,jj) = zerp / MAX( sss_m(ji,jj), 1.e-20 ) ! converted into an equivalent volume flux (diagnostic only)
                END_2D
@@ -128,21 +128,21 @@ CONTAINS
             ELSEIF( nn_sssr == 2 ) THEN                               !* Salinity damping term (volume flux (emp) and associated heat flux (qns)
                zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s]
                zerp_bnd = rn_sssr_bnd / rday                          !       -              -    
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               DO_2D( 0, 0, 0, 0 )
                   zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths
                      &        *   coefice(ji,jj)            &      ! Optional control of damping under sea-ice
                      &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) )   &
-                     &        / MAX(  sss_m(ji,jj), 1.e-20   ) * tmask(ji,jj,1)
+                     &        / MAX(  sss_m(ji,jj), 1.e-20   ) * smask0(ji,jj)
                   IF( ln_sssr_bnd )   zerp = SIGN( 1.0_wp, zerp ) * MIN( zerp_bnd, ABS(zerp) )
-                  emp(ji,jj) = emp (ji,jj) + zerp
-                  qns(ji,jj) = qns(ji,jj) - zerp * rcp * sst_m(ji,jj)
                   erp(ji,jj) = zerp
-                  qrp(ji,jj) = qrp(ji,jj) - zerp * rcp * sst_m(ji,jj)
+                  emp(ji,jj) = emp(ji,jj) + erp(ji,jj)
+                  qns(ji,jj) = qns(ji,jj) - erp(ji,jj) * rcp * sst_m(ji,jj)
+                  qrp(ji,jj) = qrp(ji,jj) - erp(ji,jj) * rcp * sst_m(ji,jj)
                END_2D
             ENDIF
             ! outputs
             CALL iom_put( 'hflx_ssr_cea', qrp(:,:) )
-            IF( nn_sssr == 1 )   CALL iom_put( 'sflx_ssr_cea',  erp(:,:) * sss_m(:,:) )
+            IF( nn_sssr == 1 )   CALL iom_put( 'sflx_ssr_cea',  erp(:,:) * sss_m(A2D(0)) )
             IF( nn_sssr == 2 )   CALL iom_put( 'vflx_ssr_cea', -erp(:,:) )
             !
          ENDIF
@@ -207,12 +207,12 @@ CONTAINS
          !
          ALLOCATE( sf_sst(1), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sst structure' )
-         ALLOCATE( sf_sst(1)%fnow(jpi,jpj,1), STAT=ierror )
+         ALLOCATE( sf_sst(1)%fnow(A2D(0),1), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sst now array' )
          !
          ! fill sf_sst with sn_sst and control print
          CALL fld_fill( sf_sst, (/ sn_sst /), cn_dir, 'sbc_ssr', 'SST restoring term toward SST data', 'namsbc_ssr', no_print )
-         IF( sf_sst(1)%ln_tint )   ALLOCATE( sf_sst(1)%fdta(jpi,jpj,1,2), STAT=ierror )
+         IF( sf_sst(1)%ln_tint )   ALLOCATE( sf_sst(1)%fdta(A2D(0),1,2), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sst data array' )
          !
       ENDIF
@@ -221,12 +221,12 @@ CONTAINS
          !
          ALLOCATE( sf_sss(1), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sss structure' )
-         ALLOCATE( sf_sss(1)%fnow(jpi,jpj,1), STAT=ierror )
+         ALLOCATE( sf_sss(1)%fnow(A2D(0),1), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sss now array' )
          !
          ! fill sf_sss with sn_sss and control print
          CALL fld_fill( sf_sss, (/ sn_sss /), cn_dir, 'sbc_ssr', 'SSS restoring term toward SSS data', 'namsbc_ssr', no_print )
-         IF( sf_sss(1)%ln_tint )   ALLOCATE( sf_sss(1)%fdta(jpi,jpj,1,2), STAT=ierror )
+         IF( sf_sss(1)%ln_tint )   ALLOCATE( sf_sss(1)%fdta(A2D(0),1,2), STAT=ierror )
          IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ssr: unable to allocate sf_sss data array' )
          !
       ENDIF
@@ -244,7 +244,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       sbc_ssr_alloc = 0       ! set to zero if no array to be allocated
       IF( .NOT. ALLOCATED( erp ) ) THEN
-         ALLOCATE( qrp(jpi,jpj), erp(jpi,jpj), coefice(jpi,jpj), STAT= sbc_ssr_alloc )
+         ALLOCATE( qrp(A2D(0)), erp(A2D(0)), coefice(A2D(0)), STAT= sbc_ssr_alloc )
          !
          IF( lk_mpp                  )   CALL mpp_sum ( 'sbcssr', sbc_ssr_alloc )
          IF( sbc_ssr_alloc /= 0 )   CALL ctl_warn('sbc_ssr_alloc: failed to allocate arrays.')
diff --git a/src/OCE/SBC/sbcwave.F90 b/src/OCE/SBC/sbcwave.F90
index 2264938d..24781602 100644
--- a/src/OCE/SBC/sbcwave.F90
+++ b/src/OCE/SBC/sbcwave.F90
@@ -22,7 +22,6 @@ MODULE sbcwave
    USE dom_oce        ! ocean domain variables
    USE sbc_oce        ! Surface boundary condition: ocean fields
    USE bdy_oce        ! open boundary condition variables
-   USE domvvl         ! domain: variable volume layers
    USE zdf_oce,  ONLY : ln_zdfswm ! Qiao wave enhanced mixing 
    !
    USE iom            ! I/O manager library
@@ -115,14 +114,13 @@ CONTAINS
       INTEGER  ::   jj, ji, jk   ! dummy loop argument
       INTEGER  ::   ik           ! local integer
       REAL(wp) ::  ztransp, zfac, ztemp, zsp0, zsqrt, zbreiv16_w
-      REAL(wp) ::  zdep_u, zdep_v, zkh_u, zkh_v, zda_u, zda_v, sdtrp
+      REAL(wp) ::  zdep_u, zdep_v, zkh_u, zkh_v, zda_u, zda_v, sdtrp, zInt_w0, zInt_w1
       REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   zk_t, zk_u, zk_v, zu0_sd, zv0_sd ! 2D workspace
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3divh, zInt_w                  ! 3D workspace
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ze3divh                          ! 3D workspace
       !!---------------------------------------------------------------------
       !
       ALLOCATE( ze3divh(jpi,jpj,jpkm1) ) ! jpkm1 -> avoid lbc_lnk on jpk that is not defined
-      ALLOCATE( zInt_w(jpi,jpj,jpk) )
-      ALLOCATE( zk_t(jpi,jpj), zk_u(jpi,jpj), zk_v(jpi,jpj), zu0_sd(jpi,jpj), zv0_sd(jpi,jpj) )
+      ALLOCATE( zk_t(A2D(1)), zk_u(A2D(0)), zk_v(A2D(0)), zu0_sd(A2D(1)), zv0_sd(A2D(1)) )
       zk_t    (:,:) = 0._wp
       zk_u    (:,:) = 0._wp
       zk_v    (:,:) = 0._wp
@@ -138,7 +136,7 @@ CONTAINS
       !                sdtrp is the norm of Stokes transport
       !
          zfac = 0.166666666667_wp
-         DO_2D( 1, 1, 1, 1 ) ! In the deep-water limit we have ke = ||ust0||/( 6 * ||transport|| )
+         DO_2D( 0, 1, 0, 1 ) ! In the deep-water limit we have ke = ||ust0||/( 6 * ||transport|| )
             zsp0          = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj) ) !<-- norm of Surface Stokes drift
             tsd2d(ji,jj)  = zsp0
             IF( cpl_tusd .AND. cpl_tvsd ) THEN  !stokes transport is provided in coupled mode
@@ -150,35 +148,40 @@ CONTAINS
             ENDIF
             zk_t (ji,jj)  = zfac * zsp0 / MAX ( sdtrp, 0.0000001_wp ) !<-- ke = ||ust0||/( 6 * ||transport|| )
          END_2D
-      !# define zInt_w ze3divh
-         DO_3D( 1, 1, 1, 1, 1, jpk ) ! Compute the primitive of Breivik 2016 function at W-points
-            zfac             = - 2._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm)  !<-- zfac should be negative definite
-            ztemp            = EXP ( zfac )
-            zsqrt            = SQRT( -zfac )
-            zbreiv16_w       = ztemp - SQRT(rpi)*zsqrt*ERFC(zsqrt) !Eq. 16 Breivik 2016
-            zInt_w(ji,jj,jk) = ztemp - 4._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm) * zbreiv16_w
-         END_3D
-!
+         !
          DO jk = 1, jpkm1
             zfac = 0.166666666667_wp
-            DO_2D( 1, 1, 1, 1 ) !++ Compute the FV Breivik 2016 function at T-points
+            DO_2D( 0, 1, 0, 1 ) !++ Compute the FV Breivik 2016 function at T-points
+               ! zInt at jk
+               zfac       = - 2._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm)  !<-- zfac should be negative definite
+               ztemp      = EXP ( zfac )
+               zsqrt      = SQRT( -zfac )
+               zbreiv16_w = ztemp - SQRT(rpi)*zsqrt*ERFC(zsqrt) !Eq. 16 Breivik 2016
+               zInt_w0    = ztemp - 4._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm) * zbreiv16_w
+               ! zInt at jk+1
+               zfac       = - 2._wp * zk_t (ji,jj) * gdepw(ji,jj,jk+1,Kmm)  !<-- zfac should be negative definite
+               ztemp      = EXP ( zfac )
+               zsqrt      = SQRT( -zfac )
+               zbreiv16_w = ztemp - SQRT(rpi)*zsqrt*ERFC(zsqrt) !Eq. 16 Breivik 2016
+               zInt_w1    = ztemp - 4._wp * zk_t (ji,jj) * gdepw(ji,jj,jk+1,Kmm) * zbreiv16_w
+               !
+               !
                zsp0          = zfac / MAX(zk_t (ji,jj),0.0000001_wp)
-               ztemp         = zInt_w(ji,jj,jk) - zInt_w(ji,jj,jk+1)
+               ztemp         = zInt_w0 - zInt_w1
                zu0_sd(ji,jj) = ut0sd(ji,jj) * zsp0 * ztemp * tmask(ji,jj,jk)
                zv0_sd(ji,jj) = vt0sd(ji,jj) * zsp0 * ztemp * tmask(ji,jj,jk)
             END_2D
-            DO_2D( 1, 0, 1, 0 ) ! ++ Interpolate at U/V points
+            DO_2D( 0, 0, 0, 0 ) ! ++ Interpolate at U/V points
                zfac          =  1.0_wp / e3u(ji  ,jj,jk,Kmm)
                usd(ji,jj,jk) =  0.5_wp * zfac * ( zu0_sd(ji,jj)+zu0_sd(ji+1,jj) ) * umask(ji,jj,jk)
                zfac          =  1.0_wp / e3v(ji  ,jj,jk,Kmm)
                vsd(ji,jj,jk) =  0.5_wp * zfac * ( zv0_sd(ji,jj)+zv0_sd(ji,jj+1) ) * vmask(ji,jj,jk)
             END_2D
          ENDDO
-      !# undef zInt_w
-      !
+         !
       ELSE
          zfac = 2.0_wp * rpi / 16.0_wp
-         DO_2D( 1, 1, 1, 1 )
+         DO_2D( 0, 1, 0, 1 )
             ! Stokes drift velocity estimated from Hs and Tmean
             ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp )
             ! Stokes surface speed
@@ -186,7 +189,7 @@ CONTAINS
             ! Wavenumber scale
             zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp )
          END_2D
-         DO_2D( 1, 0, 1, 0 )          ! exp. wave number & Stokes drift velocity at u- & v-points
+         DO_2D( 0, 0, 0, 0 )          ! exp. wave number & Stokes drift velocity at u- & v-points
             zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) )
             zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) )
             !
@@ -217,11 +220,10 @@ CONTAINS
       !                       !==  vertical Stokes Drift 3D velocity  ==!
       !
       DO_3D( 0, 1, 0, 1, 1, jpkm1 )    ! Horizontal e3*divergence
-         ze3divh(ji,jj,jk) = (  e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * usd(ji  ,jj,jk)    &
-            &                 - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * usd(ji-1,jj,jk)    &
-            &                 + e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vsd(ji,jj  ,jk)    &
-            &                 - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vsd(ji,jj-1,jk)  ) &
-            &                * r1_e1e2t(ji,jj)
+         ze3divh(ji,jj,jk) = (  ( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * usd(ji  ,jj,jk)     &   ! add () for NP repro
+            &                   - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * usd(ji-1,jj,jk) )   &
+            &                 + ( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vsd(ji,jj  ,jk)     &
+            &                   - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vsd(ji,jj-1,jk) ) ) * r1_e1e2t(ji,jj)
       END_3D
       !
       CALL lbc_lnk( 'sbcwave', ze3divh, 'T', 1.0_wp )
@@ -248,7 +250,7 @@ CONTAINS
       CALL iom_put( "vstokes",  vsd  )
       CALL iom_put( "wstokes",  wsd  )
 !      !
-      DEALLOCATE( ze3divh, zInt_w )
+      DEALLOCATE( ze3divh )
       DEALLOCATE( zk_t, zk_u, zk_v, zu0_sd, zv0_sd )
       !
    END SUBROUTINE sbc_stokes
@@ -274,12 +276,12 @@ CONTAINS
       !
       IF( ln_cdgw .AND. .NOT. cpl_wdrag ) THEN     !==  Neutral drag coefficient  ==!
          CALL fld_read( kt, nn_fsbc, sf_cd )             ! read from external forcing
-         cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) * tmask(:,:,1)
+         cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) * smask0(:,:)
       ENDIF
 
       IF( ln_tauoc .AND. .NOT. cpl_wstrf ) THEN    !==  Wave induced stress  ==!
          CALL fld_read( kt, nn_fsbc, sf_tauoc )          ! read stress reduction factor due to wave from external forcing
-         tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) * tmask(:,:,1)
+         tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) * smask0(:,:)
       ELSEIF ( ln_taw .AND. cpl_taw ) THEN
          IF (kt < 1) THEN ! The first fields gave by OASIS have very high erroneous values ....
             twox(:,:)=0._wp
@@ -315,7 +317,7 @@ CONTAINS
          ! coupling routines
          IF( ln_zdfswm .AND. .NOT. cpl_wnum ) THEN     !==wavenumber==!
             CALL fld_read( kt, nn_fsbc, sf_wn )             ! read wave parameters from external forcing
-            wnum(:,:) = sf_wn(1)%fnow(:,:,1) * tmask(:,:,1)
+            wnum(:,:) = sf_wn(1)%fnow(:,:,1) * smask0(:,:)
          ENDIF
  
          !
@@ -391,10 +393,10 @@ CONTAINS
       !                             !==  Allocate wave arrays  ==!
       ALLOCATE( ut0sd (jpi,jpj)    , vt0sd (jpi,jpj) )
       ALLOCATE( hsw   (jpi,jpj)    , wmp   (jpi,jpj) )
-      ALLOCATE( wnum  (jpi,jpj) )
       ALLOCATE( tsd2d (jpi,jpj)    , div_sd(jpi,jpj)    , bhd_wave(jpi,jpj)     )
       ALLOCATE( usd   (jpi,jpj,jpk), vsd   (jpi,jpj,jpk), wsd     (jpi,jpj,jpk) )
-      ALLOCATE( tusd  (jpi,jpj)    , tvsd  (jpi,jpj)    , ZMX     (jpi,jpj,jpk) )
+      ALLOCATE( tusd  (jpi,jpj)    , tvsd  (jpi,jpj) )
+      ALLOCATE( wnum  (A2D(0))     , ZMX   (A2D(0),jpk) )
       usd   (:,:,:) = 0._wp
       vsd   (:,:,:) = 0._wp
       wsd   (:,:,:) = 0._wp
@@ -422,30 +424,30 @@ CONTAINS
                ALLOCATE( sf_cd(1), STAT=ierror )               !* allocate and fill sf_wave with sn_cdg
                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' )
                !
-                                      ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1)   )
-               IF( sn_cdg%ln_tint )   ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) )
+                                      ALLOCATE( sf_cd(1)%fnow(A2D(0),1)   )
+               IF( sn_cdg%ln_tint )   ALLOCATE( sf_cd(1)%fdta(A2D(0),1,2) )
                CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave_init', 'Wave module ', 'namsbc_wave' )
             ENDIF
-            ALLOCATE( cdn_wave(jpi,jpj) )
+            ALLOCATE( cdn_wave(A2D(0)) )
             cdn_wave(:,:) = 0._wp
          ENDIF
          IF( ln_charn ) THEN                     ! wave drag
             IF( .NOT. cpl_charn ) THEN
                CALL ctl_stop( 'STOP', 'Charnock based wind stress can be used in coupled mode only' )
             ENDIF
-            ALLOCATE( charn(jpi,jpj) )
+            ALLOCATE( charn(A2D(0)) )
             charn(:,:) = 0._wp
          ENDIF
          IF( ln_taw ) THEN                     ! wind stress
             IF( .NOT. cpl_taw ) THEN
                CALL ctl_stop( 'STOP', 'wind stress from wave model can be used in coupled mode only, use ln_cdgw instead' )
             ENDIF
-            ALLOCATE( tawx(jpi,jpj) )
-            ALLOCATE( tawy(jpi,jpj) )
-            ALLOCATE( twox(jpi,jpj) )
-            ALLOCATE( twoy(jpi,jpj) )
-            ALLOCATE( tauoc_wavex(jpi,jpj) )
-            ALLOCATE( tauoc_wavey(jpi,jpj) )
+            ALLOCATE( tawx(A2D(0)) )
+            ALLOCATE( tawy(A2D(0)) )
+            ALLOCATE( twox(A2D(0)) )
+            ALLOCATE( twoy(A2D(0)) )
+            ALLOCATE( tauoc_wavex(A2D(0)) )
+            ALLOCATE( tauoc_wavey(A2D(0)) )
             tawx(:,:) = 0._wp
             tawy(:,:) = 0._wp
             twox(:,:) = 0._wp
@@ -458,7 +460,7 @@ CONTAINS
             IF( .NOT. cpl_phioc ) THEN
                 CALL ctl_stop( 'STOP', 'phioc can be used in coupled mode only' )
             ENDIF
-            ALLOCATE( phioc(jpi,jpj) )
+            ALLOCATE( phioc(A2D(0)) )
             phioc(:,:) = 0._wp
          ENDIF
 
@@ -467,11 +469,11 @@ CONTAINS
                ALLOCATE( sf_tauoc(1), STAT=ierror )           !* allocate and fill sf_wave with sn_tauoc
                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_tauoc structure' )
                !
-                                       ALLOCATE( sf_tauoc(1)%fnow(jpi,jpj,1)   )
-               IF( sn_tauoc%ln_tint )  ALLOCATE( sf_tauoc(1)%fdta(jpi,jpj,1,2) )
+                                       ALLOCATE( sf_tauoc(1)%fnow(A2D(0),1)   )
+               IF( sn_tauoc%ln_tint )  ALLOCATE( sf_tauoc(1)%fdta(A2D(0),1,2) )
                CALL fld_fill( sf_tauoc, (/ sn_tauoc /), cn_dir, 'sbc_wave_init', 'Wave module', 'namsbc_wave' )
             ENDIF
-            ALLOCATE( tauoc_wave(jpi,jpj) )
+            ALLOCATE( tauoc_wave(A2D(0)) )
             tauoc_wave(:,:) = 0._wp
          ENDIF
 
@@ -518,8 +520,8 @@ CONTAINS
             IF( .NOT. cpl_wnum ) THEN
                ALLOCATE( sf_wn(1), STAT=ierror )           !* allocate and fill sf_wave with sn_wnum
                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wn structure' )
-                                      ALLOCATE( sf_wn(1)%fnow(jpi,jpj,1)   )
-               IF( sn_wnum%ln_tint )  ALLOCATE( sf_wn(1)%fdta(jpi,jpj,1,2) )
+                                      ALLOCATE( sf_wn(1)%fnow(A2D(0),1)   )
+               IF( sn_wnum%ln_tint )  ALLOCATE( sf_wn(1)%fdta(A2D(0),1,2) )
                CALL fld_fill( sf_wn, (/ sn_wnum /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' )
             ENDIF
             !
diff --git a/src/OCE/TRA/eosbn2.F90 b/src/OCE/TRA/eosbn2.F90
index 81fda25e..f3b908ec 100644
--- a/src/OCE/TRA/eosbn2.F90
+++ b/src/OCE/TRA/eosbn2.F90
@@ -38,7 +38,7 @@ MODULE eosbn2
    !!   eos_init      : set eos parameters (namelist)
    !!----------------------------------------------------------------------
    USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
+   USE domutl, ONLY : lbnd_ij
    USE phycst         ! physical constants
    USE stopar         ! Stochastic T/S fluctuations
    USE stopts         ! Stochastic T/S fluctuations
@@ -53,7 +53,7 @@ MODULE eosbn2
 
    !                  !! * Interface
    INTERFACE eos
-      MODULE PROCEDURE eos_insitu_New, eos_insitu, eos_insitu_pot, eos_insitu_2d, eos_insitu_pot_2d
+      MODULE PROCEDURE eos_insitu_New, eos_insitu_pot_New, eos_insitu, eos_insitu_pot, eos_insitu_2d, eos_insitu_pot_2d
    END INTERFACE
    !
    INTERFACE eos_rab
@@ -61,7 +61,7 @@ MODULE eosbn2
    END INTERFACE
    !
    INTERFACE eos_fzp
-      MODULE PROCEDURE eos_fzp_2d, eos_fzp_0d
+      MODULE PROCEDURE eos_fzp_3d, eos_fzp_2d, eos_fzp_0d, eos_fzp_3d_New
    END INTERFACE
    !
    PUBLIC   eos            ! called by step, istate, tranpc and zpsgrd modules
@@ -83,9 +83,11 @@ MODULE eosbn2
 
    INTEGER , PARAMETER ::   np_teos10 = -1  ! parameter for using TEOS10
    INTEGER , PARAMETER ::   np_eos80  =  0  ! parameter for using EOS80
-   INTEGER , PARAMETER ::   np_seos   = 1   ! parameter for using Simplified Equation of state
+   INTEGER , PARAMETER ::   np_seos   =  1  ! parameter for using Simplified Equation of state
 
    !                               !!!  simplified eos coefficients (default value: Vallis 2006)
+   REAL(wp), PUBLIC ::   rn_T0      = 10._wp           ! reference temperature
+   REAL(wp), PUBLIC ::   rn_S0      = 35._wp           ! reference salinity
    REAL(wp), PUBLIC ::   rn_a0      = 1.6550e-1_wp     ! thermal expansion coeff.
    REAL(wp), PUBLIC ::   rn_b0      = 7.6554e-1_wp     ! saline  expansion coeff.
    REAL(wp) ::   rn_lambda1 = 5.9520e-2_wp     ! cabbeling coeff. in T^2
@@ -186,7 +188,23 @@ MODULE eosbn2
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE eos_insitu_New( pts, Knn, prd )
+   SUBROUTINE eos_insitu_New( pts, Knn, prd, kbnd )
+      !!
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(in   ) ::   pts   ! T-S
+      INTEGER                       , INTENT(in   ) ::   Knn   ! time-level
+      REAL(wp), DIMENSION(:,:,:  )  , INTENT(  out) ::   prd   ! in situ density
+      INTEGER, OPTIONAL,              INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      !!
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+
+      CALL eos_insitu_New_t( pts, lbnd_ij(pts), Knn, prd, lbnd_ij(prd), ibnd )
+   END SUBROUTINE eos_insitu_New
+
+
+   SUBROUTINE eos_insitu_New_t( pts, ktts, Knn, prd, ktrd, kbnd )
       !!----------------------------------------------------------------------
       !!                   ***  ROUTINE eos_insitu  ***
       !!
@@ -220,9 +238,11 @@ CONTAINS
       !!                Vallis, Atmospheric and Oceanic Fluid Dynamics, 2006
       !!                TEOS-10 Manual, 2010
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(in   ) ::   pts   ! T-S
-      INTEGER                     , INTENT(in   ) ::   Knn   ! time-level
-      REAL(wp), DIMENSION(:,:,:  ), INTENT(  out) ::   prd   ! in situ density
+      INTEGER,  DIMENSION(2),                       INTENT(in   ) ::   ktts, ktrd
+      INTEGER,                                      INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts),JPK,JPTS,JPT), INTENT(in   ) ::   pts   ! T-S
+      INTEGER,                                      INTENT(in   ) ::   Knn   ! time-level
+      REAL(wp), DIMENSION(AB2D(ktrd),JPK     ),     INTENT(  out) ::   prd   ! in situ density
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
@@ -235,7 +255,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_3D(nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
             !
             zh  = gdept(ji,jj,jk,Knn) * r1_Z0                                 ! depth
             zt  = pts (ji,jj,jk,jp_tem,Knn) * r1_T0                           ! temperature
@@ -271,9 +291,9 @@ CONTAINS
          !
       CASE( np_seos )                !==  simplified EOS  ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem,Knn) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal,Knn) - 35._wp
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zt  = pts  (ji,jj,jk,jp_tem,Knn) - rn_T0
+            zs  = pts  (ji,jj,jk,jp_sal,Knn) - rn_S0
             zh  = gdept(ji,jj,jk,Knn)
             ztm = tmask(ji,jj,jk)
             !
@@ -290,20 +310,265 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_stop('eos-insitu')
       !
-   END SUBROUTINE eos_insitu_New
+   END SUBROUTINE eos_insitu_New_t
+
+
+   SUBROUTINE eos_fzp_3d_New( pts, Knn, ptf, kbnd )
+      !!
+      INTEGER                       , INTENT(in   )           ::   Knn
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(in   )           ::   pts   ! temperature and salinity
+      REAL(wp), DIMENSION(:,:,:)    , INTENT(  out)           ::   ptf   ! freezing temperature [Celsius]
+      INTEGER                       , INTENT(in   ), OPTIONAL ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      !!
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_fzp_3d_New_t( pts, lbnd_ij(pts), Knn, ptf, lbnd_ij(ptf), ibnd )
+   END SUBROUTINE eos_fzp_3d_New
+
+
+   SUBROUTINE eos_fzp_3d_New_t( pts, ktts, Knn, ptf, kttf, kbnd )
+      !!----------------------------------------------------------------------
+      !!                 ***  ROUTINE eos_fzp  ***
+      !!
+      !! ** Purpose :   Compute the freezing point temperature [Celsius]
+      !!
+      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by
+      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z
+      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m
+      !!
+      !! Reference  :   UNESCO tech. papers in the marine science no. 28. 1978
+      !!----------------------------------------------------------------------
+      INTEGER,  DIMENSION(2)                      , INTENT(in   ) ::   ktts, kttf
+      INTEGER                                     , INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      INTEGER                                     , INTENT(in   ) ::   Knn
+      REAL(wp), DIMENSION(AB2D(ktts),JPK,JPTS,JPT), INTENT(in   ) ::   pts   ! temperature and salinity
+      REAL(wp), DIMENSION(AB2D(kttf),JPK         ), INTENT(  out) ::   ptf   ! freezing temperature [Celsius]
+      !
+      INTEGER  ::   ji, jj, jk      ! dummy loop indices
+      REAL(wp) ::   zt, zs, z1_S0   ! local scalars
+      !!----------------------------------------------------------------------
+      !
+      ptf(:,:,jpk) = 0._wp
+      !
+      SELECT CASE ( neos )
+      !
+      CASE ( np_teos10, np_seos )      !==  CT,SA (TEOS-10 and S-EOS formulations) ==!
+         !
+         z1_S0 = 1._wp / 35.16504_wp
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zs= SQRT( ABS( pts(ji,jj,jk,jp_sal,Knn) ) * z1_S0 )           ! square root salinity
+            ptf(ji,jj,jk) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs                &
+                 &                               -3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp &
+                 &        * pts(ji,jj,jk,jp_sal,Knn) - 7.53e-4 * gdept(ji,jj,jk,Knn)
+         END_3D
+         !
+      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==!
+         !
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            ptf(ji,jj,jk) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( pts(ji,jj,jk,jp_sal,Knn) )                              &
+               &                          - 2.154996e-4_wp *       pts(ji,jj,jk,jp_sal,Knn) ) * pts(ji,jj,jk,jp_sal,Knn)   &
+               &          - 7.53e-4 * gdept(ji,jj,jk,Knn)
+         END_3D
+         !
+      CASE DEFAULT
+         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
+         CALL ctl_stop( 'eos_fzp_3d_New:', ctmp1 )
+         !
+      END SELECT
+      !
+   END SUBROUTINE eos_fzp_3d_New_t
+
+
+   SUBROUTINE eos_insitu_pot_New( pts, Knn, prd, prhop, kbnd )
+      !!
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(in   )           ::   pts    ! temperature salinity
+      INTEGER                       , INTENT(in   )           ::   Knn
+      REAL(wp), DIMENSION(:,:,:)    , INTENT(  out)           ::   prd    ! in situ density            [-]
+      REAL(wp), DIMENSION(:,:,:)    , INTENT(  out)           ::   prhop  ! potential density (surface referenced)
+      INTEGER                       , INTENT(in   ), OPTIONAL ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      !!
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_insitu_pot_New_t( pts, lbnd_ij(pts), Knn, prd, lbnd_ij(prd), prhop, lbnd_ij(prhop), ibnd )
+   END SUBROUTINE eos_insitu_pot_New
+
+
+   SUBROUTINE eos_insitu_pot_New_t( pts, ktts, Knn, prd, ktrd, prhop, ktrhop, kbnd )
+      !!----------------------------------------------------------------------
+      !!                  ***  ROUTINE eos_insitu_pot  ***
+      !!
+      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) and the
+      !!      potential volumic mass (Kg/m3) from potential temperature and
+      !!      salinity fields using an equation of state selected in the
+      !!     namelist.
+      !!
+      !! ** Action  : - prd  , the in situ density (no units)
+      !!              - prhop, the potential volumic mass (Kg/m3)
+      !!
+      !!----------------------------------------------------------------------
+      INTEGER,  DIMENSION(2)                        , INTENT(in   ) ::   ktts, ktrd, ktrhop
+      REAL(wp), DIMENSION(AB2D(ktts)  ,JPK,JPTS,JPT), INTENT(in   ) ::   pts    ! temperature salinity
+      INTEGER                                       , INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      INTEGER                                       , INTENT(in   ) ::   Knn
+      REAL(wp), DIMENSION(AB2D(ktrd)  ,JPK         ), INTENT(  out) ::   prd    ! in situ density            [-]
+      REAL(wp), DIMENSION(AB2D(ktrhop),JPK         ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      !
+      INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
+      INTEGER  ::   jdof
+      REAL(wp) ::   zt , zh , zstemp, zs , ztm   ! local scalars
+      REAL(wp) ::   zn , zn0, zn1, zn2, zn3      !   -      -
+      REAL(wp), DIMENSION(:), ALLOCATABLE :: zn0_sto, zn_sto, zsign    ! local vectors
+      !!----------------------------------------------------------------------
+      !
+      IF( ln_timing )   CALL timing_start('eos-pot')
+      !
+      SELECT CASE ( neos )
+      !
+      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
+         !
+         ! Stochastic equation of state
+         IF ( ln_sto_eos ) THEN
+            ALLOCATE(zn0_sto(1:2*nn_sto_eos))
+            ALLOCATE(zn_sto(1:2*nn_sto_eos))
+            ALLOCATE(zsign(1:2*nn_sto_eos))
+            DO jsmp = 1, 2*nn_sto_eos, 2
+              zsign(jsmp)   = 1._wp
+              zsign(jsmp+1) = -1._wp
+            END DO
+            !
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+               !
+               ! compute density (2*nn_sto_eos) times:
+               ! (1) for t+dt, s+ds (with the random TS fluctutation computed in sto_pts)
+               ! (2) for t-dt, s-ds (with the opposite fluctuation)
+               DO jsmp = 1, nn_sto_eos*2
+                  jdof   = (jsmp + 1) / 2
+                  zh     = gdept(ji,jj,jk,Knn) * r1_Z0                                  ! depth
+                  zt     = (pts (ji,jj,jk,jp_tem,Knn) + pts_ran(ji,jj,jk,jp_tem,jdof) * zsign(jsmp)) * r1_T0    ! temperature
+                  zstemp = pts  (ji,jj,jk,jp_sal,Knn) + pts_ran(ji,jj,jk,jp_sal,jdof) * zsign(jsmp)
+                  zs     = SQRT( ABS( zstemp + rdeltaS ) * r1_S0 )   ! square root salinity
+                  ztm    = tmask(ji,jj,jk)                                         ! tmask
+                  !
+                  zn3 = EOS013*zt   &
+                     &   + EOS103*zs+EOS003
+                     !
+                  zn2 = (EOS022*zt   &
+                     &   + EOS112*zs+EOS012)*zt   &
+                     &   + (EOS202*zs+EOS102)*zs+EOS002
+                     !
+                  zn1 = (((EOS041*zt   &
+                     &   + EOS131*zs+EOS031)*zt   &
+                     &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
+                     &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
+                     &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
+                     !
+                  zn0_sto(jsmp) = (((((EOS060*zt   &
+                     &   + EOS150*zs+EOS050)*zt   &
+                     &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
+                     &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
+                     &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
+                     &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
+                     &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
+                     !
+                  zn_sto(jsmp)  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0_sto(jsmp)
+               END DO
+               !
+               ! compute stochastic density as the mean of the (2*nn_sto_eos) densities
+               prhop(ji,jj,jk) = 0._wp ; prd(ji,jj,jk) = 0._wp
+               DO jsmp = 1, nn_sto_eos*2
+                  prhop(ji,jj,jk) = prhop(ji,jj,jk) + zn0_sto(jsmp)                      ! potential density referenced at the surface
+                  !
+                  prd(ji,jj,jk) = prd(ji,jj,jk) + (  zn_sto(jsmp) * r1_rho0 - 1._wp  )   ! density anomaly (masked)
+               END DO
+               prhop(ji,jj,jk) = 0.5_wp * prhop(ji,jj,jk) * ztm / nn_sto_eos
+               prd  (ji,jj,jk) = 0.5_wp * prd  (ji,jj,jk) * ztm / nn_sto_eos
+            END_3D
+            DEALLOCATE(zn0_sto,zn_sto,zsign)
+         ! Non-stochastic equation of state
+         ELSE
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+               !
+               zh  = gdept(ji,jj,jk,Knn) * r1_Z0                                  ! depth
+               zt  = pts (ji,jj,jk,jp_tem,Knn) * r1_T0                           ! temperature
+               zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal,Knn) + rdeltaS ) * r1_S0 )   ! square root salinity
+               ztm = tmask(ji,jj,jk)                                         ! tmask
+               !
+               zn3 = EOS013*zt   &
+                  &   + EOS103*zs+EOS003
+                  !
+               zn2 = (EOS022*zt   &
+                  &   + EOS112*zs+EOS012)*zt   &
+                  &   + (EOS202*zs+EOS102)*zs+EOS002
+                  !
+               zn1 = (((EOS041*zt   &
+                  &   + EOS131*zs+EOS031)*zt   &
+                  &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
+                  &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
+                  &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
+                  !
+               zn0 = (((((EOS060*zt   &
+                  &   + EOS150*zs+EOS050)*zt   &
+                  &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
+                  &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
+                  &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
+                  &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
+                  &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
+                  !
+               zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
+               !
+               prhop(ji,jj,jk) = zn0 * ztm                           ! potential density referenced at the surface
+               !
+               prd(ji,jj,jk) = (  zn * r1_rho0 - 1._wp  ) * ztm      ! density anomaly (masked)
+            END_3D
+         ENDIF
+
+      CASE( np_seos )                !==  simplified EOS  ==!
+         !
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zt  = pts  (ji,jj,jk,jp_tem,Knn) - rn_T0
+            zs  = pts  (ji,jj,jk,jp_sal,Knn) - rn_S0
+            zh  = gdept(ji,jj,jk,Knn)
+            ztm = tmask(ji,jj,jk)
+            !                                                     ! potential density referenced at the surface
+            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt ) * zt   &
+               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs ) * zs   &
+               &  - rn_nu * zt * zs
+            prhop(ji,jj,jk) = ( rho0 + zn ) * ztm
+            !                                                     ! density anomaly (masked)
+            zn = zn - ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zh
+            prd(ji,jj,jk) = zn * r1_rho0 * ztm
+            !
+         END_3D
+         !
+      END SELECT
+      !
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', tab3d_2=prhop, clinfo2=' pot : ' )
+      !
+      IF( ln_timing )   CALL timing_stop('eos-pot')
+      !
+   END SUBROUTINE eos_insitu_pot_New_t
 
 
-   SUBROUTINE eos_insitu( pts, prd, pdep )
+   SUBROUTINE eos_insitu( pts, prd, pdep, kbnd )
       !!
       REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
       !                                                      ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd   ! in situ density            [-]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m]
+      INTEGER, OPTIONAL,            INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL eos_insitu_t( pts, is_tile(pts), prd, is_tile(prd), pdep, is_tile(pdep) )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_insitu_t( pts, lbnd_ij(pts), prd, lbnd_ij(prd), pdep, lbnd_ij(pdep), ibnd )
    END SUBROUTINE eos_insitu
 
-   SUBROUTINE eos_insitu_t( pts, ktts, prd, ktrd, pdep, ktdep )
+   SUBROUTINE eos_insitu_t( pts, ktts, prd, ktrd, pdep, ktdep, kbnd )
       !!----------------------------------------------------------------------
       !!                   ***  ROUTINE eos_insitu  ***
       !!
@@ -337,11 +602,12 @@ CONTAINS
       !!                Vallis, Atmospheric and Oceanic Fluid Dynamics, 2006
       !!                TEOS-10 Manual, 2010
       !!----------------------------------------------------------------------
-      INTEGER                                 , INTENT(in   ) ::   ktts, ktrd, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                                  ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrd) ,JPK     ), INTENT(  out) ::   prd   ! in situ density            [-]
-      REAL(wp), DIMENSION(A2D_T(ktdep),JPK     ), INTENT(in   ) ::   pdep  ! depth                      [m]
+      INTEGER,  DIMENSION(2)                   , INTENT(in   ) ::   ktts, ktrd, ktdep
+      INTEGER                                  , INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts) ,JPK,JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
+      !                                                                   ! 2 : salinity               [psu]
+      REAL(wp), DIMENSION(AB2D(ktrd) ,JPK     ), INTENT(  out) ::   prd   ! in situ density            [-]
+      REAL(wp), DIMENSION(AB2D(ktdep),JPK     ), INTENT(in   ) ::   pdep  ! depth                      [m]
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
@@ -354,7 +620,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
             !
             zh  = pdep(ji,jj,jk) * r1_Z0                                  ! depth
             zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
@@ -390,9 +656,9 @@ CONTAINS
          !
       CASE( np_seos )                !==  simplified EOS  ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal) - 35._wp
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zt  = pts  (ji,jj,jk,jp_tem) - rn_T0
+            zs  = pts  (ji,jj,jk,jp_sal) - rn_S0
             zh  = pdep (ji,jj,jk)
             ztm = tmask(ji,jj,jk)
             !
@@ -412,19 +678,25 @@ CONTAINS
    END SUBROUTINE eos_insitu_t
 
 
-   SUBROUTINE eos_insitu_pot( pts, prd, prhop, pdep )
+   SUBROUTINE eos_insitu_pot( pts, prd, prhop, pdep, kbnd )
       !!
       REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
       !                                                       ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd    ! in situ density            [-]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep   ! depth                      [m]
+      INTEGER, OPTIONAL,            INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL eos_insitu_pot_t( pts, is_tile(pts), prd, is_tile(prd), prhop, is_tile(prhop), pdep, is_tile(pdep) )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_insitu_pot_t( pts, lbnd_ij(pts), prd, lbnd_ij(prd), &
+         &                   prhop, lbnd_ij(prhop), pdep, lbnd_ij(pdep), ibnd )
    END SUBROUTINE eos_insitu_pot
 
 
-   SUBROUTINE eos_insitu_pot_t( pts, ktts, prd, ktrd, prhop, ktrhop, pdep, ktdep )
+   SUBROUTINE eos_insitu_pot_t( pts, ktts, prd, ktrd, prhop, ktrhop, pdep, ktdep, kbnd )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE eos_insitu_pot  ***
       !!
@@ -437,12 +709,13 @@ CONTAINS
       !!              - prhop, the potential volumic mass (Kg/m3)
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   ktts, ktrd, ktrhop, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts)  ,JPK,JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
+      INTEGER,  DIMENSION(2)                    , INTENT(in   ) ::   ktts, ktrd, ktrhop, ktdep
+      INTEGER                                   , INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts)  ,JPK,JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
       !                                                                    ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrd)  ,JPK     ), INTENT(  out) ::   prd    ! in situ density            [-]
-      REAL(wp), DIMENSION(A2D_T(ktrhop),JPK     ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
-      REAL(wp), DIMENSION(A2D_T(ktdep) ,JPK     ), INTENT(in   ) ::   pdep   ! depth                      [m]
+      REAL(wp), DIMENSION(AB2D(ktrd)  ,JPK     ), INTENT(  out) ::   prd    ! in situ density            [-]
+      REAL(wp), DIMENSION(AB2D(ktrhop),JPK     ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      REAL(wp), DIMENSION(AB2D(ktdep) ,JPK     ), INTENT(in   ) ::   pdep   ! depth                      [m]
       !
       INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
       INTEGER  ::   jdof
@@ -467,7 +740,7 @@ CONTAINS
               zsign(jsmp+1) = -1._wp
             END DO
             !
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
                !
                ! compute density (2*nn_sto_eos) times:
                ! (1) for t+dt, s+ds (with the random TS fluctutation computed in sto_pts)
@@ -517,7 +790,7 @@ CONTAINS
             DEALLOCATE(zn0_sto,zn_sto,zsign)
          ! Non-stochastic equation of state
          ELSE
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
                !
                zh  = pdep(ji,jj,jk) * r1_Z0                                  ! depth
                zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
@@ -555,9 +828,9 @@ CONTAINS
 
       CASE( np_seos )                !==  simplified EOS  ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal) - 35._wp
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zt  = pts  (ji,jj,jk,jp_tem) - rn_T0
+            zs  = pts  (ji,jj,jk,jp_sal) - rn_S0
             zh  = pdep (ji,jj,jk)
             ztm = tmask(ji,jj,jk)
             !                                                     ! potential density referenced at the surface
@@ -580,18 +853,23 @@ CONTAINS
    END SUBROUTINE eos_insitu_pot_t
 
 
-   SUBROUTINE eos_insitu_2d( pts, pdep, prd )
+   SUBROUTINE eos_insitu_2d( pts, pdep, prd, kbnd )
       !!
       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
       !                                                    ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m]
       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   prd   ! in situ density
+      INTEGER, OPTIONAL,          INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL eos_insitu_2d_t( pts, is_tile(pts), pdep, is_tile(pdep), prd, is_tile(prd) )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_insitu_2d_t( pts, lbnd_ij(pts), pdep, lbnd_ij(pdep), prd, lbnd_ij(prd), ibnd )
    END SUBROUTINE eos_insitu_2d
 
 
-   SUBROUTINE eos_insitu_2d_t( pts, ktts, pdep, ktdep, prd, ktrd )
+   SUBROUTINE eos_insitu_2d_t( pts, ktts, pdep, ktdep, prd, ktrd, kbnd )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE eos_insitu_2d  ***
       !!
@@ -602,11 +880,12 @@ CONTAINS
       !! ** Action  : - prd , the in situ density (no units) (unmasked)
       !!
       !!----------------------------------------------------------------------
-      INTEGER                            , INTENT(in   ) ::   ktts, ktdep, ktrd
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                             ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktdep)    ), INTENT(in   ) ::   pdep  ! depth                      [m]
-      REAL(wp), DIMENSION(A2D_T(ktrd)     ), INTENT(  out) ::   prd   ! in situ density
+      INTEGER,  DIMENSION(2)              , INTENT(in   ) ::   ktts, ktdep, ktrd
+      INTEGER                             , INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts),JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
+      !                                                              ! 2 : salinity               [psu]
+      REAL(wp), DIMENSION(AB2D(ktdep)    ), INTENT(in   ) ::   pdep  ! depth                      [m]
+      REAL(wp), DIMENSION(AB2D(ktrd)     ), INTENT(  out) ::   prd   ! in situ density
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs              ! local scalars
@@ -621,7 +900,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
             !
             zh  = pdep(ji,jj) * r1_Z0                                  ! depth
             zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
@@ -656,10 +935,10 @@ CONTAINS
          !
       CASE( np_seos )                !==  simplified EOS  ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
             !
-            zt    = pts  (ji,jj,jp_tem)  - 10._wp
-            zs    = pts  (ji,jj,jp_sal)  - 35._wp
+            zt    = pts  (ji,jj,jp_tem)  - rn_T0
+            zs    = pts  (ji,jj,jp_sal)  - rn_S0
             zh    = pdep (ji,jj)                         ! depth at the partial step level
             !
             zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt + rn_mu1*zh ) * zt   &
@@ -679,17 +958,22 @@ CONTAINS
    END SUBROUTINE eos_insitu_2d_t
 
 
-   SUBROUTINE eos_insitu_pot_2d( pts, prhop )
+   SUBROUTINE eos_insitu_pot_2d( pts, prhop, kbnd )
       !!
       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
       !                                                     ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      INTEGER, OPTIONAL,          INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL eos_insitu_pot_2d_t( pts, is_tile(pts), prhop, is_tile(prhop) )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      CALL eos_insitu_pot_2d_t( pts, lbnd_ij(pts), prhop, lbnd_ij(prhop), ibnd )
    END SUBROUTINE eos_insitu_pot_2d
 
 
-   SUBROUTINE eos_insitu_pot_2d_t( pts, ktts, prhop, ktrhop )
+   SUBROUTINE eos_insitu_pot_2d_t( pts, ktts, prhop, ktrhop, kbnd )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE eos_insitu_pot  ***
       !!
@@ -702,10 +986,11 @@ CONTAINS
       !!              - prhop, the potential volumic mass (Kg/m3)
       !!
       !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   ktts, ktrhop
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
-      !                                                                ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrhop)   ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      INTEGER,  DIMENSION(2)              , INTENT(in   ) ::   ktts, ktrhop
+      INTEGER                             , INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts),JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
+      !                                                               ! 2 : salinity               [psu]
+      REAL(wp), DIMENSION(AB2D(ktrhop)   ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
       !
       INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
       INTEGER  ::   jdof
@@ -720,7 +1005,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
             !
             zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
             zs  = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
@@ -741,9 +1026,9 @@ CONTAINS
 
       CASE( np_seos )                !==  simplified EOS  ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zt  = pts  (ji,jj,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jp_sal) - 35._wp
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
+            zt  = pts  (ji,jj,jp_tem) - rn_T0
+            zs  = pts  (ji,jj,jp_sal) - rn_S0
             ztm = tmask(ji,jj,1)
             !                                                     ! potential density referenced at the surface
             zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt ) * zt   &
@@ -763,17 +1048,23 @@ CONTAINS
    END SUBROUTINE eos_insitu_pot_2d_t
 
 
-   SUBROUTINE rab_3d( pts, pab, Kmm )
+   SUBROUTINE rab_3d( pts, pab, Kmm, kbnd )
       !!
-      INTEGER                     , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! pot. temperature & salinity
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
+      INTEGER                     , INTENT(in   )           ::   Kmm   ! time level index
+      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   )           ::   pts   ! pot. temperature & salinity
+      REAL(wp), DIMENSION(:,:,:,:), INTENT(  out)           ::   pab   ! thermal/haline expansion ratio
+      INTEGER,                      INTENT(in   ), OPTIONAL ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL rab_3d_t( pts, is_tile(pts), pab, is_tile(pab), Kmm )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+
+      CALL rab_3d_t( pts, lbnd_ij(pts), pab, lbnd_ij(pab), Kmm, ibnd )
    END SUBROUTINE rab_3d
 
 
-   SUBROUTINE rab_3d_t( pts, ktts, pab, ktab, Kmm )
+   SUBROUTINE rab_3d_t( pts, ktts, pab, ktab, Kmm, kbnd )
       !!----------------------------------------------------------------------
       !!                 ***  ROUTINE rab_3d  ***
       !!
@@ -783,10 +1074,11 @@ CONTAINS
       !!
       !! ** Action  : - pab     : thermal/haline expansion ratio at T-points
       !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   ) ::   Kmm   ! time level index
-      INTEGER                                , INTENT(in   ) ::   ktts, ktab
-      REAL(wp), DIMENSION(A2D_T(ktts),JPK,JPTS), INTENT(in   ) ::   pts   ! pot. temperature & salinity
-      REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
+      INTEGER                                 , INTENT(in   ) ::   Kmm   ! time level index
+      INTEGER,  DIMENSION(2)                  , INTENT(in   ) ::   ktts, ktab
+      INTEGER,                                  INTENT(in   ) ::   kbnd  ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts),JPK,JPTS), INTENT(in   ) ::   pts   ! pot. temperature & salinity
+      REAL(wp), DIMENSION(AB2D(ktab),JPK,JPTS), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
@@ -799,7 +1091,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
             !
             zh  = gdept(ji,jj,jk,Kmm) * r1_Z0                                ! depth
             zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
@@ -852,9 +1144,9 @@ CONTAINS
          !
       CASE( np_seos )                  !==  simplified EOS  ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts (ji,jj,jk,jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-            zs  = pts (ji,jj,jk,jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpkm1 )
+            zt  = pts (ji,jj,jk,jp_tem) - rn_T0   ! pot. temperature anomaly (t-T0)
+            zs  = pts (ji,jj,jk,jp_sal) - rn_S0   ! abs. salinity anomaly (s-S0)
             zh  = gdept(ji,jj,jk,Kmm)                ! depth in meters at t-point
             ztm = tmask(ji,jj,jk)                  ! land/sea bottom mask = surf. mask
             !
@@ -880,18 +1172,24 @@ CONTAINS
    END SUBROUTINE rab_3d_t
 
 
-   SUBROUTINE rab_2d( pts, pdep, pab, Kmm )
+   SUBROUTINE rab_2d( pts, pdep, pab, Kmm, kbnd )
       !!
-      INTEGER                   , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts    ! pot. temperature & salinity
-      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pdep   ! depth                  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pab    ! thermal/haline expansion ratio
+      INTEGER                   , INTENT(in   )           ::   Kmm   ! time level index
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   )           ::   pts   ! pot. temperature & salinity
+      REAL(wp), DIMENSION(:,:)  , INTENT(in   )           ::   pdep  ! depth                  [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(  out)           ::   pab   ! thermal/haline expansion ratio
+      INTEGER,                    INTENT(in   ), OPTIONAL ::   kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL rab_2d_t(pts, is_tile(pts), pdep, is_tile(pdep), pab, is_tile(pab), Kmm)
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+
+      CALL rab_2d_t( pts, lbnd_ij(pts), pdep, lbnd_ij(pdep), pab, lbnd_ij(pab), Kmm, ibnd )
    END SUBROUTINE rab_2d
 
 
-   SUBROUTINE rab_2d_t( pts, ktts, pdep, ktdep, pab, ktab, Kmm )
+   SUBROUTINE rab_2d_t( pts, ktts, pdep, ktdep, pab, ktab, Kmm, kbnd )
       !!----------------------------------------------------------------------
       !!                 ***  ROUTINE rab_2d  ***
       !!
@@ -899,11 +1197,12 @@ CONTAINS
       !!
       !! ** Action  : - pab     : thermal/haline expansion ratio at T-points
       !!----------------------------------------------------------------------
-      INTEGER                            , INTENT(in   ) ::   Kmm   ! time level index
-      INTEGER                            , INTENT(in   ) ::   ktts, ktdep, ktab
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts    ! pot. temperature & salinity
-      REAL(wp), DIMENSION(A2D_T(ktdep)    ), INTENT(in   ) ::   pdep   ! depth                  [m]
-      REAL(wp), DIMENSION(A2D_T(ktab),JPTS), INTENT(  out) ::   pab    ! thermal/haline expansion ratio
+      INTEGER                             , INTENT(in   ) ::   Kmm    ! time level index
+      INTEGER,  DIMENSION(2)              , INTENT(in   ) ::   ktts, ktdep, ktab
+      INTEGER,                              INTENT(in   ) ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktts),JPTS), INTENT(in   ) ::   pts    ! pot. temperature & salinity
+      REAL(wp), DIMENSION(AB2D(ktdep)    ), INTENT(in   ) ::   pdep   ! depth                  [m]
+      REAL(wp), DIMENSION(AB2D(ktab),JPTS), INTENT(  out) ::   pab    ! thermal/haline expansion ratio
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs              ! local scalars
@@ -918,7 +1217,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
             !
             zh  = pdep(ji,jj) * r1_Z0                                  ! depth
             zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
@@ -971,11 +1270,11 @@ CONTAINS
          !
       CASE( np_seos )                  !==  simplified EOS  ==!
          !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
             !
-            zt    = pts  (ji,jj,jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-            zs    = pts  (ji,jj,jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
-            zh    = pdep (ji,jj)                   ! depth at the partial step level
+            zt    = pts  (ji,jj,jp_tem) - rn_T0   ! pot. temperature anomaly (t-T0)
+            zs    = pts  (ji,jj,jp_sal) - rn_S0   ! abs. salinity anomaly (s-S0)
+            zh    = pdep (ji,jj)                  ! depth at the partial step level
             !
             zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs
             pab(ji,jj,jp_tem) = zn * r1_rho0   ! alpha
@@ -1075,9 +1374,9 @@ CONTAINS
          !
       CASE( np_seos )                  !==  simplified EOS  ==!
          !
-         zt    = pts(jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-         zs    = pts(jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
-         zh    = pdep                   ! depth at the partial step level
+         zt    = pts(jp_tem) - rn_T0   ! pot. temperature anomaly (t-T0)
+         zs    = pts(jp_sal) - rn_S0   ! abs. salinity anomaly (s-S0)
+         zh    = pdep                  ! depth at the partial step level
          !
          zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs
          pab(jp_tem) = zn * r1_rho0   ! alpha
@@ -1096,18 +1395,24 @@ CONTAINS
    END SUBROUTINE rab_0d
 
 
-   SUBROUTINE bn2( pts, pab, pn2, Kmm )
+   SUBROUTINE bn2( pts, pab, pn2, Kmm, kbnd )
       !!
-      INTEGER                              , INTENT(in   ) ::  Kmm   ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
-      REAL(wp), DIMENSION(:,:,:,:)         , INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
-      REAL(wp), DIMENSION(:,:,:)           , INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
+      INTEGER                              , INTENT(in   )           ::  Kmm   ! time level index
+      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   )           ::  pts   ! pot. temperature and salinity   [Celsius,psu]
+      REAL(wp), DIMENSION(:,:,:,:)         , INTENT(in   )           ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
+      REAL(wp), DIMENSION(:,:,:)           , INTENT(  out)           ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
+      INTEGER,                               INTENT(in   ), OPTIONAL ::  kbnd  ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
       !!
-      CALL bn2_t( pts, pab, is_tile(pab), pn2, is_tile(pn2), Kmm )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+
+      CALL bn2_t( pts, pab, lbnd_ij(pab), pn2, lbnd_ij(pn2), Kmm, ibnd )
    END SUBROUTINE bn2
 
 
-   SUBROUTINE bn2_t( pts, pab, ktab, pn2, ktn2, Kmm )
+   SUBROUTINE bn2_t( pts, pab, ktab, pn2, ktn2, Kmm, kbnd )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE bn2  ***
       !!
@@ -1121,11 +1426,12 @@ CONTAINS
       !! ** Action  :   pn2 : square of the brunt-vaisala frequency at w-point
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   ) ::  Kmm   ! time level index
-      INTEGER                                , INTENT(in   ) ::  ktab, ktn2
-      REAL(wp), DIMENSION(jpi,jpj,  jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
-      REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
-      REAL(wp), DIMENSION(A2D_T(ktn2),JPK     ), INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
+      INTEGER                                 , INTENT(in   ) ::  Kmm   ! time level index
+      INTEGER,  DIMENSION(2)                  , INTENT(in   ) ::  ktab, ktn2
+      INTEGER,                                  INTENT(in   ) ::  kbnd  ! number of halo points to calculate
+      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts)   , INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
+      REAL(wp), DIMENSION(AB2D(ktab),JPK,JPTS), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
+      REAL(wp), DIMENSION(AB2D(ktn2),JPK     ), INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
       !
       INTEGER  ::   ji, jj, jk      ! dummy loop indices
       REAL(wp) ::   zaw, zbw, zrw   ! local scalars
@@ -1133,7 +1439,7 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_start('bn2')
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )      ! interior points only (2=< jk =< jpkm1 ); surface and bottom value set to zero one for all in istate.F90
+      DO_3D( kbnd, kbnd, kbnd, kbnd, 2, jpkm1 )      ! interior points only (2=< jk =< jpkm1 ); surface and bottom value set to zero one for all in istate.F90
          zrw =   ( gdepw(ji,jj,jk  ,Kmm) - gdept(ji,jj,jk,Kmm) )   &
             &  / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) )
             !
@@ -1152,7 +1458,23 @@ CONTAINS
    END SUBROUTINE bn2_t
 
 
-   FUNCTION eos_pt_from_ct( ctmp, psal ) RESULT( ptmp )
+   SUBROUTINE eos_pt_from_ct( ctmp, psal, ptmp, kbnd )
+      !!
+      REAL(wp), DIMENSION(:,:), INTENT(in )           ::   ctmp   ! Cons. Temp   [Celsius]
+      REAL(wp), DIMENSION(:,:), INTENT(in )           ::   psal   ! salinity     [psu]
+      REAL(wp), DIMENSION(:,:), INTENT(out)           ::   ptmp   ! Pot. Temp    [Celsius]
+      INTEGER,                  INTENT(in ), OPTIONAL ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      !!
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+
+      CALL eos_pt_from_ct_t( ctmp, psal, lbnd_ij(psal), ptmp, lbnd_ij(ptmp), ibnd )
+   END SUBROUTINE eos_pt_from_ct
+
+
+   SUBROUTINE eos_pt_from_ct_t( ctmp, psal, ktpsal, ptmp, ktptmp, kbnd )
       !!----------------------------------------------------------------------
       !!                 ***  ROUTINE eos_pt_from_ct  ***
       !!
@@ -1164,10 +1486,11 @@ CONTAINS
       !! Reference  :   TEOS-10, UNESCO
       !!                Rational approximation to TEOS10 algorithm (rms error on WOA13 values: 4.0e-5 degC)
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ctmp   ! Cons. Temp   [Celsius]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   psal   ! salinity     [psu]
-      ! Leave result array automatic rather than making explicitly allocated
-      REAL(wp), DIMENSION(jpi,jpj) ::   ptmp   ! potential temperature [Celsius]
+      INTEGER,  DIMENSION(2),            INTENT(in ) ::   ktpsal, ktptmp
+      INTEGER,                           INTENT(in ) ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktpsal)), INTENT(in ) ::   ctmp   ! Cons. Temp   [Celsius]
+      REAL(wp), DIMENSION(AB2D(ktpsal)), INTENT(in ) ::   psal   ! salinity     [psu]
+      REAL(wp), DIMENSION(AB2D(ktptmp)), INTENT(out) ::   ptmp   ! Pot. Temp    [Celsius]
       !
       INTEGER  ::   ji, jj               ! dummy loop indices
       REAL(wp) ::   zt , zs , ztm        ! local scalars
@@ -1181,7 +1504,7 @@ CONTAINS
       z1_S0   = 0.875_wp/35.16504_wp
       z1_T0   = 1._wp/40._wp
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( kbnd, kbnd, kbnd, kbnd )
          !
          zt  = ctmp   (ji,jj) * z1_T0
          zs  = SQRT( ABS( psal(ji,jj) + zdeltaS ) * z1_S0 )
@@ -1206,20 +1529,109 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_stop('eos_pt_from_ct')
       !
-   END FUNCTION eos_pt_from_ct
+   END SUBROUTINE eos_pt_from_ct_t
 
 
-   SUBROUTINE eos_fzp_2d( psal, ptf, pdep )
+   SUBROUTINE eos_fzp_3d( psal, ptf, pdep, kbnd )
       !!
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
-      REAL(wp), DIMENSION(:,:)    , INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   )           ::   psal   ! salinity   [psu]
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(  out)           ::   ptf    ! freezing temperature [Celsius]
+      INTEGER,                    INTENT(in   ), OPTIONAL ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      INTEGER, DIMENSION(2) :: itdep
       !!
-      CALL eos_fzp_2d_t( psal, ptf, is_tile(ptf), pdep )
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      IF( PRESENT(pdep) ) THEN ; itdep = lbnd_ij(pdep)  ; ELSE ; itdep(:) = 1 ; ENDIF
+
+      CALL eos_fzp_3d_t( psal, lbnd_ij(psal), ptf, lbnd_ij(ptf), pdep, itdep, ibnd )
+   END SUBROUTINE eos_fzp_3d
+
+
+   SUBROUTINE eos_fzp_3d_t( psal, ktsal, ptf, kttf, pdep, ktdep, kbnd )
+      !!----------------------------------------------------------------------
+      !!                 ***  ROUTINE eos_fzp  ***
+      !!
+      !! ** Purpose :   Compute the freezing point temperature [Celsius]
+      !!
+      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by
+      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z
+      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m
+      !!
+      !! Reference  :   UNESCO tech. papers in the marine science no. 28. 1978
+      !!----------------------------------------------------------------------
+      INTEGER,  DIMENSION(2),               INTENT(in   )           ::   ktsal, kttf, ktdep
+      INTEGER,                              INTENT(in   )           ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktsal),JPK), INTENT(in   )           ::   psal   ! salinity   [psu]
+      REAL(wp), DIMENSION(AB2D(ktdep),JPK), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(wp), DIMENSION(AB2D(kttf ),JPK), INTENT(  out)           ::   ptf    ! freezing temperature [Celsius]
+      !
+      INTEGER  ::   ji, jj, jk          ! dummy loop indices
+      REAL(wp) ::   zs, z1_S0       ! local scalars
+      !!----------------------------------------------------------------------
+      !
+      SELECT CASE ( neos )
+      !
+      CASE ( np_teos10, np_seos )      !==  CT,SA (TEOS-10 and S-EOS formulations) ==!
+         !
+         z1_S0 = 1._wp / 35.16504_wp
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpk )
+            zs= SQRT( ABS( psal(ji,jj,jk) ) * z1_S0 )           ! square root salinity
+            ptf(ji,jj,jk) = ((((1.46873e-03_wp * zs - 9.64972e-03_wp)                        &
+               &                               * zs + 2.28348e-02_wp) * zs - 3.12775e-02_wp) &
+               &                               * zs + 2.07679e-02_wp) * zs - 5.87701e-02_wp
+            ptf(ji,jj,jk) = ptf(ji,jj,jk) * psal(ji,jj,jk)
+         END_3D
+         !
+         IF( PRESENT( pdep ) ) THEN
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpk )
+               ptf(ji,jj,jk) = ptf(ji,jj,jk) - 7.53e-4 * pdep(ji,jj,jk)
+            END_3D
+         ENDIF
+         !
+      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==!
+         !
+         DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpk )
+            ptf(ji,jj,jk) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(ji,jj,jk) )   &
+               &                          - 2.154996e-4_wp *       psal(ji,jj,jk)   ) * psal(ji,jj,jk)
+         END_3D
+         !
+         IF( PRESENT( pdep ) ) THEN
+            DO_3D( kbnd, kbnd, kbnd, kbnd, 1, jpk )
+               ptf(ji,jj,jk) = ptf(ji,jj,jk) - 7.53e-4 * pdep(ji,jj,jk)
+            END_3D
+         ENDIF
+         !
+      CASE DEFAULT
+         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
+         CALL ctl_stop( 'eos_fzp_3d:', ctmp1 )
+         !
+      END SELECT
+      !
+   END SUBROUTINE eos_fzp_3d_t
+
+
+   SUBROUTINE eos_fzp_2d( psal, ptf, pdep, kbnd )
+      !!
+      REAL(wp), DIMENSION(:,:), INTENT(in   )           ::   psal   ! salinity   [psu]
+      REAL(wp), DIMENSION(:,:), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(wp), DIMENSION(:,:), INTENT(  out)           ::   ptf    ! freezing temperature [Celsius]
+      INTEGER,                  INTENT(in   ), OPTIONAL ::   kbnd   ! number of halo points to calculate
+      !
+      INTEGER  ::   ibnd
+      INTEGER, DIMENSION(2) :: itdep
+      !!
+      ibnd = nn_hls
+      IF( PRESENT(kbnd) ) ibnd = kbnd
+      IF( PRESENT(pdep) ) THEN ; itdep = lbnd_ij(pdep)  ; ELSE ; itdep(:) = 1 ; ENDIF
+
+      CALL eos_fzp_2d_t( psal, lbnd_ij(psal), ptf, lbnd_ij(ptf), pdep, itdep, ibnd )
    END SUBROUTINE eos_fzp_2d
 
 
-   SUBROUTINE  eos_fzp_2d_t( psal, ptf, kttf, pdep )
+   SUBROUTINE eos_fzp_2d_t( psal, ktsal, ptf, kttf, pdep, ktdep, kbnd )
       !!----------------------------------------------------------------------
       !!                 ***  ROUTINE eos_fzp  ***
       !!
@@ -1231,13 +1643,14 @@ CONTAINS
       !!
       !! Reference  :   UNESCO tech. papers in the marine science no. 28. 1978
       !!----------------------------------------------------------------------
-      INTEGER                       , INTENT(in   )           ::   kttf
-      REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
-      REAL(wp), DIMENSION(A2D_T(kttf)), INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
+      INTEGER,  DIMENSION(2),           INTENT(in   )           ::   ktsal, kttf, ktdep
+      INTEGER,                          INTENT(in   )           ::   kbnd   ! number of halo points to calculate
+      REAL(wp), DIMENSION(AB2D(ktsal)), INTENT(in   )           ::   psal   ! salinity   [psu]
+      REAL(wp), DIMENSION(AB2D(ktdep)), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(wp), DIMENSION(AB2D(kttf)),  INTENT(  out)           ::   ptf    ! freezing temperature [Celsius]
       !
       INTEGER  ::   ji, jj          ! dummy loop indices
-      REAL(wp) ::   zt, zs, z1_S0   ! local scalars
+      REAL(wp) ::   zs, z1_S0   ! local scalars
       !!----------------------------------------------------------------------
       !
       SELECT CASE ( neos )
@@ -1245,21 +1658,32 @@ CONTAINS
       CASE ( np_teos10, np_seos )      !==  CT,SA (TEOS-10 and S-EOS formulations) ==!
          !
          z1_S0 = 1._wp / 35.16504_wp
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zs= SQRT( ABS( psal(ji,jj) ) * z1_S0 )           ! square root salinity
-            ptf(ji,jj) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs &
-               &          - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
+            zs = SQRT( ABS( psal(ji,jj) ) * z1_S0 )           ! square root salinity
+            ptf(ji,jj) = ((((1.46873e-03_wp * zs - 9.64972e-03_wp)                        &
+               &                            * zs + 2.28348e-02_wp) * zs - 3.12775e-02_wp) &
+               &                            * zs + 2.07679e-02_wp) * zs - 5.87701e-02_wp
+            ptf(ji,jj) = ptf(ji,jj) * psal(ji,jj)
          END_2D
-         ptf(:,:) = ptf(:,:) * psal(:,:)
          !
-         IF( PRESENT( pdep ) )   ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:)
+         IF( PRESENT( pdep ) ) THEN
+            DO_2D( kbnd, kbnd, kbnd, kbnd )
+               ptf(ji,jj) = ptf(ji,jj) - 7.53e-4 * pdep(ji,jj)
+            END_2D
+         ENDIF
          !
       CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==!
          !
-         ptf(:,:) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(:,:) )   &
-            &                     - 2.154996e-4_wp *       psal(:,:)   ) * psal(:,:)
-            !
-         IF( PRESENT( pdep ) )   ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:)
+         DO_2D( kbnd, kbnd, kbnd, kbnd )
+            ptf(ji,jj) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(ji,jj) )   &
+               &                       - 2.154996e-4_wp *       psal(ji,jj)   ) * psal(ji,jj)
+         END_2D
+         !
+         IF( PRESENT( pdep ) ) THEN
+            DO_2D( kbnd, kbnd, kbnd, kbnd )
+               ptf(ji,jj) = ptf(ji,jj) - 7.53e-4 * pdep(ji,jj)
+            END_2D
+         ENDIF
          !
       CASE DEFAULT
          WRITE(ctmp1,*) '          bad flag value for neos = ', neos
@@ -1267,10 +1691,10 @@ CONTAINS
          !
       END SELECT
       !
-  END SUBROUTINE eos_fzp_2d_t
+   END SUBROUTINE eos_fzp_2d_t
 
 
-  SUBROUTINE eos_fzp_0d( psal, ptf, pdep )
+   SUBROUTINE eos_fzp_0d( psal, ptf, pdep )
       !!----------------------------------------------------------------------
       !!                 ***  ROUTINE eos_fzp  ***
       !!
@@ -1336,10 +1760,10 @@ CONTAINS
       !!                    pab_pe(:,:,:,jp_tem) is alpha_pe
       !!                    pab_pe(:,:,:,jp_sal) is beta_pe
       !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   Kmm   ! time level index
+      INTEGER                              , INTENT(in   ) ::   Kmm     ! time level index
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts     ! pot. temperature & salinity
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pab_pe  ! alpha_pe and beta_pe
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   ppen     ! potential energy anomaly
+      REAL(wp), DIMENSION(T2D(0),jpk,jpts) , INTENT(  out) ::   pab_pe  ! alpha_pe and beta_pe
+      REAL(wp), DIMENSION(T2D(0),jpk)      , INTENT(  out) ::   ppen    ! potential energy anomaly
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
       REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
@@ -1352,7 +1776,7 @@ CONTAINS
       !
       CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             !
             zh  = gdept(ji,jj,jk,Kmm) * r1_Z0                                ! depth
             zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
@@ -1411,11 +1835,11 @@ CONTAINS
          !
       CASE( np_seos )                !==  Vallis (2006) simplified EOS  ==!
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts(ji,jj,jk,jp_tem) - 10._wp  ! temperature anomaly (t-T0)
-            zs = pts (ji,jj,jk,jp_sal) - 35._wp  ! abs. salinity anomaly (s-S0)
-            zh  = gdept(ji,jj,jk,Kmm)              ! depth in meters  at t-point
-            ztm = tmask(ji,jj,jk)                ! tmask
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zt  = pts  (ji,jj,jk,jp_tem) - rn_T0  ! temperature anomaly (t-T0)
+            zs  = pts  (ji,jj,jk,jp_sal) - rn_S0  ! abs. salinity anomaly (s-S0)
+            zh  = gdept(ji,jj,jk,Kmm)             ! depth in meters  at t-point
+            ztm = tmask(ji,jj,jk)                 ! tmask
             zn  = 0.5_wp * zh * r1_rho0 * ztm
             !                                    ! Potential Energy
             ppen(ji,jj,jk) = ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zn
@@ -1447,8 +1871,8 @@ CONTAINS
       INTEGER  ::   ios   ! local integer
       INTEGER  ::   ioptio   ! local integer
       !!
-      NAMELIST/nameos/ ln_TEOS10, ln_EOS80, ln_SEOS, rn_a0, rn_b0, rn_lambda1, rn_mu1,   &
-         &                                             rn_lambda2, rn_mu2, rn_nu
+      NAMELIST/nameos/ ln_TEOS10, ln_EOS80, ln_SEOS, rn_T0, rn_S0, rn_a0, rn_b0, rn_lambda1, rn_mu1, &
+         &                                           rn_lambda2, rn_mu2, rn_nu
       !!----------------------------------------------------------------------
       !
       READ  ( numnam_ref, nameos, IOSTAT = ios, ERR = 901 )
@@ -1869,9 +2293,11 @@ CONTAINS
          IF(lwp) THEN
             WRITE(numout,*)
             WRITE(numout,*) '   ==>>>   use of simplified eos:    '
-            WRITE(numout,*) '              rhd(dT=T-10,dS=S-35,Z) = [-a0*(1+lambda1/2*dT+mu1*Z)*dT '
-            WRITE(numout,*) '                                       + b0*(1+lambda2/2*dT+mu2*Z)*dS - nu*dT*dS] / rho0'
+            WRITE(numout,*) '              rhd(dT=T-rn_T0,dS=S-rn_S0,Z) = [-a0*(1+lambda1/2*dT+mu1*Z)*dT '
+            WRITE(numout,*) '                                             + b0*(1+lambda2/2*dT+mu2*Z)*dS - nu*dT*dS] / rho0'
             WRITE(numout,*) '              with the following coefficients :'
+            WRITE(numout,*) '                 reference temperature rn_T0      = ', rn_T0
+            WRITE(numout,*) '                 reference salinity    rn_S0      = ', rn_S0
             WRITE(numout,*) '                 thermal exp. coef.    rn_a0      = ', rn_a0
             WRITE(numout,*) '                 saline  cont. coef.   rn_b0      = ', rn_b0
             WRITE(numout,*) '                 cabbeling coef.       rn_lambda1 = ', rn_lambda1
diff --git a/src/OCE/TRA/traadv.F90 b/src/OCE/TRA/traadv.F90
index d8bd85cb..1c7e49d6 100644
--- a/src/OCE/TRA/traadv.F90
+++ b/src/OCE/TRA/traadv.F90
@@ -10,6 +10,7 @@ MODULE traadv
    !!             -   !  2014-12  (G. Madec) suppression of cross land advection option
    !!            3.6  !  2015-06  (E. Clementi) Addition of Stokes drift in case of wave coupling
    !!            4.5  !  2021-04  (G. Madec, S. Techene) add advective velocities as optional arguments
+   !!            4.5  !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -20,7 +21,6 @@ MODULE traadv
    USE dom_oce        ! ocean space and time domain
    ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
    USE domtile
-   USE domvvl         ! variable vertical scale factors
    USE sbcwave        ! wave module
    USE sbc_oce        ! surface boundary condition: ocean
    USE traadv_cen     ! centered scheme            (tra_adv_cen  routine)
@@ -93,9 +93,8 @@ CONTAINS
       !
       INTEGER ::   ji, jj, jk   ! dummy loop index
       REAL(wp), DIMENSION(:,:,:), POINTER ::   zptu, zptv, zptw
-      ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE ::   zuu, zvv, zww   ! 3D workspace
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE       ::   ztrdt, ztrds
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zuu, zvv, zww   ! 3D workspace
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds
       ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       LOGICAL ::   lskip
       !!----------------------------------------------------------------------
@@ -104,11 +103,6 @@ CONTAINS
       !
       lskip = .FALSE.
 
-      ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         ALLOCATE( zuu(jpi,jpj,jpk), zvv(jpi,jpj,jpk), zww(jpi,jpj,jpk) )
-      ENDIF
-
       ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       IF( ln_tile .AND. nadv == np_FCT )  THEN
          IF( ntile == 1 ) THEN
@@ -119,6 +113,7 @@ CONTAINS
       ENDIF
       !
       IF( .NOT. lskip ) THEN
+         ALLOCATE( zuu(T2D(nn_hls),jpk), zvv(T2D(nn_hls),jpk), zww(T2D(nn_hls),jpk) )
          !                                         !==  effective advective transport  ==!
          !
          IF( PRESENT( pau ) ) THEN     ! RK3: advective velocity (pau,pav,paw) /= advected velocity (uu,vv,ww)
@@ -132,31 +127,24 @@ CONTAINS
          ENDIF
          !
          IF( ln_wave .AND. ln_sdw )  THEN
-            DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
+            DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
                zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * ( zptu(ji,jj,jk) + usd(ji,jj,jk) )
                zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * ( zptv(ji,jj,jk) + vsd(ji,jj,jk) )
             END_3D
-            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+            DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
                zww(ji,jj,jk) = e1e2t(ji,jj)                     * ( zptw(ji,jj,jk) + wsd(ji,jj,jk) )
             END_3D
          ELSE
-            DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
+            DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
                zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * zptu(ji,jj,jk)               ! eulerian transport only
                zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * zptv(ji,jj,jk)
             END_3D
-            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+            DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
                zww(ji,jj,jk) = e1e2t(ji,jj)                     * zptw(ji,jj,jk)
             END_3D
          ENDIF
          !
-         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN                                ! add z-tilde and/or vvl corrections
-            DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
-               zuu(ji,jj,jk) = zuu(ji,jj,jk) + un_td(ji,jj,jk)
-               zvv(ji,jj,jk) = zvv(ji,jj,jk) + vn_td(ji,jj,jk)
-            END_3D
-         ENDIF
-         !
-         DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
+         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
             zuu(ji,jj,jpk) = 0._wp                                                      ! no transport trough the bottom 
             zvv(ji,jj,jpk) = 0._wp
             zww(ji,jj,jpk) = 0._wp
@@ -167,18 +155,14 @@ CONTAINS
          !
          IF( ln_mle    )   CALL tra_mle_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm       )   ! add the mle transport (if necessary)
          !
-         ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
          IF( l_iom ) THEN
-            IF( .NOT. l_istiled .OR. ntile == nijtile )  THEN                ! Do only on the last tile
-               CALL iom_put( "uocetr_eff", zuu )                                        ! output effective transport
-               CALL iom_put( "vocetr_eff", zvv )
-               CALL iom_put( "wocetr_eff", zww )
-            ENDIF
+            CALL iom_put( "uocetr_eff", zuu )                                        ! output effective transport
+            CALL iom_put( "vocetr_eff", zvv )
+            CALL iom_put( "wocetr_eff", zww )
          ENDIF
          !
 !!gm ???
-         ! TEMP: [tiling] This copy-in not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-         IF( l_diaptr ) CALL dia_ptr( kt, Kmm, zvv(A2D(nn_hls),:) )                                    ! diagnose the effective MSF
+         IF( l_diaptr ) CALL dia_ptr( kt, Kmm, zvv(:,:,:) )                                    ! diagnose the effective MSF
 !!gm ???
          !
 
@@ -191,15 +175,15 @@ CONTAINS
          SELECT CASE ( nadv )                      !==  compute advection trend and add it to general trend  ==!
          !
          CASE ( np_CEN )                                 ! Centered scheme : 2nd / 4th order
-            CALL tra_adv_cen    ( kt, nit000, 'TRA',      zuu, zvv, zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v      )
+            CALL tra_adv_cen( kt, nit000, 'TRA',      zuu, zvv, zww,      Kmm,      pts, jpts, Krhs, nn_cen_h, nn_cen_v )
          CASE ( np_FCT )                                 ! FCT scheme      : 2nd / 4th order
-               CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, Kaa, pts, jpts, Krhs, nn_fct_h, nn_fct_v )
+            CALL tra_adv_fct( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, Kaa, pts, jpts, Krhs, nn_fct_h, nn_fct_v )
          CASE ( np_MUS )                                 ! MUSCL
-                CALL tra_adv_mus( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups         )
+            CALL tra_adv_mus( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm,      pts, jpts, Krhs, ln_mus_ups         )
          CASE ( np_UBS )                                 ! UBS
-            CALL tra_adv_ubs    ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v           )
+            CALL tra_adv_ubs( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm,      pts, jpts, Krhs, nn_ubs_v           )
          CASE ( np_QCK )                                 ! QUICKEST
-            CALL tra_adv_qck    ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs                     )
+            CALL tra_adv_qck( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm,      pts, jpts, Krhs                     )
          !
          END SELECT
          !
@@ -215,15 +199,12 @@ CONTAINS
 
          ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
          IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE. )
+
+         DEALLOCATE( zuu, zvv, zww )
       ENDIF
       !                                              ! print mean trends (used for debugging)
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' adv  - Ta: ', mask1=tmask, &
          &                                  tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-
-      ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      IF( .NOT. l_istiled .OR. ntile == nijtile )  THEN                ! Do only for the full domain
-         DEALLOCATE( zuu, zvv, zww )
-      ENDIF
       !
       IF( ln_timing )   CALL timing_stop( 'tra_adv' )
       !
diff --git a/src/OCE/TRA/traadv_cen.F90 b/src/OCE/TRA/traadv_cen.F90
index 3351e193..e55956f2 100644
--- a/src/OCE/TRA/traadv_cen.F90
+++ b/src/OCE/TRA/traadv_cen.F90
@@ -4,6 +4,7 @@ MODULE traadv_cen
    !! Ocean  tracers:   advective trend (2nd/4th order centered)
    !!======================================================================
    !! History :  3.7  ! 2014-05  (G. Madec)  original code
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -22,14 +23,11 @@ MODULE traadv_cen
    USE iom            ! IOM library
    USE trc_oce        ! share passive tracers/Ocean variables
    USE lib_mpp        ! MPP library
-#if defined key_loop_fusion
-   USE traadv_cen_lf  ! centered scheme            (tra_adv_cen  routine - loop fusion version)
-#endif
 
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC   tra_adv_cen   ! called by traadv.F90
+   PUBLIC   tra_adv_cen        ! called by traadv.F90
 
    REAL(wp) ::   r1_6 = 1._wp / 6._wp   ! =1/6
 
@@ -73,20 +71,19 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       INTEGER                                  , INTENT(in   ) ::   kn_cen_h        ! =2/4 (2nd or 4th order scheme)
       INTEGER                                  , INTENT(in   ) ::   kn_cen_v        ! =2/4 (2nd or 4th order scheme)
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       INTEGER  ::   ierr             ! local integer
       REAL(wp) ::   zC2t_u, zC4t_u   ! local scalars
       REAL(wp) ::   zC2t_v, zC4t_v   !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zwy, zwz, ztu, ztv, ztw
+      REAL(wp) ::   zftw_kp1
+      REAL(wp), DIMENSION(T2D(1))              ::   zft_u, zft_v
+      REAL(wp), DIMENSION(:,:)   , ALLOCATABLE ::   zdt_u, zdt_v
+      REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE ::   ztw
       !!----------------------------------------------------------------------
       !
-#if defined key_loop_fusion
-      CALL tra_adv_cen_lf    ( kt, nit000, cdtype, pU, pV, pW, Kmm, pt, kjpt, Krhs, kn_cen_h, kn_cen_v )
-#else
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == kit000 )  THEN
             IF(lwp) WRITE(numout,*)
@@ -103,93 +100,132 @@ CONTAINS
             &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE.
       ENDIF
       !
-      !
-      zwz(:,:, 1 ) = 0._wp       ! surface & bottom vertical flux set to zero for all tracers
-      zwz(:,:,jpk) = 0._wp
+      IF( kn_cen_h == 4 )   ALLOCATE( zdt_u(T2D(2)) , zdt_v(T2D(2)) )   ! horizontal 4th order only
+      IF( kn_cen_v == 4 )   ALLOCATE( ztw(T2D(nn_hls),jpk) )            ! vertical   4th order only
       !
       DO jn = 1, kjpt            !==  loop over the tracers  ==!
          !
-         SELECT CASE( kn_cen_h )       !--  Horizontal fluxes  --!
+         SELECT CASE( kn_cen_h )       !--  Horizontal divergence of advective fluxes  --!
          !
+!!st limitation : does not take into acccount iceshelf specificity
+!!                in case of linssh
          CASE(  2  )                         !* 2nd order centered
-            DO_3D( 1, 0, 1, 0, 1, jpkm1 )
-               zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm) )
-               zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm) )
-            END_3D
+             DO jk = 1, jpkm1
+               !
+               DO_2D( 1, 0, 1, 0 )                     ! Horizontal fluxes at layer jk
+                  zft_u(ji,jj) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm) )
+                  zft_v(ji,jj) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm) )
+               END_2D
+               !
+               DO_2D( 0, 0, 0, 0 )                     ! Horizontal divergence of advective fluxes
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - (  ( zft_u(ji,jj) - zft_u(ji-1,jj  ) )    &   ! add () for NP repro
+                     &                                           + ( zft_v(ji,jj) - zft_v(ji  ,jj-1) )  ) * r1_e1e2t(ji,jj)   &
+                     &                                        / e3t(ji,jj,jk,Kmm)
+               END_2D
+            END DO
             !
          CASE(  4  )                         !* 4th order centered
-            ztu(:,:,jpk) = 0._wp                   ! Bottom value : flux set to zero
-            ztv(:,:,jpk) = 0._wp
-            DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )          ! masked gradient
-               ztu(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk)
-               ztv(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk)
-            END_3D
-            IF (nn_hls==1) CALL lbc_lnk( 'traadv_cen', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp, ld4only= .TRUE. )   ! Lateral boundary cond.
-            !
-            DO_3D( nn_hls-1, 0, nn_hls-1, 0, 1, jpkm1 )           ! Horizontal advective fluxes
-               zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm)   ! C2 interpolation of T at u- & v-points (x2)
-               zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm)
-               !                                                  ! C4 interpolation of T at u- & v-points (x2)
-               zC4t_u =  zC2t_u + r1_6 * ( ztu(ji-1,jj,jk) - ztu(ji+1,jj,jk) )
-               zC4t_v =  zC2t_v + r1_6 * ( ztv(ji,jj-1,jk) - ztv(ji,jj+1,jk) )
-               !                                                  ! C4 fluxes
-               zwx(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * zC4t_u
-               zwy(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * zC4t_v
-            END_3D
-            IF (nn_hls==1) CALL lbc_lnk( 'traadv_cen', zwx, 'U', -1. , zwy, 'V', -1. )
+            DO jk = 1, jpkm1
+               DO_2D( 2, 1, 2, 1 )          ! masked gradient
+                  zdt_u(ji,jj) = ( pt(ji+1,jj  ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk)
+                  zdt_v(ji,jj) = ( pt(ji  ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk)
+               END_2D
+               !
+               DO_2D( 1, 0, 1, 0 )                    ! Horizontal advective fluxes
+                  zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm)   ! C2 interpolation of T at u- & v-points (x2)
+                  zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm)
+                  !                                                        ! C4 interpolation of T at u- & v-points (x2)
+                  zC4t_u =  zC2t_u + r1_6 * ( zdt_u(ji-1,jj  ) - zdt_u(ji+1,jj  ) )
+                  zC4t_v =  zC2t_v + r1_6 * ( zdt_v(ji  ,jj-1) - zdt_v(ji  ,jj+1) )
+                  !                                                        ! C4 fluxes
+                  zft_u(ji,jj) =  0.5_wp * pU(ji,jj,jk) * zC4t_u
+                  zft_v(ji,jj) =  0.5_wp * pV(ji,jj,jk) * zC4t_v
+               END_2D
+               !
+               DO_2D( 0, 0, 0, 0 )                                         ! Horizontal divergence of advective fluxes
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - (  ( zft_u(ji,jj) - zft_u(ji-1,jj  ) )    &   ! add () for NP repro
+                     &                                           + ( zft_v(ji,jj) - zft_v(ji  ,jj-1) )  ) * r1_e1e2t(ji,jj)   &
+                     &                                        / e3t(ji,jj,jk,Kmm)
+               END_2D
+            END DO
             !
          CASE DEFAULT
             CALL ctl_stop( 'traadv_cen: wrong value for nn_cen' )
          END SELECT
          !
-         SELECT CASE( kn_cen_v )       !--  Vertical fluxes  --!   (interior)
+#define zft_w  zft_u
+         !
+         IF( ln_linssh ) THEN                !* top value   (linear free surf. only as zwz is multiplied by wmask)
+            DO_2D( 0, 0, 0, 0 )
+               zft_w(ji,jj) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kmm)
+            END_2D
+         ELSE
+            DO_2D( 0, 0, 0, 0 )
+               zft_w(ji,jj) = 0._wp
+            END_2D
+         ENDIF
+         !
+         SELECT CASE( kn_cen_v )       !--  Vertical divergence of advective fluxes  --!   (interior)
          !
          CASE(  2  )                         !* 2nd order centered
-            DO_3D( 0, 0, 0, 0, 2, jpk )
-               zwz(ji,jj,jk) = 0.5 * pW(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) * wmask(ji,jj,jk)
-            END_3D
+            DO jk = 1, jpk-2
+               DO_2D( 0, 0, 0, 0 )                             ! Vertical fluxes
+                  zftw_kp1 = 0.5 * pW(ji,jj,jk+1) * ( pt(ji,jj,jk+1,jn,Kmm) + pt(ji,jj,jk,jn,Kmm) ) * wmask(ji,jj,jk+1)
+                  !
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - (  zft_w(ji,jj) - zftw_kp1  ) * r1_e1e2t(ji,jj)   &
+                       &                                        / e3t(ji,jj,jk,Kmm)
+                  zft_w(ji,jj) = zftw_kp1
+               END_2D
+            END DO
+            jk = jpkm1                                         ! bottom vertical flux set to zero for all tracers
+            DO_2D( 0, 0, 0, 0 )
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - zft_w(ji,jj) * r1_e1e2t(ji,jj)   &
+                  &                                        / e3t(ji,jj,jk,Kmm)
+            END_2D
             !
          CASE(  4  )                         !* 4th order compact
             CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw )      ! ztw = interpolated value of T at w-point
-            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-               zwz(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)
-            END_3D
             !
-         END SELECT
-         !
-         IF( ln_linssh ) THEN                !* top value   (linear free surf. only as zwz is multiplied by wmask)
-            IF( ln_isfcav ) THEN                  ! ice-shelf cavities (top of the ocean)
-               DO_2D( 1, 1, 1, 1 )
-                  zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm)
-               END_2D
-            ELSE                                   ! no ice-shelf cavities (only ocean surface)
-               DO_2D( 1, 1, 1, 1 )
-                  zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kmm)
+            DO jk = 1, jpk-2
+               !
+               DO_2D( 0, 0, 0, 0 )
+                  zftw_kp1 = pW(ji,jj,jk+1) * ztw(ji,jj,jk+1) * wmask(ji,jj,jk+1)
+                  !                          ! Divergence of advective fluxes
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - (  zft_w(ji,jj) - zftw_kp1  ) * r1_e1e2t(ji,jj)   &
+                     &                                        / e3t(ji,jj,jk,Kmm)
+                  !                          ! update
+                  zft_w(ji,jj) = zftw_kp1
                END_2D
-            ENDIF
-         ENDIF
+               !
+            END DO
+            !
+            jk = jpkm1       ! bottom vertical flux set to zero for all tracers
+            DO_2D( 0, 0, 0, 0 )
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - zft_w(ji,jj) * r1_e1e2t(ji,jj)   &
+                  &                                        / e3t(ji,jj,jk,Kmm)
+            END_2D
+            !
+         END SELECT
          !
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !--  Divergence of advective fluxes  --!
-            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)    &
-               &             - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )    &
-               &                + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )    &
-               &                + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1)  ) &
-               &                * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-         END_3D
+#undef zft_w
          !                               ! trend diagnostics
-         IF( l_trd ) THEN
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) )
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) )
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) )
-         ENDIF
-         !                                 ! "Poleward" heat and salt transports
-         IF( l_ptr )   CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
-         !                                 !  heat and salt transport
-         IF( l_hst )   CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) )
+!!gm + !!st to be done with the whole rewritting of trd
+!!          trd routine arguments MUST be changed adding jk and zwx, zwy in 2D
+!!         IF( l_trd ) THEN
+!!            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) )
+!!            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) )
+!!            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) )
+!!         ENDIF
+!!         !                                 ! "Poleward" heat and salt transports
+!!         IF( l_ptr )   CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
+!!         !                                 !  heat and salt transport
+!!         IF( l_hst )   CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) )
          !
       END DO
       !
-#endif
+      IF( kn_cen_h == 4 )   DEALLOCATE( zdt_u , zdt_v )   ! horizontal 4th order only
+      IF( kn_cen_v == 4 )   DEALLOCATE( ztw )             ! vertical   4th order only
+      !
    END SUBROUTINE tra_adv_cen
 
    !!======================================================================
diff --git a/src/OCE/TRA/traadv_cen_lf.F90 b/src/OCE/TRA/traadv_cen_lf.F90
index 6d1f08fb..f7b0e0f1 100644
--- a/src/OCE/TRA/traadv_cen_lf.F90
+++ b/src/OCE/TRA/traadv_cen_lf.F90
@@ -70,8 +70,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       INTEGER                                  , INTENT(in   ) ::   kn_cen_h        ! =2/4 (2nd or 4th order scheme)
       INTEGER                                  , INTENT(in   ) ::   kn_cen_v        ! =2/4 (2nd or 4th order scheme)
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
@@ -80,7 +79,7 @@ CONTAINS
       REAL(wp) ::   zC2t_v, zC4t_v   !   -      -
       REAL(wp) ::   ztu_im1, ztu_ip1 !   -      -
       REAL(wp) ::   ztv_jm1, ztv_jp1 !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zwy, zwz, ztw
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwx, zwy, zwz, ztw
       !!----------------------------------------------------------------------
       !
       IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile
diff --git a/src/OCE/TRA/traadv_fct.F90 b/src/OCE/TRA/traadv_fct.F90
index 541e61e0..95b3255d 100644
--- a/src/OCE/TRA/traadv_fct.F90
+++ b/src/OCE/TRA/traadv_fct.F90
@@ -78,23 +78,19 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kn_fct_h        ! order of the FCT scheme (=2 or 4)
       INTEGER                                  , INTENT(in   ) ::   kn_fct_v        ! order of the FCT scheme (=2 or 4)
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn                           ! dummy loop indices
       REAL(wp) ::   ztra                                     ! local scalar
       REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u   !   -      -
       REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v   !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)        ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk)        ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdx, ztrdy, ztrdz, zptry
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zwinf, zwdia, zwsup
       LOGICAL  ::   ll_zAimp                                 ! flag to apply adaptive implicit vertical advection
       !!----------------------------------------------------------------------
       !
-#if defined key_loop_fusion
-      CALL tra_adv_fct_lf ( kt, nit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, Kaa, pt, kjpt, Krhs, kn_fct_h, kn_fct_v )
-#else
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == kit000 )  THEN
             IF(lwp) WRITE(numout,*)
@@ -125,22 +121,22 @@ CONTAINS
       ztw(:,:,:) = 0._wp
       !
       IF( l_trd .OR. l_hst )  THEN
-         ALLOCATE( ztrdx(A2D(nn_hls),jpk), ztrdy(A2D(nn_hls),jpk), ztrdz(A2D(nn_hls),jpk) )
+         ALLOCATE( ztrdx(T2D(nn_hls),jpk), ztrdy(T2D(nn_hls),jpk), ztrdz(T2D(nn_hls),jpk) )
          ztrdx(:,:,:) = 0._wp   ;    ztrdy(:,:,:) = 0._wp   ;   ztrdz(:,:,:) = 0._wp
       ENDIF
       !
       IF( l_ptr ) THEN
-         ALLOCATE( zptry(A2D(nn_hls),jpk) )
+         ALLOCATE( zptry(T2D(0),jpk) )
          zptry(:,:,:) = 0._wp
       ENDIF
       !
       ! If adaptive vertical advection, check if it is needed on this PE at this time
       IF( ln_zad_Aimp ) THEN
-         IF( MAXVAL( ABS( wi(A2D(1),:) ) ) > 0._wp ) ll_zAimp = .TRUE.
+         IF( MAXVAL( ABS( wi(T2D(1),:) ) ) > 0._wp ) ll_zAimp = .TRUE.
       END IF
       ! If active adaptive vertical advection, build tridiagonal matrix
       IF( ll_zAimp ) THEN
-         ALLOCATE(zwdia(A2D(nn_hls),jpk), zwinf(A2D(nn_hls),jpk), zwsup(A2D(nn_hls),jpk))
+         ALLOCATE(zwdia(T2D(nn_hls),jpk), zwinf(T2D(nn_hls),jpk), zwsup(T2D(nn_hls),jpk))
          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
             zwdia(ji,jj,jk) =  1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) )   &
             &                               / e3t(ji,jj,jk,Kaa)
@@ -182,9 +178,9 @@ CONTAINS
          !
          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )   !* trend and after field with monotonic scheme
             !                               ! total intermediate advective trends
-            ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   &
-               &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   &
-               &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj)
+            ztra = - (  ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  ) )   &  ! add () for NP reproducibility
+               &      + ( zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )   &
+               &      + ( zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) ) * r1_e1e2t(ji,jj)
             !                               ! update and guess with monotonic sheme
             pt(ji,jj,jk,jn,Krhs) =                   pt(ji,jj,jk,jn,Krhs) +       ztra   &
                &                                  / e3t(ji,jj,jk,Kmm ) * tmask(ji,jj,jk)
@@ -213,7 +209,7 @@ CONTAINS
             ztrdx(:,:,:) = zwx(:,:,:)   ;   ztrdy(:,:,:) = zwy(:,:,:)   ;   ztrdz(:,:,:) = zwz(:,:,:)
          END IF
          !                             ! "Poleward" heat and salt transports (contribution of upstream fluxes)
-         IF( l_ptr )   zptry(:,:,:) = zwy(:,:,:)
+         IF( l_ptr )   zptry(:,:,:) = zwy(T2D(0),:)
          !
          !        !==  anti-diffusive flux : high order minus low order  ==!
          !
@@ -246,13 +242,9 @@ CONTAINS
                zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm)
                !                                                        ! C4 minus upstream advective fluxes
                ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               zwx(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * ( zC2t_u + ( zltu(ji,jj,jk) - zltu(ji+1,jj,jk)   &
-                             &                                     )                                     & ! bracket for halo 1 - halo 2 compatibility
-                             &                          ) - zwx(ji,jj,jk)
-               zwy(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * ( zC2t_v + ( zltv(ji,jj,jk) - zltv(ji,jj+1,jk)   &
-                             &                                     )                                     & ! bracket for halo 1 - halo 2 compatibility
-                             &                          ) - zwy(ji,jj,jk)
+               ! needed to ensure the North Pole reproducibility
+               zwx(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * ( zC2t_u + ( zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) ) - zwx(ji,jj,jk)
+               zwy(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * ( zC2t_v + ( zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) ) - zwy(ji,jj,jk)
             END_3D
             !
          CASE(  41 )                   !- 4th order centered       ==>>   !!gm coding attempt   need to be tested
@@ -306,9 +298,9 @@ CONTAINS
          IF ( ll_zAimp ) THEN
             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )    !* trend and after field with monotonic scheme
                !                                                ! total intermediate advective trends
-               ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   &
-                  &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   &
-                  &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj)
+               ztra = - (  ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  ) )   &   ! add () NP halo
+                  &      + ( zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )   &
+                  &      + ( zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) ) * r1_e1e2t(ji,jj)
                ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Kaa) * tmask(ji,jj,jk)
             END_3D
             !
@@ -328,9 +320,9 @@ CONTAINS
          !        !==  final trend with corrected fluxes  ==!
          !
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            ztra = - (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   &
-               &      + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   &
-               &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj)
+            ztra = - (  ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  ) )   &   ! add () for NP reproducibility
+               &      + ( zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )   &
+               &      + ( zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) ) * r1_e1e2t(ji,jj)
             pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm)
             zwi(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Kaa) * tmask(ji,jj,jk)
          END_3D
@@ -364,7 +356,7 @@ CONTAINS
             !
          ENDIF
          IF( l_ptr ) THEN              ! "Poleward" transports
-            zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:)  ! <<< add anti-diffusive fluxes
+            zptry(:,:,:) = zptry(:,:,:) + zwy(T2D(0),:)  ! <<< add anti-diffusive fluxes
             CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) )
          ENDIF
          !
@@ -380,7 +372,6 @@ CONTAINS
          DEALLOCATE( zptry )
       ENDIF
       !
-#endif
    END SUBROUTINE tra_adv_fct
 
 
@@ -400,14 +391,14 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   Kaa             ! time level index
       REAL(wp)                        , INTENT(in   ) ::   p2dt            ! tracer time-step
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pbef            ! before field
-      REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(in   ) ::   paft            ! after field
-      REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions
+      REAL(wp), DIMENSION(T2D(nn_hls)    ,jpk), INTENT(in   ) ::   paft            ! after field
+      REAL(wp), DIMENSION(T2D(nn_hls)    ,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikm1         ! local integer
       REAL(dp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn    ! local scalars
       REAL(dp) ::   zau, zbu, zcu, zav, zbv, zcv, zup, zdo            !   -      -
-      REAL(dp), DIMENSION(A2D(nn_hls),jpk) :: zbetup, zbetdo, zbup, zbdo
+      REAL(dp), DIMENSION(T2D(nn_hls),jpk) :: zbetup, zbetdo, zbup, zbdo
       !!----------------------------------------------------------------------
       !
       zbig  = 1.e+40_dp
@@ -553,11 +544,11 @@ CONTAINS
       !! **  Method  :   4th order compact interpolation
       !!----------------------------------------------------------------------
       REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt_in    ! field at t-point
-      REAL(wp),DIMENSION(A2D(nn_hls)    ,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point
+      REAL(wp),DIMENSION(T2D(nn_hls)    ,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point
       !
       INTEGER ::   ji, jj, jk   ! dummy loop integers
       INTEGER ::   ikt, ikb     ! local integers
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk) :: zwd, zwi, zws, zwrm, zwt
+      REAL(wp),DIMENSION(T2D(nn_hls),jpk) :: zwd, zwi, zws, zwrm, zwt
       !!----------------------------------------------------------------------
       !
       !                      !==  build the three diagonal matrix & the RHS  ==!
@@ -642,14 +633,14 @@ CONTAINS
       !!        The solution is pta.
       !!        The 3d array zwt is used as a work space array.
       !!----------------------------------------------------------------------
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pRHS          ! Right-Hand-Side
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   pt_out        !!gm field at level=F(klev)
+      REAL(wp),DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix
+      REAL(wp),DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pRHS          ! Right-Hand-Side
+      REAL(wp),DIMENSION(T2D(nn_hls),jpk), INTENT(  out) ::   pt_out        !!gm field at level=F(klev)
       INTEGER                    , INTENT(in   ) ::   klev          ! =1 pt_out at w-level
       !                                                             ! =0 pt at t-level
       INTEGER ::   ji, jj, jk   ! dummy loop integers
       INTEGER ::   kstart       ! local indices
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk) ::   zwt   ! 3D work array
+      REAL(wp),DIMENSION(T2D(nn_hls),jpk) ::   zwt   ! 3D work array
       !!----------------------------------------------------------------------
       !
       kstart =  1  + klev
@@ -677,332 +668,5 @@ CONTAINS
       !
    END SUBROUTINE tridia_solver
 
-#if defined key_loop_fusion
-#define tracer_flux_i(out,zfp,zfm,ji,jj,jk) \
-        zfp = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ; \
-        zfm = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) ) ; \
-        out = 0.5 * ( zfp * pt(ji,jj,jk,jn,Kbb) + zfm * pt(ji+1,jj,jk,jn,Kbb) )
-
-#define tracer_flux_j(out,zfp,zfm,ji,jj,jk) \
-        zfp = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) ) ; \
-        zfm = pV(ji,jj,jk) - ABS( pV(ji,jj,jk) ) ; \
-        out = 0.5 * ( zfp * pt(ji,jj,jk,jn,Kbb) + zfm * pt(ji,jj+1,jk,jn,Kbb) )
-
-   SUBROUTINE tra_adv_fct_lf( kt, kit000, cdtype, p2dt, pU, pV, pW,       &
-      &                    Kbb, Kmm, Kaa, pt, kjpt, Krhs, kn_fct_h, kn_fct_v )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE tra_adv_fct  ***
-      !!
-      !! **  Purpose :   Compute the now trend due to total advection of tracers
-      !!               and add it to the general trend of tracer equations
-      !!
-      !! **  Method  : - 2nd or 4th FCT scheme on the horizontal direction
-      !!               (choice through the value of kn_fct)
-      !!               - on the vertical the 4th order is a compact scheme
-      !!               - corrected flux (monotonic correction)
-      !!
-      !! ** Action : - update pt(:,:,:,:,Krhs)  with the now advective tracer trends
-      !!             - send trends to trdtra module for further diagnostics (l_trdtra=T)
-      !!             - poleward advective heat and salt transport (ln_diaptr=T)
-      !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt                   ! ocean time-step index
-      INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Kaa, Krhs  ! ocean time level indices
-      INTEGER                                  , INTENT(in   ) ::   kit000          ! first time step index
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
-      INTEGER                                  , INTENT(in   ) ::   kn_fct_h        ! order of the FCT scheme (=2 or 4)
-      INTEGER                                  , INTENT(in   ) ::   kn_fct_v        ! order of the FCT scheme (=2 or 4)
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
-      !
-      INTEGER  ::   ji, jj, jk, jn                           ! dummy loop indices
-      REAL(wp) ::   ztra                                     ! local scalar
-      REAL(wp) ::   zwx_im1, zfp_ui, zfp_ui_m1, zfp_vj, zfp_vj_m1, zfp_wk, zC2t_u, zC4t_u   !   -      -
-      REAL(wp) ::   zwy_jm1, zfm_ui, zfm_ui_m1, zfm_vj, zfm_vj_m1, zfm_wk, zC2t_v, zC4t_v   !   -      -
-      REAL(wp) ::   ztu, ztv, ztu_im1, ztu_ip1, ztv_jm1, ztv_jp1
-      REAL(wp), DIMENSION(jpi,jpj,jpk)        ::   zwi, zwx_3d, zwy_3d, zwz, ztw, zltu_3d, zltv_3d
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdx, ztrdy, ztrdz, zptry
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zwinf, zwdia, zwsup
-      LOGICAL  ::   ll_zAimp                                 ! flag to apply adaptive implicit vertical advection
-      !!----------------------------------------------------------------------
-      !
-      IF( kt == kit000 )  THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'tra_adv_fct_lf : FCT advection scheme on ', cdtype
-         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
-      ENDIF
-      !! -- init to 0
-      zwx_3d(:,:,:) = 0._wp
-      zwy_3d(:,:,:) = 0._wp
-      zwz(:,:,:) = 0._wp
-      zwi(:,:,:) = 0._wp
-      !
-      l_trd = .FALSE.            ! set local switches
-      l_hst = .FALSE.
-      l_ptr = .FALSE.
-      ll_zAimp = .FALSE.
-      IF( ( cdtype == 'TRA' .AND. l_trdtra  ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) )      l_trd = .TRUE.
-      IF(   cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) )    l_ptr = .TRUE.
-      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR.  &
-         &                         iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE.
-      !
-      IF( l_trd .OR. l_hst )  THEN
-         ALLOCATE( ztrdx(jpi,jpj,jpk), ztrdy(jpi,jpj,jpk), ztrdz(jpi,jpj,jpk) )
-         ztrdx(:,:,:) = 0._wp   ;    ztrdy(:,:,:) = 0._wp   ;   ztrdz(:,:,:) = 0._wp
-      ENDIF
-      !
-      IF( l_ptr ) THEN
-         ALLOCATE( zptry(jpi,jpj,jpk) )
-         zptry(:,:,:) = 0._wp
-      ENDIF
-      !
-      ! If adaptive vertical advection, check if it is needed on this PE at this time
-      IF( ln_zad_Aimp ) THEN
-         IF( MAXVAL( ABS( wi(:,:,:) ) ) > 0._wp ) ll_zAimp = .TRUE.
-      END IF
-      ! If active adaptive vertical advection, build tridiagonal matrix
-      IF( ll_zAimp ) THEN
-         ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk))
-         DO_3D( 1, 1, 1, 1, 1, jpkm1 )
-            zwdia(ji,jj,jk) =  1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) )   &
-            &                               / e3t(ji,jj,jk,Kaa)
-            zwinf(ji,jj,jk) =  p2dt * MIN( wi(ji,jj,jk  ) , 0._wp ) / e3t(ji,jj,jk,Kaa)
-            zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t(ji,jj,jk,Kaa)
-         END_3D
-      END IF
-      !
-      DO jn = 1, kjpt            !==  loop over the tracers  ==!
-         !
-         !        !==  upstream advection with initial mass fluxes & intermediate update  ==!
-         !                               !* upstream tracer flux in the k direction *!
-         DO_3D( 1, 1, 1, 1, 2, jpkm1 )      ! Interior value ( multiplied by wmask)
-            zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) )
-            zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) )
-            zwz(ji,jj,jk) = 0.5 * ( zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb) ) * wmask(ji,jj,jk)
-         END_3D
-         IF( ln_linssh ) THEN               ! top ocean value (only in linear free surface as zwz has been w-masked)
-            IF( ln_isfcav ) THEN                        ! top of the ice-shelf cavities and at the ocean surface
-               DO_2D( 1, 1, 1, 1 )
-                  zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb)   ! linear free surface
-               END_2D
-            ELSE                                        ! no cavities: only at the ocean surface
-               DO_2D( 1, 1, 1, 1 )
-                  zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb)
-               END_2D
-            ENDIF
-         ENDIF
-         !
-         !                    !* upstream tracer flux in the i and j direction
-         DO jk = 1, jpkm1
-            DO jj = 1, jpj-1
-               tracer_flux_i(zwx_3d(1,jj,jk),zfp_ui,zfm_ui,1,jj,jk)
-               tracer_flux_j(zwy_3d(1,jj,jk),zfp_vj,zfm_vj,1,jj,jk)
-            END DO
-            DO ji = 1, jpi-1
-               tracer_flux_i(zwx_3d(ji,1,jk),zfp_ui,zfm_ui,ji,1,jk)
-               tracer_flux_j(zwy_3d(ji,1,jk),zfp_vj,zfm_vj,ji,1,jk)
-            END DO
-            DO_2D( 1, 1, 1, 1 )
-               tracer_flux_i(zwx_3d(ji,jj,jk),zfp_ui,zfm_ui,ji,jj,jk)
-               tracer_flux_i(zwx_im1,zfp_ui_m1,zfm_ui_m1,ji-1,jj,jk)
-               tracer_flux_j(zwy_3d(ji,jj,jk),zfp_vj,zfm_vj,ji,jj,jk)
-               tracer_flux_j(zwy_jm1,zfp_vj_m1,zfm_vj_m1,ji,jj-1,jk)
-               ztra = - ( zwx_3d(ji,jj,jk) - zwx_im1 + zwy_3d(ji,jj,jk) - zwy_jm1 + zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) * r1_e1e2t(ji,jj)
-               !                               ! update and guess with monotonic sheme
-               pt(ji,jj,jk,jn,Krhs) =                   pt(ji,jj,jk,jn,Krhs) +       ztra   &
-                  &                                  / e3t(ji,jj,jk,Kmm ) * tmask(ji,jj,jk)
-               zwi(ji,jj,jk)    = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) &
-                  &                                  / e3t(ji,jj,jk,Kaa ) * tmask(ji,jj,jk)
-            END_2D
-         END DO
-
-         IF ( ll_zAimp ) THEN
-            CALL tridia_solver( zwdia, zwsup, zwinf, zwi, zwi , 0 )
-            !
-            ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp ;
-            DO_3D( 1, 1, 1, 1, 2, jpkm1 )       ! Interior value ( multiplied by wmask)
-               zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) )
-               zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) )
-               ztw(ji,jj,jk) =  0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk)
-               zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! update vertical fluxes
-            END_3D
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1) ) &
-                  &                                        * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-            END_3D
-            !
-         END IF
-         !
-         IF( l_trd .OR. l_hst )  THEN             ! trend diagnostics (contribution of upstream fluxes)
-            ztrdx(:,:,:) = zwx_3d(:,:,:)   ;   ztrdy(:,:,:) = zwy_3d(:,:,:)   ;   ztrdz(:,:,:) = zwz(:,:,:)
-         END IF
-         !                             ! "Poleward" heat and salt transports (contribution of upstream fluxes)
-         IF( l_ptr )   zptry(:,:,:) = zwy_3d(:,:,:)
-         !
-         !        !==  anti-diffusive flux : high order minus low order  ==!
-         !
-         SELECT CASE( kn_fct_h )    !* horizontal anti-diffusive fluxes
-         !
-         CASE(  2  )                   !- 2nd order centered
-            DO_3D( 2, 1, 2, 1, 1, jpkm1 )
-               zwx_3d(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj,jk,jn,Kmm) ) - zwx_3d(ji,jj,jk)
-               zwy_3d(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj+1,jk,jn,Kmm) ) - zwy_3d(ji,jj,jk)
-            END_3D
-            !
-         CASE(  4  )                   !- 4th order centered
-            zltu_3d(:,:,jpk) = 0._wp            ! Bottom value : flux set to zero
-            zltv_3d(:,:,jpk) = 0._wp
-            !                          ! Laplacian
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )                 ! 2nd derivative * 1/ 6
-                  !             ! 1st derivative (gradient)
-                  ztu = ( pt(ji+1,jj,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk)
-                  ztu_im1 = ( pt(ji,jj,jk,jn,Kmm) - pt(ji-1,jj,jk,jn,Kmm) ) * umask(ji-1,jj,jk)
-                  ztv = ( pt(ji,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk)
-                  ztv_jm1 = ( pt(ji,jj,jk,jn,Kmm) - pt(ji,jj-1,jk,jn,Kmm) ) * vmask(ji,jj-1,jk)
-                  !             ! 2nd derivative * 1/ 6
-                  zltu_3d(ji,jj,jk) = (  ztu + ztu_im1  ) * r1_6
-                  zltv_3d(ji,jj,jk) = (  ztv + ztv_jm1  ) * r1_6
-               END_2D
-            END DO
-            ! NOTE [ comm_cleanup ] : need to change sign to ensure halo 1 - halo 2 compatibility
-            CALL lbc_lnk( 'traadv_fct', zltu_3d, 'T', -1.0_wp , zltv_3d, 'T', -1.0_wp )   ! Lateral boundary cond. (unchanged sgn)
-            !
-            DO_3D( 2, 1, 2, 1, 1, jpkm1 )
-               zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm)   ! 2 x C2 interpolation of T at u- & v-points
-               zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm)
-               !                                                        ! C4 minus upstream advective fluxes
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               zwx_3d(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * ( zC2t_u + ( zltu_3d(ji,jj,jk) - zltu_3d(ji+1,jj,jk)   &
-                             &                                        )                                           & ! bracket for halo 1 - halo 2 compatibility
-                             &                             ) - zwx_3d(ji,jj,jk)
-               zwy_3d(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * ( zC2t_v + ( zltv_3d(ji,jj,jk) - zltv_3d(ji,jj+1,jk)   &
-                             &                                        )                                           & ! bracket for halo 1 - halo 2 compatibility
-                             &                             ) - zwy_3d(ji,jj,jk)
-            END_3D
-            !
-         CASE(  41 )                   !- 4th order centered       ==>>   !!gm coding attempt   need to be tested
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )    ! Horizontal advective fluxes
-               ztu_im1 = ( pt(ji  ,jj  ,jk,jn,Kmm) - pt(ji-1,jj,jk,jn,Kmm) ) * umask(ji-1,jj,jk)
-               ztu_ip1 = ( pt(ji+2,jj  ,jk,jn,Kmm) - pt(ji+1,jj,jk,jn,Kmm) ) * umask(ji+1,jj,jk)
-
-               ztv_jm1 = ( pt(ji,jj  ,jk,jn,Kmm) - pt(ji,jj-1,jk,jn,Kmm) ) * vmask(ji,jj-1,jk)
-               ztv_jp1 = ( pt(ji,jj+2,jk,jn,Kmm) - pt(ji,jj+1,jk,jn,Kmm) ) * vmask(ji,jj+1,jk)
-               zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm)   ! 2 x C2 interpolation of T at u- & v-points (x2)
-               zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm)
-               !                                                  ! C4 interpolation of T at u- & v-points (x2)
-               zC4t_u =  zC2t_u + r1_6 * ( ztu_im1 - ztu_ip1 )
-               zC4t_v =  zC2t_v + r1_6 * ( ztv_jm1 - ztv_jp1 )
-               !                                                  ! C4 minus upstream advective fluxes
-               zwx_3d(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * zC4t_u - zwx_3d(ji,jj,jk)
-               zwy_3d(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * zC4t_v - zwy_3d(ji,jj,jk)
-            END_3D
-            CALL lbc_lnk( 'traadv_fct', zwx_3d, 'U', -1.0_wp , zwy_3d, 'V', -1.0_wp )   ! Lateral boundary cond. (unchanged sgn)
-            !
-         END SELECT
-         !
-         SELECT CASE( kn_fct_v )    !* vertical anti-diffusive fluxes (w-masked interior values)
-         !
-         CASE(  2  )                   !- 2nd order centered
-            DO_3D( 1, 1, 1, 1, 2, jpkm1 )
-               zwz(ji,jj,jk) =  (  pW(ji,jj,jk) * 0.5_wp * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) )   &
-                  &              - zwz(ji,jj,jk)  ) * wmask(ji,jj,jk)
-            END_3D
-            !
-         CASE(  4  )                   !- 4th order COMPACT
-            CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw )   ! zwt = COMPACT interpolation of T at w-point
-            DO_3D( 1, 1, 1, 1, 2, jpkm1 )
-               zwz(ji,jj,jk) = ( pW(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk)
-            END_3D
-            !
-         END SELECT
-         IF( ln_linssh ) THEN    ! top ocean value: high order = upstream  ==>>  zwz=0
-            zwz(:,:,1) = 0._wp   ! only ocean surface as interior zwz values have been w-masked
-         ENDIF
-         !
-         CALL lbc_lnk( 'traadv_fct', zwi, 'T', 1.0_wp)
-         !
-         IF ( ll_zAimp ) THEN
-            DO_3D( 1, 1, 1, 1, 1, jpkm1 )    !* trend and after field with monotonic scheme
-               !                                                ! total intermediate advective trends
-               ztra = - (  zwx_3d(ji,jj,jk) - zwx_3d(ji-1,jj  ,jk  )   &
-                  &      + zwy_3d(ji,jj,jk) - zwy_3d(ji  ,jj-1,jk  )   &
-                  &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj)
-               ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Kaa) * tmask(ji,jj,jk)
-            END_3D
-            !
-            CALL tridia_solver( zwdia, zwsup, zwinf, ztw, ztw , 0 )
-            !
-            DO_3D( 1, 1, 1, 1, 2, jpkm1 )       ! Interior value ( multiplied by wmask)
-               zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) )
-               zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) )
-               zwz(ji,jj,jk) = zwz(ji,jj,jk) + 0.5 * e1e2t(ji,jj) * ( zfp_wk * ztw(ji,jj,jk) + zfm_wk * ztw(ji,jj,jk-1) ) * wmask(ji,jj,jk)
-            END_3D
-         END IF
-         !
-         !        !==  monotonicity algorithm  ==!
-         !
-         CALL nonosc( Kaa, pt(:,:,:,jn,Kbb), zwx_3d, zwy_3d, zwz, zwi, p2dt )
-         !
-         !        !==  final trend with corrected fluxes  ==!
-         !
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            ztra = - (  zwx_3d(ji,jj,jk) - zwx_3d(ji-1,jj  ,jk  )   &
-               &      + zwy_3d(ji,jj,jk) - zwy_3d(ji  ,jj-1,jk  )   &
-               &      + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) * r1_e1e2t(ji,jj)
-            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm)
-            zwi(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Kaa) * tmask(ji,jj,jk)
-         END_3D
-         !
-         IF ( ll_zAimp ) THEN
-            !
-            ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp
-            DO_3D( 0, 0, 0, 0, 2, jpkm1 )      ! Interior value ( multiplied by wmask)
-               zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) )
-               zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) )
-               ztw(ji,jj,jk) = - 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk)
-               zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! Update vertical fluxes for trend diagnostic
-            END_3D
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1) ) &
-                  &                                        * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-            END_3D
-         END IF
-         ! NOT TESTED - NEED l_trd OR l_hst TRUE
-         IF( l_trd .OR. l_hst ) THEN   ! trend diagnostics // heat/salt transport
-            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx_3d(:,:,:)  ! <<< add anti-diffusive fluxes
-            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy_3d(:,:,:)  !     to upstream fluxes
-            ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:)  !
-            !
-            IF( l_trd ) THEN              ! trend diagnostics
-               CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztrdx, pU, pt(:,:,:,jn,Kmm) )
-               CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztrdy, pV, pt(:,:,:,jn,Kmm) )
-               CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, ztrdz, pW, pt(:,:,:,jn,Kmm) )
-            ENDIF
-            !                             ! heat/salt transport
-            IF( l_hst )   CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) )
-            !
-         ENDIF
-         ! NOT TESTED - NEED l_ptr TRUE
-         IF( l_ptr ) THEN              ! "Poleward" transports
-            zptry(:,:,:) = zptry(:,:,:) + zwy_3d(:,:,:)  ! <<< add anti-diffusive fluxes
-            CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) )
-         ENDIF
-         !
-      END DO                     ! end of tracer loop
-      !
-      IF ( ll_zAimp ) THEN
-         DEALLOCATE( zwdia, zwinf, zwsup )
-      ENDIF
-      IF( l_trd .OR. l_hst ) THEN
-         DEALLOCATE( ztrdx, ztrdy, ztrdz )
-      ENDIF
-      IF( l_ptr ) THEN
-         DEALLOCATE( zptry )
-      ENDIF
-      !
-   END SUBROUTINE tra_adv_fct_lf
-#endif
    !!======================================================================
 END MODULE traadv_fct
diff --git a/src/OCE/TRA/traadv_mus.F90 b/src/OCE/TRA/traadv_mus.F90
index 4c4b0437..f49d6fae 100644
--- a/src/OCE/TRA/traadv_mus.F90
+++ b/src/OCE/TRA/traadv_mus.F90
@@ -9,6 +9,7 @@ MODULE traadv_mus
    !!            3.2  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport
    !!            3.4  !  2012-06  (P. Oddo, M. Vichi) include the upstream where needed
    !!            3.7  !  2015-09  (G. Madec) add the ice-shelf cavities boundary condition
+   !!            4.5  !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -34,7 +35,8 @@ MODULE traadv_mus
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC   tra_adv_mus   ! routine called by traadv.F90
+   PUBLIC   tra_adv_mus        ! routine called by traadv.F90
+
 
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   upsmsk   !: mixed upstream/centered scheme near some straits
    !                                                           !  and in closed seas (orca 2 and 1 configurations)
@@ -80,16 +82,17 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       LOGICAL                                  , INTENT(in   ) ::   ld_msc_ups      ! use upstream scheme within muscl
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       INTEGER  ::   ierr             ! local integer
-      REAL(wp) ::   zu, z0u, zzwx, zw , zalpha   ! local scalars
-      REAL(wp) ::   zv, z0v, zzwy, z0w           !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zslpx   ! 3D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwy, zslpy   ! -      -
+      INTEGER  ::   ik
+      REAL(wp) ::   zu, z0u, zzslpx, zzwx, zw , zalpha   ! local scalars
+      REAL(wp) ::   zv, z0v, zzslpy, zzwy, z0w           !   -      -
+      REAL(wp) ::   zdzt_kp2, zslpz_kp1, zfW_kp1
+      REAL(wp), DIMENSION(T2D(2)) ::   zdxt, zslpx, zwx  ! 2D workspace
+      REAL(wp), DIMENSION(T2D(2)) ::   zdyt, zslpy, zwy  ! -      -
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -104,15 +107,10 @@ CONTAINS
             !
             ALLOCATE( xind(jpi,jpj,jpk), STAT=ierr )
             xind(:,:,:) = 1._wp              ! set equal to 1 where up-stream is not needed
-            !
             IF( ld_msc_ups ) THEN            ! define the upstream indicator (if asked)
-               ALLOCATE( upsmsk(jpi,jpj), STAT=ierr )
-               upsmsk(:,:) = 0._wp                             ! not upstream by default
-               !
                DO jk = 1, jpkm1
                   xind(:,:,jk) = 1._wp                              &                 ! =>1 where up-stream is not needed
-                     &         - MAX ( rnfmsk(:,:) * rnfmsk_z(jk),  &                 ! =>0 near runoff mouths (& closed sea outflows)
-                     &                 upsmsk(:,:)                ) * tmask(:,:,jk)   ! =>0 in some user defined area
+                     &                -  rnfmsk(:,:) * rnfmsk_z(jk) * tmask(:,:,jk)   ! =>0 near runoff mouths (& closed sea outflows) 
                END DO
             ENDIF
             !
@@ -127,115 +125,141 @@ CONTAINS
             &                                       iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )   l_hst = .TRUE.
       ENDIF
       !
+      !
       DO jn = 1, kjpt            !==  loop over the tracers  ==!
          !
-         !                          !* Horizontal advective fluxes
-         !
-         !                                !-- first guess of the slopes
-         zwx(:,:,jpk) = 0._wp                   ! bottom values
-         zwy(:,:,jpk) = 0._wp
-         DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
-            zwx(ji,jj,jk) = umask(ji,jj,jk) * ( pt(ji+1,jj,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
-            zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( pt(ji,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
-         END_3D
-         !                                !-- Slopes of tracer
-         zslpx(:,:,jpk) = 0._wp                 ! bottom values
-         zslpy(:,:,jpk) = 0._wp
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
-            zslpx(ji,jj,jk) =                       ( zwx(ji,jj,jk) + zwx(ji-1,jj  ,jk) )   &
-               &            * ( 0.25 + SIGN( 0.25_wp, zwx(ji,jj,jk) * zwx(ji-1,jj  ,jk) ) )
-            zslpy(ji,jj,jk) =                       ( zwy(ji,jj,jk) + zwy(ji  ,jj-1,jk) )   &
-               &            * ( 0.25 + SIGN( 0.25_wp, zwy(ji,jj,jk) * zwy(ji  ,jj-1,jk) ) )
-         END_3D
-         !
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )    !-- Slopes limitation
-            zslpx(ji,jj,jk) = SIGN( 1.0_wp, zslpx(ji,jj,jk) ) * MIN(    ABS( zslpx(ji  ,jj,jk) ),   &
-               &                                                     2.*ABS( zwx  (ji-1,jj,jk) ),   &
-               &                                                     2.*ABS( zwx  (ji  ,jj,jk) ) )
-            zslpy(ji,jj,jk) = SIGN( 1.0_wp, zslpy(ji,jj,jk) ) * MIN(    ABS( zslpy(ji,jj  ,jk) ),   &
-               &                                                     2.*ABS( zwy  (ji,jj-1,jk) ),   &
-               &                                                     2.*ABS( zwy  (ji,jj  ,jk) ) )
-         END_3D
-         ! NOTE [ comm_cleanup ] : need to change sign to ensure halo 1 - halo 2 compatibility
-         IF ( nn_hls==1 ) CALL lbc_lnk( 'traadv_mus', zslpx, 'T', -1.0_wp , zslpy, 'T', -1.0_wp )   ! lateral boundary conditions   (changed sign)
-         !
-         DO_3D( 1, 0, 1, 0, 1, jpkm1 )    !-- MUSCL horizontal advective fluxes
-            ! MUSCL fluxes
-            z0u = SIGN( 0.5_wp, pU(ji,jj,jk) )
-            zalpha = 0.5 - z0u
-            zu  = z0u - 0.5 * pU(ji,jj,jk) * p2dt * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
-            zzwx = pt(ji+1,jj,jk,jn,Kbb) + xind(ji,jj,jk) * zu * zslpx(ji+1,jj,jk)
-            zzwy = pt(ji  ,jj,jk,jn,Kbb) + xind(ji,jj,jk) * zu * zslpx(ji  ,jj,jk)
-            zwx(ji,jj,jk) = pU(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy )
+         DO jk = 1, jpkm1
+            !                          !* Horizontal advective fluxes
             !
-            z0v = SIGN( 0.5_wp, pV(ji,jj,jk) )
-            zalpha = 0.5 - z0v
-            zv  = z0v - 0.5 * pV(ji,jj,jk) * p2dt * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
-            zzwx = pt(ji,jj+1,jk,jn,Kbb) + xind(ji,jj,jk) * zv * zslpy(ji,jj+1,jk)
-            zzwy = pt(ji,jj  ,jk,jn,Kbb) + xind(ji,jj,jk) * zv * zslpy(ji,jj  ,jk)
-            zwy(ji,jj,jk) = pV(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy )
-         END_3D
-         !
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )    !-- Tracer advective trend
-            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )       &
-            &                                     + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  ) )     &
-            &                                   * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-         END_3D
-         !                                ! trend diagnostics
-         IF( l_trd )  THEN
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kbb) )
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kbb) )
-         END IF
-         !                                 ! "Poleward" heat and salt transports
-         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
-         !                                 !  heat transport
-         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) )
+            !                                !-- first guess of the slopes
+            DO_2D( 2, 1, 2, 1 )
+               zdxt(ji,jj) = ( pt(ji+1,jj  ,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) * umask(ji,jj,jk)
+               zdyt(ji,jj) = ( pt(ji  ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) * vmask(ji,jj,jk)
+            END_2D
+            !                                !-- Slopes of tracer
+            DO_2D( 1, 1, 1, 1 )
+               !                                 ! 1/2 Slopes at T-point (set to 0 if adjectent slopes are of opposite sign)
+               zzslpx =                          ( zdxt(ji,jj) + zdxt(ji-1,jj  ) )   &
+                  &   * ( 0.25_wp + SIGN( 0.25_wp, zdxt(ji,jj) * zdxt(ji-1,jj  ) ) )
+               zzslpy =                          ( zdyt(ji,jj) + zdyt(ji  ,jj-1) )   &
+                  &   * ( 0.25_wp + SIGN( 0.25_wp, zdyt(ji,jj) * zdyt(ji  ,jj-1) ) )
+               !                                 ! Slopes limitation
+               zslpx(ji,jj) = SIGN( 1.0_wp, zzslpx ) * MIN(       ABS( zzslpx         ),   &
+                  &                                         2._wp*ABS( zdxt (ji-1,jj) ),   &
+                  &                                         2._wp*ABS( zdxt (ji  ,jj) )    )
+               zslpy(ji,jj) = SIGN( 1.0_wp, zzslpy ) * MIN(       ABS( zzslpy         ),   &
+                  &                                         2._wp*ABS( zdyt (ji,jj-1) ),   &
+                  &                                         2._wp*ABS( zdyt (ji,jj  ) )    )
+            END_2D
+!!gm + !!st ticket ? comparaison pommes et carrottes ABS(zzslpx) et 2._wp*ABS( zdxt (ji-1,jj) )
+            !
+            DO_2D( 1, 0, 1, 0 )              !-- MUSCL horizontal advective fluxes
+               z0u = SIGN( 0.5_wp, pU(ji,jj,jk) )
+               zalpha = 0.5_wp - z0u
+               zu  = z0u - 0.5_wp * pU(ji,jj,jk) * p2dt * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
+               zzwx = pt(ji+1,jj,jk,jn,Kbb) + xind(ji,jj,jk) * zu * zslpx(ji+1,jj)
+               zzwy = pt(ji  ,jj,jk,jn,Kbb) + xind(ji,jj,jk) * zu * zslpx(ji  ,jj)
+               zwx(ji,jj) = pU(ji,jj,jk) * ( zalpha * zzwx + (1._wp-zalpha) * zzwy )
+               !
+               z0v = SIGN( 0.5_wp, pV(ji,jj,jk) )
+               zalpha = 0.5_wp - z0v
+               zv  = z0v - 0.5_wp * pV(ji,jj,jk) * p2dt * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
+               zzwx = pt(ji,jj+1,jk,jn,Kbb) + xind(ji,jj,jk) * zv * zslpy(ji,jj+1)
+               zzwy = pt(ji,jj  ,jk,jn,Kbb) + xind(ji,jj,jk) * zv * zslpy(ji,jj  )
+               zwy(ji,jj) = pV(ji,jj,jk) * ( zalpha * zzwx + (1._wp-zalpha) * zzwy )
+            END_2D
+            !
+            DO_2D( 0, 0, 0, 0 )              !-- Tracer advective trend
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ( zwx(ji,jj) - zwx(ji-1,jj  ) )       &   ! ad () for NP repro
+               &                                             + ( zwy(ji,jj) - zwy(ji  ,jj-1) ) )     &
+               &                                   * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+            END_2D
+         END DO
+!!gm + !!st to be done with the whole rewritting of trd  
+!!          trd routine arguments MUST be changed adding jk and zwx, zwy in 2D
+!!
+!!         !                                ! trend diagnostics
+!!         IF( l_trd )  THEN
+!!            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jk, jptra_xad, zwx(:,:), pU, pt(:,:,:,jn,Kbb) )
+!!            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jk, jptra_yad, zwy(:,:), pV, pt(:,:,:,jn,Kbb) )
+!!         END IF
+!!         !                                 ! "Poleward" heat and salt transports
+!!         IF( l_ptr )  CALL dia_ptr_hst( jn, jk, 'adv', zwy(:,:) )
+!!         !                                 !  heat transport
+!!         IF( l_hst )  CALL dia_ar5_hst( jn, jk, 'adv', zwx(:,:), zwy(:,:) )
          !
          !                          !* Vertical advective fluxes
          !
-         !                                !-- first guess of the slopes
-         zwx(:,:, 1 ) = 0._wp                   ! surface & bottom boundary conditions
-         zwx(:,:,jpk) = 0._wp
-         DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! interior values
-            zwx(ji,jj,jk) = tmask(ji,jj,jk) * ( pt(ji,jj,jk-1,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
-         END_3D
-         !                                !-- Slopes of tracer
-         zslpx(:,:,1) = 0._wp                   ! surface values
-         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-            zslpx(ji,jj,jk) =                        ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) )  &
-               &            * (  0.25 + SIGN( 0.25_wp, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) )  )
-         END_3D
-         DO_3D( 0, 0, 0, 0, 2, jpkm1 )    !-- Slopes limitation
-            zslpx(ji,jj,jk) = SIGN( 1.0_wp, zslpx(ji,jj,jk) ) * MIN(    ABS( zslpx(ji,jj,jk  ) ),   &
-               &                                                     2.*ABS( zwx  (ji,jj,jk+1) ),   &
-               &                                                     2.*ABS( zwx  (ji,jj,jk  ) )  )
-         END_3D
-         DO_3D( 0, 0, 0, 0, 1, jpk-2 )    !-- vertical advective flux
-            z0w = SIGN( 0.5_wp, pW(ji,jj,jk+1) )
-            zalpha = 0.5 + z0w
-            zw  = z0w - 0.5 * pW(ji,jj,jk+1) * p2dt * r1_e1e2t(ji,jj) / e3w(ji,jj,jk+1,Kmm)
-            zzwx = pt(ji,jj,jk+1,jn,Kbb) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk+1)
-            zzwy = pt(ji,jj,jk  ,jn,Kbb) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk  )
-            zwx(ji,jj,jk+1) = pW(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) * wmask(ji,jj,jk)
-         END_3D
-         IF( ln_linssh ) THEN                   ! top values, linear free surface only
+#define zdzt_kp1 zdxt 
+#define zslpz zslpx
+#define zfW zwx 
+
+         zfW     (T2D(0)) = 0._wp    ! anciennement zwx at jk = 1
+         !                          ! anciennement zwx at jk = 2
+         DO_2D( 0, 0, 0, 0 )
+            zdzt_kp1(ji,jj) = tmask(ji,jj,2) * ( pt(ji,jj,1,jn,Kbb) - pt(ji,jj,2,jn,Kbb) )
+         END_2D
+         zslpz   (T2D(0)) = 0._wp    ! anciennement zslpx at jk = 1
+         !
+         IF( ln_linssh ) THEN                !-- linear ssh : non zero top values
+            DO_2D( 0, 0, 0, 0 )                       ! at the ocean surface
+               zfW(ji,jj) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb)    ! surface flux
+            END_2D
             IF( ln_isfcav ) THEN                      ! ice-shelf cavities (top of the ocean)
+               DO_2D( 0, 0, 0, 0 )                              ! update pt(Krhs) under the ice-shelf  
+                  ik = mikt(ji,jj)                              ! the flux at ik-1 is zero ( inside ice-shelf )
+                  IF( ik > 1 ) THEN
+                     pt(ji,jj,ik,jn,Krhs) =  pt(ji,jj,ik,jn,Krhs) - pW(ji,jj,ik) * pt(ji,jj,ik,jn,Kbb)   &
+                        &                                         * r1_e1e2t(ji,jj) / e3t(ji,jj,ik,Kmm)
+                  ENDIF
+               END_2D              
+            ENDIF
+         ENDIF
+         !
+         ! wmask usage for computing zw and zwk is needed in isf case and linear ssh
+         ! 
+         !
+         DO jk = 1, jpkm1
+            IF( jk < jpkm1 ) THEN
                DO_2D( 0, 0, 0, 0 )
-                  zwx(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb)
+                  !                          !-- Slopes of tracer
+                  !                                   ! masked vertical gradient at jk+2
+                  zdzt_kp2 = ( pt(ji,jj,jk+1,jn,Kbb) - pt(ji,jj,jk+2,jn,Kbb) ) * tmask(ji,jj,jk+2) !!st wmask(ji,jj,jk+2)
+                  !                                   ! vertical slope at jk+1
+                  zslpz_kp1 =                           ( zdzt_kp1(ji,jj) + zdzt_kp2 )  &
+                  &         * (  0.25_wp + SIGN( 0.25_wp, zdzt_kp1(ji,jj) * zdzt_kp2 )  )
+                  !                                   ! slope limitation
+                  zslpz_kp1 = SIGN( 1.0_wp, zslpz_kp1 ) * MIN(    ABS( zslpz_kp1 ),   &
+                  &                                            2.*ABS( zdzt_kp2 ),   &
+                  &                                            2.*ABS( zdzt_kp1(ji,jj) )  )
+                  !                          !-- vertical advective flux at jk+1
+                  !                          !    caution: zfW_kp1 is masked for ice-shelf cavities
+                  !                          !    since top fluxes already added to pt(Krhs) before the vertical loop  
+                  z0w = SIGN( 0.5_wp, pW(ji,jj,jk+1) )
+                  zalpha = 0.5_wp + z0w
+                  zw  = z0w - 0.5_wp * pW(ji,jj,jk+1) * p2dt * r1_e1e2t(ji,jj) / e3w(ji,jj,jk+1,Kmm)
+                  zzwx = pt(ji,jj,jk+1,jn,Kbb) + xind(ji,jj,jk) * zw * zslpz_kp1
+                  zzwy = pt(ji,jj,jk  ,jn,Kbb) + xind(ji,jj,jk) * zw * zslpz(ji,jj)
+                  zfW_kp1 = pW(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) * wmask(ji,jj,jk)!!st * wmask(ji,jj,jk+1)
+                  !                         !-- vertical advective trend at jk
+                  pt(ji,jj,jk,jn,Krhs) =  pt(ji,jj,jk,jn,Krhs) - ( zfW(ji,jj) - zfW_kp1 )   &
+                     &                                      * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+                  !                                   ! updates for next level
+                  zdzt_kp1(ji,jj) = zdzt_kp2
+                  zslpz   (ji,jj) = zslpz_kp1
+                  zfW     (ji,jj) = zfW_kp1
                END_2D
-            ELSE                                      ! no cavities: only at the ocean surface
-               DO_2D( 0, 0, 0, 0 )
-                  zwx(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb)
+            ELSE
+               DO_2D( 0, 0, 0, 0 )          !-- vertical advective trend at jpkm1
+                  pt(ji,jj,jk,jn,Krhs) =  pt(ji,jj,jk,jn,Krhs) - zfW(ji,jj)    &
+                     &                                      * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
                END_2D
             ENDIF
-         ENDIF
+	 END DO                  ! end of jk loop
          !
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )     !-- vertical advective trend
-            pt(ji,jj,jk,jn,Krhs) =  pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) )   &
-               &                                      * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-         END_3D
-         !                                ! send trends for diagnostic
-         IF( l_trd )  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwx, pW, pt(:,:,:,jn,Kbb) )
+!!gm + !!st idem see above
+!!         !                                ! send trends for diagnostic
+!!         IF( l_trd )  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwx, pW, pt(:,:,:,jn,Kbb) )
          !
       END DO                     ! end of tracer loop
       !
diff --git a/src/OCE/TRA/traadv_qck.F90 b/src/OCE/TRA/traadv_qck.F90
index cdb96902..a12d3994 100644
--- a/src/OCE/TRA/traadv_qck.F90
+++ b/src/OCE/TRA/traadv_qck.F90
@@ -26,9 +26,6 @@ MODULE traadv_qck
    USE lib_mpp         ! distribued memory computing
    USE lbclnk          ! ocean lateral boundary condition (or mpp link)
    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
-#if defined key_loop_fusion
-   USE traadv_qck_lf   ! QCK    scheme            (tra_adv_qck  routine - loop fusion version)
-#endif
 
    IMPLICIT NONE
    PRIVATE
@@ -93,14 +90,10 @@ CONTAINS
       CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !!----------------------------------------------------------------------
       !
-#if defined key_loop_fusion
-      CALL tra_adv_qck_lf ( kt, kit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs )
-#else
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == kit000 )  THEN
             IF(lwp) WRITE(numout,*)
@@ -122,7 +115,6 @@ CONTAINS
       !        ! vertical fluxes are computed with the 2nd order centered scheme
       CALL tra_adv_cen2_k( kt, cdtype, pW, Kmm, pt, kjpt, Krhs )
       !
-#endif
    END SUBROUTINE tra_adv_qck
 
 
@@ -130,18 +122,17 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt              ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU        ! i-velocity components
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
+      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU              ! i-velocity components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztra, zbtr, zdir, zdx, zmsk   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zfu, zfc, zfd
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwx, zfu, zfc, zfd
       !----------------------------------------------------------------------
       !
       !                                                          ! ===========
@@ -215,18 +206,17 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt              ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pV        ! j-velocity components
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
+      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pV              ! j-velocity components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  :: ji, jj, jk, jn                ! dummy loop indices
       REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwy, zfu, zfc, zfd   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwy, zfu, zfc, zfd   ! 3D workspace
       !----------------------------------------------------------------------
       !
       !                                                          ! ===========
@@ -312,16 +302,15 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt       ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pW      ! vertical velocity
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pW         ! vertical velocity
+      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt         ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwz   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwz   ! 3D workspace
       !!----------------------------------------------------------------------
       !
       zwz(:,:, 1 ) = 0._wp       ! surface & bottom values set to zero for all tracers
@@ -365,10 +354,10 @@ CONTAINS
       !!
       !! ** Method :
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfu   ! second upwind point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfd   ! first douwning point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfc   ! the central point (or the first upwind point)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   puc   ! input as Courant number ; output as flux
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfu   ! second upwind point
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfd   ! first douwning point
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfc   ! the central point (or the first upwind point)
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) ::   puc   ! input as Courant number ; output as flux
       !!
       INTEGER  ::  ji, jj, jk               ! dummy loop indices
       REAL(wp) ::  zcoef1, zcoef2, zcoef3   ! local scalars
diff --git a/src/OCE/TRA/traadv_qck_lf.F90 b/src/OCE/TRA/traadv_qck_lf.F90
index e866bd80..dfca3032 100644
--- a/src/OCE/TRA/traadv_qck_lf.F90
+++ b/src/OCE/TRA/traadv_qck_lf.F90
@@ -90,8 +90,7 @@ CONTAINS
       CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !!----------------------------------------------------------------------
       !
@@ -123,19 +122,18 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt              ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU        ! i-velocity components
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
+      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU              ! i-velocity components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztra, zbtr, zdir, zdx, zmsk  ! local scalars
       REAL(wp) ::   zzfc, zzfd, zzfu, zzfu_ip1   !   -     -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zfu, zfc, zfd
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwx, zfu, zfc, zfd
       !----------------------------------------------------------------------
       !
       !                                                          ! ===========
@@ -199,19 +197,18 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt              ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pV        ! j-velocity components
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
+      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pV              ! j-velocity components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  :: ji, jj, jk, jn                ! dummy loop indices
       REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk   ! local scalars
       REAL(wp) :: zzfc, zzfd, zzfu, zzfu_jp1    !   -     -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwy, zfu, zfc, zfd   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwy, zfu, zfc, zfd   ! 3D workspace
       !----------------------------------------------------------------------
       !
       !                                                          ! ===========
@@ -279,16 +276,15 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!
       !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt       ! ocean time-step index
+      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kmm, Krhs  ! ocean time level indices
-      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pW      ! vertical velocity
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
+      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
+      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pW         ! vertical velocity
+      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt         ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwz   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwz   ! 3D workspace
       !!----------------------------------------------------------------------
       !
       zwz(:,:, 1 ) = 0._wp       ! surface & bottom values set to zero for all tracers
@@ -332,10 +328,10 @@ CONTAINS
       !!
       !! ** Method :
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfu   ! second upwind point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfd   ! first douwning point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfc   ! the central point (or the first upwind point)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   puc   ! input as Courant number ; output as flux
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfu   ! second upwind point
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfd   ! first douwning point
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(in   ) ::   pfc   ! the central point (or the first upwind point)
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) ::   puc   ! input as Courant number ; output as flux
       !!
       INTEGER  ::  ji, jj, jk               ! dummy loop indices
       REAL(wp) ::  zcoef1, zcoef2, zcoef3   ! local scalars
diff --git a/src/OCE/TRA/traadv_ubs.F90 b/src/OCE/TRA/traadv_ubs.F90
index 6d65af21..3c83aa9c 100644
--- a/src/OCE/TRA/traadv_ubs.F90
+++ b/src/OCE/TRA/traadv_ubs.F90
@@ -25,9 +25,6 @@ MODULE traadv_ubs
    USE lib_mpp        ! massively parallel library
    USE lbclnk         ! ocean lateral boundary condition (or mpp link)
    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
-#if defined key_loop_fusion
-   USE traadv_ubs_lf  ! UBS      scheme            (tra_adv_ubs  routine - loop fusion version)
-#endif
 
    IMPLICIT NONE
    PRIVATE
@@ -94,20 +91,16 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       INTEGER                                  , INTENT(in   ) ::   kn_ubs_v        ! number of tracers
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztra, zbtr, zcoef                       ! local scalars
       REAL(wp) ::   zfp_ui, zfm_ui, zcenut, ztak, zfp_wk, zfm_wk   !   -      -
       REAL(wp) ::   zfp_vj, zfm_vj, zcenvt, zeeu, zeev, z_hdivn    !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   ztu, ztv, zltu, zltv, zti, ztw     ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   ztu, ztv, zltu, zltv, zti, ztw     ! 3D workspace
       !!----------------------------------------------------------------------
       !
-#if defined key_loop_fusion
-      CALL tra_adv_ubs_lf    ( kt, kit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs, kn_ubs_v )
-#else
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
          IF( kt == kit000 )  THEN
             IF(lwp) WRITE(numout,*)
@@ -156,8 +149,8 @@ CONTAINS
             zcenut = pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj  ,jk,jn,Kmm) )
             zcenvt = pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji  ,jj+1,jk,jn,Kmm) )
             !                                                  ! UBS advective fluxes
-            ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) )
-            ztv(ji,jj,jk) = 0.5 * ( zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk) )
+            ztu(ji,jj,jk) = 0.5 * ( zcenut - ( zfp_ui * zltu(ji,jj,jk) + zfm_ui * zltu(ji+1,jj,jk) ) )   ! add () for NP repro
+            ztv(ji,jj,jk) = 0.5 * ( zcenvt - ( zfp_vj * zltv(ji,jj,jk) + zfm_vj * zltv(ji,jj+1,jk) ) )
          END_3D
          !
          DO_3D( 0, 0, 0, 0, 1, jpk )
@@ -166,9 +159,9 @@ CONTAINS
          !
          DO jk = 1, jpkm1        !==  add the horizontal advective trend  ==!
             DO_2D( 0, 0, 0, 0 )
-               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)                        &
-                  &             - (  ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk)    &
-                  &                + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) &
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)                    &
+                  &             - (  ( ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk) )    & ! add () for NP repro
+                  &                + ( ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk) )  ) &
                   &                * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
             END_2D
             !
@@ -265,7 +258,6 @@ CONTAINS
          !
       END DO
       !
-#endif
    END SUBROUTINE tra_adv_ubs
 
 
@@ -285,13 +277,13 @@ CONTAINS
       INTEGER , INTENT(in   )                         ::   Kmm    ! time level index
       REAL(wp), INTENT(in   )                         ::   p2dt   ! tracer time-step
       REAL(wp),                DIMENSION(jpi,jpj,jpk) ::   pbef   ! before field
-      REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   paft   ! after field
-      REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   pcc    ! monotonic flux in the k direction
+      REAL(wp), INTENT(inout), DIMENSION(T2D(nn_hls)    ,jpk) ::   paft   ! after field
+      REAL(wp), INTENT(inout), DIMENSION(T2D(nn_hls)    ,jpk) ::   pcc    ! monotonic flux in the k direction
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikm1         ! local integer
       REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
       !!----------------------------------------------------------------------
       !
       zbig  = 1.e+38_wp
diff --git a/src/OCE/TRA/traadv_ubs_lf.F90 b/src/OCE/TRA/traadv_ubs_lf.F90
index ee8acfe2..4a2b696c 100644
--- a/src/OCE/TRA/traadv_ubs_lf.F90
+++ b/src/OCE/TRA/traadv_ubs_lf.F90
@@ -91,8 +91,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers
       INTEGER                                  , INTENT(in   ) ::   kn_ubs_v        ! number of tracers
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
-      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
-      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk     ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
@@ -103,7 +102,7 @@ CONTAINS
       REAL(wp) ::   zztu, zztu_im1, zztu_ip1
       REAL(wp) ::   zztv, zztv_jm1, zztv_jp1
       REAL(wp) ::   zzltu, zzltu_ip1, zzltv, zzltv_jp1
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   ztu, ztv, zltu, zltv, zti, ztw     ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   ztu, ztv, zltu, zltv, zti, ztw     ! 3D workspace
       !!----------------------------------------------------------------------
       !
       IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -290,13 +289,13 @@ CONTAINS
       INTEGER , INTENT(in   )                         ::   Kmm    ! time level index
       REAL(wp), INTENT(in   )                         ::   p2dt   ! tracer time-step
       REAL(wp),                DIMENSION(jpi,jpj,jpk) ::   pbef   ! before field
-      REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   paft   ! after field
-      REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   pcc    ! monotonic flux in the k direction
+      REAL(wp), INTENT(inout), DIMENSION(T2D(nn_hls)    ,jpk) ::   paft   ! after field
+      REAL(wp), INTENT(inout), DIMENSION(T2D(nn_hls)    ,jpk) ::   pcc    ! monotonic flux in the k direction
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikm1         ! local integer
       REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
       !!----------------------------------------------------------------------
       !
       zbig  = 1.e+38_wp
diff --git a/src/OCE/TRA/traatf.F90 b/src/OCE/TRA/traatf.F90
deleted file mode 100644
index 57a9ca0a..00000000
--- a/src/OCE/TRA/traatf.F90
+++ /dev/null
@@ -1,389 +0,0 @@
-MODULE traatf
-   !!======================================================================
-   !!                       ***  MODULE  traatf  ***
-   !! Ocean active tracers:  Asselin time filtering for temperature and salinity
-   !!======================================================================
-   !! History :  OPA  !  1991-11  (G. Madec)  Original code
-   !!            7.0  !  1993-03  (M. Guyon)  symetrical conditions
-   !!            8.0  !  1996-02  (G. Madec & M. Imbard)  opa release 8.0
-   !!             -   !  1996-04  (A. Weaver)  Euler forward step
-   !!            8.2  !  1999-02  (G. Madec, N. Grima)  semi-implicit pressure grad.
-   !!  NEMO      1.0  !  2002-08  (G. Madec)  F90: Free form and module
-   !!             -   !  2002-11  (C. Talandier, A-M Treguier) Open boundaries
-   !!             -   !  2005-04  (C. Deltel) Add Asselin trend in the ML budget
-   !!            2.0  !  2006-02  (L. Debreu, C. Mazauric) Agrif implementation
-   !!            3.0  !  2008-06  (G. Madec)  time stepping always done in trazdf
-   !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option
-   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  semi-implicit hpg with asselin filter + modified LF-RA
-   !!             -   !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA
-   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename tranxt.F90 -> traatf.F90. Now only does time filtering.
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   tra_atf       : time filtering on tracers
-   !!   tra_atf_fix   : time filtering on tracers : fixed    volume case
-   !!   tra_atf_vvl   : time filtering on tracers : variable volume case
-   !!----------------------------------------------------------------------
-   USE oce             ! ocean dynamics and tracers variables
-   USE dom_oce         ! ocean space and time domain variables
-   USE sbc_oce         ! surface boundary condition: ocean
-   USE sbcrnf          ! river runoffs
-   USE isf_oce         ! ice shelf melting
-   USE zdf_oce         ! ocean vertical mixing
-   USE domvvl          ! variable volume
-   USE trd_oce         ! trends: ocean variables
-   USE trdtra          ! trends manager: tracers
-   USE traqsr          ! penetrative solar radiation (needed for nksr)
-   USE phycst          ! physical constant
-   USE ldftra          ! lateral physics : tracers
-   USE ldfslp          ! lateral physics : slopes
-   USE bdy_oce  , ONLY : ln_bdy
-   USE bdytra          ! open boundary condition (bdy_tra routine)
-   !
-   USE in_out_manager  ! I/O manager
-   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
-   USE prtctl          ! Print control
-   USE timing          ! Timing
-#if defined key_agrif
-   USE agrif_oce_interp
-#endif
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   tra_atf       ! routine called by step.F90
-   PUBLIC   tra_atf_fix   ! to be used in trcnxt
-   PUBLIC   tra_atf_vvl   ! to be used in trcnxt
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: traatf.F90 14800 2021-05-06 15:42:46Z jchanut $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE tra_atf( kt, Kbb, Kmm, Kaa, pts )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE traatf  ***
-      !!
-      !! ** Purpose :   Apply the boundary condition on the after temperature
-      !!             and salinity fields and add the Asselin time filter on now fields.
-      !!
-      !! ** Method  :   At this stage of the computation, ta and sa are the
-      !!             after temperature and salinity as the time stepping has
-      !!             been performed in trazdf_imp or trazdf_exp module.
-      !!
-      !!              - Apply lateral boundary conditions on (ta,sa)
-      !!             at the local domain   boundaries through lbc_lnk call,
-      !!             at the one-way open boundaries (ln_bdy=T),
-      !!             at the AGRIF zoom   boundaries (lk_agrif=T)
-      !!
-      !!              - Update lateral boundary conditions on AGRIF children
-      !!             domains (lk_agrif=T)
-      !!
-      !! ** Action  : - ts(Kmm) time filtered
-      !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) :: kt             ! ocean time-step index
-      INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Kaa  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
-      !!
-      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp) ::   zfact            ! local scalars
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start( 'tra_atf')
-      !
-      IF( kt == nit000 ) THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'tra_atf : apply Asselin time filter to "now" fields'
-         IF(lwp) WRITE(numout,*) '~~~~~~~'
-      ENDIF
-
-      ! Update after tracer on domain lateral boundaries
-      !
-#if defined key_agrif
-      CALL Agrif_tra( kt )                           ! AGRIF zoom boundaries
-#endif
-      !                                              ! local domain boundaries  (T-point, unchanged sign)
-      CALL lbc_lnk( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1.0_wp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_wp )
-      !
-      IF( ln_bdy )   CALL bdy_tra( kt, Kbb, pts, Kaa )  ! BDY open boundaries
-
-      ! trends computation initialisation
-      IF( l_trdtra )   THEN
-         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) )
-         ztrdt(:,:,:) = 0._wp
-         ztrds(:,:,:) = 0._wp
-         IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend
-            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_zdfp, ztrdt )
-            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_zdfp, ztrds )
-         ENDIF
-         ! total trend for the non-time-filtered variables.
-         zfact = 1.0 / rn_Dt
-         ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms
-         DO jk = 1, jpkm1
-            ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_tem,Kmm)) * zfact
-            ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_sal,Kmm)) * zfact
-         END DO
-         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_tot, ztrdt )
-         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_tot, ztrds )
-         IF( ln_linssh ) THEN       ! linear sea surface height only
-            ! Store now fields before applying the Asselin filter
-            ! in order to calculate Asselin filter trend later.
-            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kmm)
-            ztrds(:,:,:) = pts(:,:,:,jp_sal,Kmm)
-         ENDIF
-      ENDIF
-
-      IF( l_1st_euler ) THEN       ! Euler time-stepping
-         !
-         IF (l_trdtra .AND. .NOT. ln_linssh ) THEN   ! Zero Asselin filter contribution must be explicitly written out since for vvl
-            !                                        ! Asselin filter is output by tra_atf_vvl that is not called on this time step
-            ztrdt(:,:,:) = 0._wp
-            ztrds(:,:,:) = 0._wp
-            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt )
-            CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds )
-         END IF
-         !
-      ELSE                                            ! Leap-Frog + Asselin filter time stepping
-         !
-         IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000,        'TRA', pts, jpts )  ! linear free surface
-         ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface
-         ENDIF
-         !
-         CALL lbc_lnk( 'traatf',  pts(:,:,:,jp_tem,Kmm) , 'T', 1.0_wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1.0_wp )
-
-      ENDIF
-      !
-      IF( l_trdtra .AND. ln_linssh ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt
-         DO jk = 1, jpkm1
-            ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kmm) - ztrdt(:,:,jk) ) * r1_Dt
-            ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kmm) - ztrds(:,:,jk) ) * r1_Dt
-         END DO
-         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt )
-         CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds )
-      END IF
-      IF( l_trdtra )   DEALLOCATE( ztrdt , ztrds )
-      !
-      !                        ! control print
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Kmm), clinfo1=' nxt  - Tn: ', mask1=tmask,   &
-         &                                  tab3d_2=pts(:,:,:,jp_sal,Kmm), clinfo2=       ' Sn: ', mask2=tmask )
-      !
-      IF( ln_timing )   CALL timing_stop('tra_atf')
-      !
-   END SUBROUTINE tra_atf
-
-
-   SUBROUTINE tra_atf_fix( kt, Kbb, Kmm, Kaa, kit000, cdtype, pt, kjpt )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE tra_atf_fix  ***
-      !!
-      !! ** Purpose :   fixed volume: apply the Asselin time filter to the "now" field
-      !!
-      !! ** Method  : - Apply a Asselin time filter on now fields.
-      !!
-      !! ** Action  : - pt(Kmm) ready for the next time step
-      !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::  kt            ! ocean time-step index
-      INTEGER                                  , INTENT(in   ) ::  Kbb, Kmm, Kaa ! time level indices
-      INTEGER                                  , INTENT(in   ) ::  kit000        ! first time step index
-      CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype        ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::  kjpt          ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
-      !
-      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp) ::   ztn, ztd         ! local scalars
-      !!----------------------------------------------------------------------
-      !
-      IF( kt == kit000 )  THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'tra_atf_fix : time filtering', cdtype
-         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
-      ENDIF
-      !
-      DO jn = 1, kjpt
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            ztn = pt(ji,jj,jk,jn,Kmm)
-            ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb)  ! time laplacian on tracers
-            !
-            pt(ji,jj,jk,jn,Kmm) = ztn + rn_atfp * ztd                      ! pt <-- filtered pt
-         END_3D
-         !
-      END DO
-      !
-   END SUBROUTINE tra_atf_fix
-
-
-   SUBROUTINE tra_atf_vvl( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE tra_atf_vvl  ***
-      !!
-      !! ** Purpose :   Time varying volume: apply the Asselin time filter
-      !!
-      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields.
-      !!             pt(Kmm)  = ( e3t_Kmm*pt(Kmm) + rn_atfp*[ e3t_Kbb*pt(Kbb) - 2 e3t_Kmm*pt(Kmm) + e3t_Kaa*pt(Kaa) ] )
-      !!                       /( e3t_Kmm         + rn_atfp*[ e3t_Kbb         - 2 e3t_Kmm         + e3t_Kaa    ] )
-      !!
-      !! ** Action  : - pt(Kmm) ready for the next time step
-      !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::  kt        ! ocean time-step index
-      INTEGER                                  , INTENT(in   ) ::  Kbb, Kmm, Kaa ! time level indices
-      INTEGER                                  , INTENT(in   ) ::  kit000    ! first time step index
-      REAL(wp)                                 , INTENT(in   ) ::  p2dt      ! time-step
-      CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator)
-      INTEGER                                  , INTENT(in   ) ::  kjpt      ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
-      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
-      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
-      !
-      LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical
-      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices
-      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar
-      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d, zscale  !   -      -
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrd_atf
-      !!----------------------------------------------------------------------
-      !
-      IF( kt == kit000 )  THEN
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) 'tra_atf_vvl : time filtering', cdtype
-         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
-      ENDIF
-      !
-      IF( cdtype == 'TRA' )  THEN
-         ll_traqsr  = ln_traqsr        ! active  tracers case  and  solar penetration
-         ll_rnf     = ln_rnf           ! active  tracers case  and  river runoffs
-         ll_isf     = ln_isf           ! active  tracers case  and  ice shelf melting
-      ELSE                          ! passive tracers case
-         ll_traqsr  = .FALSE.          ! NO solar penetration
-         ll_rnf     = .FALSE.          ! NO river runoffs ????          !!gm BUG ?
-         ll_isf     = .FALSE.          ! NO ice shelf melting/freezing  !!gm BUG ??
-      ENDIF
-      !
-      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN
-         ALLOCATE( ztrd_atf(jpi,jpj,jpk,kjpt) )
-         ztrd_atf(:,:,:,:) = 0.0_wp
-      ENDIF
-      !
-!!st variables only computed in the interior by traqsr
-      IF( ll_traqsr ) CALL lbc_lnk( 'traatf',  qsr_hc_b(:,:,:) , 'T', 1.0_wp, qsr_hc(:,:,:) , 'T', 1.0_wp )
-      !
-      zfact = 1._wp / p2dt
-      zfact1 = rn_atfp * p2dt
-      zfact2 = zfact1 * r1_rho0
-      DO jn = 1, kjpt
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            ze3t_b = e3t(ji,jj,jk,Kbb)
-            ze3t_n = e3t(ji,jj,jk,Kmm)
-            ze3t_a = e3t(ji,jj,jk,Kaa)
-            !                                         ! tracer content at Before, now and after
-            ztc_b  = pt(ji,jj,jk,jn,Kbb) * ze3t_b
-            ztc_n  = pt(ji,jj,jk,jn,Kmm) * ze3t_n
-            ztc_a  = pt(ji,jj,jk,jn,Kaa) * ze3t_a
-            !
-            ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b
-            ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b
-            !
-            ze3t_f = ze3t_n + rn_atfp * ze3t_d
-            ztc_f  = ztc_n  + rn_atfp * ztc_d
-            !
-            ! Add asselin correction on scale factors:
-            zscale = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) )
-            ze3t_f = ze3t_f - zfact2 * zscale * ( emp_b(ji,jj) - emp(ji,jj) )
-            IF ( ll_rnf ) ze3t_f = ze3t_f + zfact2 * zscale * (    rnf_b(ji,jj) -    rnf(ji,jj) )
-            IF ( ll_isf ) THEN
-               IF ( ln_isfcav_mlt ) ze3t_f = ze3t_f + zfact2 * zscale * ( fwfisf_cav_b(ji,jj) - fwfisf_cav(ji,jj) )
-               IF ( ln_isfpar_mlt ) ze3t_f = ze3t_f + zfact2 * zscale * ( fwfisf_par_b(ji,jj) - fwfisf_par(ji,jj) )
-            ENDIF
-            !
-            IF( jk == mikt(ji,jj) ) THEN           ! first level
-               ztc_f  = ztc_f  - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) )
-            ENDIF
-            !
-            ! solar penetration (temperature only)
-            IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            &
-               &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )
-               !
-            !
-            IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) )                                          &
-               &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) &
-               &                              * e3t(ji,jj,jk,Kmm) / h_rnf(ji,jj)
-
-            !
-            ! ice shelf
-            IF( ll_isf ) THEN
-               !
-               ! melt in the cavity
-               IF ( ln_isfcav_mlt ) THEN
-                  ! level fully include in the Losch_2008 ice shelf boundary layer
-                  IF ( jk >= misfkt_cav(ji,jj) .AND. jk < misfkb_cav(ji,jj) ) THEN
-                     ztc_f  = ztc_f  - zfact1 * ( risf_cav_tsc(ji,jj,jn) - risf_cav_tsc_b(ji,jj,jn) ) &
-                        &                     * e3t(ji,jj,jk,Kmm) / rhisf_tbl_cav(ji,jj)
-                  END IF
-                  ! level partially include in Losch_2008 ice shelf boundary layer
-                  IF ( jk == misfkb_cav(ji,jj) ) THEN
-                     ztc_f  = ztc_f  - zfact1 * ( risf_cav_tsc(ji,jj,jn) - risf_cav_tsc_b(ji,jj,jn) )  &
-                            &                 * e3t(ji,jj,jk,Kmm) / rhisf_tbl_cav(ji,jj) * rfrac_tbl_cav(ji,jj)
-                  END IF
-               END IF
-               !
-               ! parametrised melt (cavity closed)
-               IF ( ln_isfpar_mlt ) THEN
-                  ! level fully include in the Losch_2008 ice shelf boundary layer
-                  IF ( jk >= misfkt_par(ji,jj) .AND. jk < misfkb_par(ji,jj) ) THEN
-                     ztc_f  = ztc_f  - zfact1 * ( risf_par_tsc(ji,jj,jn) - risf_par_tsc_b(ji,jj,jn) )  &
-                            &                 * e3t(ji,jj,jk,Kmm) / rhisf_tbl_par(ji,jj)
-                  END IF
-                  ! level partially include in Losch_2008 ice shelf boundary layer
-                  IF ( jk == misfkb_par(ji,jj) ) THEN
-                     ztc_f  = ztc_f  - zfact1 * ( risf_par_tsc(ji,jj,jn) - risf_par_tsc_b(ji,jj,jn) )  &
-                            &                 * e3t(ji,jj,jk,Kmm) / rhisf_tbl_par(ji,jj) * rfrac_tbl_par(ji,jj)
-                  END IF
-               END IF
-               !
-               ! ice sheet coupling correction
-               IF ( ln_isfcpl ) THEN
-                  !
-                  ! at kt = nit000,  risfcpl_vol_n = 0 and risfcpl_vol_b = risfcpl_vol so contribution nul
-                  IF ( ln_rstart .AND. kt == nit000+1 ) THEN
-                     ztc_f  = ztc_f  + zfact1 * risfcpl_tsc(ji,jj,jk,jn) * r1_e1e2t(ji,jj)
-                     ! Shouldn't volume increment be spread according thanks to zscale  ?
-                     ze3t_f = ze3t_f - zfact1 * risfcpl_vol(ji,jj,jk   ) * r1_e1e2t(ji,jj)
-                  END IF
-                  !
-               END IF
-               !
-            END IF
-            !
-            ze3t_f = 1.e0 / ze3t_f
-            pt(ji,jj,jk,jn,Kmm) = ztc_f * ze3t_f    ! time filtered "now" field
-            !
-            IF( ( l_trdtra .and. cdtype == 'TRA' ) .OR. ( l_trdtrc .and. cdtype == 'TRC' ) ) THEN
-               ztrd_atf(ji,jj,jk,jn) = (ztc_f - ztc_n) * zfact/ze3t_n
-            ENDIF
-            !
-         END_3D
-         !
-      END DO
-      !
-      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN
-         IF( l_trdtra .AND. cdtype == 'TRA' ) THEN
-            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) )
-            CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) )
-         ENDIF
-         IF( l_trdtrc .AND. cdtype == 'TRC' ) THEN
-            DO jn = 1, kjpt
-               CALL trd_tra( kt, Kmm, Kaa, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) )
-            END DO
-         ENDIF
-         DEALLOCATE( ztrd_atf )
-      ENDIF
-      !
-   END SUBROUTINE tra_atf_vvl
-
-   !!======================================================================
-END MODULE traatf
diff --git a/src/OCE/TRA/traatf_qco.F90 b/src/OCE/TRA/traatf_qco.F90
index 57034bd0..256eb601 100644
--- a/src/OCE/TRA/traatf_qco.F90
+++ b/src/OCE/TRA/traatf_qco.F90
@@ -27,7 +27,7 @@ MODULE traatf_qco
    !!----------------------------------------------------------------------
    !!   tra_atf       : time filtering on tracers
    !!   tra_atf_fix   : time filtering on tracers : fixed    volume case
-   !!   tra_atf_vvl   : time filtering on tracers : variable volume case
+   !!   tra_atf_qco   : time filtering on tracers : variable volume case
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and tracers variables
    USE dom_oce        ! ocean space and time domain variables
@@ -35,7 +35,6 @@ MODULE traatf_qco
    USE sbcrnf         ! river runoffs
    USE isf_oce        ! ice shelf melting
    USE zdf_oce        ! ocean vertical mixing
-   USE domvvl         ! variable volume
    USE trd_oce        ! trends: ocean variables
    USE trdtra         ! trends manager: tracers
    USE traqsr         ! penetrative solar radiation (needed for nksr)
@@ -136,8 +135,8 @@ CONTAINS
 
       IF( l_1st_euler ) THEN       ! Euler time-stepping
          !
-         IF (l_trdtra .AND. .NOT. ln_linssh ) THEN   ! Zero Asselin filter contribution must be explicitly written out since for vvl
-            !                                        ! Asselin filter is output by tra_atf_vvl that is not called on this time step
+         IF (l_trdtra .AND. .NOT. ln_linssh ) THEN   ! Zero Asselin filter contribution must be explicitly written out since for quasi-Eulerian
+            !                                        ! Asselin filter is output by tra_atf_qco that is not called on this time step
             ztrdt(:,:,:) = 0._wp
             ztrds(:,:,:) = 0._wp
             CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt )
@@ -150,7 +149,7 @@ CONTAINS
          ELSE                    ;   CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface
          ENDIF
          !
-         CALL lbc_lnk( 'traatfqco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._wp )
+         CALL lbc_lnk( 'traatf_qco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._wp )
          !
       ENDIF
       !
@@ -203,7 +202,6 @@ CONTAINS
       DO jn = 1, kjpt
          !
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-!!st         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
             ztn = pt(ji,jj,jk,jn,Kmm)
             ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb)  ! time laplacian on tracers
             !
@@ -217,7 +215,7 @@ CONTAINS
 
    SUBROUTINE tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt )
       !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE tra_atf_vvl  ***
+      !!                   ***  ROUTINE tra_atf_qco  ***
       !!
       !! ** Purpose :   Time varying volume: apply the Asselin time filter
       !!
@@ -234,8 +232,8 @@ CONTAINS
       CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::  kjpt      ! number of tracers
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
-      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
-      REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
+      REAL(wp), DIMENSION(A2D(0)     ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
+      REAL(wp), DIMENSION(A2D(0)     ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
       !
       LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical
       INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices
@@ -264,12 +262,12 @@ CONTAINS
          ALLOCATE( ztrd_atf(jpi,jpj,jpk,kjpt) )
          ztrd_atf(:,:,:,:) = 0._wp
       ENDIF
+      !
       zfact = 1._wp / p2dt
       zfact1 = rn_atfp * p2dt
       zfact2 = zfact1 * r1_rho0
       DO jn = 1, kjpt
          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-!!st         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
             ze3t_b = e3t(ji,jj,jk,Kbb)
             ze3t_n = e3t(ji,jj,jk,Kmm)
             ze3t_a = e3t(ji,jj,jk,Kaa)
diff --git a/src/OCE/TRA/trabbl.F90 b/src/OCE/TRA/trabbl.F90
index df82587f..06da8629 100644
--- a/src/OCE/TRA/trabbl.F90
+++ b/src/OCE/TRA/trabbl.F90
@@ -183,7 +183,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jn   ! dummy loop indices
       INTEGER  ::   ik           ! local integers
       REAL(wp) ::   zbtr         ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zptb   ! workspace
+      REAL(wp), DIMENSION(T2D(1)) ::   zptb   ! workspace
       !!----------------------------------------------------------------------
       !
       DO jn = 1, kjpt                                     ! tracer loop
@@ -196,10 +196,10 @@ CONTAINS
          DO_2D( 0, 0, 0, 0 )                               ! Compute the trend
             ik = mbkt(ji,jj)                            ! bottom T-level index
             pt_rhs(ji,jj,ik,jn) = pt_rhs(ji,jj,ik,jn)                                                  &
-               &                + (  ahu_bbl(ji  ,jj  ) * ( zptb(ji+1,jj  ) - zptb(ji  ,jj  ) )     &
-               &                   - ahu_bbl(ji-1,jj  ) * ( zptb(ji  ,jj  ) - zptb(ji-1,jj  ) )     &
-               &                   + ahv_bbl(ji  ,jj  ) * ( zptb(ji  ,jj+1) - zptb(ji  ,jj  ) )     &
-               &                   - ahv_bbl(ji  ,jj-1) * ( zptb(ji  ,jj  ) - zptb(ji  ,jj-1) )  )  &
+               &                + ( ( ahu_bbl(ji  ,jj  ) * ( zptb(ji+1,jj  ) - zptb(ji  ,jj  ) )       &   ! add () for NP repro
+               &                    - ahu_bbl(ji-1,jj  ) * ( zptb(ji  ,jj  ) - zptb(ji-1,jj  ) ) )     &
+               &                  + ( ahv_bbl(ji  ,jj  ) * ( zptb(ji  ,jj+1) - zptb(ji  ,jj  ) )       &
+               &                    - ahv_bbl(ji  ,jj-1) * ( zptb(ji  ,jj  ) - zptb(ji  ,jj-1) ) ) )   &
                &                * r1_e1e2t(ji,jj) / e3t(ji,jj,ik,Kmm)
          END_2D
          !                                                  ! ===========
@@ -326,8 +326,8 @@ CONTAINS
       INTEGER  ::   ijs, ijd, ikvs, ikvd      !   -       -
       REAL(wp) ::   za, zb, zgdrho            ! local scalars
       REAL(wp) ::   zsign, zsigna, zgbbl      !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts)   :: zts, zab         ! 3D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls))        :: zub, zvb, zdep   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpts)   :: zts, zab         ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls))        :: zub, zvb, zdep   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -527,7 +527,7 @@ CONTAINS
          ENDIF
       END_2D
       !
-      DO_2D( 1, 0, 1, 0 )           !* bbl thickness at u- (v-) point; minimum of top & bottom e3u_0 (e3v_0)
+      DO_2D( 1, 0, 1, 0 )           !* bbl thickness at u- or v- point; minimum of top & bottom e3u_0 or e3v_0
          e3u_bbl_0(ji,jj) = MIN( e3u_0(ji,jj,mbkt(ji+1,jj  )), e3u_0(ji,jj,mbkt(ji,jj)) )
          e3v_bbl_0(ji,jj) = MIN( e3v_0(ji,jj,mbkt(ji  ,jj+1)), e3v_0(ji,jj,mbkt(ji,jj)) )
       END_2D
diff --git a/src/OCE/TRA/tradmp.F90 b/src/OCE/TRA/tradmp.F90
index 16cab127..2643c58a 100644
--- a/src/OCE/TRA/tradmp.F90
+++ b/src/OCE/TRA/tradmp.F90
@@ -94,7 +94,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !
       INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts)     ::  zts_dta
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk,jpts)     ::  zts_dta
       REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE ::  zwrk
       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  ztrdts
       !!----------------------------------------------------------------------
@@ -102,7 +102,7 @@ CONTAINS
       IF( ln_timing )   CALL timing_start('tra_dmp')
       !
       IF( l_trdtra .OR. iom_use('hflx_dmp_cea') .OR. iom_use('sflx_dmp_cea') ) THEN   !* Save ta and sa trends
-         ALLOCATE( ztrdts(A2D(nn_hls),jpk,jpts) )
+         ALLOCATE( ztrdts(T2D(nn_hls),jpk,jpts) )
          DO jn = 1, jpts
             DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
                ztrdts(ji,jj,jk,jn) = pts(ji,jj,jk,jn,Krhs)
@@ -146,7 +146,7 @@ CONTAINS
       !
       ! outputs (clem trunk)
       IF( iom_use('hflx_dmp_cea') .OR. iom_use('sflx_dmp_cea') ) THEN
-         ALLOCATE( zwrk(A2D(nn_hls),jpk) )          ! Needed to handle expressions containing e3t when using key_qco or key_linssh
+         ALLOCATE( zwrk(T2D(0),jpk) )          ! Needed to handle expressions containing e3t when using key_qco or key_linssh
          zwrk(:,:,:) = 0._wp
 
          IF( iom_use('hflx_dmp_cea') ) THEN
diff --git a/src/OCE/TRA/traisf.F90 b/src/OCE/TRA/traisf.F90
index 610f9064..2ddc45da 100644
--- a/src/OCE/TRA/traisf.F90
+++ b/src/OCE/TRA/traisf.F90
@@ -113,39 +113,34 @@ CONTAINS
       !! *** Action :: Update pts(:,:,:,:,Krhs) with the surface boundary condition trend
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts)          , INTENT(inout) ::   pts
-      INTEGER , DIMENSION(jpi,jpj)                   , INTENT(in   ) ::   ktop , kbot
-      REAL(wp), DIMENSION(jpi,jpj)                   , INTENT(in   ) ::   phtbl, pfrac
-      REAL(wp), DIMENSION(jpi,jpj,jpts)              , INTENT(in   ) ::   ptsc
-      REAL(wp), DIMENSION(:,:,:)           , OPTIONAL, INTENT(in   ) ::   ptsc_b
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts)     , INTENT(inout) ::   pts
+      INTEGER , DIMENSION(A2D(0))                   , INTENT(in   ) ::   ktop , kbot
+      REAL(wp), DIMENSION(A2D(0))                   , INTENT(in   ) ::   phtbl, pfrac
+      REAL(wp), DIMENSION(A2D(0),jpts)              , INTENT(in   ) ::   ptsc
+      REAL(wp), DIMENSION(A2D(0),jpts)    , OPTIONAL, INTENT(in   ) ::   ptsc_b
       !!
-      INTEGER ::   ji,jj,jk   ! dummy loop index
-      INTEGER ::   ikt, ikb   ! top and bottom level of the tbl
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   ztc   ! total ice shelf tracer trend
+      INTEGER  ::   ji, jj, jk   ! dummy loop index
+      INTEGER  ::   ikt, ikb     ! top and bottom level of the tbl
+      REAL(wp) ::   ztc          ! total ice shelf tracer trend
       !!----------------------------------------------------------------------
       !
-      ! compute 2d total trend due to isf
+      ! update pts(:,:,:,:,Krhs)
       DO_2D( 0, 0, 0, 0 )
+         !
 #if defined key_RK3
-         ztc(ji,jj) = ptsc(ji,jj,jp_tem) / phtbl(ji,jj)
+         ztc = ptsc(ji,jj,jp_tem) / phtbl(ji,jj)
 #else
-         ztc(ji,jj) = 0.5_wp * ( ptsc(ji,jj,jp_tem) + ptsc_b(ji,jj,jp_tem) ) / phtbl(ji,jj)
+         ztc = 0.5_wp * ( ptsc(ji,jj,jp_tem) + ptsc_b(ji,jj,jp_tem) ) / phtbl(ji,jj)
 #endif
-      END_2D
-      !
-      ! update pts(:,:,:,:,Krhs)
-      DO_2D( 0, 0, 0, 0 )
-         !
+         ! level fully include in the ice shelf boundary layer
          ikt = ktop(ji,jj)
          ikb = kbot(ji,jj)
-         !
-         ! level fully include in the ice shelf boundary layer
          DO jk = ikt, ikb - 1
-            pts(ji,jj,jk,jp_tem) = pts(ji,jj,jk,jp_tem) + ztc(ji,jj)
+            pts(ji,jj,jk,jp_tem) = pts(ji,jj,jk,jp_tem) + ztc
          END DO
          !
          ! level partially include in ice shelf boundary layer
-         pts(ji,jj,ikb,jp_tem) = pts(ji,jj,ikb,jp_tem) + ztc(ji,jj) * pfrac(ji,jj)
+         pts(ji,jj,ikb,jp_tem) = pts(ji,jj,ikb,jp_tem) + ztc * pfrac(ji,jj)
          !
       END_2D
       !
@@ -159,9 +154,9 @@ CONTAINS
       !! *** Action :: Update pts(:,:,:,:,Krhs) with the ice shelf coupling trend
       !!
       !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   Kmm   ! ocean time-level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   ptsc
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) ::   ptsa
+      INTEGER                                  , INTENT(in   ) ::   Kmm   ! ocean time-level index
+      REAL(wp), DIMENSION(A2D(0),jpk,jpts)     , INTENT(in   ) ::   ptsc
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts), INTENT(inout) ::   ptsa
       !!
       INTEGER ::   ji, jj, jk   ! dummy loop index
       !!----------------------------------------------------------------------
diff --git a/src/OCE/TRA/traldf.F90 b/src/OCE/TRA/traldf.F90
index fc229842..4ca392ac 100644
--- a/src/OCE/TRA/traldf.F90
+++ b/src/OCE/TRA/traldf.F90
@@ -8,6 +8,8 @@ MODULE traldf
    !!            3.7  ! 2013-12  (G. Madec) remove the optional computation from T & S anomaly profiles and traldf_bilapg
    !!             -   ! 2013-12  (F. Lemarie, G. Madec)  triad operator (Griffies) + Method of Stabilizing Correction
    !!             -   ! 2014-01  (G. Madec, S. Masson)  restructuration/simplification of lateral diffusive operators
+   !!            4.5  ! 2022-08  (G, Madec, S. Techene)  refactorization to reduce local memory usage
+   !!                 !                                + add tra_ldf_iso_a33 routine and traldf_iso_h/z.h90 files
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -19,14 +21,15 @@ MODULE traldf
    USE phycst         ! physical constants
    USE ldftra         ! lateral diffusion: eddy diffusivity & EIV coeff.
    USE ldfslp         ! lateral diffusion: iso-neutral slope
-   USE traldf_lap_blp ! lateral diffusion: laplacian iso-level            operator  (tra_ldf_lap/_blp   routines)
-   USE traldf_iso     ! lateral diffusion: laplacian iso-neutral standard operator  (tra_ldf_iso        routine )
-   USE traldf_triad   ! lateral diffusion: laplacian iso-neutral triad    operator  (tra_ldf_triad      routine )
+   USE traldf_iso     ! lateral diffusion: laplacian iso-neutral standard operator  (traldf_iso_lap/_blp  routines)
+   USE traldf_lev     ! lateral diffusion: laplacian iso-level            operator  (traldf_lap/_blp      routines)
+   USE traldf_triad   ! lateral diffusion: laplacian iso-neutral triad    operator  (tra_ldf_triad(_blp)  routines)
    USE trd_oce        ! trends: ocean variables
    USE trdtra         ! ocean active tracers trends
    !
    USE prtctl         ! Print control
    USE in_out_manager ! I/O manager
+   USE iom            ! I/O library
    USE lib_mpp        ! distribued memory computing library
    USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
    USE timing         ! Timing
@@ -37,6 +40,9 @@ MODULE traldf
    PUBLIC   tra_ldf        ! called by step.F90
    PUBLIC   tra_ldf_init   ! called by nemogcm.F90
 
+   LOGICAL  ::   l_ptr   ! flag to compute the diffusive part of poleward heat & salt transport
+   LOGICAL  ::   l_hst   ! flag to compute the diffusive part of heat and salt transport
+
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: traldf.F90 14834 2021-05-11 09:24:44Z hadcv $
@@ -54,34 +60,57 @@ CONTAINS
       INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! ocean time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !!
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zTtrd, zStrd
       !!----------------------------------------------------------------------
       !
+      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
+         IF( kt == nit000 .AND. lwp )  THEN
+            WRITE(numout,*)
+            SELECT CASE ( nldf_tra )   !* compute lateral mixing trend and add it to the general trend
+               CASE ( np_lap    )   ;   WRITE(numout,*) 'traldf_lev_lap   : iso-level laplacian diffusive operator'
+               CASE ( np_lap_i  )   ;   WRITE(numout,*) 'traldf_iso_lap   : iso-neutral standard laplacian diffusive operator'
+               CASE ( np_lap_it )   ;   WRITE(numout,*) 'traldf_triad_lap : iso-neutral triad laplacian diffusive operator'
+               CASE ( np_blp    )   ;   WRITE(numout,*) 'traldf_lev_blp   : iso-level bilaplacian diffusive operator'
+               CASE ( np_blp_i  )   ;   WRITE(numout,*) 'traldf_iso_blp   : iso-neutral bilaplacian diffusive operator'
+               CASE ( np_blp_it )   ;   WRITE(numout,*) 'traldf_triad_blp : iso-neutral triad bilaplacian diffusive operator'
+            END SELECT
+            WRITE(numout,*) '~~~~~~~~~~~~~~~~ '
+         ENDIF
+      ENDIF
+      !
       IF( ln_timing )   CALL timing_start('tra_ldf')
       !
       IF( l_trdtra )   THEN                    !* Save ta and sa trends
-         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) )
-         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs)
-         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs)
+         ALLOCATE( zTtrd(jpi,jpj,jpk) , zStrd(jpi,jpj,jpk) )
+         zTtrd(:,:,:) = pts(:,:,:,jp_tem,Krhs)
+         zStrd(:,:,:) = pts(:,:,:,jp_sal,Krhs)
       ENDIF
       !
-      SELECT CASE ( nldf_tra )                 !* compute lateral mixing trend and add it to the general trend
-      CASE ( np_lap   )                                  ! laplacian: iso-level operator
-         CALL tra_ldf_lap  ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs),                   jpts,  1 )
-      CASE ( np_lap_i )                                  ! laplacian: standard iso-neutral operator (Madec)
-         CALL tra_ldf_iso  ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 )
-      CASE ( np_lap_it )                                 ! laplacian: triad iso-neutral operator (griffies)
-         CALL tra_ldf_triad( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 )
-      CASE ( np_blp , np_blp_i , np_blp_it )             ! bilaplacian: iso-level & iso-neutral operators
-         CALL tra_ldf_blp  ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs),             jpts, nldf_tra )
+      SELECT CASE ( nldf_tra )   !* compute lateral mixing trend and add it to the general trend
+      !                                !-  laplacian  - !
+      CASE ( np_lap    )                     ! level operator
+         CALL traldf_lev_lap  ( kt, Kbb, Kmm, pts, Krhs, l_ptr, l_hst )
+      CASE ( np_lap_i  )                     ! standard iso-neutral operator
+         CALL traldf_iso_lap  ( kt, Kbb, Kmm, pts, Krhs, l_ptr, l_hst )
+      CASE ( np_lap_it )                     ! laplacian: triad iso-neutral operator
+         CALL traldf_triad_lap( kt, Kmm, nit000,'TRA', ahtu, ahtv, pts(:,:,:,:,Kbb),    &
+            &                                    pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 )
+      !                                !- bilaplacian - !
+      CASE ( np_blp    )                     ! iso-level operators
+         CALL traldf_lev_blp   ( kt, Kbb, Kmm, pts, Krhs, l_ptr, l_hst )
+      CASE ( np_blp_i  )                     ! standard iso-neutral operator
+         CALL traldf_iso_blp   ( kt, Kbb, Kmm, pts, Krhs, l_ptr, l_hst )
+      CASE ( np_blp_it )                     ! bilaplacian: iso-level & iso-neutral operators
+         CALL traldf_triad_blp( kt, Kmm, nit000,'TRA', ahtu, ahtv, pts(:,:,:,:,Kbb),    &
+            &                                     pts(:,:,:,:,Krhs),             jpts )
       END SELECT
       !
       IF( l_trdtra )   THEN                    !* save the horizontal diffusive trends for further diagnostics
-         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:)
-         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:)
-         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, ztrdt )
-         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, ztrds )
-         DEALLOCATE( ztrdt, ztrds )
+         zTtrd(:,:,:) = pts(:,:,:,jp_tem,Krhs) - zTtrd(:,:,:)
+         zStrd(:,:,:) = pts(:,:,:,jp_sal,Krhs) - zStrd(:,:,:)
+         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, zTtrd )
+         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, zStrd )
+         DEALLOCATE( zTtrd, zStrd )
       ENDIF
       !                                        !* print mean trends (used for debugging)
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' ldf  - Ta: ', mask1=tmask, &
@@ -122,6 +151,12 @@ CONTAINS
          END SELECT
       ENDIF
       !
+      l_ptr = .FALSE.                        ! set flag for heat & salt diffusive diagnostics
+      l_hst = .FALSE.
+      IF(   ( iom_use( 'sophtldf'  ) .OR. iom_use(  'sopstldf' )  )   )   l_ptr = .TRUE.   ! diffusive poleward transport
+      IF(   ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &                 
+         &    iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  )   )   l_hst = .TRUE.   ! vertically cumulated diffusive fluxes
+      !
    END SUBROUTINE tra_ldf_init
 
    !!======================================================================
diff --git a/src/OCE/TRA/traldf_iso.F90 b/src/OCE/TRA/traldf_iso.F90
index 8d84e768..6ed2242e 100644
--- a/src/OCE/TRA/traldf_iso.F90
+++ b/src/OCE/TRA/traldf_iso.F90
@@ -9,7 +9,9 @@ MODULE traldf_iso
    !!            1.0  ! 2005-11  (G. Madec)  merge traldf and trazdf :-)
    !!            3.3  ! 2010-09  (C. Ethe, G. Madec) Merge TRA-TRC
    !!            3.7  ! 2014-01  (G. Madec, S. Masson)  restructuration/simplification of aht/aeiv specification
-   !!             -   ! 2014-02  (F. Lemarie, G. Madec)  triad operator (Griffies) + Method of Stabilizing Correction
+   !!             -   ! 2014-02  (F. Lemarie, G. Madec)  Standard and triad operator with Method of Stabilizing Correction
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec)  refactorization to reduce local memory usage + add tra_ldf_iso_a33 &
+   !!                 !                                  traldf_iso_blp routines and traldf_iso_scheme.h90 file
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -18,7 +20,7 @@ MODULE traldf_iso
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and active tracers
    USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
+   USE domutl, ONLY : lbnd_ij
    USE trc_oce        ! share passive tracers/Ocean variables
    USE zdf_oce        ! ocean vertical physics
    USE ldftra         ! lateral diffusion: tracer eddy coefficients
@@ -34,10 +36,10 @@ MODULE traldf_iso
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC   tra_ldf_iso   ! routine called by step.F90
-
-   LOGICAL  ::   l_ptr   ! flag to compute poleward transport
-   LOGICAL  ::   l_hst   ! flag to compute heat transport
+   PUBLIC   traldf_iso_lap   ! routine called by traadv.F90
+   PUBLIC   traldf_iso_blp   ! routine called by traadv.F90
+   PUBLIC   traldf_iso_a33   ! routine called by traldf_iso.F90    !!gm: to be move in traadv.F90 ???
+!!gm                                                               !!gm: to be extended to 13 and 23 ???)
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -49,34 +51,11 @@ MODULE traldf_iso
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE tra_ldf_iso( kt, Kmm, kit000, cdtype, pahu, pahv,             &
-      &                                             pgu , pgv , pgui, pgvi, &
-      &                                             pt, pt2, pt_rhs, kjpt, kpass )
-      !!
-      INTEGER                     , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                     , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                     , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                     , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                     , INTENT(in   ) ::   Kmm        ! ocean time level index
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
-      !!
-      CALL tra_ldf_iso_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                             &
-         &                                         pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui),  &
-         &                                         pt, is_tile(pt), pt2, is_tile(pt2), pt_rhs, is_tile(pt_rhs), kjpt, kpass )
-   END SUBROUTINE tra_ldf_iso
-
-
-  SUBROUTINE tra_ldf_iso_t( kt, Kmm, kit000, cdtype, pahu, pahv, ktah,                    &
-      &                                              pgu , pgv , ktg , pgui, pgvi, ktgi,  &
-      &                                              pt, ktt, pt2, ktt2, pt_rhs, ktt_rhs, kjpt, kpass )
+   SUBROUTINE traldf_iso_lap( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst )
       !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE tra_ldf_iso  ***
+      !!                  ***  ROUTINE traldf_iso_iso  ***
+      !!
+      !!                   ——    nn_hls =2 or more  ——
       !!
       !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
       !!      trend for a laplacian tensor (ezxcept the dz[ dz[.] ] term) and
@@ -88,316 +67,348 @@ CONTAINS
       !!      It is computed using before fields (forward in time) and isopyc-
       !!      nal or geopotential slopes computed in routine ldfslp.
       !!
-      !!      1st part :  masked horizontal derivative of T  ( di[ t ] )
-      !!      ========    with partial cell update if ln_zps=T
-      !!                  with top     cell update if ln_isfcav
+      !!                        (  A11   0   A13  )
+      !!      rotation matrix = (   0   A22  A23  )
+      !!                        (  A31  A32  A33  )
       !!
-      !!      2nd part :  horizontal fluxes of the lateral mixing operator
-      !!      ========
-      !!         zftu =  pahu e2u*e3u/e1u di[ tb ]
-      !!               - pahu e2u*uslp    dk[ mi(mk(tb)) ]
-      !!         zftv =  pahv e1v*e3v/e2v dj[ tb ]
-      !!               - pahv e2u*vslp    dk[ mj(mk(tb)) ]
+      !!      • masked horizontal derivative of T  ( di[ t ] )
+      !!
+      !!      •  horizontal fluxes of the lateral mixing operator
+      !!         zfu =  A11 di[ tb ] + A13  dk[ mi(mk(tb)) ]
+      !!         zfv =  ahtv e1v*e3v/e2v dj[ tb ]
+      !!              - ahtv e2u*vslp    dk[ mj(mk(tb)) ]
+      !!        with  A11 = ahtu e2u*e3u/e1u  ;  A13 = - ahtu e2u*uslp
+      !!              A22 = ahtv e1v*e3v/e1v  ;  A23 = - ahtv e1v*vslp
       !!      take the horizontal divergence of the fluxes:
-      !!         difft = 1/(e1e2t*e3t) {  di-1[ zftu ] +  dj-1[ zftv ]  }
+      !!         difft = 1/(e1e2t*e3t) {  di-1[ zfu ] +  dj-1[ zfv ]  }
       !!      Add this trend to the general trend (ta,sa):
       !!         ta = ta + difft
       !!
-      !!      3rd part: vertical trends of the lateral mixing operator
-      !!      ========  (excluding the vertical flux proportional to dk[t] )
+      !!      • vertical trends of the lateral mixing operator
+      !!       (excluding the implicit part of vertical flux proportional to dk[t] )
       !!      vertical fluxes associated with the rotated lateral mixing:
-      !!         zftw = - {  mi(mk(pahu)) * e2t*wslpi di[ mi(mk(tb)) ]
-      !!                   + mj(mk(pahv)) * e1t*wslpj dj[ mj(mk(tb)) ]  }
+      !!         zfw = - {  mi(mk(ahtu)) * e2t*wslpi di[ mi(mk(tb)) ]
+      !!                  + mj(mk(ahtv)) * e1t*wslpj dj[ mj(mk(tb)) ]  }
       !!      take the horizontal divergence of the fluxes:
-      !!         difft = 1/(e1e2t*e3t) dk[ zftw ]
+      !!         difft = 1/(e1e2t*e3t) dk[ zfw ]
       !!      Add this trend to the general trend (ta,sa):
       !!         pt_rhs = pt_rhs + difft
       !!
       !! ** Action :   Update pt_rhs arrays with the before rotated diffusion
       !!----------------------------------------------------------------------
-      INTEGER                                   , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                                   , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)                          , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                                   , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                                   , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                                   , INTENT(in   ) ::   Kmm        ! ocean time level index
-      INTEGER                                   , INTENT(in   ) ::   ktah, ktg, ktgi, ktt, ktt2, ktt_rhs
-      REAL(wp), DIMENSION(A2D_T(ktah)   ,JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(A2D_T(ktg)        ,KJPT), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(A2D_T(ktgi)       ,KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt)    ,JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt2)   ,JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
+      INTEGER                       , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step and time-level indices
+      LOGICAL , OPTIONAL            , INTENT(in   ) ::   ld_hst, ld_ptr       ! T-S diagnostic flags
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(inout) ::   pt                   ! tracers, in: at kbb ; out: at Krhs
+      !!
+      INTEGER  ::   ji, jj, jk, jn     ! dummy loop indices
+      INTEGER  ::   inn                ! inner domain index
+      INTEGER  ::   itra               ! number of tracers
+      INTEGER  ::   ik, ikp1, iis      ! swap  indices
+      !
+      REAL(wp) ::   zmsku, zahu_w      ! local scalars
+      REAL(wp) ::   zmskv, zahv_w      !   -      -
+      REAL(wp) ::   zfw_kp1            !   -      -
+      REAL(wp) ::   zA11      , zA13   !)
+      REAL(wp) ::         zA22, zA23   !) elements of the rotation matrix
+      REAL(wp) ::   zA31, zA32, zA33   !)
       !
-      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices
-      INTEGER  ::  ikt
-      INTEGER  ::  ierr, iij        ! local integer
-      REAL(wp) ::  zmsku, zahu_w, zabe1, zcof1, zcoef3   ! local scalars
-      REAL(wp) ::  zmskv, zahv_w, zabe2, zcof2, zcoef4   !   -      -
-      REAL(wp) ::  zcoef0, ze3w_2, zsign                 !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zdkt, zdk1t, z2d
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdit, zdjt, zftu, zftv, ztfw
+      REAL(wp), DIMENSION(T2D(1),0:1) ::   zdit, zdjt   ! INNER + 1 domain at level jk and jk+1
+      REAL(wp), DIMENSION(T2D(1),0:1) ::   zdkt         ! INNER + 1 domain at level jk and jk+1
+      REAL(wp), DIMENSION(T2D(1)    ) ::   zfu , zfv    ! INNER + 1 domain
+      REAL(wp), DIMENSION(T2D(0)    ) ::   zfw          ! INNER     domain
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
+!!!gm end
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
       !!----------------------------------------------------------------------
       !
-      IF( kpass == 1 .AND. kt == kit000 )  THEN
-         IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype
-            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
+!!gm OPTIMIZATION : This part does not depends on tracer  ===>>> put in a routine
+!!                  possibility of moving it in tra_ldf routine (shared between TRA and TRC at least in RK3 case).
+!!gm idea:  define A13 and A23 as 2D arrays that do not depends on tracers in tra_ldf_iso_a33 routine which
+!!gm        will be renamed : tra_ldf_iso_a13_23_33    ===>> 2x3D additional arrays but much less calculation...
+!!gm idea 2 : even better: explore the possibility to compute matrix element instead of slopes in ldfslp ....
+!!gm                                                   ===>> same memory print but much less calculation !!
+!!            caution: the gm velocity have also to be calculated as they use the slopes....
+!!gm idea
+      !
+      CALL traldf_iso_a33( Kmm, ah_wslp2, akz )   ! calculate  a33 element   (ah_wslp2 and akz)
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!       IF( ld_ptr .OR. ld_hst ) THEN
+!          ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) )
+!       ENDIF
+      IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN
+         IF( ld_ptr .OR. ld_hst ) THEN
+            ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) )
+            zdia_i(:,:,jpk) = 0._wp   ;   zdia_j(:,:,jpk) = 0._wp
          ENDIF
       ENDIF
+!!gm end
       !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                           ! Do only on the first tile
-         l_hst = .FALSE.
-         l_ptr = .FALSE.
-         IF( l_diaptr .AND. cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) )      l_ptr = .TRUE.
-         IF( l_iom    .AND. cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &
-            &                                       iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )   l_hst = .TRUE.
-      ENDIF
+      itra = SIZE( pt, dim = 4 )                   ! number of tracers
       !
-      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case
-      IF( nldf_tra == np_blp_i .AND. kpass == 1 ) THEN ; iij = nn_hls
-      ELSE                                             ; iij = 1
-      ENDIF
+      DO jn = 1, itra                     !==  tracer loop  ==!
+         !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!       IF( ld_ptr .OR. ld_hst ) THEN
+!          zdia_i(:,:) = 0._wp   ;   zdia_j(:,:) = 0._wp
+!       ENDIF
+!!gm end
+
+         DO jk = 1, jpkm1                       !=  ij slab  =!
+            !
+            !                                      !* iso-neutral laplacian applied on pt over the INNER domain
+#           define   iso_lap
+#           define   INN                0
+#           define   pt_in(i,j,k,n,t)   pt(i,j,k,n,t)
 
+#           include   "traldf_iso_scheme.h90"
+
+#           undef    iso_lap
+#           undef    INN
+#           undef    pt_in
+!!gm ld_ptr,ld_hst:
+!             IF( ld_ptr .OR. ld_hst ) THEN       ! vertically cumulated fluxes (minus sign by convention in the output)
+!                zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0))
+!                zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0))
+!             ENDIF
+            IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN        ! store fluxes for diagnostics (minus sign by convention in the output)
+               IF( ld_ptr .OR. ld_hst ) THEN
+                  zdia_i(:,:,jk) = - zfu(T2D(0))
+                  zdia_j(:,:,jk) = - zfv(T2D(0))
+               ENDIF
+            ENDIF
+!!gm end
+            !
+         END DO                             !=  end ij slab  =!
+         !
+         !                                  !=  "Poleward" diffusive heat or salt transports  =!
+         IF( PRESENT(ld_ptr) )  THEN
+            IF( ld_ptr)  CALL dia_ptr_hst( jn, 'ldf'        , zdia_j )
+         ENDIF
+         IF( PRESENT(ld_hst) )  THEN
+            IF( ld_hst)  CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j )
+         ENDIF
+         !
+      END DO                          !==  end tracer loop  ==!
       !
-      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0)
-      ELSE                    ;   zsign = -1._wp
-      ENDIF
+   END SUBROUTINE traldf_iso_lap
+
 
+   SUBROUTINE traldf_iso_blp( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst )
       !!----------------------------------------------------------------------
-      !!   0 - calculate  ah_wslp2 and akz
+      !!                  ***  ROUTINE tra_ldf_iso_blp  ***
+      !!
+      !!                   ——    nn_hls =2 or more  ——
+      !!
       !!----------------------------------------------------------------------
+      INTEGER                       , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step and time-level indices
+      LOGICAL , OPTIONAL            , INTENT(in   ) ::   ld_hst, ld_ptr       ! T-S diagnostic flags
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(inout) ::   pt                   ! tracers, in: at kbb ; out: at Krhs
+      !!
+      INTEGER  ::   ji, jj, jk, jn     ! dummy loop indices
+      INTEGER  ::   inn                ! inner domain index
+      INTEGER  ::   itra               ! number of tracers
+      INTEGER  ::   ik, ikp1, iis      ! swap  indices
       !
-      IF( kpass == 1 ) THEN                  !==  first pass only  ==!
-         !
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
-            !
-            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          &
-               &                           + umask(ji-1,jj,jk-1) + umask(ji  ,jj,jk) , 1._wp  )
-            zmskv = wmask(ji,jj,jk) / MAX(   vmask(ji,jj  ,jk-1) + vmask(ji,jj-1,jk)          &
-               &                           + vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk) , 1._wp  )
-               !
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            zahu_w = ( (  pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk)                    &
-               &       )                                                           & ! bracket for halo 1 - halo 2 compatibility
-               &       + ( pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk)                   &
-               &         )                                                         & ! bracket for halo 1 - halo 2 compatibility
-               &     ) * zmsku
-            zahv_w = ( (  pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk)                    &
-               &       )                                                           & ! bracket for halo 1 - halo 2 compatibility
-               &       + ( pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk)                   &
-               &         )                                                         & ! bracket for halo 1 - halo 2 compatibility
-               &     ) * zmskv
-               !
-            ah_wslp2(ji,jj,jk) = zahu_w * wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   &
-               &               + zahv_w * wslpj(ji,jj,jk) * wslpj(ji,jj,jk)
-         END_3D
-         !
-         IF( ln_traldf_msc ) THEN                ! stabilizing vertical diffusivity coefficient
-            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               akz(ji,jj,jk) = 0.25_wp * (                                                                     &
-                  &            ( ( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )   &
-                  &            + ( pahu(ji-1,jj,jk) + pahu(ji-1,jj,jk-1) ) / ( e1u(ji-1,jj) * e1u(ji-1,jj) )   &
-                  &            )                                                                               & ! bracket for halo 1 - halo 2 compatibility
-                  &            + ( ( pahv(ji,jj  ,jk) + pahv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) ) &
-                  &              + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) ) &
-                  &              )                                                                             & ! bracket for halo 1 - halo 2 compatibility
-                  &                      )
-            END_3D
-            !
-            IF( ln_traldf_blp ) THEN                ! bilaplacian operator
-               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
-                  akz(ji,jj,jk) = 16._wp   &
-                     &   * ah_wslp2   (ji,jj,jk)   &
-                     &   * (  akz     (ji,jj,jk)   &
-                     &      + ah_wslp2(ji,jj,jk)   &
-                     &        / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) )  )
-               END_3D
-            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator
-               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
-                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm)
-                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  )
-                  akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * r1_Dt
-               END_3D
-           ENDIF
-           !
-         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit
-            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
-               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk)
-            END_3D
+      REAL(wp) ::   zmsku, zahu_w      ! local scalars
+      REAL(wp) ::   zmskv, zahv_w      !   -      -
+      REAL(wp) ::   zfw_kp1            !   -      -
+      REAL(wp) ::   zA11      , zA13   !)
+      REAL(wp) ::         zA22, zA23   !) elements of the rotation matrix
+      REAL(wp) ::   zA31, zA32, zA33   !)
+      !
+      REAL(wp), DIMENSION(T2D(2),0:1)   ::   zdit, zdjt   ! INNER + 2 domain at level jk and jk+1
+      REAL(wp), DIMENSION(T2D(2),0:1)   ::   zdkt         ! INNER + 2 domain at level jk and jk+1
+      REAL(wp), DIMENSION(T2D(2)    )   ::   zfu , zfv    ! INNER + 2 domain
+      REAL(wp), DIMENSION(T2D(1)    )   ::   zfw          ! INNER + 1 domain
+      REAL(wp), DIMENSION(T2D(1),jpkm1) ::   zlap         ! INNER + 1 doamin (3D laplacian at t-point)
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
+!!!gm end
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
+      !!----------------------------------------------------------------------
+      !
+      CALL traldf_iso_a33( Kmm, ah_wslp2, akz )   ! calculate  a33 element   (ah_wslp2 and akz)
+      !
+      itra = SIZE( pt, dim = 4 )                   ! number of tracers
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!      IF( ld_ptr .OR. ld_hst ) THEN
+!         ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) )
+!      ENDIF
+      IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN
+         IF( ld_ptr .OR. ld_hst ) THEN
+            ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) )
+            zdia_i(:,:,jpk) = 0._wp   ;   zdia_j(:,:,jpk) = 0._wp
          ENDIF
       ENDIF
+!!gm end
       !
-      !                                                          ! ===========
-      DO jn = 1, kjpt                                            ! tracer loop
-         !                                                       ! ===========
+      DO jn = 1, itra                     !==  tracer loop  ==!
+         !                  !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!         IF( ld_ptr .OR. ld_hst ) THEN
+!            zdia_i(:,:) = 0._wp   ;   zdia_j(:,:) = 0._wp
+!         ENDIF
+!!gm end
          !
-         !!----------------------------------------------------------------------
-         !!   I - masked horizontal derivative
-         !!----------------------------------------------------------------------
-         zdit(:,:,:) = 0._wp
-         zdjt(:,:,:) = 0._wp
-
-         ! Horizontal tracer gradient
-         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )
-            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk)
-            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk)
-         END_3D
-         IF( ln_zps ) THEN      ! botton and surface ocean correction of the horizontal gradient
-            DO_2D( iij, iij-1, iij, iij-1 )            ! bottom correction (partial bottom cell)
-               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn)
-               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn)
-            END_2D
-            IF( ln_isfcav ) THEN      ! first wet level beneath a cavity
-               DO_2D( iij, iij-1, iij, iij-1 )
-                  IF( miku(ji,jj) > 1 )   zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn)
-                  IF( mikv(ji,jj) > 1 )   zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn)
-               END_2D
+         DO jk = 1, jpkm1                       !=  ij slab  =!
+            !
+            !                                      !* 1st pass : iso-neutral laplacian of pt
+            !                                                    computed over the INNER + 1 domain
+#           define   iso_blp_p1
+#           define   INN                1
+#           define   pt_in(i,j,k,n,t)   pt(i,j,k,n,t)
+!
+#           include "traldf_iso_scheme.h90"
+!
+#           undef    iso_blp_p1
+#           undef    INN
+#           undef    pt_in
+            !
+            !                                      !* 2nd pass : bilaplacian = laplacian of 1st pass (zlap)
+            !                                                    computed over the INNER domain
+#           define   iso_blp_p2
+#           define   INN                0
+#           define   pt_in(i,j,k,n,t)   zlap(i,j,k)
+!
+#           include "traldf_iso_scheme.h90"
+!
+#           undef    iso_blp_p2
+#           undef    INN
+#           undef    pt_in
+            !
+!!gm ld_ptr,ld_hst:
+!             IF( ld_ptr .OR. ld_hst ) THEN       ! vertically cumulated fluxes (minus sign by convention in the output)
+!                zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0))
+!                zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0))
+!             ENDIF
+            IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN
+               IF( ld_ptr .OR. ld_hst ) THEN       ! store fluxes for diagnostics (minus sign by convention in the output)
+                  zdia_i(:,:,jk) = - zfu(T2D(0))
+                  zdia_j(:,:,jk) = - zfv(T2D(0))
+               ENDIF
             ENDIF
+!!gm end
+            !
+         END DO                             !=  end ij slab  =!
+         !
+         !                                  !=  "Poleward" diffusive heat or salt transports  =!
+         IF( PRESENT(ld_ptr) )  THEN
+            IF( ld_ptr )   CALL dia_ptr_hst( jn, 'ldf'        , zdia_j )
+         ENDIF
+         IF( PRESENT(ld_hst) )  THEN
+            IF( ld_hst )   CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j )
          ENDIF
          !
-         !!----------------------------------------------------------------------
-         !!   II - horizontal trend  (full)
-         !!----------------------------------------------------------------------
+      END DO                          !==  end tracer loop  ==!
+      !
+   END SUBROUTINE traldf_iso_blp
+
+
+   SUBROUTINE traldf_iso_a33( Kmm, pah_wslp2, pakz )
+      !!----------------------------------------------------------------------
+      !!                  ***  ROUTINE traldf_iso_a33  ***
+      !!
+      !!                   ——    nn_hls =2 or more  ——
+      !!
+      !! ** Purpose :   Compute the a33 element of the rotation  matrix and,
+      !!              if ln_traldf_msc=T, its split into explicit and implicit
+      !!              time-integration.
+      !!
+      !! ** Method  :
+      !!
+      !! ** Action :   pah_wslp2, pakz
+      !!----------------------------------------------------------------------
+      INTEGER                   , INTENT(in   ) ::   Kmm         ! ocean time level index
+      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pah_wslp2   ! implicit a33 element (ln_traldf_msc= false)
+      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pakz        ! implicit a33 element (ln_traldf_msc= true )
+      !
+      INTEGER  ::  ji, jj, jk      ! dummy loop indices
+      INTEGER  ::  inn             ! local integer
+      REAL(wp) ::  zmsku, zahu_w   ! local scalars
+      REAL(wp) ::  zmskv, zahv_w   !   -      -
+      REAL(wp) ::  zcoef0, ze3w_2  !   -      -
+      !!----------------------------------------------------------------------
+      !
+      SELECT CASE( nldf_tra )             ! set inner domain index
+      CASE( np_lap_i  )   ;   inn  = 0
+      CASE( np_blp_i  )   ;   inn  = 1
+      CASE DEFAULT        ;   CALL ctl_stop( 'STOP', 'traldf_iso_a33 routine should not be called  ' )
+      END SELECT
+      !
+      ! CAUTION:   round brackets are required for halo size and north fold compatibility
+      !
+      !
+      DO_3D( inn , inn , inn , inn ,   2, jpkm1 )
          !
-         DO jk = 1, jpkm1                                 ! Horizontal slab
-            !
-            DO_2D( iij, iij, iij, iij )
-               !                             !== Vertical tracer gradient
-               zdk1t(ji,jj) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * wmask(ji,jj,jk+1)     ! level jk+1
-               !
-               IF( jk == 1 ) THEN   ;   zdkt(ji,jj) = zdk1t(ji,jj)                            ! surface: zdkt(jk=1)=zdkt(jk=2)
-               ELSE                 ;   zdkt(ji,jj) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * wmask(ji,jj,jk)
-               ENDIF
-            END_2D
+         zmsku = wmask(ji,jj,jk) / MAX(   ( umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk) )          &
+            &                           + ( umask(ji-1,jj,jk-1) + umask(ji  ,jj,jk) ) , 1._wp  )
+         zmskv = wmask(ji,jj,jk) / MAX(   ( vmask(ji,jj  ,jk-1) + vmask(ji,jj-1,jk) )          &
+            &                           + ( vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk) ) , 1._wp  )
             !
-            DO_2D( iij, iij-1, iij, iij-1 )           !==  Horizontal fluxes
-               zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)
-               zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)
-               !
-               zmsku = 1. / MAX(  wmask(ji+1,jj,jk  ) + wmask(ji,jj,jk+1)   &
-                  &             + wmask(ji+1,jj,jk+1) + wmask(ji,jj,jk  ), 1. )
-               !
-               zmskv = 1. / MAX(  wmask(ji,jj+1,jk  ) + wmask(ji,jj,jk+1)   &
-                  &             + wmask(ji,jj+1,jk+1) + wmask(ji,jj,jk  ), 1. )
-               !
-               zcof1 = - pahu(ji,jj,jk) * e2u(ji,jj) * uslp(ji,jj,jk) * zmsku
-               zcof2 = - pahv(ji,jj,jk) * e1v(ji,jj) * vslp(ji,jj,jk) * zmskv
-               !
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               zftu(ji,jj,jk ) = (  zabe1 * zdit(ji,jj,jk)                       &
-                  &               + zcof1 * ( ( zdkt (ji+1,jj) + zdk1t(ji,jj)    &
-                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                         + ( zdk1t(ji+1,jj) + zdkt (ji,jj)    &
-                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                         ) ) * umask(ji,jj,jk)
-               zftv(ji,jj,jk) = (  zabe2 * zdjt(ji,jj,jk)                        &
-                  &              + zcof2 * ( ( zdkt (ji,jj+1) + zdk1t(ji,jj)     &
-                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                         + ( zdk1t(ji,jj+1) + zdkt (ji,jj)    &
-                  &                           )                                  & ! bracket for halo 1 - halo 2 compatibility
-                  &                         ) ) * vmask(ji,jj,jk)
-            END_2D
+         !                                   ! round brackets required to ensure halo size compatibility with north fold boundary condition
+         zahu_w = (  ( ahtu(ji  ,jj,jk-1) + ahtu(ji-1,jj,jk) )    &
+            &      + ( ahtu(ji-1,jj,jk-1) + ahtu(ji  ,jj,jk) )  ) * zmsku
+         zahv_w = (  ( ahtv(ji,jj  ,jk-1) + ahtv(ji,jj-1,jk) )    &
+            &      + ( ahtv(ji,jj-1,jk-1) + ahtv(ji,jj  ,jk) )  ) * zmskv
+!!st need to do something for dia...
+!!st            !                             ! "Poleward" diffusive heat or salt transports (T-S case only)
+!!st               ! note sign is reversed to give down-gradient diffusive transports )
+!!st            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -zftv(A2D(0),:)  )
+!!st            !                          ! Diffusive heat transports
+!!st            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) )
             !
-            DO_2D( iij-1, iij-1, iij-1, iij-1 )           !== horizontal divergence and add to pta
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)                         &
-                  &       + zsign * ( ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk)        &
-                  &                   )                                          & ! bracket for halo 1 - halo 2 compatibility
-                  &                 + ( zftv(ji,jj,jk) - zftv(ji,jj-1,jk)        &
-                  &                   )                                          & ! bracket for halo 1 - halo 2 compatibility
-                  &                 ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
-            END_2D
-         END DO                                        !   End of slab
+         pah_wslp2(ji,jj,jk) = zahu_w * wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   &
+            &                + zahv_w * wslpj(ji,jj,jk) * wslpj(ji,jj,jk)
+      END_3D
+      !
+!!gm size allocate for ah_wslp2 and akz should be A2D(0) in lap case and A2D(1) in bilap case
 
-         !!----------------------------------------------------------------------
-         !!   III - vertical trend (full)
-         !!----------------------------------------------------------------------
-         !
-         ! Vertical fluxes
-         ! ---------------
-         !                          ! Surface and bottom vertical fluxes set to zero
-         ztfw(:,:, 1 ) = 0._wp      ;      ztfw(:,:,jpk) = 0._wp
 
-         DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )    ! interior (2=<jk=<jpk-1)
-            !
-            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          &
-               &                           + umask(ji-1,jj,jk-1) + umask(ji  ,jj,jk) , 1._wp  )
-            zmskv = wmask(ji,jj,jk) / MAX(   vmask(ji,jj  ,jk-1) + vmask(ji,jj-1,jk)          &
-               &                           + vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk) , 1._wp  )
-               !
-            zahu_w = (   pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk)    &
-               &       + pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk)  ) * zmsku
-            zahv_w = (   pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk)    &
-               &       + pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk)  ) * zmskv
-               !
-            zcoef3 = - zahu_w * e2t(ji,jj) * zmsku * wslpi (ji,jj,jk)   !wslpi & j are already w-masked
-            zcoef4 = - zahv_w * e1t(ji,jj) * zmskv * wslpj (ji,jj,jk)
-            !
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            ztfw(ji,jj,jk) = zcoef3 * ( ( zdit(ji  ,jj  ,jk-1) + zdit(ji-1,jj  ,jk)    &
-                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility
-                  &                   + ( zdit(ji-1,jj  ,jk-1) + zdit(ji  ,jj  ,jk)    &
-                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility
-                  &                   )                                                &
-                  &        + zcoef4 * ( ( zdjt(ji  ,jj  ,jk-1) + zdjt(ji  ,jj-1,jk)    &
-                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility
-                  &                   + ( zdjt(ji  ,jj-1,jk-1) + zdjt(ji  ,jj  ,jk)    &
-                  &                     )                                              & ! bracket for halo 1 - halo 2 compatibility
-                  &                   )
+!!gm  NB:   ah_wslp2 and akz can be defined on A2D(0) or A2D(1) (lap, or bilap) and aver 2:jpkm1 in all cases
+!!gm        moreover, without ln_traldf_msc=T  only ah_wslp2 is required  +  akz can be set as a local array
+!!gm        if ah_wslp2 is set to a proper value at the end of tra_ldf in iso case
+
+
+!!gm  Question:  here is it really Kmm that should be used and not Kbb  ?
+
+
+!!gm BUG ?:  below akz calculation should use zmsku/v instead of * 0.25_wp
+!!gm        ===>>>  introduce ah_wspl2 calculation in all cases !
+
+      IF( ln_traldf_msc ) THEN               ! stabilizing vertical diffusivity coefficient (compute akz)
+         DO_3D( inn , inn , inn , inn ,   2, jpkm1 )
+            !                                ! round brackets required to ensure halo size compatibility with north fold boundary condition
+            pakz(ji,jj,jk) = (   (  ( ahtu(ji  ,jj,jk) + ahtu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )      &
+               &                  + ( ahtu(ji-1,jj,jk) + ahtu(ji-1,jj,jk-1) ) / ( e1u(ji-1,jj) * e1u(ji-1,jj) )  )   &
+               &               + (  ( ahtv(ji,jj  ,jk) + ahtv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) )      &
+               &                  + ( ahtv(ji,jj-1,jk) + ahtv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) )  )   ) * 0.25_wp
          END_3D
-         !                                !==  add the vertical 33 flux  ==!
-         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz
-            DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )
-               ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)   &
-                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )               &
-                  &                            * (  pt(ji,jj,jk-1,jn) -  pt(ji,jj,jk,jn) )
-            END_3D
-            !
-         ELSE                                   ! bilaplacian
-            SELECT CASE( kpass )
-            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2
-               DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )
-                  ztfw(ji,jj,jk) =   &
-                     &  ztfw(ji,jj,jk) + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj)   &
-                     &           * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)
-               END_3D
-            CASE(  2  )                         ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp.
-               DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)                  &
-                     &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   &
-                     &                            +         akz(ji,jj,jk) * ( pt2(ji,jj,jk-1,jn) - pt2(ji,jj,jk,jn) )   )
-               END_3D
-            END SELECT
-         ENDIF
          !
-         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==!
-            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1)  ) * r1_e1e2t(ji,jj)   &
-               &                                             / e3t(ji,jj,jk,Kmm)
+         IF( ln_traldf_blp ) THEN            ! bilaplacian operator
+            DO_3D( inn , inn , inn , inn , 2, jpkm1 )
+               ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm)
+               pakz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  )
+            END_3D
+         ELSEIF( ln_traldf_lap ) THEN        ! laplacian operator
+            DO_3D( inn , inn , inn , inn ,   2, jpkm1 )
+               ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm)
+               zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  )
+               pakz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * r1_Dt
+            END_3D
+        ENDIF
+        !
+      ELSE                                    ! A33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit
+         DO_3D( inn , inn , inn , inn ,   1, jpk )
+            pakz(ji,jj,jk) = pah_wslp2(ji,jj,jk)
          END_3D
-         !
-         IF( ( kpass == 1 .AND. ln_traldf_lap ) .OR.  &     !==  first pass only (  laplacian)  ==!
-             ( kpass == 2 .AND. ln_traldf_blp ) ) THEN      !==  2nd   pass      (bilaplacian)  ==!
-            !
-            !                             ! "Poleward" diffusive heat or salt transports (T-S case only)
-               ! note sign is reversed to give down-gradient diffusive transports )
-            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -zftv(:,:,:)  )
-            !                          ! Diffusive heat transports
-            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) )
-            !
-         ENDIF                                                    !== end pass selection  ==!
-         !
-         !                                                        ! ===============
-      END DO                                                      ! end tracer loop
+      ENDIF
       !
-   END SUBROUTINE tra_ldf_iso_t
+   END SUBROUTINE traldf_iso_a33
 
    !!==============================================================================
 END MODULE traldf_iso
diff --git a/src/OCE/TRA/traldf_iso_scheme.h90 b/src/OCE/TRA/traldf_iso_scheme.h90
new file mode 100644
index 00000000..818474f4
--- /dev/null
+++ b/src/OCE/TRA/traldf_iso_scheme.h90
@@ -0,0 +1,195 @@
+   !!======================================================================
+   !!                   ***  traldf_iso_scheme.h90  ***
+   !! tra_ldf:   divergence the lateral iso-neutral fluxes
+#if defined iso_lap
+   !!                             laplacian
+#elif defined iso_blp_p1
+   !!                        bilaplacian: 1st pass
+#elif defined iso_blp_p2
+   !!                        bilaplacian: 2nd pass
+#endif
+   !!======================================================================
+   !! History :  4.5  ! 2022-08  (S. Techene, G, Madec) refactorization to reduce local memory usage
+   !!                                                 + no more re-entering lap with traldf_iso_blp creation
+   !!----------------------------------------------------------------------
+
+	    
+            !!======================================================================
+            !!  masked tracer gradient : (zdit, zdjt, zdkt) at both jk and jk+1
+            !!======================================================================
+            !
+            IF( jk == 1 ) THEN                         !=  surface level  =!   compute level 1 and 2
+               !
+               ik = 0   ;   ikp1 = 1                        ! ik-index initialisation
+               !
+               DO_2D( INN+1, INN , INN+1, INN  )
+                  zdit(ji,jj,ik  ) = ( pt_in(ji+1,jj,jk  ,jn,Kbb) - pt_in(ji,jj,jk  ,jn,Kbb) ) * umask(ji,jj,jk  )
+                  zdit(ji,jj,ikp1) = ( pt_in(ji+1,jj,jk+1,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * umask(ji,jj,jk+1)
+                  !
+                  zdjt(ji,jj,ik  ) = ( pt_in(ji,jj+1,jk  ,jn,Kbb) - pt_in(ji,jj,jk  ,jn,Kbb) ) * vmask(ji,jj,jk  )
+                  zdjt(ji,jj,ikp1) = ( pt_in(ji,jj+1,jk+1,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * vmask(ji,jj,jk+1)
+               END_2D
+               !
+               DO_2D( INN+1, INN+1, INN+1, INN+1 )
+                  zdkt(ji,jj,ik  ) = 0._wp                                                                        ! level 1 (=0)
+                  zdkt(ji,jj,ikp1) = ( pt_in(ji,jj,jk,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * wmask(ji,jj,jk+1)    ! level 2
+               END_2D
+               !
+            ELSEIF( 2 <= jk .AND. jk <= jpk-2 ) THEN   !=  deeper level  =!   compute level jk+1 only
+               !
+               iis = ik   ;   ik = ikp1   ;   ikp1 = iis    ! swap ik-index 
+               !
+               DO_2D( INN+1, INN , INN+1, INN  )
+                  zdit(ji,jj,ikp1) = ( pt_in(ji+1,jj  ,jk+1,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * umask(ji,jj,jk+1)
+                  zdjt(ji,jj,ikp1) = ( pt_in(ji  ,jj+1,jk+1,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * vmask(ji,jj,jk+1)
+               END_2D
+               DO_2D( INN+1, INN+1, INN+1, INN+1 )
+                  zdkt(ji,jj,ikp1) = ( pt_in(ji,jj,jk,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) ) * wmask(ji,jj,jk+1)    ! w-level jk+1
+               END_2D
+               !
+            ELSEIF( jk == jpkm1 ) THEN                 !=  jpk-1 level =!   zdit, zdjt not used ; zdkt(jpk) always 0 as wmask(jpk)=0
+               !
+               iis = ik   ;   ik = ikp1   ;   ikp1 = iis    ! swap ik-index 
+               !
+               DO_2D( INN+1, INN+1, INN+1, INN+1 )
+                  zdkt(ji,jj,ikp1) = 0._wp                                                                        ! w-level jpk
+               END_2D
+            ENDIF
+	    !
+            !!----------------------------------------------------------------------
+            !                             (  A11   0   A13  )      
+            !  rotation matrix        A = (   0   A22  A23  )
+            !                             (  A31  A32  A33  )
+            !!----------------------------------------------------------------------
+
+            !!======================================================================
+            !!     HORIZONTAL iso-neutral fluxes
+            !!======================================================================
+            ! CAUTION:   round brackets are required for halo size and north fold compatibility 
+            !
+            DO_2D( INN+1, INN , INN+1, INN )    !==  Horizontal fluxes  ==!   used elements: (  A11   -   A13  )
+               !                                                                             (   -   A22  A23  )
+               !
+               zA11 = e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)
+               zA22 = e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)
+               !
+               zmsku = 1._wp / MAX(  ( wmask(ji+1,jj,jk  ) + wmask(ji,jj,jk+1) )         &
+                  &                + ( wmask(ji+1,jj,jk+1) + wmask(ji,jj,jk  ) ) , 1._wp )
+               zmskv = 1._wp / MAX(  ( wmask(ji,jj+1,jk  ) + wmask(ji,jj,jk+1) )         &
+                  &                + ( wmask(ji,jj+1,jk+1) + wmask(ji,jj,jk  ) ) , 1._wp )
+               !
+               zA13 = - e2u(ji,jj) * uslp(ji,jj,jk) * zmsku
+               zA23 = - e1v(ji,jj) * vslp(ji,jj,jk) * zmskv
+               !
+               zfu(ji,jj) =  ahtu(ji,jj,jk)                                                                      &   ! u-masked
+                  &       * (   zA11 * zdit(ji,jj,ik) + zA13 * (  ( zdkt(ji+1,jj,ik  ) + zdkt(ji,jj,ikp1) )      &
+                  &                                             + ( zdkt(ji+1,jj,ikp1) + zdkt(ji,jj,ik  ) )  )   )
+               zfv(ji,jj) = ahtv(ji,jj,jk)                                                                       &   ! v-masked
+                  &       * (   zA22 * zdjt(ji,jj,ik) + zA23 * (  ( zdkt(ji,jj+1,ik  ) + zdkt(ji,jj,ikp1) )      &
+                  &                                             + ( zdkt(ji,jj+1,ikp1) + zdkt(ji,jj,ik  ) )  )   )
+            END_2D
+!!gm
+!!gm OPTIM???    also verify the usage of akz ah_wslp2 in trazdf !!!
+!!gm
+            !
+            !!======================================================================
+            !!     VERTICAL iso-neutral fluxes   and   3D DIVERGENCE of fluxes
+            !!======================================================================
+            ! CAUTION:   round brackets are required for halo size and north fold compatibility 
+            !
+            !  used elements :  (  A31  A32  explicit part of A33 )   (ln_traldf_msc=F ==> ah_wslp2 = akz : full explicit)
+            !
+            IF( jk ==1 )   zfw(T2D(INN)) = 0._wp      ! set surface vertical flux to zero
+            !
+            IF( 1 <= jk .AND. jk <= jpk-2 ) THEN      ! ocean level except the deepest one (jpkm1)
+               !
+               DO_2D( INN, INN, INN, INN )
+                  !                             !==  Vertical fluxes at jpk+1  ==!   used elements: ( A31  A32  and explicit part of A33 )
+                  !
+                  zmsku   = wmask(ji,jj,jk) / MAX(  ( umask(ji  ,jj,jk) + umask(ji-1,jj,jk+1) )          &
+                     &                            + ( umask(ji-1,jj,jk) + umask(ji  ,jj,jk+1) ) , 1._wp  )
+                  zmskv   = wmask(ji,jj,jk) / MAX(  ( vmask(ji,jj  ,jk) + vmask(ji,jj-1,jk+1) )          &
+                     &                            + ( vmask(ji,jj-1,jk) + vmask(ji,jj  ,jk+1) ) , 1._wp  )
+                     !
+                  zahu_w  = (  ( ahtu(ji  ,jj,jk) + ahtu(ji-1,jj,jk+1) )    &
+                     &       + ( ahtu(ji-1,jj,jk) + ahtu(ji  ,jj,jk+1) )  ) * zmsku
+                  zahv_w  = (  ( ahtv(ji,jj  ,jk) + ahtv(ji,jj-1,jk+1) )    &
+                     &       + ( ahtv(ji,jj-1,jk) + ahtv(ji,jj  ,jk+1) )  ) * zmskv
+                     !
+                  zA31    = - zahu_w * e2t(ji,jj) * zmsku * wslpi(ji,jj,jk+1)   ! NB: wslpi & j are already w-masked
+                  zA32    = - zahv_w * e1t(ji,jj) * zmskv * wslpj(ji,jj,jk+1)   !     and * zmsk for zd.t averaging
+                  !
+                  zfw_kp1 = zA31 * (  ( zdit(ji  ,jj,ik) + zdit(ji-1,jj,ikp1) )      &   ! round brackets required for halo size
+                     &              + ( zdit(ji-1,jj,ik) + zdit(ji  ,jj,ikp1) )  )   &   ! and north fold compatibility
+                     &    + zA32 * (  ( zdjt(ji,jj  ,ik) + zdjt(ji,jj-1,ikp1) )      &
+                     &              + ( zdjt(ji,jj-1,ik) + zdjt(ji,jj  ,ikp1) )  )   &
+                     &    + e1e2t(ji,jj) / e3w(ji,jj,jk+1,Kmm) * wmask(ji,jj,jk+1)   &   ! vertical A33 flux :
+#if defined iso_lap
+                     &           * ( ah_wslp2(ji,jj,jk+1)        - akz(ji,jj,jk+1)    )   &   !   laplacian          : ah_wslp2 - akz
+                     &           * ( pt      (ji,jj,jk  ,jn,Kbb) - pt (ji,jj,jk+1,jn,Kbb) )                          ! NB = 0 if ln_traldf_msc=F
+#elif defined iso_blp_p1
+                     &           *   ah_wslp2(ji,jj,jk+1)                                 &   ! bilaplacian, 1st pass: ah_wslp2 
+                     &           * ( pt      (ji,jj,jk  ,jn,Kbb) - pt (ji,jj,jk+1,jn,Kbb) )
+#elif defined iso_blp_p2
+                     !                                                                        ! bilaplacian, 2nd pass:
+                     &           * (  ah_wslp2(ji,jj,jk+1) * ( pt   (ji,jj,jk,jn,Kbb) - pt   (ji,jj,jk+1,jn,Kbb) )  &   ! ah_wslp2 on pt
+                     &              +      akz(ji,jj,jk+1) * ( pt_in(ji,jj,jk,jn,Kbb) - pt_in(ji,jj,jk+1,jn,Kbb) )  )   ! akz      on pt in
+#endif
+		  !                             !==  Divergence of vertical fluxes  ==!
+#if   defined iso_lap
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined iso_blp_p1
+                  zlap(ji,jj,jk)       =                                      &   ! store in zlap
+#elif defined iso_blp_p2
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) -               &   ! added to RHS with MINUS sign (blp)
+#endif
+                     &                  (  ( zfu(ji,jj) - zfu(ji-1,jj) )      &
+                     &                   + ( zfv(ji,jj) - zfv(ji,jj-1) )      &
+                     &                   + ( zfw(ji,jj) - zfw_kp1      )  )   & 
+                     &                 * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+                  !
+                  zfw(ji,jj) = zfw_kp1          !==  Store zfw for next level calculation  ==!
+                  !
+               END_2D
+               !
+            ELSEIF( jk == jpkm1 ) THEN                ! level jpkm1   (zfw_kp1 at jpk always zero)
+	       !
+	       DO_2D( INN, INN, INN, INN )
+#if   defined iso_lap
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) +               &   ! added to RHS with PLUS sign (lap)
+#elif defined iso_blp_p1
+                  zlap(ji,jj,jk)       =                                      &   ! store in zlap
+#elif defined iso_blp_p2
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) -               &   ! added to RHS with MINUS sign (blp)
+#endif
+                     &                  (  ( zfu(ji,jj) - zfu(ji-1,jj) )      &
+                     &                   + ( zfv(ji,jj) - zfv(ji,jj-1) )      &
+                     &                   + ( zfw(ji,jj)                )  )   & 
+                     &                 * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+               END_2D
+               !
+	    ENDIF
+            !
+	         
+!!gm note for futur improvements :
+!
+!!gm suggestion or more compact writing for a 3 time duplicated part
+! 
+!          !        ! averaging of u- and v-point values at w-point (i-k and j-k averaging)
+!          !           ! NB:  round brackets required for  halo size and north fold compatibility
+! define    Au_2_w(A3D,k)       (  ( A3D(ji  ,jj,k) + A3D(ji-1,jj,k+1) )    &   \
+!                     &          + ( A3D(ji-1,jj,k) + A3D(ji  ,jj,k+1) )  )
+! define    Av_2_w(A3D,k)       (  ( A3D(ji,jj  ,k) + A3D(ji,jj-1,k+1) )    &   \
+!                     &          + ( A3D(ji,jj-1,k) + A3D(ji,jj  ,k+1) )  )
+!! then :
+!                   zmsku  = wmask(ji,jj,jk) / MAX( Au_2_w( umask, k ) , 1._wp )
+!                   zmskv  = wmask(ji,jj,jk) / MAX( Av_2_w( vmask, k ) , 1._wp )
+!                   zahu_w = Au_2_w( ahtu, k ) * zmsku
+!                   zahv_w = Av_2_w( ahtv, k ) * zmskv
+!                   zA31 = - zahu_w * e2t(ji,jj) * zmsku * wslpi(ji,jj,jk+1)   ! NB: wslpi & j are already w-masked
+!                   zA32 = - zahv_w * e1t(ji,jj) * zmskv * wslpj(ji,jj,jk+1)
+!                   !  
+!                   ztfw_kp1 = zA31 * Au_2_w( zdit, 0 )         &          ! 3rd indice is ik,ikp1 ==>> 0 in argument
+!                      &     + zA32 * Aw_2_v( zdjt, 0 )         &
+!                      !
+!!gm end
\ No newline at end of file
diff --git a/src/OCE/TRA/traldf_lap_blp.F90 b/src/OCE/TRA/traldf_lap_blp.F90
deleted file mode 100644
index 16e5df16..00000000
--- a/src/OCE/TRA/traldf_lap_blp.F90
+++ /dev/null
@@ -1,260 +0,0 @@
-MODULE traldf_lap_blp
-   !!==============================================================================
-   !!                       ***  MODULE  traldf_lap_blp  ***
-   !! Ocean tracers:  lateral diffusivity trend  (laplacian and bilaplacian)
-   !!==============================================================================
-   !! History :  3.7  ! 2014-01  (G. Madec, S. Masson)  Original code, re-entrant laplacian
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   tra_ldf_lap   : tracer trend update with iso-level laplacian diffusive operator
-   !!   tra_ldf_blp   : tracer trend update with iso-level or iso-neutral bilaplacian operator
-   !!----------------------------------------------------------------------
-   USE oce            ! ocean dynamics and active tracers
-   USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
-   USE ldftra         ! lateral physics: eddy diffusivity
-   USE traldf_iso     ! iso-neutral lateral diffusion (standard operator)     (tra_ldf_iso   routine)
-   USE traldf_triad   ! iso-neutral lateral diffusion (triad    operator)     (tra_ldf_triad routine)
-   USE diaptr         ! poleward transport diagnostics
-   USE diaar5         ! AR5 diagnostics
-   USE trc_oce        ! share passive tracers/Ocean variables
-   USE zpshde         ! partial step: hor. derivative     (zps_hde routine)
-   !
-   USE in_out_manager ! I/O manager
-   USE iom            ! I/O library
-   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
-   USE lib_mpp        ! distribued memory computing library
-   USE timing         ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   tra_ldf_lap   ! called by traldf.F90
-   PUBLIC   tra_ldf_blp   ! called by traldf.F90
-
-   LOGICAL  ::   l_ptr   ! flag to compute poleward transport
-   LOGICAL  ::   l_hst   ! flag to compute heat transport
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: traldf_lap_blp.F90 14834 2021-05-11 09:24:44Z hadcv $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE tra_ldf_lap( kt, Kmm, kit000, cdtype, pahu, pahv,             &
-      &                                             pgu , pgv , pgui, pgvi, &
-      &                                             pt, pt_rhs, kjpt, kpass )
-      !!
-      INTEGER                     , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                     , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                     , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                     , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                     , INTENT(in   ) ::   Kmm        ! ocean time level index
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! before tracer fields
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
-      !!
-      CALL tra_ldf_lap_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                            &
-      &                                            pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui), &
-      &                                            pt, is_tile(pt), pt_rhs, is_tile(pt_rhs), kjpt, kpass )
-   END SUBROUTINE tra_ldf_lap
-
-
-   SUBROUTINE tra_ldf_lap_t( kt, Kmm, kit000, cdtype, pahu, pahv, ktah,                   &
-      &                                               pgu , pgv , ktg , pgui, pgvi, ktgi, &
-      &                                               pt, ktt, pt_rhs, ktt_rhs, kjpt, kpass )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE tra_ldf_lap  ***
-      !!
-      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
-      !!      trend and add it to the general trend of tracer equation.
-      !!
-      !! ** Method  :   Second order diffusive operator evaluated using before
-      !!      fields (forward time scheme). The horizontal diffusive trends of
-      !!      the tracer is given by:
-      !!          difft = 1/(e1e2t*e3t) {  di-1[ pahu e2u*e3u/e1u di(tb) ]
-      !!                                 + dj-1[ pahv e1v*e3v/e2v dj(tb) ] }
-      !!      Add this trend to the general tracer trend pt_rhs :
-      !!          pt_rhs = pt_rhs + difft
-      !!
-      !! ** Action  : - Update pt_rhs arrays with the before iso-level
-      !!                harmonic mixing trend.
-      !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                              , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                              , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                              , INTENT(in   ) ::   Kmm        ! ocean time level index
-      INTEGER                              , INTENT(in   ) ::   ktah, ktg, ktgi, ktt, ktt_rhs
-      REAL(wp), DIMENSION(A2D_T(ktah),   JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(A2D_T(ktg),        KJPT), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(A2D_T(ktgi),       KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! before tracer fields
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
-      !
-      INTEGER  ::   ji, jj, jk, jn      ! dummy loop indices
-      INTEGER  ::   iij
-      REAL(wp) ::   zsign               ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   ztu, ztv, zaheeu, zaheev
-      !!----------------------------------------------------------------------
-      !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == nit000 .AND. lwp )  THEN
-            WRITE(numout,*)
-            WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion on ', cdtype, ', pass=', kpass
-            WRITE(numout,*) '~~~~~~~~~~~ '
-         ENDIF
-         !
-         l_hst = .FALSE.
-         l_ptr = .FALSE.
-         IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) )     l_ptr = .TRUE.
-         IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &
-            &                        iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE.
-      ENDIF
-      !
-      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case
-      IF( nldf_tra == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls
-      ELSE                                           ; iij = 1
-      ENDIF
-
-      !                                !==  Initialization of metric arrays used for all tracers  ==!
-      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0)
-      ELSE                    ;   zsign = -1._wp
-      ENDIF
-
-      DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )            !== First derivative (gradient)  ==!
-         zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)   !!gm   * umask(ji,jj,jk) pah masked!
-         zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)   !!gm   * vmask(ji,jj,jk)
-      END_3D
-      !
-      !                             ! =========== !
-      DO jn = 1, kjpt               ! tracer loop !
-         !                          ! =========== !
-         !
-         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )            !== First derivative (gradient)  ==!
-            ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) )
-            ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) )
-         END_3D
-         IF( ln_zps ) THEN                             ! set gradient at bottom/top ocean level
-            DO_2D( iij, iij-1, iij, iij-1 )                              ! bottom
-               ztu(ji,jj,mbku(ji,jj)) = zaheeu(ji,jj,mbku(ji,jj)) * pgu(ji,jj,jn)
-               ztv(ji,jj,mbkv(ji,jj)) = zaheev(ji,jj,mbkv(ji,jj)) * pgv(ji,jj,jn)
-            END_2D
-            IF( ln_isfcav ) THEN                             ! top in ocean cavities only
-               DO_2D( iij, iij-1, iij, iij-1 )
-                  IF( miku(ji,jj) > 1 )   ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn)
-                  IF( mikv(ji,jj) > 1 )   ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn)
-               END_2D
-            ENDIF
-         ENDIF
-         !
-         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )            !== Second derivative (divergence) added to the general tracer trends  ==!
-            ! round brackets added to fix the order of floating point operations
-            ! needed to ensure halo 1 - halo 2 compatibility
-            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ( ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk)    &
-               &                                          )                                    & ! bracket for halo 1 - halo 2 compatibility
-               &                                      +   ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk)    &
-               &                                          )                                    & ! bracket for halo 1 - halo 2 compatibility
-               &                                        ) / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) )
-         END_3D
-         !
-         !                             !== "Poleward" diffusive heat or salt transports  ==!
-         IF( ( kpass == 1 .AND. .NOT.ln_traldf_blp ) .OR.  &     !==  first pass only (  laplacian)  ==!
-             ( kpass == 2 .AND.      ln_traldf_blp ) ) THEN      !==  2nd   pass only (bilaplacian)  ==!
-
-            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -ztv(:,:,:)  )
-            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -ztu(:,:,:), -ztv(:,:,:) )
-         ENDIF
-         !                          ! ==================
-      END DO                        ! end of tracer loop
-      !                             ! ==================
-      !
-   END SUBROUTINE tra_ldf_lap_t
-
-
-   SUBROUTINE tra_ldf_blp( kt, Kmm, kit000, cdtype, pahu, pahv  ,             &
-      &                                             pgu , pgv   , pgui, pgvi, &
-      &                                             pt  , pt_rhs, kjpt, kldf )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE tra_ldf_blp  ***
-      !!
-      !! ** Purpose :   Compute the before lateral tracer diffusive
-      !!      trend and add it to the general trend of tracer equation.
-      !!
-      !! ** Method  :   The lateral diffusive trends is provided by a bilaplacian
-      !!      operator applied to before field (forward in time).
-      !!      It is computed by two successive calls to laplacian routine
-      !!
-      !! ** Action :   pta   updated with the before rotated bilaplacian diffusion
-      !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                              , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                              , INTENT(in   ) ::   kldf       ! type of operator used
-      INTEGER                              , INTENT(in   ) ::   Kmm        ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(jpi,jpj,    kjpt), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top levels
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt         ! before and now tracer fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend
-      !
-      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,kjpt) :: zlap         ! laplacian at t-point
-      REAL(wp), DIMENSION(A2D(nn_hls),    kjpt) :: zglu, zglv   ! bottom GRADh of the laplacian (u- and v-points)
-      REAL(wp), DIMENSION(A2D(nn_hls),    kjpt) :: zgui, zgvi   ! top    GRADh of the laplacian (u- and v-points)
-      !!---------------------------------------------------------------------
-      !
-      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
-         IF( kt == kit000 .AND. lwp )  THEN
-            WRITE(numout,*)
-            SELECT CASE ( kldf )
-            CASE ( np_blp    )   ;   WRITE(numout,*) 'tra_ldf_blp : iso-level   bilaplacian operator on ', cdtype
-            CASE ( np_blp_i  )   ;   WRITE(numout,*) 'tra_ldf_blp : iso-neutral bilaplacian operator on ', cdtype, ' (Standard)'
-            CASE ( np_blp_it )   ;   WRITE(numout,*) 'tra_ldf_blp : iso-neutral bilaplacian operator on ', cdtype, ' (triad)'
-            END SELECT
-            WRITE(numout,*) '~~~~~~~~~~~'
-         ENDIF
-      ENDIF
-
-      zlap(:,:,:,:) = 0._wp
-      !
-      SELECT CASE ( kldf )       !==  1st laplacian applied to pt (output in zlap)  ==!
-      !
-      CASE ( np_blp    )               ! iso-level bilaplacian
-         CALL tra_ldf_lap  ( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt,     zlap, kjpt, 1 )
-      CASE ( np_blp_i  )               ! rotated   bilaplacian : standard operator (Madec)
-         CALL tra_ldf_iso  ( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 )
-      CASE ( np_blp_it )               ! rotated  bilaplacian : triad operator (griffies)
-         CALL tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 )
-      END SELECT
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp )     ! Lateral boundary conditions (unchanged sign)
-      !                                               ! Partial top/bottom cell: GRADh( zlap )
-      IF( ln_isfcav .AND. ln_zps ) THEN   ;   CALL zps_hde_isf( kt, kjpt, zlap, zglu, zglv, zgui, zgvi )  ! both top & bottom
-      ELSEIF(             ln_zps ) THEN   ;   CALL zps_hde    ( kt, kjpt, zlap, zglu, zglv )              ! only bottom
-      ENDIF
-      !
-      SELECT CASE ( kldf )       !==  2nd laplacian applied to zlap (output in pt_rhs)  ==!
-      !
-      CASE ( np_blp    )               ! iso-level bilaplacian
-         CALL tra_ldf_lap  ( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt_rhs,         kjpt, 2 )
-      CASE ( np_blp_i  )               ! rotated   bilaplacian : standard operator (Madec)
-         CALL tra_ldf_iso  ( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt    , pt_rhs, kjpt, 2 )
-      CASE ( np_blp_it )               ! rotated  bilaplacian : triad operator (griffies)
-         CALL tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt    , pt_rhs, kjpt, 2 )
-      END SELECT
-      !
-   END SUBROUTINE tra_ldf_blp
-
-   !!==============================================================================
-END MODULE traldf_lap_blp
diff --git a/src/OCE/TRA/traldf_lev.F90 b/src/OCE/TRA/traldf_lev.F90
new file mode 100644
index 00000000..3d554e33
--- /dev/null
+++ b/src/OCE/TRA/traldf_lev.F90
@@ -0,0 +1,253 @@
+MODULE traldf_lev
+   !!==============================================================================
+   !!                       ***  MODULE  traldf_lev  ***
+   !! Ocean tracers:  iso-level diffusive tracer trend  (laplacian and bilaplacian)
+   !!==============================================================================
+   !! History :  3.7  ! 2014-01  (G. Madec, S. Masson)  Original code, re-entrant laplacian (traldf_lap_blp module)
+   !!            4.5  ! 2022-06  (S. Techene, G, Madec)  refactorization to reduce local memory usage
+   !!                 !                                + removal of old partial-step treatment
+   !!----------------------------------------------------------------------
+
+   !!----------------------------------------------------------------------
+   !!   traldf_lev_lap   : tracer trend update using an iso-level   laplacian diffusive operator
+   !!   traldf_lev_blp   :   -      -      -     -   an iso-level bilaplacian     -        -
+   !!----------------------------------------------------------------------
+   USE oce            ! ocean dynamics and active tracers
+   USE dom_oce        ! ocean space and time domain
+   USE domutl  , ONLY : is_tile
+   USE ldftra  , ONLY : ahtu, ahtv   ! lateral physics: eddy diffusivity coefficients
+   USE diaptr         ! poleward transport diagnostics
+   USE diaar5         ! AR5 diagnostics
+!!gm this is useless I guess since trc is passed in argument with pt
+!   USE trc_oce        ! share passive tracers/Ocean variables
+!!gm end
+   !
+   USE in_out_manager ! I/O manager
+!!gm   USE iom            ! I/O library
+!!gm   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
+!!gm   USE lib_mpp        ! distribued memory computing library
+!!gm   USE timing         ! Timing
+
+   IMPLICIT NONE
+   PRIVATE
+
+   PUBLIC   traldf_lev_lap   ! called by traldf.F90
+   PUBLIC   traldf_lev_blp   ! called by traldf.F90
+
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
+   !!----------------------------------------------------------------------
+   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
+   !! $Id: traldf_lap_blp.F90 14834 2021-05-11 09:24:44Z hadcv $
+   !! Software governed by the CeCILL license (see ./LICENSE)
+   !!----------------------------------------------------------------------
+CONTAINS
+
+   SUBROUTINE traldf_lev_lap( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst )
+      !!----------------------------------------------------------------------
+      !!                  ***  ROUTINE tra_ldf_lap  ***
+      !!
+      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
+      !!      trend and add it to the general trend of tracer equation.
+      !!
+      !! ** Method  :   iso-level laplacian diffusive operator evaluated using
+      !!      Kbb fields (forward time integration). The horizontal diffusive 
+      !!      trends of the tracer is given by:
+      !!          difft = 1/(e1e2t*e3t_Kmm) {  di-1[ ahtu e2u*e3u_Kmm/e1u di(t(Kbb)) ]
+      !!                                     + dj-1[ ahtv e1v*e3v_Kmm/e2v dj(t(Kbb)) ] }
+      !!      Add this trend to the general tracer trend pt_rhs :
+      !!          pt_rhs = pt_rhs + difft
+      !!
+      !! ** Action :   pt(Krhs)   increased by the laplacian diffusive trend 
+      !!----------------------------------------------------------------------
+      INTEGER                       , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step and time-level indices
+      LOGICAL , OPTIONAL            , INTENT(in   ) ::   ld_hst, ld_ptr       ! T-S diagnostic flags
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(inout) ::   pt                   ! tracers, in: at kbb ; out: at Krhs
+      !
+      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
+      INTEGER  ::   itra             ! number of tracers
+      REAL(wp) ::   zaheeu, zaheev   ! local scalar 
+      REAL(wp), DIMENSION(T2D(1)) ::   zfu, zfv
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
+!!!gm end
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zdia_i , zdia_j
+      !!----------------------------------------------------------------------
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!                                                                    and to be duplicated in traldf_lev_blp (2nd pass only)
+!       IF( ld_ptr .OR. ld_hst ) THEN 
+!          ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) )
+!       ENDIF
+      !!gm end
+      IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN
+         IF( ld_ptr .OR. ld_hst ) THEN 
+            ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) )
+            zdia_i(:,:,jpk) = 0._wp   ;   zdia_j(:,:,jpk) = 0._wp
+         ENDIF
+      ENDIF
+      !
+      itra = SIZE( pt, dim=4 )         ! number of tracers
+      !
+      !  
+      !                             ! =========== !
+      DO jn = 1, itra               ! tracer loop !
+         !                          ! =========== !
+         !
+         DO jk = 1, jpkm1                 ! horizontal slab
+            !
+            DO_2D( 1, 0, 1, 0 )                 !-  1st derivative   (masked as ahtu/v are masked)
+               zaheeu     = ahtu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)
+               zaheev     = ahtv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)
+               zfu(ji,jj) = zaheeu * ( pt(ji+1,jj  ,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
+               zfv(ji,jj) = zaheev * ( pt(ji  ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
+            END_2D
+            DO_2D( 0, 0, 0, 0 )                 !-  2nd derivative added to the general tracer trends (with PLUS sign)
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)                  &
+                  &                 + (  ( zfu(ji,jj) - zfu(ji-1,jj) )      &
+                  &                    + ( zfv(ji,jj) - zfv(ji,jj-1) )  )   &
+                  &                 * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
+            END_2D
+            !
+!!gm ld_ptr,ld_hst:
+!             IF( ld_ptr .OR. ld_hst ) THEN       ! vertically cumulated fluxes (minus sign by convention in the output)
+!                zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0))
+!                zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0))
+!             ENDIF         
+            !!gm end
+            IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN
+               IF( ld_ptr .OR. ld_hst ) THEN         ! store fluxes for diagnostics (minus sign by convention in the output)
+                  zdia_i(:,:,jk) = - zfu(T2D(0))
+                  zdia_j(:,:,jk) = - zfv(T2D(0))
+               ENDIF
+            ENDIF
+            !
+         END DO                          ! end horizontal slab
+         !
+         !                             !== "Poleward" diffusive heat or salt transports  ==!
+         IF( PRESENT(ld_ptr) )  THEN
+            IF( ld_ptr )   CALL dia_ptr_hst( jn, 'ldf'        , zdia_j )
+         ENDIF
+         IF( PRESENT(ld_hst) )  THEN
+            IF( ld_hst )   CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j )
+         ENDIF
+         !
+         !                          ! ==================
+      END DO                        ! end of tracer loop
+      !                             ! ==================
+      !
+   END SUBROUTINE traldf_lev_lap
+
+
+   SUBROUTINE traldf_lev_blp( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst )
+      !!----------------------------------------------------------------------
+      !!                 ***  ROUTINE tra_ldf_blp  ***
+      !!
+      !!                          nn_hls >= 2
+      !!
+      !!           NO use of zps_hde ==>>  New HPG calculation
+      !!           **        *******
+      !!      
+      !!
+      !! ** Purpose :   Compute the before lateral tracer diffusive
+      !!      trend and add it to the general trend of tracer equation.
+      !!
+      !! ** Method  :   The lateral diffusive trends is provided by a bilaplacian
+      !!      iso-level operator applied to pt(Kbb) (forward time integration).
+      !!
+      !! ** Action :   pt(Krhs)   increased by the bilaplacian diffusive trend 
+      !!----------------------------------------------------------------------
+      INTEGER                       , INTENT(in   ) ::   kt, Kbb, Kmm, Krhs   ! ocean time-step and time-level indices
+      LOGICAL , OPTIONAL            , INTENT(in   ) ::   ld_hst, ld_ptr       ! T-S diagnostic flags
+      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(inout) ::   pt                   ! tracers, in: at kbb ; out: at Krhs
+      !
+      INTEGER  ::   ji, jj, jk, jn      ! dummy loop indices
+      INTEGER  ::   itra                ! number of tracers
+      REAL(wp), DIMENSION(T2D(2)) ::   zaheeu, zfu
+      REAL(wp), DIMENSION(T2D(2)) ::   zaheev, zfv
+      REAL(wp), DIMENSION(T2D(1)) ::   zlap             ! laplacian at t-point
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zdia_i , zdia_j    ! used for some diagnostics
+!!!gm end
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zdia_i , zdia_j
+      !!---------------------------------------------------------------------
+      !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!       IF( ld_ptr .OR. ld_hst ) THEN 
+!          ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) )
+!       ENDIF
+      IF( ld_ptr .OR. ld_hst ) THEN 
+         ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) )
+         zdia_i(:,:,jpk) = 0._wp   ;   zdia_j(:,:,jpk) = 0._wp
+      ENDIF
+!!gm end
+      !
+      itra = SIZE( pt, dim=4 )      ! number of tracers
+      !  
+      !                             ! =========== !
+      DO jn = 1, itra               ! tracer loop !
+         !                          ! =========== !
+         !
+!!gm ld_ptr,ld_hst:  require changes in the dia_ptr/dia_ar5   <<<=== comment for the moment
+!       IF( ld_ptr .OR. ld_hst ) THEN 
+!          zdia_i(:,:) = 0._wp   ;   zdia_j(:,:) = 0._wp
+!       ENDIF
+!!gm end
+         !
+         DO jk = 1, jpkm1                 ! horizontal slab
+            !
+            DO_2D( 2, 1, 2, 1 )
+               zaheeu(ji,jj) = ahtu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)
+               zaheev(ji,jj) = ahtv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)
+            END_2D
+            !                                   !-  first derivative   (masked as ahtu/v are masked)
+            DO_2D( 2, 1, 2, 1 )
+               zfu(ji,jj) = zaheeu(ji,jj) * ( pt(ji+1,jj  ,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
+               zfv(ji,jj) = zaheev(ji,jj) * ( pt(ji  ,jj+1,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) )
+            END_2D
+            !                                   !-  Second derivative (divergence)    (with PLUS sign)
+            DO_2D( 1, 1, 1, 1 )
+               zlap(ji,jj) = (  ( zfu(ji,jj) - zfu(ji-1,jj) )      &       ! t-masked as fluxes are u/v-masked
+                  &           + ( zfv(ji,jj) - zfv(ji,jj-1) )  )   &
+                  &        *  r1_e1e2t(ji,jj) /  e3t(ji,jj,jk,Kmm)
+            END_2D
+            !                                   !-  3rd derivative  -!   (masked as ahtu/v are masked)
+            DO_2D( 1, 0, 1, 0 )
+               zfu(ji,jj) = zaheeu(ji,jj) * ( zlap(ji+1,jj  ) - zlap(ji,jj) )
+               zfv(ji,jj) = zaheev(ji,jj) * ( zlap(ji  ,jj+1) - zlap(ji,jj) )
+            END_2D
+            !
+            DO_2D( 0, 0, 0, 0 )                 !-  4th derivative added to the general tracer trends (with MINUS sign)
+               pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs)                    &
+                  &                 - (  ( zfu(ji,jj) - zfu(ji-1,jj) )      &
+                  &                    + ( zfv(ji,jj) - zfv(ji,jj-1) )  )   &
+                  &                 *  r1_e1e2t(ji,jj) /  e3t(ji,jj,jk,Kmm)
+            END_2D
+            !
+!!gm ld_ptr,ld_hst:
+!             IF( ld_ptr .OR. ld_hst ) THEN       ! vertically cumulated fluxes (minus sign by convention in the output)
+!                zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0))
+!                zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0))
+!             ENDIF         
+!!gm end
+            IF( ld_ptr .OR. ld_hst ) THEN       ! vertically cumulated fluxes (minus sign by convention in the output)
+               zdia_i(:,:,jk) = - zfu(T2D(0))
+               zdia_j(:,:,jk) = - zfv(T2D(0))
+            ENDIF         
+            !
+         END DO                           ! end horizontal slab
+         !
+         !                             !== "Poleward" diffusive heat or salt transports  ==!
+         !                             !== "Poleward" diffusive heat or salt transports  ==!
+         IF( ld_ptr )   CALL dia_ptr_hst( jn, 'ldf'        , zdia_j )
+         IF( ld_hst )   CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j )
+         !
+         !                          ! ==================
+      END DO                        ! end of tracer loop
+      !                             ! ==================
+      !
+   END SUBROUTINE traldf_lev_blp
+
+   !!==============================================================================
+END MODULE traldf_lev
diff --git a/src/OCE/TRA/traldf_triad.F90 b/src/OCE/TRA/traldf_triad.F90
index 19039b88..09a1e346 100644
--- a/src/OCE/TRA/traldf_triad.F90
+++ b/src/OCE/TRA/traldf_triad.F90
@@ -12,7 +12,7 @@ MODULE traldf_triad
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and active tracers
    USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
+   USE domutl, ONLY : lbnd_ij
    USE phycst         ! physical constants
    USE trc_oce        ! share passive tracers/Ocean variables
    USE zdf_oce        ! ocean vertical physics
@@ -30,7 +30,8 @@ MODULE traldf_triad
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC   tra_ldf_triad   ! routine called by traldf.F90
+   PUBLIC   traldf_triad_lap   ! routine called by traldf.F90
+   PUBLIC   traldf_triad_blp   ! routine called by traldf.F90
 
    LOGICAL  ::   l_ptr   ! flag to compute poleward transport
    LOGICAL  ::   l_hst   ! flag to compute heat transport
@@ -46,9 +47,8 @@ MODULE traldf_triad
    !!----------------------------------------------------------------------
 CONTAINS
 
-   SUBROUTINE tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv,             &
-      &                                               pgu , pgv , pgui, pgvi, &
-      &                                               pt, pt2, pt_rhs, kjpt, kpass )
+   SUBROUTINE traldf_triad_lap( kt, Kmm, kit000, cdtype, pahu, pahv,                  &
+      &                                                  pt, pt2, pt_rhs, kjpt, kpass )
       !!
       INTEGER                     , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                     , INTENT(in   ) ::   kit000     ! first time step index
@@ -57,21 +57,17 @@ CONTAINS
       INTEGER                     , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
       INTEGER                     , INTENT(in   ) ::   Kmm        ! ocean time level indices
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu , pgv  ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
       REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
       REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
       REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
       !!
-      CALL tra_ldf_triad_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                            &
-      &                                              pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui), &
-      &                                              pt, is_tile(pt), pt2, is_tile(pt2), pt_rhs, is_tile(pt_rhs), kjpt, kpass )
-   END SUBROUTINE tra_ldf_triad
+      CALL traldf_triad_lap_t( kt, Kmm, kit000, cdtype, pahu, pahv, lbnd_ij(pahu),                                               &
+      &                                                 pt, lbnd_ij(pt), pt2, lbnd_ij(pt2), pt_rhs, lbnd_ij(pt_rhs), kjpt, kpass )
+   END SUBROUTINE traldf_triad_lap
 
 
-  SUBROUTINE tra_ldf_triad_t( kt, Kmm, kit000, cdtype, pahu, pahv, ktah,                   &
-      &                                                pgu , pgv , ktg , pgui, pgvi, ktgi, &
-      &                                                pt, ktt, pt2, ktt2, pt_rhs, ktt_rhs, kjpt, kpass )
+   SUBROUTINE traldf_triad_lap_t( kt, Kmm, kit000, cdtype, pahu, pahv, ktah,                                &
+      &                                                    pt, ktt, pt2, ktt2, pt_rhs, ktt_rhs, kjpt, kpass )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE tra_ldf_triad  ***
       !!
@@ -91,19 +87,17 @@ CONTAINS
       !!               ah_wslp2 ....
       !!               akz   stabilizing vertical diffusivity coefficient (used in trazdf_imp)
       !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                              , INTENT(in   ) ::   kit000     ! first time step index
-      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers
-      INTEGER                              , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
-      INTEGER                              , INTENT(in)    ::   Kmm        ! ocean time level indices
-      INTEGER                              , INTENT(in   ) ::   ktah, ktg, ktgi, ktt, ktt2, ktt_rhs
-      REAL(wp), DIMENSION(A2D_T(ktah),   JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
-      REAL(wp), DIMENSION(A2D_T(ktg),        KJPT), INTENT(in   ) ::   pgu , pgv  ! tracer gradient at pstep levels
-      REAL(wp), DIMENSION(A2D_T(ktgi),       KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt2),   JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
+      INTEGER                                    , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                                    , INTENT(in   ) ::   kit000     ! first time step index
+      CHARACTER(len=3)                           , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
+      INTEGER                                    , INTENT(in   ) ::   kjpt       ! number of tracers
+      INTEGER                                    , INTENT(in   ) ::   kpass      ! =1/2 first or second passage
+      INTEGER                                    , INTENT(in   ) ::   Kmm        ! ocean time level indices
+      INTEGER , DIMENSION(2)                     , INTENT(in   ) ::   ktah, ktt, ktt2, ktt_rhs
+      REAL(wp), DIMENSION(AB2D(ktah),   JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
+      REAL(wp), DIMENSION(AB2D(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
+      REAL(wp), DIMENSION(AB2D(ktt2),   JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
+      REAL(wp), DIMENSION(AB2D(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
       !
       INTEGER  ::  ji, jj, jk, jn, kp, iij   ! dummy loop indices
       REAL(wp) ::  zcoef0, ze3w_2, zsign          !   -      -
@@ -111,9 +105,9 @@ CONTAINS
       REAL(wp) ::   zslope2, zbu, zbv, zbu1, zbv1, zslope21, zah, zah1, zah_ip1, zah_jp1, zbu_ip1, zbv_jp1
       REAL(wp) ::   ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt, zdyt_jp1, ze3wr_jp1, zdzt_jp1, zah_slp1, zah_slp_jp1, zaei_slp_jp1
       REAL(wp) ::   zah_slp, zaei_slp, zdxt_ip1, ze3wr_ip1, zdzt_ip1, zah_slp_ip1, zaei_slp_ip1, zaei_slp1
-      REAL(wp), DIMENSION(A2D(nn_hls),0:1) ::   zdkt3d                                           ! vertical tracer gradient at 2 levels
-      REAL(wp), DIMENSION(A2D(nn_hls)    ) ::   z2d                                              ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw   ! 3D     -
+      REAL(wp), DIMENSION(T2D(nn_hls),0:1) ::   zdkt3d                                           ! vertical tracer gradient at 2 levels
+      REAL(wp), DIMENSION(T2D(nn_hls)    ) ::   z2d                                              ! 2D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw   ! 3D     -
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -147,6 +141,13 @@ CONTAINS
       !!----------------------------------------------------------------------
       !
       IF( kpass == 1 ) THEN         !==  first pass only  and whatever the tracer is  ==!
+         !
+         IF( kt /= kit000 ) THEN    ! Already zeroed on first timestep in ldf_slp_init
+            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+               akz     (ji,jj,jk) = 0._wp
+               ah_wslp2(ji,jj,jk) = 0._wp
+            END_3D
+         ENDIF
          !
          DO kp = 0, 1                            ! i-k triads
             DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
@@ -156,18 +157,18 @@ CONTAINS
                zah   = 0.25_wp * pahu(ji,jj,jk)
                zah1  = 0.25_wp * pahu(ji-1,jj,jk)
                ! Subtract s-coordinate slope at t-points to give slope rel to s-surfaces (do this by *adding* gradient of depth)
-               zslope2 = triadi_g(ji,jj,jk,1,kp) + ( gdept(ji+1,jj,jk,Kmm) - gdept(ji,jj,jk,Kmm) ) * r1_e1u(ji,jj) * umask(ji,jj,jk+kp)
+               zslope2  = triadi_g(ji,jj,jk,1,kp) + ( gdept(ji+1,jj,jk,Kmm) - gdept(ji,jj,jk,Kmm) )   &
+                  &                                 * r1_e1u(ji,jj) * umask(ji,jj,jk+kp)
                zslope2 = zslope2 *zslope2
-               zslope21 = triadi_g(ji,jj,jk,0,kp) + ( gdept(ji,jj,jk,Kmm) - gdept(ji-1,jj,jk,Kmm) ) * r1_e1u(ji-1,jj) * umask(ji-1,jj,jk+kp)
+               zslope21 = triadi_g(ji,jj,jk,0,kp) + ( gdept(ji,jj,jk,Kmm) - gdept(ji-1,jj,jk,Kmm) )   &
+                  &                                 * r1_e1u(ji-1,jj) * umask(ji-1,jj,jk+kp)
                zslope21 = zslope21 *zslope21
                ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               ah_wslp2(ji,jj,jk+kp) =  ah_wslp2(ji,jj,jk+kp) + ( zah * zbu * ze3wr * r1_e1e2t(ji,jj) * zslope2                    &
-                        &                                       + zah1 * zbu1 * ze3wr * r1_e1e2t(ji,jj) * zslope21                 &
-                        &                                       )                                                                  ! bracket for halo 1 - halo 2 compatibility
-               akz     (ji,jj,jk+kp) =  akz     (ji,jj,jk+kp) + ( zah * r1_e1u(ji,jj) * r1_e1u(ji,jj) * umask(ji,jj,jk+kp)         &
-                                                                + zah1 * r1_e1u(ji-1,jj) * r1_e1u(ji-1,jj) * umask(ji-1,jj,jk+kp)  &
-                        &                                       )                                                                  ! bracket for halo 1 - halo 2 compatibility
+               ! needed to ensure the North Pole reproducibility
+               ah_wslp2(ji,jj,jk+kp) =  ah_wslp2(ji,jj,jk+kp) + ( zah  * zbu  * ze3wr * r1_e1e2t(ji,jj) * zslope2    & ! () for NP
+                        &                                       + zah1 * zbu1 * ze3wr * r1_e1e2t(ji,jj) * zslope21 )   ! repro
+               akz     (ji,jj,jk+kp) =  akz     (ji,jj,jk+kp) + ( zah  * r1_e1u(ji  ,jj) * r1_e1u(ji  ,jj) * umask(ji  ,jj,jk+kp) &
+                                                                + zah1 * r1_e1u(ji-1,jj) * r1_e1u(ji-1,jj) * umask(ji-1,jj,jk+kp) )
             END_3D
          END DO
          !
@@ -180,18 +181,18 @@ CONTAINS
                zah1   = 0.25_wp * pahv(ji,jj-1,jk)
                ! Subtract s-coordinate slope at t-points to give slope rel to s surfaces
                !    (do this by *adding* gradient of depth)
-               zslope2 = triadj_g(ji,jj,jk,1,kp) + ( gdept(ji,jj+1,jk,Kmm) - gdept(ji,jj,jk,Kmm) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk+kp)
+               zslope2  = triadj_g(ji,jj,jk,1,kp) + ( gdept(ji,jj+1,jk,Kmm) - gdept(ji,jj,jk,Kmm) )   &
+                  &                                 * r1_e2v(ji,jj) * vmask(ji,jj,jk+kp)
                zslope2 = zslope2 * zslope2
-               zslope21 = triadj_g(ji,jj,jk,0,kp) + ( gdept(ji,jj,jk,Kmm) - gdept(ji,jj-1,jk,Kmm) ) * r1_e2v(ji,jj-1) * vmask(ji,jj-1,jk+kp)
+               zslope21 = triadj_g(ji,jj,jk,0,kp) + ( gdept(ji,jj,jk,Kmm) - gdept(ji,jj-1,jk,Kmm) )   &
+                  &                                 * r1_e2v(ji,jj-1) * vmask(ji,jj-1,jk+kp)
                zslope21 = zslope21 * zslope21
                ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               ah_wslp2(ji,jj,jk+kp) = ah_wslp2(ji,jj,jk+kp) + ( zah * zbv * ze3wr * r1_e1e2t(ji,jj) * zslope2                     &
-                        &                                      + zah1 * zbv1 * ze3wr * r1_e1e2t(ji,jj) * zslope21                  &
-                        &                                      )                                                                   ! bracket for halo 1 - halo 2 compatibility
-               akz     (ji,jj,jk+kp) = akz     (ji,jj,jk+kp) + ( zah * r1_e2v(ji,jj) * r1_e2v(ji,jj) * vmask(ji,jj,jk+kp)          &
-                        &                                      + zah1 * r1_e2v(ji,jj-1) * r1_e2v(ji,jj-1) * vmask(ji,jj-1,jk+kp)   &
-                        &                                      )                                                                   ! bracket for halo 1 - halo 2 compatibility
+               ! needed to ensure the North Pole reproducibility
+               ah_wslp2(ji,jj,jk+kp) = ah_wslp2(ji,jj,jk+kp) + ( zah  * zbv  * ze3wr * r1_e1e2t(ji,jj) * zslope2    & ! () for NP
+                        &                                      + zah1 * zbv1 * ze3wr * r1_e1e2t(ji,jj) * zslope21 )   ! repro
+               akz     (ji,jj,jk+kp) = akz     (ji,jj,jk+kp) + ( zah  * r1_e2v(ji,jj  ) * r1_e2v(ji,jj  ) * vmask(ji,jj  ,jk+kp) &
+                        &                                      + zah1 * r1_e2v(ji,jj-1) * r1_e2v(ji,jj-1) * vmask(ji,jj-1,jk+kp) )
             END_3D
          END DO
          !
@@ -225,16 +226,12 @@ CONTAINS
 
             DO kp = 0, 1
                DO_3D( 1, 0, 1, 0, 1, jpkm1 )
-                  ! round brackets added to fix the order of floating point operations
-                  ! needed to ensure halo 1 - halo 2 compatibility
-                  zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp)                                     &
-                     & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp)        &
-                     &   + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp)      &
-                     &   )                                                                        ! bracket for halo 1 - halo 2 compatibility
-                  zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp)                                     &
-                     & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp)        &
-                     &   + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp)      &
-                     &   )                                                                        ! bracket for halo 1 - halo 2 compatibility
+                  zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp)                                       &
+                     & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji  ,jj,jk,1,kp)        & ! () for NP reproducibility
+                     &   + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp) )
+                  zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp)                                       & ! () for NP reproducibility
+                     & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj  ,jk,1,kp)        &
+                     &   + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp) )
                END_3D
             END DO
             CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm )
@@ -257,18 +254,6 @@ CONTAINS
             zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk)
             zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk)
          END_3D
-         IF( ln_zps .AND. l_grad_zps ) THEN    ! partial steps: correction at top/bottom ocean level
-            DO_2D( iij, iij-1, iij, iij-1 )                    ! bottom level
-               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn)
-               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn)
-            END_2D
-            IF( ln_isfcav ) THEN                   ! top level (ocean cavities only)
-               DO_2D( iij, iij-1, iij, iij-1 )
-                  IF( miku(ji,jj)  > 1 )   zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn)
-                  IF( mikv(ji,jj)  > 1 )   zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn)
-               END_2D
-            ENDIF
-         ENDIF
          !
          !!----------------------------------------------------------------------
          !!   II - horizontal trend  (full)
@@ -440,14 +425,10 @@ CONTAINS
             ENDIF
             !                             !==  horizontal divergence and add to the general trend  ==!
             DO_2D( iij-1, iij-1, iij-1, iij-1 )
-               ! round brackets added to fix the order of floating point operations
-               ! needed to ensure halo 1 - halo 2 compatibility
-               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)                                                &
-                  &                       + zsign * ( ( zftu(ji-1,jj  ,jk) - zftu(ji,jj,jk)             &
-                  &                                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-                  &                                 + ( zftv(ji,jj-1,jk) - zftv(ji,jj,jk)               &
-                  &                                   )                                                 & ! bracket for halo 1 - halo 2 compatibility
-                  &                                 ) / (  e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)  )
+               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)                                           &
+                  &                       + zsign * ( ( zftu(ji-1,jj  ,jk) - zftu(ji,jj,jk) )      & ! () for NP reproducibility
+                  &                                 + ( zftv(ji  ,jj-1,jk) - zftv(ji,jj,jk) ) )    &
+                  &                               / (  e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)  )
             END_2D
             !
          END DO
@@ -456,7 +437,7 @@ CONTAINS
          IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz
             DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )
                ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)   &
-                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )             &
+                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )               &
                   &                            * (  pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) )
             END_3D
          ELSE                                   ! bilaplacian
@@ -466,9 +447,9 @@ CONTAINS
                   ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)             &
                      &                            * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) )
                END_3D
-            CASE(  2  )                            ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp.
+            CASE(  2  )                            ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp.
                DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)                      &
+                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)                  &
                      &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   &
                      &                               + akz     (ji,jj,jk) * ( pt2(ji,jj,jk-1,jn) - pt2(ji,jj,jk,jn) )   )
                END_3D
@@ -494,7 +475,55 @@ CONTAINS
          !                                                        ! ===============
       END DO                                                      ! end tracer loop
       !                                                           ! ===============
-   END SUBROUTINE tra_ldf_triad_t
+   END SUBROUTINE traldf_triad_lap_t
+
+
+   SUBROUTINE traldf_triad_blp( kt, Kmm, kit000, cdtype, pahu, pahv  ,             &
+      &                                             pt  , pt_rhs, kjpt )
+      !!----------------------------------------------------------------------
+      !!                 ***  ROUTINE tra_ldf_blp  ***
+      !!
+      !! ** Purpose :   Compute the before lateral tracer diffusive
+      !!      trend and add it to the general trend of tracer equation.
+      !!
+      !! ** Method  :   The lateral diffusive trends is provided by a bilaplacian
+      !!      operator applied to before field (forward in time).
+      !!      It is computed by two successive calls to laplacian routine
+      !!
+      !! ** Action :   pta   updated with the before rotated bilaplacian diffusion
+      !!----------------------------------------------------------------------
+      INTEGER                              , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                              , INTENT(in   ) ::   kit000     ! first time step index
+      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
+      INTEGER                              , INTENT(in   ) ::   kjpt       ! number of tracers
+      INTEGER                              , INTENT(in   ) ::   Kmm        ! ocean time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
+      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt         ! before and now tracer fields
+      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend
+      !
+      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk,kjpt) :: zlap         ! laplacian at t-point
+      !!---------------------------------------------------------------------
+      !
+      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
+         IF( kt == kit000 .AND. lwp )  THEN
+            WRITE(numout,*)
+            WRITE(numout,*) 'tra_ldf_blp : iso-neutral bilaplacian operator on ', cdtype, ' (triad)'
+            WRITE(numout,*) '~~~~~~~~~~~'
+         ENDIF
+      ENDIF
+
+      zlap(:,:,:,:) = 0._wp
+      !
+      !                          !==  1st laplacian applied to pt (output in zlap)  ==!
+      CALL traldf_triad_lap( kt, Kmm, kit000, cdtype, pahu, pahv, pt, pt, zlap, kjpt, 1 )
+      !
+      IF (nn_hls==1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp )     ! Lateral boundary conditions (unchanged sign)
+      !
+      !                          !==  2nd laplacian applied to zlap (output in pt_rhs)  ==!
+      CALL traldf_triad_lap( kt, Kmm, kit000, cdtype, pahu, pahv, zlap, pt    , pt_rhs, kjpt, 2 )
+      !
+   END SUBROUTINE traldf_triad_blp
 
    !!==============================================================================
 END MODULE traldf_triad
diff --git a/src/OCE/TRA/tramle.F90 b/src/OCE/TRA/tramle.F90
index a6f00b0b..83fb80b7 100644
--- a/src/OCE/TRA/tramle.F90
+++ b/src/OCE/TRA/tramle.F90
@@ -82,22 +82,21 @@ CONTAINS
       !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008
       !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008
       !!----------------------------------------------------------------------
-      INTEGER                     , INTENT(in   ) ::   kt         ! ocean time-step index
-      INTEGER                     , INTENT(in   ) ::   kit000     ! first time step index
-      INTEGER                     , INTENT(in   ) ::   Kmm        ! ocean time level index
-      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
-      ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv         ! out: same 3  transport components
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport
+      INTEGER                             , INTENT(in   ) ::   kt         ! ocean time-step index
+      INTEGER                             , INTENT(in   ) ::   kit000     ! first time step index
+      INTEGER                             , INTENT(in   ) ::   Kmm        ! ocean time level index
+      CHARACTER(len=3)                    , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) ::   pv         ! out: same 3  transport components
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport
       !
       INTEGER  ::   ji, jj, jk          ! dummy loop indices
       INTEGER  ::   ii, ij, ik, ikmax   ! local integers
       REAL(wp) ::   zcuw, zmuw, zc      ! local scalar
       REAL(wp) ::   zcvw, zmvw          !   -      -
-      INTEGER , DIMENSION(A2D(nn_hls))     :: inml_mle
-      REAL(wp), DIMENSION(A2D(nn_hls))     :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zpsi_uw, zpsi_vw
+      INTEGER , DIMENSION(T2D(nn_hls))     :: inml_mle
+      REAL(wp), DIMENSION(T2D(nn_hls))     :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) :: zpsi_uw, zpsi_vw
       !!----------------------------------------------------------------------
       !
       !
@@ -211,10 +210,10 @@ CONTAINS
          ELSEIF( nn_mle == 1 ) THEN       ! New formulation (Lf = 5km fo/ff with fo=Coriolis parameter at latitude rn_lat)
             DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
                zpsim_u(ji,jj) = rc_f *   zhu(ji,jj)   * zhu(ji,jj)   * e2_e1u(ji,jj)               &
-                    &                  * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) )
+                    &                * ( zbm(ji+1,jj) - zbm(ji,jj) ) * MIN( 111.e3_wp , e1u(ji,jj) )
                !
                zpsim_v(ji,jj) = rc_f *   zhv(ji,jj)   * zhv(ji,jj)   * e1_e2v(ji,jj)               &
-                    &                  * ( zbm(ji,jj+1) - zbm(ji,jj) ) * MIN( 111.e3_wp , e2v(ji,jj) )
+                    &                * ( zbm(ji,jj+1) - zbm(ji,jj) ) * MIN( 111.e3_wp , e2v(ji,jj) )
             END_2D
          ENDIF
          !
@@ -250,13 +249,13 @@ CONTAINS
       !
       !                                      !==  transport increased by the MLE induced transport ==!
       DO jk = 1, ikmax
-         DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
-            pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) )
+         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
+            pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) )         ! add () for NO repro
             pv(ji,jj,jk) = pv(ji,jj,jk) + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) )
          END_2D
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            pw(ji,jj,jk) = pw(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk)   &
-               &                          + zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) ) * wmask(ji,jj,1)
+         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            pw(ji,jj,jk) = pw(ji,jj,jk) - ( ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk) )   &   ! add () for NO repro
+               &                          + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) ) ) * wmask(ji,jj,1)
          END_2D
       END DO
 
diff --git a/src/OCE/TRA/tranpc.F90 b/src/OCE/TRA/tranpc.F90
index 495ca30b..61d8c927 100644
--- a/src/OCE/TRA/tranpc.F90
+++ b/src/OCE/TRA/tranpc.F90
@@ -70,10 +70,10 @@ CONTAINS
       REAL(wp) ::   zta, zalfa, zsum_temp, zsum_alfa, zaw, zdz, zsum_z
       REAL(wp) ::   zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw
       REAL(wp), PARAMETER ::   zn2_zero = 1.e-14_wp             ! acceptance criteria for neutrality (N2==0)
-      REAL(wp), DIMENSION(    jpk     )   ::   zvn2             ! vertical profile of N2 at 1 given point...
-      REAL(wp), DIMENSION(    jpk,jpts)   ::   zvts, zvab       ! vertical profile of T & S , and  alpha & betaat 1 given point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk     )   ::   zn2              ! N^2
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts)   ::   zab              ! alpha and beta
+      REAL(wp), DIMENSION(       jpk     )    ::   zvn2         ! vertical profile of N2 at 1 given point...
+      REAL(wp), DIMENSION(       jpk,jpts)    ::   zvts, zvab   ! vertical profile of T & S , and  alpha & betaat 1 given point
+      REAL(wp), DIMENSION(T2D(0),jpk     )    ::   zn2          ! N^2
+      REAL(wp), DIMENSION(T2D(0),jpk,jpts)    ::   zab          ! alpha and beta
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds ! 3D workspace
       !
       LOGICAL, PARAMETER :: l_LB_debug = .FALSE. ! set to true if you want to follow what is
@@ -98,12 +98,12 @@ CONTAINS
             klc1 =  mbkt(ilc1,jlc1) ! bottom of the ocean for debug point...
          ENDIF
          !
-         CALL eos_rab( pts(:,:,:,:,Kaa), zab, Kmm )         ! after alpha and beta (given on T-points)
-         CALL bn2    ( pts(:,:,:,:,Kaa), zab, zn2, Kmm )    ! after Brunt-Vaisala  (given on W-points)
+         CALL eos_rab( pts(:,:,:,:,Kaa), zab, Kmm, kbnd=0 )         ! after alpha and beta (given on T-points)
+         CALL bn2    ( pts(:,:,:,:,Kaa), zab, zn2, Kmm, kbnd=0 )    ! after Brunt-Vaisala  (given on W-points)
          !
          IF( .NOT. l_istiled .OR. ntile == 1 ) nnpcc = 0         ! Do only on the first tile
          !
-         DO_2D_OVR( 0, 0, 0, 0 )                        ! interior column only
+         DO_2D( 0, 0, 0, 0 )                        ! interior column only
             !
             IF( tmask(ji,jj,2) == 1 ) THEN      ! At least 2 ocean points
                !                                     ! consider one ocean column
diff --git a/src/OCE/TRA/traqsr.F90 b/src/OCE/TRA/traqsr.F90
index 6db9892b..765d7313 100644
--- a/src/OCE/TRA/traqsr.F90
+++ b/src/OCE/TRA/traqsr.F90
@@ -53,7 +53,7 @@ MODULE traqsr
    LOGICAL , PUBLIC ::   ln_qsr_rgb   !: Red-Green-Blue light absorption flag
    LOGICAL , PUBLIC ::   ln_qsr_2bd   !: 2 band         light absorption flag
    LOGICAL , PUBLIC ::   ln_qsr_bio   !: bio-model      light absorption flag
-   INTEGER , PUBLIC ::   nn_chldta    !: use Chlorophyll data (=1) or not (=0)
+   INTEGER , PUBLIC ::   nn_chldta    !: use Chlorophyll data 3D/Surface (=2/1) or not (=0)
    REAL(wp), PUBLIC ::   rn_abs       !: fraction absorbed in the very near surface (RGB & 2 bands)
    REAL(wp), PUBLIC ::   rn_si0       !: very near surface depth of extinction      (RGB & 2 bands)
    REAL(wp), PUBLIC ::   rn_si1       !: deepest depth of extinction (water type I)       (2 bands)
@@ -145,13 +145,13 @@ CONTAINS
             ENDIF
          ELSE                                           ! No restart or Euler forward at 1st time step
             z1_2 = 1._wp
-            DO_3D_OVR( 0, 0, 0, 0, 1, jpk )
+            DO_3D( 0, 0, 0, 0, 1, jpk )
                qsr_hc_b(ji,jj,jk) = 0._wp
             END_3D
          ENDIF
       ELSE                             !==  Swap of qsr heat content  ==!
          z1_2 = 0.5_wp
-         DO_3D_OVR( 0, 0, 0, 0, 1, jpk )
+         DO_3D( 0, 0, 0, 0, 1, jpk )
             qsr_hc_b(ji,jj,jk) = qsr_hc(ji,jj,jk)
          END_3D
       ENDIF
@@ -179,8 +179,8 @@ CONTAINS
 #endif
          END_3D
          !                                                     !- sea-ice : store the 1st level attenuation coefficient
-         WHERE( etot3(A2D(0),1) /= 0._wp )   ;   fraqsr_1lev(A2D(0)) = 1._wp - etot3(A2D(0),2) / etot3(A2D(0),1)
-         ELSEWHERE                           ;   fraqsr_1lev(A2D(0)) = 1._wp
+         WHERE( etot3(T2D(0),1) /= 0._wp )   ;   fraqsr_1lev(T2D(0)) = 1._wp - etot3(T2D(0),2) / etot3(T2D(0),1)
+         ELSEWHERE                           ;   fraqsr_1lev(T2D(0)) = 1._wp
          END WHERE
          !
       END SELECT
@@ -215,7 +215,7 @@ CONTAINS
       END_2D
       !
       IF( iom_use('qsr3d') ) THEN      ! output the shortwave Radiation distribution
-         ALLOCATE( zetot(A2D(nn_hls),jpk) )
+         ALLOCATE( zetot(T2D(nn_hls),jpk) )
          zetot(:,:,nksr+1:jpk) = 0._wp     ! below ~400m set to zero
          DO_3DS(0, 0, 0, 0, nksr, 1, -1)
             zetot(ji,jj,jk) = zetot(ji,jj,jk+1) + qsr_hc(ji,jj,jk) * rho0_rcp
@@ -273,17 +273,21 @@ CONTAINS
       INTEGER,                                   INTENT(in   ) ::   kt, Kmm, Krhs   ! ocean time-step and time-level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts         ! active tracers and RHS of tracer equation
       !!
-      INTEGER  ::   ji, jj, jk               ! dummy loop indices
-      INTEGER  ::   irgb                     ! local integer
+      INTEGER  ::   ji, jj, jk, ik           ! dummy loop indices
+      INTEGER  ::   ipk, irgb                ! local integer
       REAL(wp) ::   zc1 , zc2 , zc3, zchl    ! local scalars
       REAL(wp) ::   zze0, zzeR, zzeG, zzeB, zzeT              !    -         -
       REAL(wp) ::   zz0 , zz1 , ze3t                          !    -         -
       REAL(wp) ::   zCb, zCmax, zpsi, zpsimax, zrdpsi, zCze   !    -         -
       REAL(wp) ::   zlogc, zlogze, zlogCtot, zlogCze          !    -         -
-      REAL(wp), DIMENSION(A2D(0)    ) ::   ze0, zeR, zeG, zeB, zeT
-      REAL(wp), DIMENSION(A2D(0),0:3) ::   zc
+      !!
+      REAL(wp), DIMENSION(T2D(0)) ::   ze0, zeR, zeG, zeB, zeT
+      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zc
       !!----------------------------------------------------------------------
       !
+      IF    ( nn_chldta == 1 ) THEN   ;   ipk=1
+      ELSEIF( nn_chldta == 2 ) THEN   ;   ipk=jpk   ;   ENDIF
+      ALLOCATE( zc(T2D(0),ipk,0:3) )
       !
       !                       !===========================================!
       !                       !==  R-G-B fluxes using chlorophyll data  ==!    with Morel &Berthon (1989) vertical profile
@@ -297,18 +301,18 @@ CONTAINS
          IF( ln_tile )   CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 1 )   ! Revert to tile domain
       ENDIF
       !
-       DO_2D( 0, 0, 0, 0 )                          ! pre-calculated expensive coefficient
-         zlogc = LOG(  MAX( 0.03_wp, MIN( sf_chl(1)%fnow(ji,jj,1) ,10._wp ) )  ) ! zlogc = log(zchl)   with 0.03 <= Chl >= 10. 
-         zc1   = 0.113328685307 + 0.803 * zlogc                               ! zc1 : log(zCze)  = log (1.12  * zchl**0.803)
-         zc2   = 3.703768066608 + 0.459 * zlogc                               ! zc2 : log(zCtot) = log(40.6  * zchl**0.459)
-         zc3   = 6.34247346942  - 0.746 * zc2                                 ! zc3 : log(zze)   = log(568.2 * zCtot**(-0.746))
-         IF( zc3 > 4.62497281328 )   zc3 = 5.298317366548 - 0.293 * zc2       ! IF(log(zze)>log(102)) log(zze) = log(200*zCtot**(-0.293))
+      DO_3D( 0, 0, 0, 0, 1, ipk )                          ! pre-calculated expensive coefficient
+         zlogc = LOG(  MAX( 0.03_wp, MIN( sf_chl(1)%fnow(ji,jj,jk) ,10._wp ) )  ) ! zlogc = log(zchl)   with 0.03 <= Chl >= 10. 
+         zc1   = 0.113328685307 + 0.803 * zlogc                                   ! zc1 : log(zCze)  = log (1.12  * zchl**0.803)
+         zc2   = 3.703768066608 + 0.459 * zlogc                                   ! zc2 : log(zCtot) = log(40.6  * zchl**0.459)
+         zc3   = 6.34247346942  - 0.746 * zc2                                     ! zc3 : log(zze)   = log(568.2 * zCtot**(-0.746))
+         IF( zc3 > 4.62497281328 )   zc3 = 5.298317366548 - 0.293 * zc2           ! IF(log(zze)>log(102)) log(zze) = log(200*zCtot**(-0.293))
          !
-         zc(ji,jj,0) = zlogc                                                  ! ze(0) = log(zchl)
-         zc(ji,jj,1) = EXP( zc1 )                                             ! ze(1) = zCze
-         zc(ji,jj,2) = 1._wp / ( 0.710 + zlogc * ( 0.159 + zlogc * 0.021 ) )  ! ze(2) = 1/zdelpsi
-         zc(ji,jj,3) = EXP( - zc3 )                                           ! ze(3) = 1/zze
-      END_2D
+         zc(ji,jj,jk,0) = zlogc                                                   ! ze(0) = log(zchl)
+         zc(ji,jj,jk,1) = EXP( zc1 )                                              ! ze(1) = zCze
+         zc(ji,jj,jk,2) = 1._wp / ( 0.710 + zlogc * ( 0.159 + zlogc * 0.021 ) )   ! ze(2) = 1/zdelpsi
+         zc(ji,jj,jk,3) = EXP( - zc3 )                                            ! ze(3) = 1/zze
+      END_3D
       !
       !                             !=  surface light  =!
       !
@@ -324,17 +328,18 @@ CONTAINS
       !                             !=  interior light  =!
       !
       DO jk = 1, nk0                      !* near surface layers *!   (< ~12 meters : IR + RGB )
+         ik = MIN( jk , ipk )
          DO_2D( 0, 0, 0, 0 )
             !                                      !- inverse of RGB attenuation lengths
-            zlogc     = zc(ji,jj,0)
+            zlogc     = zc(ji,jj,ik,0)
             zCb       = 0.768 + zlogc * ( 0.087 - zlogc * ( 0.179 + zlogc * 0.025 ) )
             zCmax     = 0.299 - zlogc * ( 0.289 - zlogc * 0.579 )
             zpsimax   = 0.6   - zlogc * ( 0.640 - zlogc * ( 0.021 + zlogc * 0.115 ) )
             ! zdelpsi = 0.710 + zlogc * ( 0.159 + zlogc * 0.021 )
-            zCze   = zc(ji,jj,1)
-            zrdpsi = zc(ji,jj,2)                                     ! 1/zdelpsi
-!!st05            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk,Kmm)               ! gdepw/zze
-            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk+1,Kmm)               ! gdepw/zze
+            zCze   = zc(ji,jj,ik,1)
+            zrdpsi = zc(ji,jj,ik,2)                                     ! 1/zdelpsi
+!!st05            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk,Kmm)               ! gdepw/zze
+            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk+1,Kmm)               ! gdepw/zze
             !                                                        ! make sure zchl value is such that: 0.03 < zchl < 10. 
             zchl = MAX(  0.03_wp , MIN( zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) * zrdpsi )**2 ) ) , 10._wp )  )
             !                                                        ! Convert chlorophyll value to attenuation coefficient
@@ -364,17 +369,18 @@ CONTAINS
       END DO
       !
       DO jk = nk0+1, nkR                  !* down to Red extinction *!   (< ~71 meters : RGB , IR removed from calculation)
-          DO_2D( 0, 0, 0, 0 )
+         ik = MIN( jk , ipk )
+         DO_2D( 0, 0, 0, 0 )
             !                                      !- inverse of RGB attenuation lengths
-            zlogc     = zc(ji,jj,0)
+            zlogc     = zc(ji,jj,ik,0)
             zCb       = 0.768 + zlogc * ( 0.087 - zlogc * ( 0.179 + zlogc * 0.025 ) )
             zCmax     = 0.299 - zlogc * ( 0.289 - zlogc * 0.579 )
             zpsimax   = 0.6   - zlogc * ( 0.640 - zlogc * ( 0.021 + zlogc * 0.115 ) )
             ! zdelpsi = 0.710 + zlogc * ( 0.159 + zlogc * 0.021 )
-            zCze   = zc(ji,jj,1)
-            zrdpsi = zc(ji,jj,2)                               ! 1/zdelpsi
-            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
-!!st05            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
+            zCze   = zc(ji,jj,ik,1)
+            zrdpsi = zc(ji,jj,ik,2)                               ! 1/zdelpsi
+            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
+!!st05            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
             !                                                  ! make sure zchl value is such that: 0.03 < zchl < 10. 
             zchl = MAX(  0.03_wp , MIN( zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) * zrdpsi )**2 ) ) , 10._wp )  )
             !                                                  ! Convert chlorophyll value to attenuation coefficient
@@ -402,17 +408,18 @@ CONTAINS
       END DO
       !
       DO jk = nkR+1, nkG                  !* down to Green extinction *!   (< ~350 m : GB , IR+R removed from calculation)
-          DO_2D( 0, 0, 0, 0 )
+         ik = MIN( jk , ipk )
+         DO_2D( 0, 0, 0, 0 )
             !                                      !- inverse of RGB attenuation lengths
-            zlogc     = zc(ji,jj,0)
+            zlogc     = zc(ji,jj,ik,0)
             zCb       = 0.768 + zlogc * ( 0.087 - zlogc * ( 0.179 + zlogc * 0.025 ) )
             zCmax     = 0.299 - zlogc * ( 0.289 - zlogc * 0.579 )
             zpsimax   = 0.6   - zlogc * ( 0.640 - zlogc * ( 0.021 + zlogc * 0.115 ) )
             ! zdelpsi = 0.710 + zlogc * ( 0.159 + zlogc * 0.021 )
-            zCze   = zc(ji,jj,1)
-            zrdpsi = zc(ji,jj,2)                               ! 1/zdelpsi
-            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
-!!st05            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
+            zCze   = zc(ji,jj,ik,1)
+            zrdpsi = zc(ji,jj,ik,2)                               ! 1/zdelpsi
+            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
+!!st05            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
             !                                                  ! make sure zchl value is such that: 0.03 < zchl < 10. 
             zchl = MAX(  0.03_wp , MIN( zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) * zrdpsi )**2 ) ) , 10._wp )  )
             !                                                  ! Convert chlorophyll value to attenuation coefficient
@@ -437,17 +444,18 @@ CONTAINS
       END DO
       !
       DO jk = nkG+1, nkB                  !* down to Blue extinction *!   (< ~1300 m : B , IR+RG removed from calculation)
-          DO_2D( 0, 0, 0, 0 )
+         ik = MIN( jk , ipk )
+         DO_2D( 0, 0, 0, 0 )
             !                                      !- inverse of RGB attenuation lengths
-            zlogc     = zc(ji,jj,0)
+            zlogc     = zc(ji,jj,ik,0)
             zCb       = 0.768 + zlogc * ( 0.087 - zlogc * ( 0.179 + zlogc * 0.025 ) )
             zCmax     = 0.299 - zlogc * ( 0.289 - zlogc * 0.579 )
             zpsimax   = 0.6   - zlogc * ( 0.640 - zlogc * ( 0.021 + zlogc * 0.115 ) )
             ! zdelpsi = 0.710 + zlogc * ( 0.159 + zlogc * 0.021 )
-            zCze   = zc(ji,jj,1)
-            zrdpsi = zc(ji,jj,2)                               ! 1/zdelpsi
-            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
-!!st05            zpsi   = zc(ji,jj,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
+            zCze   = zc(ji,jj,ik,1)
+            zrdpsi = zc(ji,jj,ik,2)                               ! 1/zdelpsi
+            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk+1,Kmm)         ! gdepw/zze
+!!st05            zpsi   = zc(ji,jj,ik,3) * gdepw(ji,jj,jk,Kmm)         ! gdepw/zze
             !                                                  ! make sure zchl value is such that: 0.03 < zchl < 10. 
             zchl = MAX(  0.03_wp , MIN( zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) * zrdpsi )**2 ) ) , 10._wp )  )
             !                                                  ! Convert chlorophyll value to attenuation coefficient
@@ -470,6 +478,8 @@ CONTAINS
          END_2D
       END DO
       !
+      DEALLOCATE( zc )
+      !
    END SUBROUTINE qsr_RGBc
 
 
@@ -499,7 +509,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk               ! dummy loop indices
       REAL(wp) ::   zze0, zzeR, zzeG, zzeB, zzeT              !    -         -
       REAL(wp) ::   zz0 , zz1 , ze3t                          !    -         -
-      REAL(wp), DIMENSION(A2D(0))   ::   ze0, zeR, zeG, zeB, zeT
+      REAL(wp), DIMENSION(T2D(0))   ::   ze0, zeR, zeG, zeB, zeT
       !!----------------------------------------------------------------------
       !      
       !
@@ -539,8 +549,8 @@ CONTAINS
             zeT(ji,jj) = zzeT                                   ! total          -        -      -
          END_2D
 !!stbug         IF( jk == 1 ) THEN               !* sea-ice *!   store the 1st level attenuation coeff.
-!!stbug            WHERE( qsr(A2D(0)) /= 0._wp )   ;   fraqsr_1lev(A2D(0)) = 1._wp - zeT(A2D(0)) / qsr(A2D(0))
-!!stbug            ELSEWHERE                       ;   fraqsr_1lev(A2D(0)) = 1._wp
+!!stbug            WHERE( qsr(T2D(0)) /= 0._wp )   ;   fraqsr_1lev(T2D(0)) = 1._wp - zeT(T2D(0)) / qsr(T2D(0))
+!!stbug            ELSEWHERE                       ;   fraqsr_1lev(T2D(0)) = 1._wp
 !!stbug            END WHERE
 !!stbug         ENDIF
       END DO
@@ -633,7 +643,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk               ! dummy loop indices
       REAL(wp) ::   zzatt                    !    -         -
       REAL(wp) ::   zz0 , zz1 , ze3t         !    -         -
-      REAL(wp), DIMENSION(A2D(0)) ::   zatt
+      REAL(wp), DIMENSION(T2D(0)) ::   zatt
       !!----------------------------------------------------------------------
       !      
       !                       !======================!
@@ -643,7 +653,7 @@ CONTAINS
       zz0 =           rn_abs   * r1_rho0_rcp       ! surface equi-partition in 2-bands
       zz1 = ( 1._wp - rn_abs ) * r1_rho0_rcp
       !
-      zatt(A2D(0)) = r1_rho0_rcp                   !* surface value *!
+      zatt(T2D(0)) = r1_rho0_rcp                   !* surface value *!
       !
       DO_2D( 0, 0, 0, 0 )
          zatt(ji,jj) = (  zz0 * EXP( -gdepw(ji,jj,1,Kmm)*r1_si0 ) + zz1 * EXP( -gdepw(ji,jj,1,Kmm)*r1_si1 )  )
@@ -666,7 +676,7 @@ CONTAINS
             zatt(ji,jj) = zzatt                          ! save for the next level computation
          END_2D
 !!stbug         !                                         !* sea-ice *!   store the 1st level attenuation coeff.
-!!stbug         IF( jk == 1 )   fraqsr_1lev(A2D(0)) = 1._wp - zatt(A2D(0)) * rho0_rcp
+!!stbug         IF( jk == 1 )   fraqsr_1lev(T2D(0)) = 1._wp - zatt(T2D(0)) * rho0_rcp
       END DO
 !!st      IF(lwp) WRITE(numout,*) 'nk0+1= ', nk0+1, ' qsr max = ' , MAXVAL(zatt*qsr)*rho0_rcp, ' W/m2' , MAXVAL(zatt*qsr/e3t(:,:,nk0+1,Kmm)), ' K/s' 
       !
@@ -730,7 +740,8 @@ CONTAINS
       !
       zcoef    =  zprec * rho0_rcp / ( rDt * zQmax * pfr)
       !
-      IF( ln_zco .OR. ln_zps ) THEN      ! z- or zps coordinate (use 1D ref vertcial coordinate)
+#if defined key_vco_1d || defined key_vco_1d3d
+      ! z- or zps coordinate (use 1D ref vertcial coordinate)
          klev = jpkm1                              ! Level of light extinction zco / zps
          DO jk = jpkm1, 1, -1
             zdw  = gdepw_1d(jk+1)                  ! max w-depth at jk+1 level
@@ -738,7 +749,8 @@ CONTAINS
             zhext =  - pL * LOG( zcoef * ze3t )    ! extinction depth
             IF( zdw >= zhext )   klev = jk         ! last T-level reached by Qsr
          END DO
-      ELSE                               ! s- or s-z- coordinate (use 3D vertical coordinate)
+#else
+      ! s- or s-z- coordinate (use 3D vertical coordinate)
          klev = jpkm1                              ! Level of light extinction 
          DO jk = jpkm1, 1, -1    ! 
             IF( SUM( tmask(:,:,jk) ) > 0 ) THEN    ! ocean point at that level
@@ -752,7 +764,7 @@ CONTAINS
          END DO
          CALL mpp_max('tra_qsr', klev)             ! needed for reproducibility   !!st may be modified to avoid this comm.
          !                                                                        !!st use ssmask to remove the comm ?
-      ENDIF
+#endif
       !
 !!st      IF(lwp) WRITE(numout,*) '                level of e3t light extinction = ', klev, ' ref depth = ', gdepw_1d(klev+1), ' m'
    END FUNCTION qsr_ext_lev
@@ -798,13 +810,13 @@ CONTAINS
          WRITE(numout,*) 'tra_qsr_init : penetration of the surface solar radiation'
          WRITE(numout,*) '~~~~~~~~~~~~'
          WRITE(numout,*) '   Namelist namtra_qsr : set the parameter of penetration'
-         WRITE(numout,*) '      RGB (Red-Green-Blue) light penetration       ln_qsr_rgb = ', ln_qsr_rgb
-         WRITE(numout,*) '      2 band               light penetration       ln_qsr_2bd = ', ln_qsr_2bd
-         WRITE(numout,*) '      bio-model            light penetration       ln_qsr_bio = ', ln_qsr_bio
-         WRITE(numout,*) '      RGB : Chl data (=1) or cst value (=0)        nn_chldta  = ', nn_chldta
-         WRITE(numout,*) '      RGB & 2 bands: fraction of light (rn_si1)    rn_abs     = ', rn_abs
-         WRITE(numout,*) '      RGB & 2 bands: shortess attenuation depth    rn_si0     = ', rn_si0
-         WRITE(numout,*) '      2 bands: longest attenuation depth           rn_si1     = ', rn_si1
+         WRITE(numout,*) '      RGB (Red-Green-Blue) light penetration           ln_qsr_rgb = ', ln_qsr_rgb
+         WRITE(numout,*) '      2 band               light penetration           ln_qsr_2bd = ', ln_qsr_2bd
+         WRITE(numout,*) '      bio-model            light penetration           ln_qsr_bio = ', ln_qsr_bio
+         WRITE(numout,*) '      RGB : 3D/Surface Chl data or Cst value (2,1,0)   nn_chldta  = ', nn_chldta
+         WRITE(numout,*) '      RGB & 2 bands: fraction of light (rn_si1)        rn_abs     = ', rn_abs
+         WRITE(numout,*) '      RGB & 2 bands: shortess attenuation depth        rn_si0     = ', rn_si0
+         WRITE(numout,*) '      2 bands: longest attenuation depth               rn_si1     = ', rn_si1
          WRITE(numout,*)
       ENDIF
       !
@@ -816,10 +828,10 @@ CONTAINS
       IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE type of light penetration in namelist namtra_qsr',  &
          &                               ' 2 bands, 3 RGB bands or bio-model light penetration' )
       !
-      IF( ln_qsr_rgb .AND. nn_chldta == 0 )   nqsr = np_RGB
-      IF( ln_qsr_rgb .AND. nn_chldta == 1 )   nqsr = np_RGBc
-      IF( ln_qsr_2bd                      )   nqsr = np_2BD
-      IF( ln_qsr_bio                      )   nqsr = np_BIO
+      IF( ln_qsr_rgb .AND.   nn_chldta == 0                       )   nqsr = np_RGB
+      IF( ln_qsr_rgb .AND. ( nn_chldta == 1 .OR. nn_chldta == 2 ) )   nqsr = np_RGBc
+      IF( ln_qsr_2bd                                              )   nqsr = np_2BD
+      IF( ln_qsr_bio                                              )   nqsr = np_BIO
       !
       !                       !**  Initialisation  **!
       !
@@ -872,8 +884,13 @@ CONTAINS
             IF( ierror > 0 ) THEN
                CALL ctl_stop( 'tra_qsr_init: unable to allocate sf_chl structure' )   ;   RETURN
             ENDIF
-            ALLOCATE( sf_chl(1)%fnow(jpi,jpj,1) )
-            IF( sn_chl%ln_tint )   ALLOCATE( sf_chl(1)%fdta(jpi,jpj,1,2) )
+            IF    ( nn_chldta == 1 ) THEN
+               ALLOCATE( sf_chl(1)%fnow(jpi,jpj,1) )
+               IF( sn_chl%ln_tint )   ALLOCATE( sf_chl(1)%fdta(jpi,jpj,1,2) )
+            ELSEIF( nn_chldta == 2 ) THEN
+               ALLOCATE( sf_chl(1)%fnow(jpi,jpj,jpk) )
+               IF( sn_chl%ln_tint )   ALLOCATE( sf_chl(1)%fdta(jpi,jpj,jpk,2) )
+            ENDIF
             !                                        ! fill sf_chl with sn_chl and control print
             CALL fld_fill( sf_chl, (/ sn_chl /), cn_dir, 'tra_qsr_init',                             &
                &           'Solar penetration function of read chlorophyll', 'namtra_qsr' , no_print )
diff --git a/src/OCE/TRA/trasbc.F90 b/src/OCE/TRA/trasbc.F90
index 0f8472a3..d0a0b042 100644
--- a/src/OCE/TRA/trasbc.F90
+++ b/src/OCE/TRA/trasbc.F90
@@ -100,7 +100,7 @@ CONTAINS
       !
 !!gm  This should be moved into sbcmod.F90 module ? (especially now that ln_traqsr is read in namsbc namelist)
       IF( .NOT.ln_traqsr ) THEN     ! no solar radiation penetration
-         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             qns(ji,jj) = qns(ji,jj) + qsr(ji,jj)      ! total heat flux in qns
             qsr(ji,jj) = 0._wp                        ! qsr set to zero
          END_2D
@@ -121,24 +121,24 @@ CONTAINS
             ENDIF
          ELSE                                             ! No restart or restart not found: Euler forward time stepping
             zfact = 1._wp
-            DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                sbc_tsc(ji,jj,:) = 0._wp
                sbc_tsc_b(ji,jj,:) = 0._wp
             END_2D
          ENDIF
       ELSE                                !* other time-steps: swap of forcing fields
          zfact = 0.5_wp
-         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             sbc_tsc_b(ji,jj,:) = sbc_tsc(ji,jj,:)
          END_2D
       ENDIF
       !                             !==  Now sbc tracer content fields  ==!
-      DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          sbc_tsc(ji,jj,jp_tem) = r1_rho0_rcp * qns(ji,jj)   ! non solar heat flux
          sbc_tsc(ji,jj,jp_sal) = r1_rho0     * sfx(ji,jj)   ! salt flux due to freezing/melting
       END_2D
       IF( ln_linssh ) THEN                !* linear free surface
-         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )                    !==>> add concentration/dilution effect due to constant volume cell
+         DO_2D( 0, 0, 0, 0 )                    !==>> add concentration/dilution effect due to constant volume cell
             sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm)
             sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_sal,Kmm)
          END_2D                                 !==>> output c./d. term
@@ -198,7 +198,7 @@ CONTAINS
             END_2D
          ELSE
             DO_2D( 0, 0, 0, 0 )
-               ztim = ssh_iau(ji,jj) / ( ht(ji,jj) + 1. - ssmask(ji, jj) )
+               ztim = ssh_iau(ji,jj) / ( ht(ji,jj,Kmm) + 1. - ssmask(ji, jj) )
                pts(ji,jj,:,jp_tem,Krhs) = pts(ji,jj,:,jp_tem,Krhs) + pts(ji,jj,:,jp_tem,Kmm) * ztim
                pts(ji,jj,:,jp_sal,Krhs) = pts(ji,jj,:,jp_sal,Krhs) + pts(ji,jj,:,jp_sal,Kmm) * ztim
             END_2D
@@ -275,7 +275,7 @@ CONTAINS
             
 !!gm  This should be moved into sbcmod.F90 module ? (especially now that ln_traqsr is read in namsbc namelist)
       IF( .NOT.ln_traqsr  .AND. kstg == 1) THEN     ! no solar radiation penetration
-         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             qns(ji,jj) = qns(ji,jj) + qsr(ji,jj)         ! total heat flux in qns
             qsr(ji,jj) = 0._wp                           ! qsr set to zero
          END_2D
@@ -358,7 +358,7 @@ CONTAINS
             END_2D
          ELSE
             DO_2D( 0, 0, 0, 0 )
-               ztim = ssh_iau(ji,jj) / ( ht(ji,jj) + 1. - ssmask(ji, jj) )
+               ztim = ssh_iau(ji,jj) / ( ht(ji,jj,Kmm) + 1. - ssmask(ji, jj) )
                pts(ji,jj,:,jp_tem,Krhs) = pts(ji,jj,:,jp_tem,Krhs) + pts(ji,jj,:,jp_tem,Kmm) * ztim
                pts(ji,jj,:,jp_sal,Krhs) = pts(ji,jj,:,jp_sal,Krhs) + pts(ji,jj,:,jp_sal,Kmm) * ztim
             END_2D
diff --git a/src/OCE/TRA/trazdf.F90 b/src/OCE/TRA/trazdf.F90
index 8280d318..bdcf5235 100644
--- a/src/OCE/TRA/trazdf.F90
+++ b/src/OCE/TRA/trazdf.F90
@@ -6,6 +6,7 @@ MODULE trazdf
    !! History :  1.0  !  2005-11  (G. Madec)  Original code
    !!            3.0  !  2008-01  (C. Ethe, G. Madec)  merge TRC-TRA
    !!            4.0  !  2017-06  (G. Madec)  remove explict time-stepping option
+   !!            4.5  !  2022-06  (G. Madec)  refactoring to reduce memory usage (j-k-i loops)
    !!----------------------------------------------------------------------
 
    !!----------------------------------------------------------------------
@@ -13,7 +14,6 @@ MODULE trazdf
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and tracers variables
    USE dom_oce        ! ocean space and time domain variables
-   USE domvvl         ! variable volume
    USE phycst         ! physical constant
    USE zdf_oce        ! ocean vertical physics variables
    USE zdfmfc         ! Mass FLux Convection
@@ -22,7 +22,7 @@ MODULE trazdf
    USE ldfslp         ! lateral diffusion: iso-neutral slope
    USE trd_oce        ! trends: ocean variables
    USE trdtra         ! trends: tracer trend manager
-   USE eosbn2, ONLY: ln_SEOS, rn_b0
+   USE eosbn2   , ONLY: ln_SEOS, rn_b0
    !
    USE in_out_manager ! I/O manager
    USE prtctl         ! Print control
@@ -77,7 +77,7 @@ CONTAINS
       ENDIF
       !
       !                                      !* compute lateral mixing trend and add it to the general trend
-      CALL tra_zdf_imp( kt, nit000, 'TRA', rDt, Kbb, Kmm, Krhs, pts, Kaa, jpts )
+      CALL tra_zdf_imp( 'TRA', Kbb, Kmm, Krhs, pts, Kaa, jpts )
 
 !!gm WHY here !   and I don't like that !
       ! DRAKKAR SSS control {
@@ -85,7 +85,7 @@ CONTAINS
       ! JMM : restore negative salinities to small salinities:
 !!jc: discard this correction in case salinity is not used in eos
       IF ( .NOT.(ln_SEOS.AND.(rn_b0==0._wp)) ) THEN
-         WHERE( pts(A2D(0),:,jp_sal,Kaa) < 0._wp )   pts(A2D(0),:,jp_sal,Kaa) = 0.1_wp
+         WHERE( pts(T2D(0),:,jp_sal,Kaa) < 0._wp )   pts(T2D(0),:,jp_sal,Kaa) = 0.1_wp
       ENDIF
 !!gm
 
@@ -116,7 +116,7 @@ CONTAINS
    END SUBROUTINE tra_zdf
 
 
-   SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, Kbb, Kmm, Krhs, pt, Kaa, kjpt )
+   SUBROUTINE tra_zdf_imp( cdtype, Kbb, Kmm, Krhs, pt, Kaa, kjpt )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE tra_zdf_imp  ***
       !!
@@ -136,128 +136,177 @@ CONTAINS
       !!
       !! ** Action  : - pt(:,:,:,:,Kaa)  becomes the after tracer
       !!---------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   kt       ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs, Kaa  ! ocean time level indices
-      INTEGER                                  , INTENT(in   ) ::   kit000   ! first time step index
       CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
-      REAL(wp)                                 , INTENT(in   ) ::   p2dt     ! tracer time-step
       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt       ! tracers and RHS of tracer equation
       !
       INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::  zrhs, zzwi, zzws ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zwi, zwt, zwd, zws
+      REAL(wp), DIMENSION(T1Di(0),jpk) ::  zwi, zwt, zwd, zws
       !!---------------------------------------------------------------------
       !
-      !                                               ! ============= !
-      DO jn = 1, kjpt                                 !  tracer loop  !
-         !                                            ! ============= !
-         !  Matrix construction
-         ! --------------------
-         ! Build matrix if temperature or salinity (only in double diffusion case) or first passive tracer
-         !
-         IF(  ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. ln_zdfddm ) ) ) .OR.   &
-            & ( cdtype == 'TRC' .AND. jn == 1 )  )  THEN
+      !                                               ! ================= !
+      DO_1Dj( 0, 0 )                                  !  i-k slices loop  !
+         !                                            ! ================= !
+         DO jn = 1, kjpt                              !    tracer loop    !
+            !                                         ! ================= !
             !
-            ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers
-            IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN
-               DO_3D( 1, 1, 1, 1, 2, jpk )
-                  zwt(ji,jj,jk) = avt(ji,jj,jk)
-               END_3D
-            ELSE
-               DO_3D( 1, 1, 1, 1, 2, jpk )
-                  zwt(ji,jj,jk) = avs(ji,jj,jk)
-               END_3D
-            ENDIF
-            zwt(:,:,1) = 0._wp
+            !  Matrix construction
+            ! --------------------
+            ! Build matrix if temperature or salinity (only in double diffusion case) or first passive tracer
             !
-            IF( l_ldfslp ) THEN            ! isoneutral diffusion: add the contribution
-               IF( ln_traldf_msc  ) THEN     ! MSC iso-neutral operator
-                  DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-                     zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk)
-                  END_3D
-               ELSE                          ! standard or triad iso-neutral operator
-                  DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-                     zwt(ji,jj,jk) = zwt(ji,jj,jk) + ah_wslp2(ji,jj,jk)
-                  END_3D
+            IF(  ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. ln_zdfddm ) ) ) .OR.   &
+               & ( cdtype == 'TRC' .AND. jn == 1 )  )  THEN
+               !
+               ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers
+               !
+               IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN     ! use avt  for temperature
+                  !
+                  IF( l_ldfslp ) THEN            ! use avt + isoneutral diffusion contribution
+                     IF( ln_traldf_msc  ) THEN        ! MSC iso-neutral operator
+                        DO_2Dik( 0, 0,   2, jpk, 1 )
+                           zwt(ji,jk) = avt(ji,jj,jk) + akz(ji,jj,jk)
+                        END_2D
+                     ELSE                             ! standard or triad iso-neutral operator
+                        DO_2Dik( 0, 0,   2, jpk, 1 )
+                           zwt(ji,jk) = avt(ji,jj,jk) + ah_wslp2(ji,jj,jk)
+                        END_2D
+                     ENDIF
+                  ELSE                          ! use avt only
+                     DO_2Dik( 0, 0,   2, jpk, 1 )
+                        zwt(ji,jk) = avt(ji,jj,jk)
+                     END_2D
+                  ENDIF
+                  !
+               ELSE                                               ! use avs for salinty or passive tracers
+                  !
+                  IF( l_ldfslp ) THEN            ! use avs + isoneutral diffusion contribution
+                     IF( ln_traldf_msc  ) THEN        ! MSC iso-neutral operator
+                        DO_2Dik( 0, 0,   2, jpk, 1 )
+                           zwt(ji,jk) = avs(ji,jj,jk) + akz(ji,jj,jk)
+                        END_2D
+                     ELSE                             ! standard or triad iso-neutral operator
+                        DO_2Dik( 0, 0,   2, jpk, 1 )
+                           zwt(ji,jk) = avs(ji,jj,jk) + ah_wslp2(ji,jj,jk)
+                        END_2D
+                     ENDIF
+                  ELSE                          !
+                     DO_2Dik( 0, 0,   2, jpk, 1 )
+                        zwt(ji,jk) = avs(ji,jj,jk)
+                     END_2D
+                  ENDIF
                ENDIF
+               zwt(:,1) = 0._wp
+               !
+               ! Diagonal, lower (i), upper (s)  (including the bottom boundary condition since avt is masked)
+               IF( ln_zad_Aimp ) THEN         ! Adaptive implicit vertical advection
+                  DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                     zzwi = - rDt * zwt(ji,jk  ) / e3w(ji,jj,jk  ,Kmm)
+                     zzws = - rDt * zwt(ji,jk+1) / e3w(ji,jj,jk+1,Kmm)
+                     zwd(ji,jk) = e3t(ji,jj,jk,Kaa) - ( zzwi + zzws )   &
+                        &              + rDt * ( MAX( wi(ji,jj,jk  ) , 0._wp ) &
+                        &                      - MIN( wi(ji,jj,jk+1) , 0._wp ) )
+                     zwi(ji,jk) = zzwi + rDt *   MIN( wi(ji,jj,jk  ) , 0._wp )
+                     zws(ji,jk) = zzws - rDt *   MAX( wi(ji,jj,jk+1) , 0._wp )
+                  END_2D
+               ELSE
+                  DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                     zwi(ji,jk) = - rDt * zwt(ji,jk  ) / e3w(ji,jj,jk,Kmm)
+                     zws(ji,jk) = - rDt * zwt(ji,jk+1) / e3w(ji,jj,jk+1,Kmm)
+                     zwd(ji,jk) = e3t(ji,jj,jk,Kaa) - ( zwi(ji,jk) + zws(ji,jk) )
+                  END_2D
+               ENDIF
+               !
+!!gm  BUG?? : if edmfm is equivalent to a w  ==>>>   just add +/-  rDt * edmfm(ji,jj,jk+1/jk  )
+!!            but edmfm is at t-point !!!!   crazy???  why not keep it at w-point????
+               !
+               IF( ln_zdfmfc ) THEN    ! add upward Mass Flux in the matrix
+                  DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                     zws(ji,jk) = zws(ji,jk) + e3t(ji,jj,jk,Kaa) * rDt * edmfm(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm)
+                     zwd(ji,jk) = zwd(ji,jk) - e3t(ji,jj,jk,Kaa) * rDt * edmfm(ji,jj,jk  ) / e3w(ji,jj,jk+1,Kmm)
+                  END_2D
+               ENDIF
+!       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+!          edmfa(ji,jj,jk) =  0._wp
+!          edmfb(ji,jj,jk) = -edmfm(ji,jj,jk  ) / e3w(ji,jj,jk+1,Kmm)
+!          edmfc(ji,jj,jk) =  edmfm(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm)
+!       END_3D
+!!gm    BUG :  level jpk never used in the inversion
+!       DO_2D( 0, 0, 0, 0 )
+!          edmfa(ji,jj,jpk)   = -edmfm(ji,jj,jpk-1) / e3w(ji,jj,jpk,Kmm)
+!          edmfb(ji,jj,jpk)   =  edmfm(ji,jj,jpk  ) / e3w(ji,jj,jpk,Kmm)
+!          edmfc(ji,jj,jpk)   =  0._wp
+!       END_2D
+!!
+!!gm   BUG ???   below  e3t_Kmm  should be used ?
+!!               or even no multiplication by e3t unless there is a bug in wi calculation
+!!
+!                   DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+!!gm edmfa = 0._wp except at jpk which is not used  ==>>  zdiagi update is useless !
+!                      zdiagi(ji,jj,jk) = zdiagi(ji,jj,jk) + e3t(ji,jj,jk,Kaa) * p2dt *edmfa(ji,jj,jk)
+!                      zdiags(ji,jj,jk) = zdiags(ji,jj,jk) + e3t(ji,jj,jk,Kaa) * p2dt *edmfc(ji,jj,jk)
+!                      zdiagd(ji,jj,jk) = zdiagd(ji,jj,jk) + e3t(ji,jj,jk,Kaa) * p2dt *edmfb(ji,jj,jk)
+!                   END_3D
+!!gm                  CALL diag_mfc( zwi, zwd, zws, rDt, Kaa )
+!!gm   SUBROUTINE diag_mfc( zdiagi, zdiagd, zdiags, p2dt, Kaa )
+               !
+               !! Matrix inversion from the first level
+               !!----------------------------------------------------------------------
+               !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
+               !
+               !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
+               !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
+               !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
+               !        (        ...               )( ...  ) ( ...  )
+               !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
+               !
+               !   m is decomposed in the product of an upper and lower triangular matrix.
+               !   The 3 diagonal terms are in 3d arrays: zwd, zws, zwi.
+               !   Suffices i,s and d indicate "inferior" (below diagonal), diagonal
+               !   and "superior" (above diagonal) components of the tridiagonal system.
+               !   The solution will be in the 4d array pta.
+               !   The 3d array zwt is used as a work space array.
+               !   En route to the solution pt(:,:,:,:,Kaa) is used a to evaluate the rhs and then
+               !   used as a work space array: its value is modified.
+               !
+               DO_1Di( 0, 0 )          !* 1st recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k) ! done one for all passive tracers (so included in the IF instruction)
+                  zwt(ji,1) = zwd(ji,1)
+               END_1D
+               DO_2Dik( 0, 0,   2, jpkm1, 1 )
+                  zwt(ji,jk) = zwd(ji,jk) - zwi(ji,jk) * zws(ji,jk-1) / zwt(ji,jk-1)
+               END_2D
+               !
             ENDIF
             !
-            ! Diagonal, lower (i), upper (s)  (including the bottom boundary condition since avt is masked)
-            IF( ln_zad_Aimp ) THEN         ! Adaptive implicit vertical advection
-               DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-                  zzwi = - p2dt * zwt(ji,jj,jk  ) / e3w(ji,jj,jk  ,Kmm)
-                  zzws = - p2dt * zwt(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm)
-                  zwd(ji,jj,jk) = e3t(ji,jj,jk,Kaa) - zzwi - zzws   &
-                     &                 + p2dt * ( MAX( wi(ji,jj,jk  ) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) )
-                  zwi(ji,jj,jk) = zzwi + p2dt *   MIN( wi(ji,jj,jk  ) , 0._wp )
-                  zws(ji,jj,jk) = zzws - p2dt *   MAX( wi(ji,jj,jk+1) , 0._wp )
-               END_3D
-            ELSE
-               DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-                  zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk  ) / e3w(ji,jj,jk,Kmm)
-                  zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm)
-                  zwd(ji,jj,jk) = e3t(ji,jj,jk,Kaa) - zwi(ji,jj,jk) - zws(ji,jj,jk)
-               END_3D
+            IF( ln_zdfmfc ) THEN    ! add Mass Flux to the RHS
+               DO_2Dik( 0, 0,   1, jpkm1, 1 )
+                  pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + edmftra(ji,jj,jk,jn)
+               END_2D
+!!gm               CALL rhs_mfc( pt(:,:,:,jn,Krhs), jn )
             ENDIF
             !
-            ! Modification of diagonal to add MF scheme
-            IF ( ln_zdfmfc ) THEN
-               CALL diag_mfc( zwi, zwd, zws, p2dt, Kaa )
-            END IF
-            !
-            !! Matrix inversion from the first level
-            !!----------------------------------------------------------------------
-            !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
-            !
-            !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
-            !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
-            !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
-            !        (        ...               )( ...  ) ( ...  )
-            !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
-            !
-            !   m is decomposed in the product of an upper and lower triangular matrix.
-            !   The 3 diagonal terms are in 3d arrays: zwd, zws, zwi.
-            !   Suffices i,s and d indicate "inferior" (below diagonal), diagonal
-            !   and "superior" (above diagonal) components of the tridiagonal system.
-            !   The solution will be in the 4d array pta.
-            !   The 3d array zwt is used as a work space array.
-            !   En route to the solution pt(:,:,:,:,Kaa) is used a to evaluate the rhs and then
-            !   used as a work space array: its value is modified.
-            !
-            DO_2D( 0, 0, 0, 0 )      !* 1st recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k) ! done one for all passive tracers (so included in the IF instruction)
-               zwt(ji,jj,1) = zwd(ji,jj,1)
+            DO_1Di( 0, 0 )             !* 2nd recurrence:    Zk = Yk - Ik / Tk-1  Zk-1
+               pt(ji,jj,1,jn,Kaa) =       e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb )    &
+                  &               + rDt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs)
+            END_1D
+            DO_2Dik( 0, 0,   2, jpkm1, 1 )
+               zrhs =       e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb )   &
+                  & + rDt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs)   ! zrhs=right hand side
+               pt(ji,jj,jk,jn,Kaa) = zrhs - zwi(ji,jk) / zwt(ji,jk-1) * pt(ji,jj,jk-1,jn,Kaa)
             END_2D
-            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-               zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1)
-            END_3D
             !
-         ENDIF
-         !
-         ! Modification of rhs to add MF scheme
-         IF ( ln_zdfmfc ) THEN
-            CALL rhs_mfc( pt(:,:,:,jn,Krhs), jn )
-         END IF
-         !
-         DO_2D( 0, 0, 0, 0 )         !* 2nd recurrence:    Zk = Yk - Ik / Tk-1  Zk-1
-            pt(ji,jj,1,jn,Kaa) =        e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb)    &
-               &               + p2dt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs)
-         END_2D
-         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
-            zrhs =        e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb)    &
-               & + p2dt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs)   ! zrhs=right hand side
-            pt(ji,jj,jk,jn,Kaa) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pt(ji,jj,jk-1,jn,Kaa)
-         END_3D
-         !
-         DO_2D( 0, 0, 0, 0 )         !* 3d recurrence:    Xk = (Zk - Sk Xk+1 ) / Tk   (result is the after tracer)
-            pt(ji,jj,jpkm1,jn,Kaa) = pt(ji,jj,jpkm1,jn,Kaa) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1)
-         END_2D
-         DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 )
-            pt(ji,jj,jk,jn,Kaa) = ( pt(ji,jj,jk,jn,Kaa) - zws(ji,jj,jk) * pt(ji,jj,jk+1,jn,Kaa) )   &
-               &             / zwt(ji,jj,jk) * tmask(ji,jj,jk)
-         END_3D
+            DO_1Di( 0, 0 )             !* 3d recurrence:    Xk = (Zk - Sk Xk+1 ) / Tk   (result is the after tracer)
+               pt(ji,jj,jpkm1,jn,Kaa) = pt(ji,jj,jpkm1,jn,Kaa) / zwt(ji,jpkm1) * tmask(ji,jj,jpkm1)
+            END_1D
+            DO_2Dik( 0, 0,   jpk-2, 1, -1 )
+               pt(ji,jj,jk,jn,Kaa) = ( pt(ji,jj,jk,jn,Kaa) - zws(ji,jk) * pt(ji,jj,jk+1,jn,Kaa) )   &
+                  &             / zwt(ji,jk) * tmask(ji,jj,jk)
+            END_2D
+            !                                         ! ================= !
+         END DO                                       !    tracer loop    !
          !                                            ! ================= !
-      END DO                                          !  end tracer loop  !
+      END_1D                                          !  i-k slices loop  !
       !                                               ! ================= !
    END SUBROUTINE tra_zdf_imp
 
diff --git a/src/OCE/TRA/zpshde.F90 b/src/OCE/TRA/zpshde.F90
deleted file mode 100644
index 0591067f..00000000
--- a/src/OCE/TRA/zpshde.F90
+++ /dev/null
@@ -1,487 +0,0 @@
-MODULE zpshde
-   !!======================================================================
-   !!                       ***  MODULE zpshde   ***
-   !! z-coordinate + partial step : Horizontal Derivative at ocean bottom level
-   !!======================================================================
-   !! History :  OPA  !  2002-04  (A. Bozec)  Original code
-   !!   NEMO     1.0  !  2002-08  (G. Madec E. Durand)  Optimization and Free form
-   !!             -   !  2004-03  (C. Ethe)  adapted for passive tracers
-   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA
-   !!            3.6  !  2014-11  (P. Mathiot) Add zps_hde_isf (needed to open a cavity)
-   !!======================================================================
-
-   !!----------------------------------------------------------------------
-   !!   zps_hde      :  Horizontal DErivative of T, S and rd at the last
-   !!                   ocean level (Z-coord. with Partial Steps)
-   !!----------------------------------------------------------------------
-   USE oce             ! ocean: dynamics and tracers variables
-   USE dom_oce         ! domain: ocean variables
-   USE domutl, ONLY : is_tile
-   USE phycst          ! physical constants
-   USE eosbn2          ! ocean equation of state
-   USE in_out_manager  ! I/O manager
-   USE lbclnk          ! lateral boundary conditions (or mpp link)
-   USE lib_mpp         ! MPP library
-   USE timing          ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   zps_hde     ! routine called by step.F90
-   PUBLIC   zps_hde_isf ! routine called by step.F90
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: zpshde.F90 14834 2021-05-11 09:24:44Z hadcv $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE zps_hde( kt, kjpt, pta, pgtu, pgtv, prd, pgru, pgrv )
-      !!
-      INTEGER                     , INTENT(in   )           ::  kt          ! ocean time-step index
-      INTEGER                     , INTENT(in   )           ::  kjpt        ! number of tracers
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta         ! 4D tracers fields
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtu, pgtv  ! hor. grad. of ptra at u- & v-pts
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ), OPTIONAL ::  prd         ! 3D density anomaly fields
-      REAL(wp), DIMENSION(:,:)    , INTENT(  out), OPTIONAL ::  pgru, pgrv  ! hor. grad of prd at u- & v-pts (bottom)
-      !
-      INTEGER :: itrd, itgr
-      !!
-      IF( PRESENT(prd)  ) THEN ; itrd = is_tile(prd)  ; ELSE ; itrd = 0 ; ENDIF
-      IF( PRESENT(pgru) ) THEN ; itgr = is_tile(pgru) ; ELSE ; itgr = 0 ; ENDIF
-
-      CALL zps_hde_t( kt, kjpt, pta, is_tile(pta), pgtu, pgtv, is_tile(pgtu), &
-         &                      prd, itrd,         pgru, pgrv, itgr )
-   END SUBROUTINE zps_hde
-
-
-   SUBROUTINE zps_hde_t( kt, kjpt, pta, ktta, pgtu, pgtv, ktgt,   &
-      &                            prd, ktrd, pgru, pgrv, ktgr )
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE zps_hde  ***
-      !!
-      !! ** Purpose :   Compute the horizontal derivative of T, S and rho
-      !!      at u- and v-points with a linear interpolation for z-coordinate
-      !!      with partial steps.
-      !!
-      !! ** Method  :   In z-coord with partial steps, scale factors on last
-      !!      levels are different for each grid point, so that T, S and rd
-      !!      points are not at the same depth as in z-coord. To have horizontal
-      !!      gradients again, we interpolate T and S at the good depth :
-      !!      Linear interpolation of T, S
-      !!         Computation of di(tb) and dj(tb) by vertical interpolation:
-      !!          di(t) = t~ - t(i,j,k) or t(i+1,j,k) - t~
-      !!          dj(t) = t~ - t(i,j,k) or t(i,j+1,k) - t~
-      !!         This formulation computes the two cases:
-      !!                 CASE 1                   CASE 2
-      !!         k-1  ___ ___________   k-1   ___ ___________
-      !!                    Ti  T~                  T~  Ti+1
-      !!                  _____                        _____
-      !!         k        |   |Ti+1     k           Ti |   |
-      !!                  |   |____                ____|   |
-      !!              ___ |   |   |           ___  |   |   |
-      !!
-      !!      case 1->   e3w_0(i+1,:,:) >= e3w_0(i,:,:) ( and e3w_0(:,j+1,:) >= e3w_0(:,j,:) ) then
-      !!          t~ = t(i+1,j  ,k) + (e3w_0(i+1,j,k) - e3w_0(i,j,k)) * dk(Ti+1)/e3w_0(i+1,j,k)
-      !!        ( t~ = t(i  ,j+1,k) + (e3w_0(i,j+1,k) - e3w_0(i,j,k)) * dk(Tj+1)/e3w_0(i,j+1,k)  )
-      !!          or
-      !!      case 2->   e3w_0(i+1,:,:) <= e3w_0(i,:,:) ( and e3w_0(:,j+1,:) <= e3w_0(:,j,:) ) then
-      !!          t~ = t(i,j,k) + (e3w_0(i,j,k) - e3w_0(i+1,j,k)) * dk(Ti)/e3w_0(i,j,k)
-      !!        ( t~ = t(i,j,k) + (e3w_0(i,j,k) - e3w_0(i,j+1,k)) * dk(Tj)/e3w_0(i,j,k) )
-      !!          Idem for di(s) and dj(s)
-      !!
-      !!      For rho, we call eos which will compute rd~(t~,s~) at the right
-      !!      depth zh from interpolated T and S for the different formulations
-      !!      of the equation of state (eos).
-      !!      Gradient formulation for rho :
-      !!          di(rho) = rd~ - rd(i,j,k)   or   rd(i+1,j,k) - rd~
-      !!
-      !! ** Action  : compute for top interfaces
-      !!              - pgtu, pgtv: horizontal gradient of tracer at u- & v-points
-      !!              - pgru, pgrv: horizontal gradient of rho (if present) at u- & v-points
-      !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   )           ::  kt          ! ocean time-step index
-      INTEGER                                , INTENT(in   )           ::  kjpt        ! number of tracers
-      INTEGER                                , INTENT(in   )           ::  ktta, ktgt, ktrd, ktgr
-      REAL(wp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta         ! 4D tracers fields
-      REAL(wp), DIMENSION(A2D_T(ktgt)    ,KJPT), INTENT(  out)           ::  pgtu, pgtv  ! hor. grad. of ptra at u- & v-pts
-      REAL(wp), DIMENSION(A2D_T(ktrd),JPK     ), INTENT(in   ), OPTIONAL ::  prd         ! 3D density anomaly fields
-      REAL(wp), DIMENSION(A2D_T(ktgr)         ), INTENT(  out), OPTIONAL ::  pgru, pgrv  ! hor. grad of prd at u- & v-pts (bottom)
-      !
-      INTEGER  ::   ji, jj, jn                  ! Dummy loop indices
-      INTEGER  ::   iku, ikv, ikum1, ikvm1      ! partial step level (ocean bottom level) at u- and v-points
-      REAL(wp) ::   ze3wu, ze3wv, zmaxu, zmaxv  ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zri, zrj, zhi, zhj   ! NB: 3rd dim=1 to use eos
-      REAL(wp), DIMENSION(A2D(nn_hls),kjpt) ::   zti, ztj             !
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start( 'zps_hde')
-      !
-      pgtu(:,:,:) = 0._wp   ;   zti (:,:,:) = 0._wp   ;   zhi (:,:) = 0._wp
-      pgtv(:,:,:) = 0._wp   ;   ztj (:,:,:) = 0._wp   ;   zhj (:,:) = 0._wp
-      !
-      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==!
-         !
-         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )              ! Gradient of density at the last level
-            iku = mbku(ji,jj)   ;   ikum1 = MAX( iku - 1 , 1 )    ! last and before last ocean level at u- & v-points
-            ikv = mbkv(ji,jj)   ;   ikvm1 = MAX( ikv - 1 , 1 )    ! if level first is a p-step, ik.m1=1
-            ze3wu = e3w_0(ji+1,jj  ,iku) - e3w_0(ji,jj,iku)
-            ze3wv = e3w_0(ji  ,jj+1,ikv) - e3w_0(ji,jj,ikv)
-            !
-            ! i- direction
-            IF( ze3wu >= 0._wp ) THEN      ! case 1
-               zmaxu =  ze3wu / e3w_0(ji+1,jj,iku)
-               ! interpolated values of tracers
-               zti (ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikum1,jn) - pta(ji+1,jj,iku,jn) )
-               ! gradient of  tracers
-               pgtu(ji,jj,jn) = umask(ji,jj,1) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) )
-            ELSE                           ! case 2
-               zmaxu = -ze3wu / e3w_0(ji,jj,iku)
-               ! interpolated values of tracers
-               zti (ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikum1,jn) - pta(ji,jj,iku,jn) )
-               ! gradient of tracers
-               pgtu(ji,jj,jn) = umask(ji,jj,1) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) )
-            ENDIF
-            !
-            ! j- direction
-            IF( ze3wv >= 0._wp ) THEN      ! case 1
-               zmaxv =  ze3wv / e3w_0(ji,jj+1,ikv)
-               ! interpolated values of tracers
-               ztj (ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvm1,jn) - pta(ji,jj+1,ikv,jn) )
-               ! gradient of tracers
-               pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) )
-            ELSE                           ! case 2
-               zmaxv =  -ze3wv / e3w_0(ji,jj,ikv)
-               ! interpolated values of tracers
-               ztj (ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvm1,jn) - pta(ji,jj,ikv,jn) )
-               ! gradient of tracers
-               pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) )
-            ENDIF
-         END_2D
-      END DO
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgtu, 'U', -1.0_wp , pgtv, 'V', -1.0_wp )   ! Lateral boundary cond.
-      !
-      IF( PRESENT( prd ) ) THEN    !==  horizontal derivative of density anomalies (rd)  ==!    (optional part)
-         pgru(:,:) = 0._wp
-         pgrv(:,:) = 0._wp                ! depth of the partial step level
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            iku = mbku(ji,jj)
-            ikv = mbkv(ji,jj)
-            ze3wu  = e3w_0(ji+1,jj  ,iku) - e3w_0(ji,jj,iku)
-            ze3wv  = e3w_0(ji  ,jj+1,ikv) - e3w_0(ji,jj,ikv)
-            IF( ze3wu >= 0._wp ) THEN   ;   zhi(ji,jj) = gdept_0(ji  ,jj,iku)     ! i-direction: case 1
-            ELSE                        ;   zhi(ji,jj) = gdept_0(ji+1,jj,iku)     ! -     -      case 2
-            ENDIF
-            IF( ze3wv >= 0._wp ) THEN   ;   zhj(ji,jj) = gdept_0(ji,jj  ,ikv)     ! j-direction: case 1
-            ELSE                        ;   zhj(ji,jj) = gdept_0(ji,jj+1,ikv)     ! -     -      case 2
-            ENDIF
-         END_2D
-         !
-         CALL eos( zti, zhi, zri )        ! interpolated density from zti, ztj
-         CALL eos( ztj, zhj, zrj )        ! at the partial step depth output in  zri, zrj
-         !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )              ! Gradient of density at the last level
-            iku = mbku(ji,jj)
-            ikv = mbkv(ji,jj)
-            ze3wu  = e3w_0(ji+1,jj  ,iku) - e3w_0(ji,jj,iku)
-            ze3wv  = e3w_0(ji  ,jj+1,ikv) - e3w_0(ji,jj,ikv)
-            IF( ze3wu >= 0._wp ) THEN   ;   pgru(ji,jj) = umask(ji,jj,1) * ( zri(ji  ,jj    ) - prd(ji,jj,iku) )   ! i: 1
-            ELSE                        ;   pgru(ji,jj) = umask(ji,jj,1) * ( prd(ji+1,jj,iku) - zri(ji,jj    ) )   ! i: 2
-            ENDIF
-            IF( ze3wv >= 0._wp ) THEN   ;   pgrv(ji,jj) = vmask(ji,jj,1) * ( zrj(ji,jj      ) - prd(ji,jj,ikv) )   ! j: 1
-            ELSE                        ;   pgrv(ji,jj) = vmask(ji,jj,1) * ( prd(ji,jj+1,ikv) - zrj(ji,jj    ) )   ! j: 2
-            ENDIF
-         END_2D
-         IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgru , 'U', -1.0_wp , pgrv , 'V', -1.0_wp )   ! Lateral boundary conditions
-         !
-      END IF
-      !
-      IF( ln_timing )   CALL timing_stop( 'zps_hde')
-      !
-   END SUBROUTINE zps_hde_t
-
-
-   SUBROUTINE zps_hde_isf( kt, kjpt, pta, pgtu, pgtv, pgtui, pgtvi,  &
-      &                              prd, pgru, pgrv, pgrui, pgrvi )
-      !!
-      INTEGER                     , INTENT(in   )           ::  kt           ! ocean time-step index
-      INTEGER                     , INTENT(in   )           ::  kjpt         ! number of tracers
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta          ! 4D tracers fields
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtu, pgtv   ! hor. grad. of ptra at u- & v-pts
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtui, pgtvi ! hor. grad. of stra at u- & v-pts (ISF)
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ), OPTIONAL ::  prd          ! 3D density anomaly fields
-      REAL(wp), DIMENSION(:,:)    , INTENT(  out), OPTIONAL ::  pgru, pgrv   ! hor. grad of prd at u- & v-pts (bottom)
-      REAL(wp), DIMENSION(:,:)    , INTENT(  out), OPTIONAL ::  pgrui, pgrvi ! hor. grad of prd at u- & v-pts (top)
-      !
-      INTEGER :: itrd, itgr, itgri
-      !!
-      IF( PRESENT(prd)   ) THEN ; itrd  = is_tile(prd)   ; ELSE ; itrd  = 0 ; ENDIF
-      IF( PRESENT(pgru)  ) THEN ; itgr  = is_tile(pgru)  ; ELSE ; itgr  = 0 ; ENDIF
-      IF( PRESENT(pgrui) ) THEN ; itgri = is_tile(pgrui) ; ELSE ; itgri = 0 ; ENDIF
-
-      CALL zps_hde_isf_t( kt, kjpt, pta, is_tile(pta), pgtu, pgtv, is_tile(pgtu), pgtui, pgtvi, is_tile(pgtui),  &
-      &                             prd, itrd,         pgru, pgrv, itgr,          pgrui, pgrvi, itgri )
-   END SUBROUTINE zps_hde_isf
-
-
-   SUBROUTINE zps_hde_isf_t( kt, kjpt, pta, ktta, pgtu, pgtv, ktgt, pgtui, pgtvi, ktgti,  &
-      &                                prd, ktrd, pgru, pgrv, ktgr, pgrui, pgrvi, ktgri )
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE zps_hde_isf  ***
-      !!
-      !! ** Purpose :   Compute the horizontal derivative of T, S and rho
-      !!      at u- and v-points with a linear interpolation for z-coordinate
-      !!      with partial steps for top (ice shelf) and bottom.
-      !!
-      !! ** Method  :   In z-coord with partial steps, scale factors on last
-      !!      levels are different for each grid point, so that T, S and rd
-      !!      points are not at the same depth as in z-coord. To have horizontal
-      !!      gradients again, we interpolate T and S at the good depth :
-      !!      For the bottom case:
-      !!      Linear interpolation of T, S
-      !!         Computation of di(tb) and dj(tb) by vertical interpolation:
-      !!          di(t) = t~ - t(i,j,k) or t(i+1,j,k) - t~
-      !!          dj(t) = t~ - t(i,j,k) or t(i,j+1,k) - t~
-      !!         This formulation computes the two cases:
-      !!                 CASE 1                   CASE 2
-      !!         k-1  ___ ___________   k-1   ___ ___________
-      !!                    Ti  T~                  T~  Ti+1
-      !!                  _____                        _____
-      !!         k        |   |Ti+1     k           Ti |   |
-      !!                  |   |____                ____|   |
-      !!              ___ |   |   |           ___  |   |   |
-      !!
-      !!      case 1->   e3w_0(i+1,j,k) >= e3w_0(i,j,k) ( and e3w_0(i,j+1,k) >= e3w_0(i,j,k) ) then
-      !!          t~ = t(i+1,j  ,k) + (e3w_0(i+1,j  ,k) - e3w_0(i,j,k)) * dk(Ti+1)/e3w_0(i+1,j  ,k)
-      !!        ( t~ = t(i  ,j+1,k) + (e3w_0(i  ,j+1,k) - e3w_0(i,j,k)) * dk(Tj+1)/e3w_0(i  ,j+1,k)  )
-      !!          or
-      !!      case 2->   e3w_0(i+1,j,k) <= e3w_0(i,j,k) ( and e3w_0(i,j+1,k) <= e3w_0(i,j,k) ) then
-      !!          t~ = t(i,j,k) + (e3w_0(i,j,k) - e3w_0(i+1,j  ,k)) * dk(Ti)/e3w_0(i,j,k)
-      !!        ( t~ = t(i,j,k) + (e3w_0(i,j,k) - e3w_0(i  ,j+1,k)) * dk(Tj)/e3w_0(i,j,k) )
-      !!          Idem for di(s) and dj(s)
-      !!
-      !!      For rho, we call eos which will compute rd~(t~,s~) at the right
-      !!      depth zh from interpolated T and S for the different formulations
-      !!      of the equation of state (eos).
-      !!      Gradient formulation for rho :
-      !!          di(rho) = rd~ - rd(i,j,k)   or   rd(i+1,j,k) - rd~
-      !!
-      !!      For the top case (ice shelf): As for the bottom case but upside down
-      !!
-      !! ** Action  : compute for top and bottom interfaces
-      !!              - pgtu, pgtv, pgtui, pgtvi: horizontal gradient of tracer at u- & v-points
-      !!              - pgru, pgrv, pgrui, pgtvi: horizontal gradient of rho (if present) at u- & v-points
-      !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   )           ::  kt           ! ocean time-step index
-      INTEGER                                , INTENT(in   )           ::  kjpt         ! number of tracers
-      INTEGER                                , INTENT(in   )           ::  ktta, ktgt, ktgti, ktrd, ktgr, ktgri
-      REAL(wp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta          ! 4D tracers fields
-      REAL(wp), DIMENSION(A2D_T(ktgt)    ,KJPT), INTENT(  out)           ::  pgtu, pgtv   ! hor. grad. of ptra at u- & v-pts
-      REAL(wp), DIMENSION(A2D_T(ktgti)   ,KJPT), INTENT(  out)           ::  pgtui, pgtvi ! hor. grad. of stra at u- & v-pts (ISF)
-      REAL(wp), DIMENSION(A2D_T(ktrd),JPK     ), INTENT(in   ), OPTIONAL ::  prd          ! 3D density anomaly fields
-      REAL(wp), DIMENSION(A2D_T(ktgr)         ), INTENT(  out), OPTIONAL ::  pgru, pgrv   ! hor. grad of prd at u- & v-pts (bottom)
-      REAL(wp), DIMENSION(A2D_T(ktgri)        ), INTENT(  out), OPTIONAL ::  pgrui, pgrvi ! hor. grad of prd at u- & v-pts (top)
-      !
-      INTEGER  ::   ji, jj, jn      ! Dummy loop indices
-      INTEGER  ::   iku, ikv, ikum1, ikvm1,ikup1, ikvp1   ! partial step level (ocean bottom level) at u- and v-points
-      REAL(wp) ::  ze3wu, ze3wv, zmaxu, zmaxv             ! temporary scalars
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::  zri, zrj, zhi, zhj   ! NB: 3rd dim=1 to use eos
-      REAL(wp), DIMENSION(A2D(nn_hls),kjpt) ::  zti, ztj             !
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start( 'zps_hde_isf')
-      !
-      pgtu (:,:,:) = 0._wp   ;   pgtv (:,:,:) =0._wp
-      pgtui(:,:,:) = 0._wp   ;   pgtvi(:,:,:) =0._wp
-      zti  (:,:,:) = 0._wp   ;   ztj  (:,:,:) =0._wp
-      zhi  (:,:  ) = 0._wp   ;   zhj  (:,:  ) =0._wp
-      !
-      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==!
-         !
-         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
-
-            iku = mbku(ji,jj); ikum1 = MAX( iku - 1 , 1 )    ! last and before last ocean level at u- & v-points
-            ikv = mbkv(ji,jj); ikvm1 = MAX( ikv - 1 , 1 )    ! if level first is a p-step, ik.m1=1
-            ze3wu = gdept_0(ji+1,jj,iku) - gdept_0(ji,jj,iku)
-            ze3wv = gdept_0(ji,jj+1,ikv) - gdept_0(ji,jj,ikv)
-            !
-            ! i- direction
-            IF( ze3wu >= 0._wp ) THEN      ! case 1
-               zmaxu =  ze3wu / e3w_0(ji+1,jj,iku)
-               ! interpolated values of tracers
-               zti (ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikum1,jn) - pta(ji+1,jj,iku,jn) )
-               ! gradient of  tracers
-               pgtu(ji,jj,jn) = ssumask(ji,jj) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) )
-            ELSE                           ! case 2
-               zmaxu = -ze3wu / e3w_0(ji,jj,iku)
-               ! interpolated values of tracers
-               zti (ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikum1,jn) - pta(ji,jj,iku,jn) )
-               ! gradient of tracers
-               pgtu(ji,jj,jn) = ssumask(ji,jj) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) )
-            ENDIF
-            !
-            ! j- direction
-            IF( ze3wv >= 0._wp ) THEN      ! case 1
-               zmaxv =  ze3wv / e3w_0(ji,jj+1,ikv)
-               ! interpolated values of tracers
-               ztj (ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvm1,jn) - pta(ji,jj+1,ikv,jn) )
-               ! gradient of tracers
-               pgtv(ji,jj,jn) = ssvmask(ji,jj) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) )
-            ELSE                           ! case 2
-               zmaxv =  -ze3wv / e3w_0(ji,jj,ikv)
-               ! interpolated values of tracers
-               ztj (ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvm1,jn) - pta(ji,jj,ikv,jn) )
-               ! gradient of tracers
-               pgtv(ji,jj,jn) = ssvmask(ji,jj) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) )
-            ENDIF
-
-         END_2D
-      END DO
-      !
-      IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgtu, 'U', -1.0_wp , pgtv, 'V', -1.0_wp )   ! Lateral boundary cond.
-
-      ! horizontal derivative of density anomalies (rd)
-      IF( PRESENT( prd ) ) THEN         ! depth of the partial step level
-         pgru(:,:)=0.0_wp   ; pgrv(:,:)=0.0_wp ;
-         !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-
-            iku = mbku(ji,jj)
-            ikv = mbkv(ji,jj)
-            ze3wu = gdept_0(ji+1,jj,iku) - gdept_0(ji,jj,iku)
-            ze3wv = gdept_0(ji,jj+1,ikv) - gdept_0(ji,jj,ikv)
-            !
-            IF( ze3wu >= 0._wp ) THEN   ;   zhi(ji,jj) = gdept_0(ji  ,jj,iku)    ! i-direction: case 1
-            ELSE                        ;   zhi(ji,jj) = gdept_0(ji+1,jj,iku)    ! -     -      case 2
-            ENDIF
-            IF( ze3wv >= 0._wp ) THEN   ;   zhj(ji,jj) = gdept_0(ji,jj  ,ikv)    ! j-direction: case 1
-            ELSE                        ;   zhj(ji,jj) = gdept_0(ji,jj+1,ikv)    ! -     -      case 2
-            ENDIF
-
-         END_2D
-
-         ! Compute interpolated rd from zti, ztj for the 2 cases at the depth of the partial
-         ! step and store it in  zri, zrj for each  case
-         CALL eos( zti, zhi, zri )
-         CALL eos( ztj, zhj, zrj )
-
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            iku = mbku(ji,jj)
-            ikv = mbkv(ji,jj)
-            ze3wu = gdept_0(ji+1,jj,iku) - gdept_0(ji,jj,iku)
-            ze3wv = gdept_0(ji,jj+1,ikv) - gdept_0(ji,jj,ikv)
-
-            IF( ze3wu >= 0._wp ) THEN   ;   pgru(ji,jj) = ssumask(ji,jj) * ( zri(ji  ,jj    ) - prd(ji,jj,iku) )   ! i: 1
-            ELSE                        ;   pgru(ji,jj) = ssumask(ji,jj) * ( prd(ji+1,jj,iku) - zri(ji,jj    ) )   ! i: 2
-            ENDIF
-            IF( ze3wv >= 0._wp ) THEN   ;   pgrv(ji,jj) = ssvmask(ji,jj) * ( zrj(ji,jj      ) - prd(ji,jj,ikv) )   ! j: 1
-            ELSE                        ;   pgrv(ji,jj) = ssvmask(ji,jj) * ( prd(ji,jj+1,ikv) - zrj(ji,jj    ) )   ! j: 2
-            ENDIF
-
-         END_2D
-
-         IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgru , 'U', -1.0_wp , pgrv , 'V', -1.0_wp )   ! Lateral boundary conditions
-         !
-      END IF
-      !
-      !     !==  (ISH)  compute grui and gruvi  ==!
-      !
-      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==!            !
-         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
-            iku = miku(ji,jj); ikup1 = miku(ji,jj) + 1
-            ikv = mikv(ji,jj); ikvp1 = mikv(ji,jj) + 1
-            !
-            ! (ISF) case partial step top and bottom in adjacent cell in vertical
-            ! cannot used e3w because if 2 cell water column, we have ps at top and bottom
-            ! in this case e3w_0(i,j,k) - e3w_0(i,j+1,k) is not the distance between Tj~ and Tj
-            ! the only common depth between cells (i,j) and (i,j+1) is gdepw_0
-            ze3wu  =  gdept_0(ji,jj,iku) - gdept_0(ji+1,jj,iku)
-            ze3wv  =  gdept_0(ji,jj,ikv) - gdept_0(ji,jj+1,ikv)
-
-            ! i- direction
-            IF( ze3wu >= 0._wp ) THEN      ! case 1
-               zmaxu = ze3wu / e3w_0(ji+1,jj,ikup1)
-               ! interpolated values of tracers
-               zti(ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikup1,jn) - pta(ji+1,jj,iku,jn) )
-               ! gradient of tracers
-               pgtui(ji,jj,jn) = ssumask(ji,jj) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) )
-            ELSE                           ! case 2
-               zmaxu = - ze3wu / e3w_0(ji,jj,ikup1)
-               ! interpolated values of tracers
-               zti(ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikup1,jn) - pta(ji,jj,iku,jn) )
-               ! gradient of  tracers
-               pgtui(ji,jj,jn) = ssumask(ji,jj) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) )
-            ENDIF
-            !
-            ! j- direction
-            IF( ze3wv >= 0._wp ) THEN      ! case 1
-               zmaxv =  ze3wv / e3w_0(ji,jj+1,ikvp1)
-               ! interpolated values of tracers
-               ztj(ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvp1,jn) - pta(ji,jj+1,ikv,jn) )
-               ! gradient of tracers
-               pgtvi(ji,jj,jn) = ssvmask(ji,jj) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) )
-            ELSE                           ! case 2
-               zmaxv =  - ze3wv / e3w_0(ji,jj,ikvp1)
-               ! interpolated values of tracers
-               ztj(ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvp1,jn) - pta(ji,jj,ikv,jn) )
-               ! gradient of tracers
-               pgtvi(ji,jj,jn) = ssvmask(ji,jj) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) )
-            ENDIF
-
-         END_2D
-         !
-      END DO
-      IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgtui, 'U', -1.0_wp , pgtvi, 'V', -1.0_wp )   ! Lateral boundary cond.
-
-      IF( PRESENT( prd ) ) THEN    !==  horizontal derivative of density anomalies (rd)  ==!    (optional part)
-         !
-         pgrui(:,:)  =0.0_wp; pgrvi(:,:)  =0.0_wp;
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-
-            iku = miku(ji,jj)
-            ikv = mikv(ji,jj)
-            ze3wu  =  gdept_0(ji,jj,iku) - gdept_0(ji+1,jj,iku)
-            ze3wv  =  gdept_0(ji,jj,ikv) - gdept_0(ji,jj+1,ikv)
-            !
-            IF( ze3wu >= 0._wp ) THEN   ;   zhi(ji,jj) = gdept_0(ji  ,jj,iku)    ! i-direction: case 1
-            ELSE                        ;   zhi(ji,jj) = gdept_0(ji+1,jj,iku)    ! -     -      case 2
-            ENDIF
-
-            IF( ze3wv >= 0._wp ) THEN   ;   zhj(ji,jj) = gdept_0(ji,jj  ,ikv)    ! j-direction: case 1
-            ELSE                        ;   zhj(ji,jj) = gdept_0(ji,jj+1,ikv)    ! -     -      case 2
-            ENDIF
-
-         END_2D
-         !
-         CALL eos( zti, zhi, zri )        ! interpolated density from zti, ztj
-         CALL eos( ztj, zhj, zrj )        ! at the partial step depth output in  zri, zrj
-         !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            iku = miku(ji,jj)
-            ikv = mikv(ji,jj)
-            ze3wu  =  gdept_0(ji,jj,iku) - gdept_0(ji+1,jj,iku)
-            ze3wv  =  gdept_0(ji,jj,ikv) - gdept_0(ji,jj+1,ikv)
-
-            IF( ze3wu >= 0._wp ) THEN ; pgrui(ji,jj) = ssumask(ji,jj) * ( zri(ji  ,jj      ) - prd(ji,jj,iku) ) ! i: 1
-            ELSE                      ; pgrui(ji,jj) = ssumask(ji,jj) * ( prd(ji+1,jj  ,iku) - zri(ji,jj    ) ) ! i: 2
-            ENDIF
-            IF( ze3wv >= 0._wp ) THEN ; pgrvi(ji,jj) = ssvmask(ji,jj) * ( zrj(ji  ,jj      ) - prd(ji,jj,ikv) ) ! j: 1
-            ELSE                      ; pgrvi(ji,jj) = ssvmask(ji,jj) * ( prd(ji  ,jj+1,ikv) - zrj(ji,jj    ) ) ! j: 2
-            ENDIF
-
-         END_2D
-         IF (nn_hls==1) CALL lbc_lnk( 'zpshde', pgrui, 'U', -1.0_wp , pgrvi, 'V', -1.0_wp )   ! Lateral boundary conditions
-         !
-      END IF
-      !
-      IF( ln_timing )   CALL timing_stop( 'zps_hde_isf')
-      !
-   END SUBROUTINE zps_hde_isf_t
-
-   !!======================================================================
-END MODULE zpshde
diff --git a/src/OCE/TRD/trddyn.F90 b/src/OCE/TRD/trddyn.F90
index 8816056e..464ebbbf 100644
--- a/src/OCE/TRD/trddyn.F90
+++ b/src/OCE/TRD/trddyn.F90
@@ -56,10 +56,13 @@ CONTAINS
       INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
       INTEGER                   , INTENT(in   ) ::   kt             ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
+      INTEGER                                   ::   ji, jj, jk     ! lopp indices
       !!----------------------------------------------------------------------
       !
-      putrd(:,:,:) = putrd(:,:,:) * umask(:,:,:)                       ! mask the trends
-      pvtrd(:,:,:) = pvtrd(:,:,:) * vmask(:,:,:)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         putrd(ji,jj,jk) = putrd(ji,jj,jk) * umask(ji,jj,jk)                       ! mask the trends
+         pvtrd(ji,jj,jk) = pvtrd(ji,jj,jk) * vmask(ji,jj,jk)
+      END_3D
       !
 
 !!gm NB : here a lbc_lnk should probably be added
@@ -120,10 +123,10 @@ CONTAINS
                               CALL iom_put( "vtrd_rvo", pvtrd )
       CASE( jpdyn_keg )   ;   CALL iom_put( "utrd_keg", putrd )    ! Kinetic Energy gradient (or had)
                               CALL iom_put( "vtrd_keg", pvtrd )
-                              ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) )
-                              z3dx(:,:,:) = 0._wp                  ! U.dxU & V.dyV (approximation)
-                              z3dy(:,:,:) = 0._wp
-                              DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! no mask as un,vn are masked
+                              ALLOCATE( z3dx(T2D(0),jpk) , z3dy(T2D(0),jpk) )   ! U.dxU & V.dyV (approximation)
+                              z3dx(T2D(0),jpk) = 0._wp
+                              z3dy(T2D(0),jpk) = 0._wp
+                              DO_3D( 0, 0, 0, 0, 1, jpkm1 )                          ! no mask as un,vn are masked
                                  z3dx(ji,jj,jk) = uu(ji,jj,jk,Kmm) * ( uu(ji+1,jj,jk,Kmm) - uu(ji-1,jj,jk,Kmm) ) / ( 2._wp * e1u(ji,jj) )
                                  z3dy(ji,jj,jk) = vv(ji,jj,jk,Kmm) * ( vv(ji,jj+1,jk,Kmm) - vv(ji,jj-1,jk,Kmm) ) / ( 2._wp * e2v(ji,jj) )
                               END_3D
@@ -139,9 +142,11 @@ CONTAINS
                               CALL iom_put( "vtrd_zdf", pvtrd )
                               !
                               !                                    ! wind stress trends
-                              ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) )
-                              z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * rho0 )
-                              z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * rho0 )
+                              ALLOCATE( z2dx(T2D(0)) , z2dy(T2D(0)) )
+                              DO_2D( 0, 0, 0, 0 )
+                                 z2dx(ji,jj) = ( utau_b(ji,jj) + utauU(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * rho0 )
+                                 z2dy(ji,jj) = ( vtau_b(ji,jj) + vtauV(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * rho0 )
+                              END_2D
                               CALL iom_put( "utrd_tau", z2dx )
                               CALL iom_put( "vtrd_tau", z2dy )
                               DEALLOCATE( z2dx , z2dy )
diff --git a/src/OCE/TRD/trdglo.F90 b/src/OCE/TRD/trdglo.F90
index 0e4a2aea..29dd173f 100644
--- a/src/OCE/TRD/trdglo.F90
+++ b/src/OCE/TRD/trdglo.F90
@@ -42,6 +42,7 @@ MODULE trdglo
    REAL(wp) ::   tvolv    ! volume of the whole ocean computed at v-points
    REAL(wp) ::   rpktrd   ! potential to kinetic energy conversion
    REAL(wp) ::   peke     ! conversion potential energy - kinetic energy trend
+   REAL(wp) ::   xcof
 
    !                     !!! domain averaged trends
    REAL(wp), DIMENSION(jptot_tra) ::   tmo, smo   ! temperature and salinity trends 
@@ -77,44 +78,47 @@ CONTAINS
       INTEGER ::   ji, jj, jk      ! dummy loop indices
       INTEGER ::   ikbu, ikbv      ! local integers
       REAL(wp)::   zvm, zvt, zvs, z1_2rho0   ! local scalars
-      REAL(wp), DIMENSION(jpi,jpj)  :: ztswu, ztswv, z2dx, z2dy   ! 2D workspace 
+      REAL(wp), DIMENSION(T2D(0))  :: ztswu, ztswv, z2dx, z2dy   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       IF( MOD(kt,nn_trd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN
          !
-      	SELECT CASE( ctype )
-      	!
-      	CASE( 'TRA' )          !==  Tracers (T & S)  ==!
-      	   DO_3D( 1, 1, 1, 1, 1, jpkm1 )   ! global sum of mask volume trend and trend*T (including interior mask)
-	            zvm = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * tmask_i(ji,jj)
-	            zvt = ptrdx(ji,jj,jk) * zvm
-	            zvs = ptrdy(ji,jj,jk) * zvm
-   	         tmo(ktrd) = tmo(ktrd) + zvt   
-   	         smo(ktrd) = smo(ktrd) + zvs
-   	         t2 (ktrd) = t2(ktrd)  + zvt * ts(ji,jj,jk,jp_tem,Kmm)
-   	         s2 (ktrd) = s2(ktrd)  + zvs * ts(ji,jj,jk,jp_sal,Kmm)
-      	   END_3D
+     SELECT CASE( ctype )
+     !
+     CASE( 'TRA' )          !==  Tracers (T & S)  ==!
+        DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! global sum of mask volume trend and trend*T (including interior mask)
+           zvm = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * tmask_i(ji,jj)
+           zvt = ptrdx(ji,jj,jk) * zvm
+           zvs = ptrdy(ji,jj,jk) * zvm
+           tmo(ktrd) = tmo(ktrd) + zvt   
+           smo(ktrd) = smo(ktrd) + zvs
+           t2 (ktrd) = t2(ktrd)  + zvt * ts(ji,jj,jk,jp_tem,Kmm)
+           s2 (ktrd) = s2(ktrd)  + zvs * ts(ji,jj,jk,jp_sal,Kmm)
+        END_3D
             !                       ! linear free surface: diagnose advective flux trough the fixed k=1 w-surface
-            IF( ln_linssh .AND. ktrd == jptra_zad ) THEN  
-               tmo(jptra_sad) = SUM( ww(:,:,1) * ts(:,:,1,jp_tem,Kmm) * e1e2t(:,:) * tmask_i(:,:) )
-               smo(jptra_sad) = SUM( ww(:,:,1) * ts(:,:,1,jp_sal,Kmm) * e1e2t(:,:) * tmask_i(:,:)  )
-               t2 (jptra_sad) = SUM( ww(:,:,1) * ts(:,:,1,jp_tem,Kmm) * ts(:,:,1,jp_tem,Kmm) * e1e2t(:,:) * tmask_i(:,:)  )
-               s2 (jptra_sad) = SUM( ww(:,:,1) * ts(:,:,1,jp_sal,Kmm) * ts(:,:,1,jp_sal,Kmm) * e1e2t(:,:) * tmask_i(:,:)  )
-            ENDIF
+        IF( ln_linssh .AND. ktrd == jptra_zad ) THEN  
+            DO_2D( 0, 0, 0, 0 )   ! global sum of mask volume trend and trend*T (including interior mask)
+               zvm = ww(ji,jj,1) * e1e2t(ji,jj) * tmask_i(ji,jj)
+               tmo(jptra_sad) = tmo(jptra_sad) + ts(ji,jj,1,jp_tem,Kmm) * zvm
+               smo(jptra_sad) = smo(jptra_sad) + ts(ji,jj,1,jp_sal,Kmm) * zvm
+               t2 (jptra_sad) = t2 (jptra_sad) + ts(ji,jj,1,jp_tem,Kmm) * ts(ji,jj,1,jp_tem,Kmm) * zvm
+               s2 (jptra_sad) = s2 (jptra_sad) + ts(ji,jj,1,jp_sal,Kmm) * ts(ji,jj,1,jp_sal,Kmm) * zvm
+            END_2D
+        ENDIF
             !
-            IF( ktrd == jptra_atf ) THEN     ! last trend (asselin time filter)
-               ! 
-               CALL glo_tra_wri( kt )             ! print the results in ocean.output
-               !                
-	            tmo(:) = 0._wp                     ! prepare the next time step (domain averaged array reset to zero)
-   	         smo(:) = 0._wp
-               t2 (:) = 0._wp
-               s2 (:) = 0._wp
-               !
-            ENDIF
+        IF( ktrd == jptra_atf ) THEN     ! last trend (asselin time filter)
+            ! 
+            CALL glo_tra_wri( kt )             ! print the results in ocean.output
+            !                
+            tmo(:) = 0._wp                     ! prepare the next time step (domain averaged array reset to zero)
+            smo(:) = 0._wp
+            t2 (:) = 0._wp
+            s2 (:) = 0._wp
+            !
+         ENDIF
             !
          CASE( 'DYN' )          !==  Momentum and KE  ==!        
-            DO_3D( 1, 0, 1, 0, 1, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
                zvt = ptrdx(ji,jj,jk) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk)   &
                   &                                     * e1e2u  (ji,jj) * e3u(ji,jj,jk,Kmm)
                zvs = ptrdy(ji,jj,jk) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   &
@@ -126,11 +130,11 @@ CONTAINS
             !                 
             IF( ktrd == jpdyn_zdf ) THEN      ! zdf trend: compute separately the surface forcing trend
                z1_2rho0 = 0.5_wp / rho0
-               DO_2D( 1, 0, 1, 0 )
-                  zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk)   &
-                     &                                                     * z1_2rho0       * e1e2u(ji,jj)
-                  zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   &
-                     &                                                     * z1_2rho0       * e1e2v(ji,jj)
+               DO_2D( 0, 0, 0, 0 )
+                  zvt = ( utau_b(ji,jj) + utauU(ji,jj) ) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk)   &
+                     &                                                      * z1_2rho0       * e1e2u(ji,jj)
+                  zvs = ( vtau_b(ji,jj) + vtauV(ji,jj) ) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   &
+                     &                                                      * z1_2rho0       * e1e2v(ji,jj)
                   umo(jpdyn_tau) = umo(jpdyn_tau) + zvt
                   vmo(jpdyn_tau) = vmo(jpdyn_tau) + zvs
                   hke(jpdyn_tau) = hke(jpdyn_tau) + uu(ji,jj,1,Kmm) * zvt + vv(ji,jj,1,Kmm) * zvs
@@ -184,8 +188,7 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kmm  ! time level index
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp) ::   zcof         ! local scalar
-      REAL(wp), DIMENSION(jpi,jpj,jpk)  ::  zkx, zky, zkz, zkepe  
+      REAL(wp), DIMENSION(T2D(0),jpk)  ::  zkx, zky, zkz, zkepe
       !!----------------------------------------------------------------------
 
       ! I. Momentum trends
@@ -196,24 +199,24 @@ CONTAINS
          ! I.1 Conversion potential energy - kinetic energy
          ! --------------------------------------------------
          ! c a u t i o n here, trends are computed at kt+1 (now , but after the swap)
-         zkx  (:,:,:) = 0._wp
-         zky  (:,:,:) = 0._wp
-         zkz  (:,:,:) = 0._wp
-         zkepe(:,:,:) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! loop from top to bottom
+            zkx  (ji,jj,jk) = 0._wp
+            zky  (ji,jj,jk) = 0._wp
+            zkz  (ji,jj,jk) = 0._wp
+            zkepe(ji,jj,jk) = 0._wp
+         END_3D
    
          CALL eos( ts(:,:,:,:,Kmm), rhd, rhop )       ! now potential density
 
-         zcof = 0.5_wp / rho0             ! Density flux at w-point
-         zkz(:,:,1) = 0._wp
-         DO jk = 2, jpk
-            zkz(:,:,jk) = zcof * e1e2t(:,:) * ww(:,:,jk) * ( rhop(:,:,jk) + rhop(:,:,jk-1) ) * tmask_i(:,:)
-         END DO
+         zkz(T2D(0),1) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk ) ! loop from top to bottom
+            zkz(ji,jj,jk) = xcof * e1e2t(ji,jj) * ww(ji,jj,jk) * ( rhop(ji,jj,jk) + rhop(ji,jj,jk-1) ) * tmask_i(ji,jj)
+         END_3D
          
-         zcof   = 0.5_wp / rho0           ! Density flux at u and v-points
-         DO_3D( 1, 0, 1, 0, 1, jpkm1 )
-            zkx(ji,jj,jk) = zcof * e2u(ji,jj) * e3u(ji,jj,jk,Kmm)   &
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            zkx(ji,jj,jk) = xcof * e2u(ji,jj) * e3u(ji,jj,jk,Kmm)   &
                &                              *  uu(ji,jj,jk,Kmm) * ( rhop(ji,jj,jk) + rhop(ji+1,jj,jk) )
-            zky(ji,jj,jk) = zcof * e1v(ji,jj) * e3v(ji,jj,jk,Kmm)   &
+            zky(ji,jj,jk) = xcof * e1v(ji,jj) * e3v(ji,jj,jk,Kmm)   &
                &                              *  vv(ji,jj,jk,Kmm) * ( rhop(ji,jj,jk) + rhop(ji,jj+1,jk) )
          END_3D
          
@@ -227,10 +230,9 @@ CONTAINS
          ! I.2 Basin averaged kinetic energy trend
          ! ----------------------------------------
          peke = 0._wp
-         DO jk = 1, jpkm1
-            peke = peke + SUM( zkepe(:,:,jk) * gdept(:,:,jk,Kmm) * e1e2t(:,:)   &
-               &                               * e3t(:,:,jk,Kmm) )
-         END DO
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! loop from top to bottom
+            peke = peke + zkepe(ji,jj,jk) * gdept(ji,jj,jk,Kmm) * e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)
+         END_3D
          peke = grav * peke
 
          ! I.3 Sums over the global domain
@@ -509,11 +511,14 @@ CONTAINS
          WRITE(numout,*) '~~~~~~~~~~~~~'
       ENDIF
 
+      xcof = 0.5_wp / rho0
+
       ! Total volume at t-points:
       tvolt = 0._wp
-      DO jk = 1, jpkm1
-         tvolt = tvolt + SUM( e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) * tmask_i(:,:) )
-      END DO
+
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )    ! Density flux divergence at t-point
+         tvolt = tvolt + e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * tmask_i(ji,jj)
+      END_3D
       CALL mpp_sum( 'trdglo', tvolt )   ! sum over the global domain
 
       IF(lwp) WRITE(numout,*) '                total ocean volume at T-point   tvolt = ',tvolt
diff --git a/src/OCE/TRD/trdken.F90 b/src/OCE/TRD/trdken.F90
index d97b3eb8..6b0595fc 100644
--- a/src/OCE/TRD/trdken.F90
+++ b/src/OCE/TRD/trdken.F90
@@ -30,6 +30,10 @@ MODULE trdken
    IMPLICIT NONE
    PRIVATE
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
+
    PUBLIC   trd_ken       ! called by trddyn module
    PUBLIC   trd_ken_init  ! called by trdini module
 
@@ -38,9 +42,6 @@ MODULE trdken
    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   bu, bv   ! volume of u- and v-boxes
    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   r1_bt    ! inverse of t-box volume
 
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: trdken.F90 15104 2021-07-07 14:36:00Z clem $
@@ -52,7 +53,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       !!                  ***  FUNCTION trd_ken_alloc  ***
       !!---------------------------------------------------------------------
-      ALLOCATE( bu(jpi,jpj,jpk) , bv(jpi,jpj,jpk) , r1_bt(jpi,jpj,jpk) , STAT= trd_ken_alloc )
+      ALLOCATE( bu(T2D(0),jpk) , bv(T2D(0),jpk) , r1_bt(T2D(0),jpk) , STAT= trd_ken_alloc )
       !
       CALL mpp_sum ( 'trdken', trd_ken_alloc )
       IF( trd_ken_alloc /= 0 )   CALL ctl_stop( 'STOP', 'trd_ken_alloc: failed to allocate arrays' )
@@ -77,31 +78,32 @@ CONTAINS
       !
       !
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V masked trends
-      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
-      INTEGER                   , INTENT(in   ) ::   kt             ! time step
-      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
+      REAL(wp), DIMENSION(:,:,:)   , INTENT(inout) ::   putrd, pvtrd   ! U and V masked trends
+      INTEGER                      , INTENT(in   ) ::   ktrd           ! trend index
+      INTEGER                      , INTENT(in   ) ::   kt             ! time step
+      INTEGER                      , INTENT(in   ) ::   Kmm            ! time level index
       !
       INTEGER ::   ji, jj, jk       ! dummy loop indices
       INTEGER ::   ikbu  , ikbv     ! local integers
       INTEGER ::   ikbum1, ikbvm1   !   -       -
-      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   z2dx, z2dy, zke2d   ! 2D workspace 
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zke                 ! 3D workspace 
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE    ::   zke2d   ! 2D workspace 
+      REAL(wp)                                 ::   z2dx, z2dy, z2dxm1, z2dym1   ! 2D workspace 
+      REAL(wp), DIMENSION(T2D(0),jpk)          ::   zke                 ! 3D workspace
       !!----------------------------------------------------------------------
       !
       CALL lbc_lnk( 'trdken', putrd, 'U', -1.0_wp , pvtrd, 'V', -1.0_wp )      ! lateral boundary conditions
       !
       nkstp = kt
       DO jk = 1, jpkm1
-         bu   (:,:,jk) =    e1e2u(:,:) * e3u(:,:,jk,Kmm)
-         bv   (:,:,jk) =    e1e2v(:,:) * e3v(:,:,jk,Kmm)
-         r1_bt(:,:,jk) = r1_e1e2t(:,:) / e3t(:,:,jk,Kmm) * tmask(:,:,jk)
+         DO_2D( 0, 0, 0, 0 )
+            bu   (ji,jj,jk) =    e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm)
+            bv   (ji,jj,jk) =    e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm)
+            r1_bt(ji,jj,jk) = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+         END_2D
       END DO
       !
-      zke(:,:,jpk) = 0._wp
-      zke(1:nn_hls,:, : ) = 0._wp
-      zke(:,1:nn_hls, : ) = 0._wp
-      DO_3D( 0, nn_hls, 0, nn_hls, 1, jpkm1 )
+      zke(T2D(0),:) = 0._wp
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          zke(ji,jj,jk) = 0.5_wp * rho0 *( uu(ji  ,jj,jk,Kmm) * putrd(ji  ,jj,jk) * bu(ji  ,jj,jk)  &
             &                           + uu(ji-1,jj,jk,Kmm) * putrd(ji-1,jj,jk) * bu(ji-1,jj,jk)  &
             &                           + vv(ji,jj  ,jk,Kmm) * pvtrd(ji,jj  ,jk) * bv(ji,jj  ,jk)  &
@@ -118,35 +120,31 @@ CONTAINS
          CASE( jpdyn_ldf )   ;   CALL iom_put( "ketrd_ldf"   , zke )    ! lateral diffusion
          CASE( jpdyn_zdf )   ;   CALL iom_put( "ketrd_zdf"   , zke )    ! vertical diffusion 
          !                   !                                          ! wind stress trends
-                                 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) , zke2d(jpi,jpj) )
-                           z2dx(:,:) = uu(:,:,1,Kmm) * ( utau_b(:,:) + utau(:,:) ) * e1e2u(:,:) * umask(:,:,1)
-                           z2dy(:,:) = vv(:,:,1,Kmm) * ( vtau_b(:,:) + vtau(:,:) ) * e1e2v(:,:) * vmask(:,:,1)
-                           zke2d(1:nn_hls,:) = 0._wp   ;   zke2d(:,1:nn_hls) = 0._wp
-                           DO_2D( 0, nn_hls, 0, nn_hls )
-                              zke2d(ji,jj) = r1_rho0 * 0.5_wp * (   z2dx(ji,jj) + z2dx(ji-1,jj)   &
-                              &                                   + z2dy(ji,jj) + z2dy(ji,jj-1)   ) * r1_bt(ji,jj,1)
-                           END_2D
+             ALLOCATE( zke2d(T2D(0)) ) ; zke2d(T2D(0)) = 0._wp
+             DO_2D( 0, 0, 0, 0 )
+                z2dx = uu(ji,jj,1,Kmm) * ( utau_b(ji,jj) + utauU(ji,jj) ) * e1e2u(ji,jj) * umask(ji,jj,1)
+                z2dy = vv(ji,jj,1,Kmm) * ( vtau_b(ji,jj) + vtauV(ji,jj) ) * e1e2v(ji,jj) * vmask(ji,jj,1)
+                z2dxm1 = uu(ji-1,jj,1,Kmm) * ( utau_b(ji-1,jj) + utauU(ji-1,jj) ) * e1e2u(ji-1,jj) * umask(ji-1,jj,1)
+                z2dym1 = vv(ji,jj-1,1,Kmm) * ( vtau_b(ji,jj-1) + vtauV(ji,jj-1) ) * e1e2v(ji,jj-1) * vmask(ji,jj-1,1)
+                zke2d(ji,jj) = r1_rho0 * 0.5_wp * ( z2dx + z2dxm1 + z2dy + z2dym1 ) * r1_bt(ji,jj,1)
+             END_2D
                                  CALL iom_put( "ketrd_tau"   , zke2d )  ! 
-                                 DEALLOCATE( z2dx , z2dy , zke2d )
+                                 DEALLOCATE( zke2d )
          CASE( jpdyn_bfr )   ;   CALL iom_put( "ketrd_bfr"   , zke )    ! bottom friction (explicit case) 
 !!gm TO BE DONE properly
 !!gm only valid if ln_drgimp=F otherwise the bottom stress as to be recomputed at the end of the computation....
 !         IF(.NOT. ln_drgimp) THEN
-!            DO jj = 1, jpj    !   
-!               DO ji = 1, jpi
-!                  ikbu = mbku(ji,jj)         ! deepest ocean u- & v-levels
-!                  ikbv = mbkv(ji,jj)   
-!                  z2dx(ji,jj) = uu(ji,jj,ikbu,Kmm) * bfrua(ji,jj) * uu(ji,jj,ikbu,Kmm)
-!                  z2dy(ji,jj) = vv(ji,jj,ikbu,Kmm) * bfrva(ji,jj) * vv(ji,jj,ikbv,Kmm)
-!               END DO
-!            END DO
+!            zke2d(T2D(0)) = 0._wp
+!            DO_2D( 0, 0, 0, 0 )   
+!               ikbu   = mbku(ji,jj)         ! deepest ocean u- & v-levels
+!               ikbv   = mbkv(ji,jj)   
+!               z2dx   = uu(ji,jj,ikbu,Kmm) * bfrua(ji,jj) * uu(ji,jj,ikbu,Kmm)
+!               z2dy   = vv(ji,jj,ikbu,Kmm) * bfrva(ji,jj) * vv(ji,jj,ikbv,Kmm)
+!               z2dxm1 = uu(ji-1,jj,ikbu,Kmm) * bfrua(ji-1,jj) * uu(ji-1,jj,ikbu,Kmm)
+!               z2dym1 = vv(ji,jj-1,ikbu,Kmm) * bfrva(ji,jj-1) * vv(ji,jj-1,ikbv,Kmm)
+!               zke2d(ji,jj) = 0.5_wp * ( z2dx + z2dxm1 + z2dy + z2dym1 ) * r1_bt(ji,jj,1)
+!            END_2D
 !            zke2d(1,:) = 0._wp   ;   zke2d(:,1) = 0._wp
-!            DO jj = 2, jpj
-!               DO ji = 2, jpi
-!                  zke2d(ji,jj) = 0.5_wp * (   z2dx(ji,jj) + z2dx(ji-1,jj)   &
-!                     &                      + z2dy(ji,jj) + z2dy(ji,jj-1)   ) * r1_bt(ji,jj,  BEURK!!!
-!               END DO
-!            END DO
 !                                    CALL iom_put( "ketrd_bfr"  , zke2d )   ! bottom friction (explicit case)
 !         ENDIF
 !!gm end
@@ -175,11 +173,11 @@ CONTAINS
         CASE( jpdyn_ken )   ;   ! kinetic energy
                     ! called in dynnxt.F90 before asselin time filter
                     ! with putrd=uu(Krhs) and pvtrd=vv(Krhs)
-                    zke(:,:,:) = 0.5_wp * zke(:,:,:)
+                    zke(T2D(0),:) = 0.5_wp * zke(T2D(0),:)
                     CALL iom_put( "KE", zke )
                     !
                     CALL ken_p2k( kt , zke, Kmm )
-                      CALL iom_put( "ketrd_convP2K", zke )     ! conversion -rau*g*w
+                    CALL iom_put( "ketrd_convP2K", zke )     ! conversion -rau*g*w
          !
       END SELECT
       !
@@ -203,22 +201,23 @@ CONTAINS
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   iku, ikv     ! local integers
       REAL(wp) ::   zcoef        ! local scalars
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zconv  ! 3D workspace
+      REAL(wp), DIMENSION(T2D(0),jpk) ::  zconv  ! 3D workspace
       !!----------------------------------------------------------------------
       !
       ! Local constant initialization 
       zcoef = - rho0 * grav * 0.5_wp      
       
       !  Surface value (also valid in partial step case)
-      zconv(:,:,1) = zcoef * ( 2._wp * rhd(:,:,1) ) * ww(:,:,1) * e3w(:,:,1,Kmm)
-
+      DO_2D( 0, 0, 0, 0 )
+         zconv(ji,jj,1) = zcoef * ( 2._wp * rhd(ji,jj,1) ) * ww(ji,jj,1) * e3w(ji,jj,1,Kmm)
+      END_2D
       ! interior value (2=<jk=<jpkm1)
-      DO jk = 2, jpk
-         zconv(:,:,jk) = zcoef * ( rhd(:,:,jk) + rhd(:,:,jk-1) ) * ww(:,:,jk) * e3w(:,:,jk,Kmm)
-      END DO
+      DO_3D( 0, 0, 0, 0 , 2, jpk )
+            zconv(ji,jj,jk) = zcoef * ( rhd(ji,jj,jk) + rhd(ji,jj,jk-1) ) * ww(ji,jj,jk) * e3w(ji,jj,jk,Kmm)
+      END_3D
 
       ! conv value on T-point
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          zcoef = 0.5_wp / e3t(ji,jj,jk,Kmm)
          pconv(ji,jj,jk) = zcoef * ( zconv(ji,jj,jk) + zconv(ji,jj,jk+1) ) * tmask(ji,jj,jk)
       END_3D
diff --git a/src/OCE/TRD/trdmxl.F90 b/src/OCE/TRD/trdmxl.F90
index bce0dd53..f9fab190 100644
--- a/src/OCE/TRD/trdmxl.F90
+++ b/src/OCE/TRD/trdmxl.F90
@@ -45,20 +45,7 @@ MODULE trdmxl
    PUBLIC   trd_mxl_init   ! routine called by opa.F90
    PUBLIC   trd_mxl_zint   ! routine called by tracers routines
 
-   INTEGER ::   nkstp       ! current time step 
-
-!!gm  to be moved from trdmxl_oce
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   hml                ! ML depth (sum of e3t over nmln-1 levels) [m] 
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   tml    , sml       ! now ML averaged T & S 
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   tmlb_nf, smlb_nf   ! not filtered before ML averaged T & S
-!
-!
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   hmlb, hmln         ! before, now, and after Mixed Layer depths [m]
-!   
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   tb_mlb, tb_mln     ! before (not filtered) tracer averaged over before and now ML 
-!
-!   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   tn_mln             ! now tracer averaged over now ML
-!!gm end   
+   INTEGER ::   nkstp      ! current time step 
    
    CHARACTER (LEN=40) ::  clhstnam         ! name of the trends NetCDF file
    INTEGER ::   nh_t, nmoymltrd
@@ -111,44 +98,41 @@ CONTAINS
       IF ( kt /= nkstp ) THEN   !=  1st call at kt time step  =!
          !                      !==============================!
          nkstp = kt
-         
-         
          !                          !==  reset trend arrays to zero  ==!
-         tmltrd(:,:,:) = 0._wp    ;    smltrd(:,:,:) = 0._wp    
-         
-         
+         DO_3D( 0, 0, 0, 0, 1, jpktrd )
+            tmltrd(ji,jj,jk) = 0._wp
+            smltrd(ji,jj,jk) = 0._wp
+         END_3D
          !
-         wkx(:,:,:) = 0._wp         !==  now ML weights for vertical averaging  ==!
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpktrd )  ! initialize wkx with vertical scale factor in mixed-layer
+         !                          !==  now ML weights for vertical averaging  ==!
+         DO_3D( 0, 0, 0, 0, 1, jpktrd )  ! initialize wkx with vertical scale factor in mixed-layer
             IF( jk - kmxln(ji,jj) < 0 )   THEN
                wkx(ji,jj,jk) = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+            ELSE
+               wkx(ji,jj,jk) = 0._wp
             ENDIF
          END_3D
+         !
          hmxl(:,:) = 0._wp               ! NOW mixed-layer depth
-         DO jk = 1, jpktrd
-            hmxl(:,:) = hmxl(:,:) + wkx(:,:,jk)
-         END DO
-         DO jk = 1, jpktrd               ! integration weights
-            wkx(:,:,jk) = wkx(:,:,jk) / MAX( 1.e-20_wp, hmxl(:,:) ) * tmask(:,:,1)
-         END DO
-         
-         
+         DO_3D( 0, 0, 0, 0, 1, jpktrd )
+            hmxl(ji,jj)    = hmxl(ji,jj) + wkx(ji,jj,jk)
+            wkx (ji,jj,jk) = wkx (ji,jj,jk) / MAX( 1.e-20_wp, hmxl(ji,jj) ) * tmask(ji,jj,1)
+         END_3D
          !
          !                          !==  Vertically averaged T and S  ==!
          tml(:,:) = 0._wp   ;   sml(:,:) = 0._wp
-         DO jk = 1, jpktrd
-            tml(:,:) = tml(:,:) + wkx(:,:,jk) * ts(:,:,jk,jp_tem,Kmm)
-            sml(:,:) = sml(:,:) + wkx(:,:,jk) * ts(:,:,jk,jp_sal,Kmm)
-         END DO
+         DO_3D( 0, 0, 0, 0, 1, jpktrd )
+            tml(ji,jj) = tml(ji,jj) + wkx(ji,jj,jk) * ts(ji,jj,jk,jp_tem,Kmm)
+            sml(ji,jj) = sml(ji,jj) + wkx(ji,jj,jk) * ts(ji,jj,jk,jp_sal,Kmm)
+         END_3D
          !
       ENDIF
 
-
-
       ! mean now trends over the now ML 
-      tmltrd(:,:,ktrd) = tmltrd(:,:,ktrd) + ptrdx(:,:,jk) * wkx(:,:,jk)   ! temperature
-      smltrd(:,:,ktrd) = smltrd(:,:,ktrd) + ptrdy(:,:,jk) * wkx(:,:,jk)   ! salinity
- 
+      DO_2D( 0, 0, 0, 0 )
+         tmltrd(ji,jj,ktrd) = tmltrd(ji,jj,ktrd) + ptrdx(ji,jj,jk) * wkx(ji,jj,jk)   ! temperature
+         smltrd(ji,jj,ktrd) = smltrd(ji,jj,ktrd) + ptrdy(ji,jj,jk) * wkx(ji,jj,jk)   ! salinity
+      END_2D
 
  
 !!gm to be put juste before the output !
@@ -249,11 +233,11 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT( in ) ::   ktrd       ! ocean trend index
       CHARACTER(len=2)                , INTENT( in ) ::   ctype      ! 2D surface/bottom or 3D interior physics
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pttrdmxl   ! temperature trend 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pstrdmxl   ! salinity trend 
+      REAL(wp), DIMENSION(T2D(0),jpk), INTENT( in ) ::   pttrdmxl   ! temperature trend
+      REAL(wp), DIMENSION(T2D(0),jpk), INTENT( in ) ::   pstrdmxl   ! salinity trend
       !
       INTEGER ::   ji, jj, jk, isum
-      REAL(wp), DIMENSION(jpi,jpj)  :: zvlmsk 
+      REAL(wp), DIMENSION(T2D(0))  :: zvlmsk
       !!----------------------------------------------------------------------
 
       ! I. Definition of control surface and associated fields
@@ -268,11 +252,13 @@ CONTAINS
 
          
          ! ... Set nmxl(ji,jj) = index of first T point below control surf. or outside mixed-layer
-         IF( nn_ctls == 0 ) THEN       ! * control surface = mixed-layer with density criterion 
-            nmxl(:,:) = nmln(:,:)    ! array nmln computed in zdfmxl.F90
-         ELSEIF( nn_ctls == 1 ) THEN   ! * control surface = read index from file 
+         IF( nn_ctls == 0 ) THEN         ! * control surface = mixed-layer with density criterion 
+            DO_2D( 0, 0, 0, 0 )
+               nmxl(ji,jj) = nmln(ji,jj) !   array nmln computed in zdfmxl.F90
+            END_2D
+         ELSEIF( nn_ctls == 1 ) THEN     ! * control surface = read index from file 
             nmxl(:,:) = nbol(:,:)
-         ELSEIF( nn_ctls >= 2 ) THEN   ! * control surface = model level
+         ELSEIF( nn_ctls >= 2 ) THEN     ! * control surface = model level
             nn_ctls = MIN( nn_ctls, jpktrd - 1 )
             nmxl(:,:) = nn_ctls + 1
          ENDIF
@@ -335,9 +321,9 @@ CONTAINS
       REAL(wp) :: zavt, zfn, zfn2
       !                                              ! z(ts)mltot : dT/dt over the anlysis window (including Asselin)
       !                                              ! z(ts)mlres : residual = dh/dt entrainment term
-      REAL(wp), DIMENSION(jpi,jpj  )   ::  ztmltot , zsmltot , ztmlres , zsmlres , ztmlatf , zsmlatf
-      REAL(wp), DIMENSION(jpi,jpj  )   ::  ztmltot2, zsmltot2, ztmlres2, zsmlres2, ztmlatf2, zsmlatf2, ztmltrdm2, zsmltrdm2  
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  ztmltrd2, zsmltrd2   ! only needed for mean diagnostics
+      REAL(wp), DIMENSION(T2D(0)  )   ::  ztmltot , zsmltot , ztmlres , zsmlres , ztmlatf , zsmlatf
+      REAL(wp), DIMENSION(T2D(0)  )   ::  ztmltot2, zsmltot2, ztmlres2, zsmlres2, ztmlatf2, zsmlatf2, ztmltrdm2, zsmltrdm2
+      REAL(wp), DIMENSION(T2D(0),jpk) ::  ztmltrd2, zsmltrd2   ! only needed for mean diagnostics
       !!----------------------------------------------------------------------
   
       ! ======================================================================
@@ -446,12 +432,7 @@ CONTAINS
       itmod = kt - nit000 + 1
 
       MODULO_NTRD : IF( MOD( itmod, nn_trd ) == 0 ) THEN        ! nitend MUST be multiple of nn_trd
-         !
-         ztmltot (:,:) = 0.e0   ;   zsmltot (:,:) = 0.e0   ! reset arrays to zero
-         ztmlres (:,:) = 0.e0   ;   zsmlres (:,:) = 0.e0
-         ztmltot2(:,:) = 0.e0   ;   zsmltot2(:,:) = 0.e0
-         ztmlres2(:,:) = 0.e0   ;   zsmlres2(:,:) = 0.e0
-      
+         !      
          zfn  = REAL( nmoymltrd, wp )   ;   zfn2 = zfn * zfn
          
          ! III.1 Prepare fields for output ("instantaneous" diagnostics) 
@@ -469,25 +450,18 @@ CONTAINS
          ztmlatf(:,:) = tmlatfm(:,:) - tmlatfn(:,:) + tmlatfb(:,:)
          zsmlatf(:,:) = smlatfm(:,:) - smlatfn(:,:) + smlatfb(:,:)
          
-         !-- Lateral boundary conditions
-         !         ... temperature ...                    ... salinity ...
-         CALL lbc_lnk( 'trdmxl', ztmltot , 'T', 1.0_wp, zsmltot , 'T', 1.0_wp, &
-            &                    ztmlres , 'T', 1.0_wp, zsmlres , 'T', 1.0_wp, &
-            &                    ztmlatf , 'T', 1.0_wp, zsmlatf , 'T', 1.0_wp )
-
-
          ! III.2 Prepare fields for output ("mean" diagnostics) 
          ! ----------------------------------------------------
          
          !-- Update the ML depth time sum (to build the Leap-Frog time mean)
-         hmxl_sum(:,:) = hmxlbn(:,:) + 2 * ( hmxl_sum(:,:) - hmxl(:,:) ) + hmxl(:,:)
+         hmxl_sum(:,:) = hmxlbn(:,:) + 2._wp * ( hmxl_sum(:,:) - hmxl(:,:) ) + hmxl(:,:)
 
          !-- Compute temperature total trends
-         tml_sum (:,:) = tmlbn(:,:) + 2 * ( tml_sum(:,:) - tml(:,:) ) + tml(:,:)
+         tml_sum (:,:) = tmlbn(:,:) + 2._wp * ( tml_sum(:,:) - tml(:,:) ) + tml(:,:)
          ztmltot2(:,:) = ( tml_sum(:,:) - tml_sumb(:,:) ) / p2dt    ! now in degC/s
          
          !-- Compute salinity total trends
-         sml_sum (:,:) = smlbn(:,:) + 2 * ( sml_sum(:,:) - sml(:,:) ) + sml(:,:)
+         sml_sum (:,:) = smlbn(:,:) + 2._wp * ( sml_sum(:,:) - sml(:,:) ) + sml(:,:)
          zsmltot2(:,:) = ( sml_sum(:,:) - sml_sumb(:,:) ) / p2dt    ! now in psu/s
          
          !-- Compute temperature residuals
@@ -495,7 +469,7 @@ CONTAINS
             ztmltrd2(:,:,jl) = tmltrd_csum_ub(:,:,jl) + tmltrd_csum_ln(:,:,jl)
          END DO
 
-         ztmltrdm2(:,:) = 0.e0
+         ztmltrdm2(:,:) = 0._wp
          DO jl = 1, jpltrd
             ztmltrdm2(:,:) = ztmltrdm2(:,:) + ztmltrd2(:,:,jl)
          END DO
@@ -508,7 +482,7 @@ CONTAINS
             zsmltrd2(:,:,jl) = smltrd_csum_ub(:,:,jl) + smltrd_csum_ln(:,:,jl)
          END DO
 
-         zsmltrdm2(:,:) = 0.
+         zsmltrdm2(:,:) = 0._wp
          DO jl = 1, jpltrd
             zsmltrdm2(:,:) = zsmltrdm2(:,:) + zsmltrd2(:,:,jl)
          END DO
@@ -519,13 +493,6 @@ CONTAINS
          !-- Diagnose Asselin trend over the analysis window
          ztmlatf2(:,:) = ztmltrd2(:,:,jpmxl_atf) - tmltrd_sum(:,:,jpmxl_atf) + tmltrd_atf_sumb(:,:)
          zsmlatf2(:,:) = zsmltrd2(:,:,jpmxl_atf) - smltrd_sum(:,:,jpmxl_atf) + smltrd_atf_sumb(:,:)
-
-         !-- Lateral boundary conditions
-         !         ... temperature ...                    ... salinity ...
-         CALL lbc_lnk( 'trdmxl', ztmltot2, 'T', 1.0_wp, zsmltot2, 'T', 1.0_wp, &
-            &                    ztmlres2, 'T', 1.0_wp, zsmlres2, 'T', 1.0_wp )
-         !
-         CALL lbc_lnk( 'trdmxl', ztmltrd2(:,:,:), 'T', 1.0_wp, zsmltrd2(:,:,:), 'T', 1.0_wp ) ! /  in the NetCDF trends file
          
          ! III.3 Time evolution array swap
          ! -------------------------------
@@ -622,6 +589,8 @@ CONTAINS
       ! ======================================================================
 
       !-- Write the trends for T/S instantaneous diagnostics 
+
+      ! clem => these fields do not exist in field_def
       
       IF( ln_trdmxl_instant ) THEN           
 
diff --git a/src/OCE/TRD/trdmxl_oce.F90 b/src/OCE/TRD/trdmxl_oce.F90
index c2d4d4be..728ec10d 100644
--- a/src/OCE/TRD/trdmxl_oce.F90
+++ b/src/OCE/TRD/trdmxl_oce.F90
@@ -80,6 +80,8 @@ MODULE trdmxl_oce
       smltrd_csum_ln,               & !:    ( idem for salinity )
       smltrd_csum_ub                  !: 
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: trdmxl_oce.F90 10425 2018-12-19 21:54:16Z smasson $ 
@@ -101,29 +103,29 @@ CONTAINS
 
      ierr(:) = 0
 
-     ALLOCATE( nmxl (jpi,jpj)    , nbol (jpi,jpj),    &
-        &      wkx  (jpi,jpj,jpk), hmxl (jpi,jpj),    & 
-        &      tml  (jpi,jpj)    , sml  (jpi,jpj),    & 
-        &      tmlb (jpi,jpj)    , smlb (jpi,jpj),    &
-        &      tmlbb(jpi,jpj)    , smlbb(jpi,jpj), STAT = ierr(1) )
-
-     ALLOCATE( tmlbn(jpi,jpj)  , smlbn(jpi,jpj),   &
-        &      tmltrdm(jpi,jpj), smltrdm(jpi,jpj), &
-        &      tml_sum(jpi,jpj), tml_sumb(jpi,jpj),&
-        &      tmltrd_atf_sumb(jpi,jpj)           , STAT=ierr(2) )
-
-     ALLOCATE( sml_sum(jpi,jpj), sml_sumb(jpi,jpj), &
-        &      smltrd_atf_sumb(jpi,jpj),            &
-        &      hmxl_sum(jpi,jpj), hmxlbn(jpi,jpj),  &
-        &      tmlatfb(jpi,jpj), tmlatfn(jpi,jpj), STAT = ierr(3) )
-
-     ALLOCATE( smlatfb(jpi,jpj), smlatfn(jpi,jpj), & 
-        &      tmlatfm(jpi,jpj), smlatfm(jpi,jpj), &
-        &      tmltrd(jpi,jpj,jpltrd),   smltrd(jpi,jpj,jpltrd), STAT=ierr(4))
-
-     ALLOCATE( tmltrd_sum(jpi,jpj,jpltrd),tmltrd_csum_ln(jpi,jpj,jpltrd),      &
-        &      tmltrd_csum_ub(jpi,jpj,jpltrd), smltrd_sum(jpi,jpj,jpltrd),     &
-        &      smltrd_csum_ln(jpi,jpj,jpltrd), smltrd_csum_ub(jpi,jpj,jpltrd), STAT=ierr(5) )
+     ALLOCATE( nmxl (T2D(0))    , nbol (T2D(0)),    &
+        &      wkx  (T2D(0),jpk), hmxl (T2D(0)),    &
+        &      tml  (T2D(0))    , sml  (T2D(0)),    &
+        &      tmlb (T2D(0))    , smlb (T2D(0)),    &
+        &      tmlbb(T2D(0))    , smlbb(T2D(0)), STAT = ierr(1) )
+
+     ALLOCATE( tmlbn(T2D(0))  , smlbn(T2D(0)),   &
+        &      tmltrdm(T2D(0)), smltrdm(T2D(0)), &
+        &      tml_sum(T2D(0)), tml_sumb(T2D(0)),&
+        &      tmltrd_atf_sumb(T2D(0))           , STAT=ierr(2) )
+
+     ALLOCATE( sml_sum(T2D(0)), sml_sumb(T2D(0)), &
+        &      smltrd_atf_sumb(T2D(0)),           &
+        &      hmxl_sum(T2D(0)), hmxlbn(T2D(0)),  &
+        &      tmlatfb(T2D(0)), tmlatfn(T2D(0)), STAT = ierr(3) )
+
+     ALLOCATE( smlatfb(T2D(0)), smlatfn(T2D(0)), &
+        &      tmlatfm(T2D(0)), smlatfm(T2D(0)), &
+        &      tmltrd(T2D(0),jpltrd),   smltrd(T2D(0),jpltrd), STAT=ierr(4))
+
+     ALLOCATE( tmltrd_sum(T2D(0),jpltrd),tmltrd_csum_ln(T2D(0),jpltrd),      &
+        &      tmltrd_csum_ub(T2D(0),jpltrd), smltrd_sum(T2D(0),jpltrd),     &
+        &      smltrd_csum_ln(T2D(0),jpltrd), smltrd_csum_ub(T2D(0),jpltrd), STAT=ierr(5) )
       !
       trdmxl_oce_alloc = MAXVAL( ierr )
       CALL mpp_sum ( 'trdmxl_oce', trdmxl_oce_alloc )
diff --git a/src/OCE/TRD/trdpen.F90 b/src/OCE/TRD/trdpen.F90
index 0c356f84..c21ba9b1 100644
--- a/src/OCE/TRD/trdpen.F90
+++ b/src/OCE/TRD/trdpen.F90
@@ -35,6 +35,7 @@ MODULE trdpen
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   rab_pe   ! partial derivatives of PE anomaly with respect to T and S
 
    !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -48,7 +49,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       !!                  ***  FUNCTION trd_tra_alloc  ***
       !!---------------------------------------------------------------------
-      ALLOCATE( rab_pe(jpi,jpj,jpk,jpts) , STAT= trd_pen_alloc )
+      ALLOCATE( rab_pe(T2D(0),jpk,jpts) , STAT= trd_pen_alloc )
       !
       CALL mpp_sum ( 'trdpen', trd_pen_alloc )
       IF( trd_pen_alloc /= 0 )   CALL ctl_stop( 'STOP',  'trd_pen_alloc: failed to allocate arrays'  )
@@ -69,37 +70,40 @@ CONTAINS
       INTEGER                   , INTENT(in) ::   Kmm            ! time level index
       REAL(wp)                  , INTENT(in) ::   pdt            ! time step [s]
       !
-      INTEGER ::   jk                                            ! dummy loop indices
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)      ::   z2d            ! 2D workspace 
-      REAL(wp), DIMENSION(jpi,jpj,jpk)           ::   zpe            ! 3D workspace 
+      INTEGER ::   ji, jj, jk                                            ! dummy loop indices
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:)  ::   z2d            ! 2D workspace 
+      REAL(wp), DIMENSION(T2D(0),jpk)        ::   zpe            ! 3D workspace
       !!----------------------------------------------------------------------
       !
-      zpe(:,:,:) = 0._wp
+      zpe(T2D(0),:) = 0._wp
       !
       IF( kt /= nkstp ) THEN     ! full eos: set partial derivatives at the 1st call of kt time step
          nkstp = kt
-         CALL eos_pen( ts(:,:,:,:,Kmm), rab_PE, zpe, Kmm )
+         CALL eos_pen( ts(:,:,:,:,Kmm), rab_pe, zpe, Kmm )
          CALL iom_put( "alphaPE", rab_pe(:,:,:,jp_tem) )
          CALL iom_put( "betaPE" , rab_pe(:,:,:,jp_sal) )
          CALL iom_put( "PEanom" , zpe )
       ENDIF
       !
-      zpe(:,:,jpk) = 0._wp
-      DO jk = 1, jpkm1
-         zpe(:,:,jk) = ( - ( rab_n(:,:,jk,jp_tem) + rab_pe(:,:,jk,jp_tem) ) * ptrdx(:,:,jk)   &
-            &            + ( rab_n(:,:,jk,jp_sal) + rab_pe(:,:,jk,jp_sal) ) * ptrdy(:,:,jk)  )
-      END DO
+      zpe(T2D(0),jpk) = 0._wp
+      !
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         zpe(ji,jj,jk) = ( - ( rab_n(ji,jj,jk,jp_tem) + rab_pe(ji,jj,jk,jp_tem) ) * ptrdx(ji,jj,jk)   &
+            &              + ( rab_n(ji,jj,jk,jp_sal) + rab_pe(ji,jj,jk,jp_sal) ) * ptrdy(ji,jj,jk)  )
+      END_3D
 
       SELECT CASE ( ktrd )
       CASE ( jptra_xad  )   ;   CALL iom_put( "petrd_xad", zpe )   ! zonal    advection
       CASE ( jptra_yad  )   ;   CALL iom_put( "petrd_yad", zpe )   ! merid.   advection
       CASE ( jptra_zad  )   ;   CALL iom_put( "petrd_zad", zpe )   ! vertical advection
                                 IF( ln_linssh ) THEN                   ! cst volume : adv flux through z=0 surface
-                                   ALLOCATE( z2d(jpi,jpj) )
-                                   z2d(:,:) = ww(:,:,1) * ( &
-                                     &   - ( rab_n(:,:,1,jp_tem) + rab_pe(:,:,1,jp_tem) ) * ts(:,:,1,jp_tem,Kmm)    &
-                                     &   + ( rab_n(:,:,1,jp_sal) + rab_pe(:,:,1,jp_sal) ) * ts(:,:,1,jp_sal,Kmm)    &
-                                     & ) / e3t(:,:,1,Kmm)
+                                   ALLOCATE( z2d(T2D(0)) )
+                                   DO_2D( 0, 0, 0, 0 )
+                                      z2d(ji,jj) = ww(ji,jj,1) * ( &
+                                        &   - ( rab_n(ji,jj,1,jp_tem) + rab_pe(ji,jj,1,jp_tem) ) * ts(ji,jj,1,jp_tem,Kmm)    &
+                                        &   + ( rab_n(ji,jj,1,jp_sal) + rab_pe(ji,jj,1,jp_sal) ) * ts(ji,jj,1,jp_sal,Kmm)    &
+                                        & ) / e3t(ji,jj,1,Kmm)
+                                   END_2D
                                    CALL iom_put( "petrd_sad" , z2d )
                                    DEALLOCATE( z2d )
                                 ENDIF
diff --git a/src/OCE/TRD/trdtra.F90 b/src/OCE/TRD/trdtra.F90
index a3377863..b073b1b7 100644
--- a/src/OCE/TRD/trdtra.F90
+++ b/src/OCE/TRD/trdtra.F90
@@ -53,7 +53,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       !!                  ***  FUNCTION trd_tra_alloc  ***
       !!---------------------------------------------------------------------
-      ALLOCATE( trdtx(jpi,jpj,jpk) , trdty(jpi,jpj,jpk) , trdt(jpi,jpj,jpk) , avt_evd(jpi,jpj,jpk), STAT= trd_tra_alloc )
+      ALLOCATE( trdtx(T2D(0),jpk), trdty(T2D(0),jpk), trdt(T2D(0),jpk), avt_evd(T2D(0),jpk), STAT= trd_tra_alloc )
       !
       CALL mpp_sum ( 'trdtra', trd_tra_alloc )
       IF( trd_tra_alloc /= 0 )   CALL ctl_stop( 'STOP', 'trd_tra_alloc: failed to allocate arrays' )
@@ -73,24 +73,25 @@ CONTAINS
       !!              - 'TRA' case : regroup T & S trends
       !!              - send the trends to trd_tra_mng (trdtrc) for further processing
       !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in)           ::   kt      ! time step
-      CHARACTER(len=3)                , INTENT(in)           ::   ctype   ! tracers trends type 'TRA'/'TRC'
-      INTEGER                         , INTENT(in)           ::   ktra    ! tracer index
-      INTEGER                         , INTENT(in)           ::   ktrd    ! tracer trend index
-      INTEGER                         , INTENT(in)           ::   Kmm, Krhs ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)           ::   ptrd    ! tracer trend  or flux
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pu      ! now velocity 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   ptra    ! now tracer variable
+      INTEGER                   , INTENT(in)           ::   kt      ! time step
+      CHARACTER(len=3)          , INTENT(in)           ::   ctype   ! tracers trends type 'TRA'/'TRC'
+      INTEGER                   , INTENT(in)           ::   ktra    ! tracer index
+      INTEGER                   , INTENT(in)           ::   ktrd    ! tracer trend index
+      INTEGER                   , INTENT(in)           ::   Kmm, Krhs ! time level indices
+      REAL(wp), DIMENSION(:,:,:), INTENT(in)           ::   ptrd    ! tracer trend  or flux
+      REAL(wp), DIMENSION(:,:,:), INTENT(in), OPTIONAL ::   pu      ! now velocity 
+      REAL(wp), DIMENSION(:,:,:), INTENT(in), OPTIONAL ::   ptra    ! now tracer variable
       !
-      INTEGER ::   jk    ! loop indices
-      INTEGER ::   i01   ! 0 or 1
-      REAL(wp),        DIMENSION(jpi,jpj,jpk) ::   ztrds             ! 3D workspace
+      INTEGER  ::   ji,jj,jk    ! loop indices
+      INTEGER  ::   i01   ! 0 or 1
+      REAL(wp) ::  z1e3w
+      REAL(wp),              DIMENSION(T2D(0),jpk) ::   ztrds             ! 3D workspace
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwt, zws, ztrdt   ! 3D workspace
       !!----------------------------------------------------------------------
       !      
       IF( .NOT. ALLOCATED( trdtx ) ) THEN      ! allocate trdtra arrays
          IF( trd_tra_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'trd_tra : unable to allocate arrays' )
-         avt_evd(:,:,:) = 0._wp
+         avt_evd(T2D(0),:) = 0._wp
       ENDIF
       !
       i01 = COUNT( (/ PRESENT(pu) .OR. ( ktrd /= jptra_xad .AND. ktrd /= jptra_yad .AND. ktrd /= jptra_zad ) /) )
@@ -103,13 +104,13 @@ CONTAINS
          CASE( jptra_yad )   ;   CALL trd_tra_adv( ptrd, pu, ptra, 'Y', trdty, Kmm ) 
          CASE( jptra_zad )   ;   CALL trd_tra_adv( ptrd, pu, ptra, 'Z', trdt, Kmm )
          CASE( jptra_bbc,    &        ! qsr, bbc: on temperature only, send to trd_tra_mng
-            &  jptra_qsr )   ;   trdt(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
-                                 ztrds(:,:,:) = 0._wp
+            &  jptra_qsr )   ;   trdt(T2D(0),:) = ptrd(T2D(0),:) * tmask(T2D(0),:)
+                                 ztrds(T2D(0),:) = 0._wp
                                  CALL trd_tra_mng( trdt, ztrds, ktrd, kt, Kmm )
  !!gm Gurvan, verify the jptra_evd trend please !
-         CASE( jptra_evd )   ;   avt_evd(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
+         CASE( jptra_evd )   ;   avt_evd(T2D(0),:) = ptrd(T2D(0),:) * tmask(T2D(0),:)
          CASE DEFAULT                 ! other trends: masked trends
-            trdt(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)              ! mask & store
+            trdt(T2D(0),:) = ptrd(T2D(0),:) * tmask(T2D(0),:)              ! mask & store
          END SELECT
          !
       ENDIF
@@ -127,44 +128,44 @@ CONTAINS
                                   CALL trd_tra_mng( trdt , ztrds, ktrd, kt, Kmm   )
          CASE( jptra_zdfp )           ! diagnose the "PURE" Kz trend (here: just before the swap)
             !                         ! iso-neutral diffusion case otherwise jptra_zdf is "PURE"
-            ALLOCATE( zwt(jpi,jpj,jpk), zws(jpi,jpj,jpk), ztrdt(jpi,jpj,jpk) )
+            ALLOCATE( zwt(T2D(0),jpk), zws(T2D(0),jpk), ztrdt(T2D(0),jpk) )
             !
-            zwt(:,:, 1 ) = 0._wp   ;   zws(:,:, 1 ) = 0._wp            ! vertical diffusive fluxes
-            zwt(:,:,jpk) = 0._wp   ;   zws(:,:,jpk) = 0._wp
-            DO jk = 2, jpk
-               zwt(:,:,jk) = avt(:,:,jk) * ( ts(:,:,jk-1,jp_tem,Krhs) - ts(:,:,jk,jp_tem,Krhs) )   &
-                  &        / e3w(:,:,jk,Kmm) * tmask(:,:,jk)
-               zws(:,:,jk) = avs(:,:,jk) * ( ts(:,:,jk-1,jp_sal,Krhs) - ts(:,:,jk,jp_sal,Krhs) )   &
-                  &        / e3w(:,:,jk,Kmm) * tmask(:,:,jk)
-            END DO
+            zwt(T2D(0), 1 ) = 0._wp   ;   zws(T2D(0), 1 ) = 0._wp            ! vertical diffusive fluxes
+            zwt(T2D(0),jpk) = 0._wp   ;   zws(T2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 2, jpk )
+               z1e3w = 1._wp / ( e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) )
+               zwt(ji,jj,jk) = avt(ji,jj,jk) * ( ts(ji,jj,jk-1,jp_tem,Krhs) - ts(ji,jj,jk,jp_tem,Krhs) ) * z1e3w
+               zws(ji,jj,jk) = avs(ji,jj,jk) * ( ts(ji,jj,jk-1,jp_sal,Krhs) - ts(ji,jj,jk,jp_sal,Krhs) ) * z1e3w
+            END_3D
             !
-            ztrdt(:,:,jpk) = 0._wp   ;   ztrds(:,:,jpk) = 0._wp
-            DO jk = 1, jpkm1
-               ztrdt(:,:,jk) = ( zwt(:,:,jk) - zwt(:,:,jk+1) ) / e3t(:,:,jk,Kmm)
-               ztrds(:,:,jk) = ( zws(:,:,jk) - zws(:,:,jk+1) ) / e3t(:,:,jk,Kmm) 
-            END DO
+            ztrdt(T2D(0),jpk) = 0._wp   ;   ztrds(T2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+               z1e3w = 1._wp / e3w(ji,jj,jk,Kmm) 
+               ztrdt(ji,jj,jk) = ( zwt(ji,jj,jk) - zwt(ji,jj,jk+1) ) * z1e3w
+               ztrds(ji,jj,jk) = ( zws(ji,jj,jk) - zws(ji,jj,jk+1) ) * z1e3w
+            END_3D
             CALL trd_tra_mng( ztrdt, ztrds, jptra_zdfp, kt, Kmm )  
             !
             !                         ! Also calculate EVD trend at this point. 
-            zwt(:,:,:) = 0._wp   ;   zws(:,:,:) = 0._wp            ! vertical diffusive fluxes
-            DO jk = 2, jpk
-               zwt(:,:,jk) = avt_evd(:,:,jk) * ( ts(:,:,jk-1,jp_tem,Krhs) - ts(:,:,jk,jp_tem,Krhs) )   &
-                  &            / e3w(:,:,jk,Kmm) * tmask(:,:,jk)
-               zws(:,:,jk) = avt_evd(:,:,jk) * ( ts(:,:,jk-1,jp_sal,Krhs) - ts(:,:,jk,jp_sal,Krhs) )   &
-                  &            / e3w(:,:,jk,Kmm) * tmask(:,:,jk)
-            END DO
+            zwt(T2D(0), :) = 0._wp   ;   zws(T2D(0), :) = 0._wp            ! vertical diffusive fluxes
+            DO_3D( 0, 0, 0, 0, 2, jpk )
+               z1e3w = 1._wp / ( e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) )
+               zwt(ji,jj,jk) = avt_evd(ji,jj,jk) * ( ts(ji,jj,jk-1,jp_tem,Krhs) - ts(ji,jj,jk,jp_tem,Krhs) ) * z1e3w
+               zws(ji,jj,jk) = avt_evd(ji,jj,jk) * ( ts(ji,jj,jk-1,jp_sal,Krhs) - ts(ji,jj,jk,jp_sal,Krhs) ) * z1e3w
+            END_3D
             !
-            ztrdt(:,:,jpk) = 0._wp   ;   ztrds(:,:,jpk) = 0._wp
-            DO jk = 1, jpkm1
-               ztrdt(:,:,jk) = ( zwt(:,:,jk) - zwt(:,:,jk+1) ) / e3t(:,:,jk,Kmm)
-               ztrds(:,:,jk) = ( zws(:,:,jk) - zws(:,:,jk+1) ) / e3t(:,:,jk,Kmm) 
-            END DO
+            ztrdt(T2D(0),jpk) = 0._wp   ;   ztrds(T2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+               z1e3w = 1._wp / e3w(ji,jj,jk,Kmm) 
+               ztrdt(ji,jj,jk) = ( zwt(ji,jj,jk) - zwt(ji,jj,jk+1) ) * z1e3w
+               ztrds(ji,jj,jk) = ( zws(ji,jj,jk) - zws(ji,jj,jk+1) ) * z1e3w
+            END_3D
             CALL trd_tra_mng( ztrdt, ztrds, jptra_evd, kt, Kmm )  
             !
             DEALLOCATE( zwt, zws, ztrdt )
             !
          CASE DEFAULT                 ! other trends: mask and send T & S trends to trd_tra_mng
-            ztrds(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
+            ztrds(T2D(0),:) = ptrd(T2D(0),:) * tmask(T2D(0),:)
             CALL trd_tra_mng( trdt, ztrds, ktrd, kt, Kmm )  
          END SELECT
       ENDIF
@@ -177,7 +178,7 @@ CONTAINS
          CASE( jptra_yad )   ;   CALL trd_tra_adv( ptrd , pu , ptra, 'Y', ztrds, Kmm ) 
          CASE( jptra_zad )   ;   CALL trd_tra_adv( ptrd , pu , ptra, 'Z', ztrds, Kmm ) 
          CASE DEFAULT                 ! other trends: just masked 
-                                 ztrds(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
+                                 ztrds(T2D(0),:) = ptrd(T2D(0),:) * tmask(T2D(0),:)
          END SELECT
          !                            ! send trend to trd_trc
          CALL trd_trc( ztrds, ktra, ktrd, kt, Kmm ) 
@@ -199,12 +200,12 @@ CONTAINS
       !!       k-advective trends = -un. di+1[T] = -( dk+1[fi] - tn dk+1[un] )
       !!                where fi is the incoming advective flux.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pf      ! advective flux in one direction
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu      ! now velocity   in one direction
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt      ! now or before tracer 
-      CHARACTER(len=1)                , INTENT(in   ) ::   cdir    ! X/Y/Z direction
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   ptrd    ! advective trend in one direction
-      INTEGER,  INTENT(in)                            ::   Kmm     ! time level index
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pf      ! advective flux in one direction
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pu      ! now velocity   in one direction
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt      ! now or before tracer 
+      CHARACTER(len=1)          , INTENT(in   ) ::   cdir    ! X/Y/Z direction
+      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   ptrd    ! advective trend in one direction
+      INTEGER,  INTENT(in)                      ::   Kmm     ! time level index
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ii, ij, ik   ! index shift as function of the direction
@@ -217,9 +218,7 @@ CONTAINS
       END SELECT
       !
       !                               ! set to zero uncomputed values
-      ptrd(jpi,:,:) = 0._wp   ;   ptrd(1,:,:) = 0._wp
-      ptrd(:,jpj,:) = 0._wp   ;   ptrd(:,1,:) = 0._wp
-      ptrd(:,:,jpk) = 0._wp
+      ptrd(:,:,:) = 0._wp 
       !
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! advective trend
          ptrd(ji,jj,jk) = - (     pf (ji,jj,jk) - pf (ji-ii,jj-ij,jk-ik)                        &
@@ -248,7 +247,7 @@ CONTAINS
       !                   ! 3D output of tracers trends using IOM interface
       IF( ln_tra_trd )   CALL trd_tra_iom ( ptrdx, ptrdy, ktrd, kt, Kmm )
 
-      !                   ! Integral Constraints Properties for tracers trends                                       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+      !                   ! Integral Constraints Properties for tracers trends           
       IF( ln_glo_trd )   CALL trd_glo( ptrdx, ptrdy, ktrd, 'TRA', kt, Kmm )
 
       !                   ! Potential ENergy trends
@@ -305,8 +304,8 @@ CONTAINS
       INTEGER                   , INTENT(in   ) ::   kt      ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm     ! time level index
       !!
-      INTEGER ::   ji, jj, jk   ! dummy loop indices
-      INTEGER ::   ikbu, ikbv   ! local integers
+      INTEGER  :: ji, jj
+      REAL(wp) :: z1e3
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace 
       !!----------------------------------------------------------------------
       !
@@ -329,9 +328,12 @@ CONTAINS
          CASE( jptra_zad  )   ;   CALL iom_put( "ttrd_zad"  , ptrdx )        ! z- vertical   advection
                                   CALL iom_put( "strd_zad"  , ptrdy )
                                   IF( ln_linssh ) THEN                   ! cst volume : adv flux through z=0 surface
-                                     ALLOCATE( z2dx(jpi,jpj), z2dy(jpi,jpj) )
-                                     z2dx(:,:) = ww(:,:,1) * ts(:,:,1,jp_tem,Kmm) / e3t(:,:,1,Kmm)
-                                     z2dy(:,:) = ww(:,:,1) * ts(:,:,1,jp_sal,Kmm) / e3t(:,:,1,Kmm)
+                                     ALLOCATE( z2dx(T2D(0)), z2dy(T2D(0)) )
+                                     DO_2D( 0, 0, 0, 0 )
+                                        z1e3 = ww(ji,jj,1) / e3t(ji,jj,1,Kmm)
+                                        z2dx(ji,jj) = ts(ji,jj,1,jp_tem,Kmm) * z1e3
+                                        z2dy(ji,jj) = ts(ji,jj,1,jp_sal,Kmm) * z1e3
+                                     END_2D
                                      CALL iom_put( "ttrd_sad", z2dx )
                                      CALL iom_put( "strd_sad", z2dy )
                                      DEALLOCATE( z2dx, z2dy )
diff --git a/src/OCE/TRD/trdvor.F90 b/src/OCE/TRD/trdvor.F90
index 974f5b1a..72763255 100644
--- a/src/OCE/TRD/trdvor.F90
+++ b/src/OCE/TRD/trdvor.F90
@@ -68,9 +68,9 @@ CONTAINS
       !!----------------------------------------------------------------------------
       !!                  ***  ROUTINE trd_vor_alloc  ***
       !!----------------------------------------------------------------------------
-      ALLOCATE( vor_avr   (jpi,jpj) , vor_avrb(jpi,jpj) , vor_avrbb (jpi,jpj) ,   &
-         &      vor_avrbn (jpi,jpj) , rotot   (jpi,jpj) , vor_avrtot(jpi,jpj) ,   &
-         &      vor_avrres(jpi,jpj) , vortrd  (jpi,jpj,jpltot_vor) ,              &
+      ALLOCATE( vor_avr   (T2D(0)) , vor_avrb(T2D(0)) , vor_avrbb (T2D(0)) ,   &
+         &      vor_avrbn (T2D(0)) , rotot   (T2D(0)) , vor_avrtot(T2D(0)) ,   &
+         &      vor_avrres(T2D(0)) , vortrd  (T2D(0),jpltot_vor) ,              &
          &      ndexvor1  (jpi*jpj)                                ,   STAT= trd_vor_alloc )
          !
       CALL mpp_sum ( 'trdvor', trd_vor_alloc )
@@ -105,9 +105,9 @@ CONTAINS
       CASE( jpdyn_zad )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_zad, Kmm )   ! Vertical Advection 
       CASE( jpdyn_spg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_spg, Kmm )   ! Surface Pressure Grad. 
       CASE( jpdyn_zdf )                                                           ! Vertical Diffusion 
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                                                               ! wind stress trends
-            ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * rho0 )
-            ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * rho0 )
+         DO_2D( 0, 1, 0, 1 )                                                      ! wind stress trends
+            ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utauU(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * rho0 )
+            ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtauV(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * rho0 )
          END_2D
          CALL trd_vor_zint( putrd, pvtrd, jpvor_zdf, Kmm )                             ! zdf trend including surf./bot. stresses 
          CALL trd_vor_zint( ztswu, ztswv, jpvor_swf, Kmm )                             ! surface wind stress 
@@ -165,7 +165,7 @@ CONTAINS
       SELECT CASE( ktrd ) 
       !
       CASE( jpvor_bfr )        ! bottom friction
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 1, 0, 1 )
             ikbu = mbkv(ji,jj)
             ikbv = mbkv(ji,jj)            
             zudpvor(ji,jj) = putrdvor(ji,jj) * e3u(ji,jj,ikbu,Kmm) * e1u(ji,jj) * umask(ji,jj,ikbu)
@@ -173,14 +173,18 @@ CONTAINS
          END_2D
          !
       CASE( jpvor_swf )        ! wind stress
-         zudpvor(:,:) = putrdvor(:,:) * e3u(:,:,1,Kmm) * e1u(:,:) * umask(:,:,1)
-         zvdpvor(:,:) = pvtrdvor(:,:) * e3v(:,:,1,Kmm) * e2v(:,:) * vmask(:,:,1)
+         DO_2D( 0, 1, 0, 1 )
+            zudpvor(ji,jj) = putrdvor(ji,jj) * e3u(ji,jj,1,Kmm) * e1u(ji,jj) * umask(ji,jj,1)
+            zvdpvor(ji,jj) = pvtrdvor(ji,jj) * e3v(ji,jj,1,Kmm) * e2v(ji,jj) * vmask(ji,jj,1)
+         END_2D
          !
       END SELECT
 
       ! Average except for Beta.V
-      zudpvor(:,:) = zudpvor(:,:) * r1_hu(:,:,Kmm)
-      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv(:,:,Kmm)
+      DO_2D( 0, 1, 0, 1 )
+         zudpvor(ji,jj) = zudpvor(ji,jj) * r1_hu(ji,jj,Kmm)
+         zvdpvor(ji,jj) = zvdpvor(ji,jj) * r1_hv(ji,jj,Kmm)
+      END_2D
    
       ! Curl
       DO_2D( 0, 0, 0, 0 )
@@ -238,10 +242,11 @@ CONTAINS
       !  I vertical integration of 3D trends
       !  =====================================
       ! putrdvor and pvtrdvor terms
-      DO jk = 1,jpk
-        zudpvor(:,:) = zudpvor(:,:) + putrdvor(:,:,jk) * e3u(:,:,jk,Kmm) * e1u(:,:) * umask(:,:,jk)
-        zvdpvor(:,:) = zvdpvor(:,:) + pvtrdvor(:,:,jk) * e3v(:,:,jk,Kmm) * e2v(:,:) * vmask(:,:,jk)
-      END DO
+      zudpvor(:,:) = 0._wp ; zvdpvor(:,:) = 0._wp
+      DO_3D( 0, 1, 0, 1, 1, jpk )
+        zudpvor(ji,jj) = zudpvor(ji,jj) + putrdvor(ji,jj,jk) * e3u(ji,jj,jk,Kmm) * e1u(ji,jj) * umask(ji,jj,jk)
+        zvdpvor(ji,jj) = zvdpvor(ji,jj) + pvtrdvor(ji,jj,jk) * e3v(ji,jj,jk,Kmm) * e2v(ji,jj) * vmask(ji,jj,jk)
+      END_3D
 
       ! Planetary vorticity: 2nd computation (Beta.V term) store the vertical sum
       ! as Beta.V term need intergration, not average
@@ -254,8 +259,10 @@ CONTAINS
       ENDIF
       !
       ! Average 
-      zudpvor(:,:) = zudpvor(:,:) * r1_hu(:,:,Kmm)
-      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv(:,:,Kmm)
+      DO_2D( 0, 1, 0, 1 )
+         zudpvor(ji,jj) = zudpvor(ji,jj) * r1_hu(ji,jj,Kmm)
+         zvdpvor(ji,jj) = zvdpvor(ji,jj) * r1_hv(ji,jj,Kmm)
+      END_2D
       !
       ! Curl
       DO_2D( 0, 0, 0, 0 )
@@ -368,10 +375,6 @@ CONTAINS
          zmean = 1._wp / REAL( nmoydpvor, wp )
          vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean
 
-         ! Boundary conditions
-         CALL lbc_lnk( 'trdvor', vor_avrtot, 'F', 1.0_wp , vor_avrres, 'F', 1.0_wp )
-
-
          ! III.3 time evolution array swap
          ! ------------------------------
          vor_avrbb(:,:) = vor_avrb(:,:)
diff --git a/src/OCE/USR/usrdef_fmask.F90 b/src/OCE/USR/usrdef_fmask.F90
index bc97a2ed..d1e0d482 100644
--- a/src/OCE/USR/usrdef_fmask.F90
+++ b/src/OCE/USR/usrdef_fmask.F90
@@ -69,25 +69,25 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ij0 = 101 + nn_hls       ;   ij1 = 101 + nn_hls           ! Gibraltar strait  : partial slip (pfmsk=0.5)
             ii0 = 139 + nn_hls - 1   ;   ii1 = 140 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             ij0 = 102 + nn_hls       ;   ij1 = 102 + nn_hls
             ii0 = 139 + nn_hls - 1   ;   ii1 = 140 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             !
             IF(lwp) WRITE(numout,*) '      Bab el Mandeb '
             ij0 =  87 + nn_hls       ;   ij1 = 88  + nn_hls          ! Bab el Mandeb : partial slip (pfmsk=1)
             ii0 = 160 + nn_hls - 1   ;   ii1 = 160 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             ij0 =  88 + nn_hls       ;   ij1 =  88 + nn_hls
             ii0 = 159 + nn_hls - 1   ;   ii1 = 159 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             !
             ! We keep this as an example but it is instable in this case 
             !IF(lwp) WRITE(numout,*) '      Danish straits '
             !         ij0 = 115   ;   ij1 = 115 ! Danish straits  : strong slip (pfmsk > 2)
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !         ij0 = 116   ;   ij1 = 116
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !
          CASE( 1 )                           ! R1 case
             IF(lwp) WRITE(numout,*)
@@ -104,42 +104,42 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ii0 = 282 + nn_hls - 1       ;   ii1 = 283 + nn_hls - 1        ! Gibraltar Strait 
             ij0 = 241 + nn_hls - isrow   ;   ij1 = 241 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Bhosporus '
             ii0 = 314 + nn_hls - 1       ;   ii1 = 315 + nn_hls - 1        ! Bhosporus Strait 
             ij0 = 248 + nn_hls - isrow   ;   ij1 = 248 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Makassar (Top) '
             ii0 =  48 + nn_hls - 1       ;   ii1 =  48 + nn_hls - 1        ! Makassar Strait (Top) 
             ij0 = 189 + nn_hls - isrow   ;   ij1 = 190 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      Lombok '
             ii0 =  44 + nn_hls - 1       ;   ii1 =  44 + nn_hls - 1        ! Lombok Strait 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Ombai '
             ii0 =  53 + nn_hls - 1       ;   ii1 =  53 + nn_hls - 1        ! Ombai Strait 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Timor Passage '
             ii0 =  56 + nn_hls - 1       ;   ii1 =  56 + nn_hls - 1        ! Timor Passage 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      West Halmahera '
             ii0 =  58 + nn_hls - 1       ;   ii1 =  58 + nn_hls - 1        ! West Halmahera Strait 
             ij0 = 181 + nn_hls - isrow   ;   ij1 = 182 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      East Halmahera '
             ii0 =  55 + nn_hls - 1       ;   ii1 =  55 + nn_hls - 1        ! East Halmahera Strait 
             ij0 = 181 + nn_hls - isrow   ;   ij1 = 182 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
          CASE DEFAULT
             IF(lwp) WRITE(numout,*)
diff --git a/src/OCE/USR/usrdef_hgr.F90 b/src/OCE/USR/usrdef_hgr.F90
index 2f617b55..cbcb3ff8 100644
--- a/src/OCE/USR/usrdef_hgr.F90
+++ b/src/OCE/USR/usrdef_hgr.F90
@@ -115,8 +115,8 @@ CONTAINS
       ENDIF
       !   
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zim1 = REAL( mig0(ji), wp ) - 1.   ;   zim05 = REAL( mig0(ji), wp ) - 1.5
-         zjm1 = REAL( mjg0(jj), wp ) - 1.   ;   zjm05 = REAL( mjg0(jj), wp ) - 1.5
+         zim1 = REAL( mig(ji,0), wp ) - 1.   ;   zim05 = REAL( mig(ji,0), wp ) - 1.5
+         zjm1 = REAL( mjg(jj,0), wp ) - 1.   ;   zjm05 = REAL( mjg(jj,0), wp ) - 1.5
          !   
          !glamt(i,j) longitude at T-point
          !gphit(i,j) latitude at T-point  
diff --git a/src/OCE/USR/usrdef_sbc.F90 b/src/OCE/USR/usrdef_sbc.F90
index ce5b785a..0be3bd7e 100644
--- a/src/OCE/USR/usrdef_sbc.F90
+++ b/src/OCE/USR/usrdef_sbc.F90
@@ -109,7 +109,7 @@ CONTAINS
 
       ztrp= - 40.e0        ! retroaction term on heat fluxes (W/m2/K)
       zconv = 3.16e-5      ! convertion factor: 1 m/yr => 3.16e-5 mm/s
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! emp and rnf used in sshwzv over the whole domain
+      DO_2D( 0, 0, 0, 0 )
          ! domain from 15 deg to 50 deg between 27 and 28  degC at 15N, -3
          ! and 13 degC at 50N 53.5 + or - 11 = 1/4 period :
          ! 64.5 in summer, 42.5 in winter
@@ -119,6 +119,8 @@ CONTAINS
          ! 23.5 deg : tropics
          qsr (ji,jj) =  230 * COS( 3.1415 * ( gphit(ji,jj) - 23.5 * zcos_sais1 ) / ( 0.9 * 180 ) )
          qns (ji,jj) = ztrp * ( ts(ji,jj,1,jp_tem,Kbb) - t_star ) - qsr(ji,jj)
+      END_2D
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! emp and rnf used in sshwzv over the whole domain
          IF( gphit(ji,jj) >= 14.845 .AND. 37.2 >= gphit(ji,jj) ) THEN    ! zero at 37.8 deg, max at 24.6 deg
             emp  (ji,jj) =   zemp_S * zconv   &
                &         * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (24.6 - 37.2) )  &
@@ -137,6 +139,8 @@ CONTAINS
       ! freshwater (mass flux) and update of qns with heat content of emp
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )   ! emp used in sshwzv over the whole domain
          emp (ji,jj) = emp(ji,jj) - zsumemp * tmask(ji,jj,1)          ! freshwater flux (=0 in domain average)
+      END_2D
+      DO_2D( 0, 0, 0, 0 )
          sfx (ji,jj) = 0.0_wp                                         ! no salt flux
          qns (ji,jj) = qns(ji,jj) - emp(ji,jj) * sst_m(ji,jj) * rcp   ! evap and precip are at SST
       END_2D
@@ -166,19 +170,17 @@ CONTAINS
       ! seasonal oscillation intensity
       ztau_sais = 0.015
       ztaun = ztau - ztau_sais * COS( (ztime - ztimemax) / (ztimemin - ztimemax) * rpi )
-      DO_2D( 1, 1, 1, 1 )
+      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
         ! domain from 15deg to 50deg and 1/2 period along 14deg
         ! so 5/4 of half period with seasonal cycle
-        utau(ji,jj) = - ztaun * SIN( rpi * (gphiu(ji,jj) - 15.) / (29.-15.) )
-        vtau(ji,jj) =   ztaun * SIN( rpi * (gphiv(ji,jj) - 15.) / (29.-15.) )
+        utau(ji,jj) = - ztaun * SIN( rpi * (gphit(ji,jj) - 15.) / (29.-15.) )
+        vtau(ji,jj) =   ztaun * SIN( rpi * (gphit(ji,jj) - 15.) / (29.-15.) )
       END_2D
 
       ! module of wind stress and wind speed at T-point
       zcoef = 1. / ( zrhoa * zcdrag ) 
       DO_2D( 0, 0, 0, 0 )
-         ztx = utau(ji-1,jj  ) + utau(ji,jj) 
-         zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
-         zmod = 0.5 * SQRT( ztx * ztx + zty * zty )
+         zmod = SQRT( utau(ji,jj) * utau(ji,jj) + vtau(ji,jj) * vtau(ji,jj) )
          taum(ji,jj) = zmod
          wndm(ji,jj) = SQRT( zmod * zcoef )
       END_2D
diff --git a/src/OCE/USR/usrdef_zgr.F90 b/src/OCE/USR/usrdef_zgr.F90
index 99916151..4523a2ff 100644
--- a/src/OCE/USR/usrdef_zgr.F90
+++ b/src/OCE/USR/usrdef_zgr.F90
@@ -36,11 +36,11 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
       &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
       &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pe3w  , pe3uw , pe3vw                       )   !     -      -      -
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -49,16 +49,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
-      !
-      INTEGER  ::   inum   ! local logical unit
-      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
-      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -80,11 +76,12 @@ CONTAINS
       !
       CALL zgr_msk_top_bot( k_top , k_bot )                 ! masked top and bottom ocean t-level indices
       !
-      !                                                     ! z-coordinate (3D arrays) from the 1D z-coord.
-      CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
-         &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
-         &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
-         &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      IF( PRESENT( pe3t ) ) THEN                            ! z-coordinate (3D arrays) from the 1D z-coord.
+         CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
+            &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
+            &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
+            &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
diff --git a/src/OCE/ZDF/zdf_oce.F90 b/src/OCE/ZDF/zdf_oce.F90
index 40bcb56c..ca4a688a 100644
--- a/src/OCE/ZDF/zdf_oce.F90
+++ b/src/OCE/ZDF/zdf_oce.F90
@@ -53,6 +53,8 @@ MODULE zdf_oce
    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:)     ::   avmb , avtb    !: background profile of avm and avt      [m2/s]
    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   avtb_2d        !: horizontal shape of background Kz profile [-]
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: zdf_oce.F90 14072 2020-12-04 07:48:38Z laurent $
@@ -65,9 +67,9 @@ CONTAINS
       !!            *** FUNCTION zdf_oce_alloc ***
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( avm (jpi,jpj,jpk) , avm_k(jpi,jpj,jpk) , avs(jpi,jpj,jpk) ,   &
-         &      avt (jpi,jpj,jpk) , avt_k(jpi,jpj,jpk) , en (jpi,jpj,jpk) ,   &
-         &      avmb(jpk)         , avtb(jpk)          , avtb_2d(jpi,jpj) , STAT = zdf_oce_alloc )
+      ALLOCATE( avm (jpi,jpj,jpk), avm_k(jpi,jpj,jpk), avs(A2D(0),jpk) ,   &
+         &      avt (A2D(0),jpk) , avt_k(A2D(0),jpk) , en (A2D(0),jpk) ,   &
+         &      avmb(jpk)        , avtb(jpk)         , avtb_2d(A2D(0)) , STAT = zdf_oce_alloc )
          !
       IF( zdf_oce_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_oce_alloc: failed to allocate arrays' )
       !
diff --git a/src/OCE/ZDF/zdfddm.F90 b/src/OCE/ZDF/zdfddm.F90
index a08cf343..5fa6c719 100644
--- a/src/OCE/ZDF/zdfddm.F90
+++ b/src/OCE/ZDF/zdfddm.F90
@@ -70,9 +70,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index
       INTEGER, INTENT(in   ) ::   Kmm      ! ocean time level index
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm   !  Kz on momentum    (w-points)
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avt   !  Kz on temperature (w-points)
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avs   !  Kz on salinity    (w-points)
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm   !  Kz on momentum    (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt   !  Kz on temperature (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(  out) ::   p_avs   !  Kz on salinity    (w-points)
       !
       INTEGER  ::   ji, jj , jk     ! dummy loop indices
       REAL(wp) ::   zaw, zbw, zrw   ! local scalars
@@ -82,7 +82,7 @@ CONTAINS
       REAL(wp) ::   zavft           !   -      -
       REAL(dp) ::          zavfs    !   -      -
       REAL(wp) ::   zavdt, zavds    !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3
+      REAL(wp), DIMENSION(T2D(0)) ::   zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3
       !!----------------------------------------------------------------------
       !
       !                                                ! ===============
@@ -94,7 +94,7 @@ CONTAINS
 !!gm                     ==>>>  test in the loop instead of use of mask arrays
 !!gm                            and many acces in memory
          
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )           !==  R=zrau = (alpha / beta) (dk[t] / dk[s])  ==!
+         DO_2D( 0, 0, 0, 0 )           !==  R=zrau = (alpha / beta) (dk[t] / dk[s])  ==!
             zrw =   ( gdepw(ji,jj,jk  ,Kmm) - gdept(ji,jj,jk,Kmm) )   &
 !!gm please, use e3w at Kmm below 
                &  / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) ) 
@@ -110,7 +110,7 @@ CONTAINS
             zrau(ji,jj) = MAX(  1.e-20, zdt / zds  )    ! only retains positive value of zrau
          END_2D
 
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )           !==  indicators  ==!
+         DO_2D( 0, 0, 0, 0 )           !==  indicators  ==!
             ! stability indicator: msks=1 if rn2>0; 0 elsewhere
             IF( rn2(ji,jj,jk) + 1.e-12  <= 0. ) THEN   ;   zmsks(ji,jj) = 0._wp
             ELSE                                       ;   zmsks(ji,jj) = 1._wp * wmask(ji,jj,jk)   ! mask so avt and avs masked
@@ -137,7 +137,7 @@ CONTAINS
          ! Update avt and avs
          ! ------------------
          ! Constant eddy coefficient: reset to the background value
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zinr = 1._wp / zrau(ji,jj)
             ! salt fingering
             zrr = zrau(ji,jj) / rn_hsbfr
diff --git a/src/OCE/ZDF/zdfdrg.F90 b/src/OCE/ZDF/zdfdrg.F90
index 7c866594..a20067bf 100644
--- a/src/OCE/ZDF/zdfdrg.F90
+++ b/src/OCE/ZDF/zdfdrg.F90
@@ -116,7 +116,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !
       IF( l_log_not_linssh ) THEN     !==  "log layer"  ==!   compute Cd and -Cd*|U|
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             imk = k_mk(ji,jj)          ! ocean bottom level at t-points
             zut = uu(ji,jj,imk,Kmm) + uu(ji-1,jj,imk,Kmm)     ! 2 x velocity at t-point
             zvt = vv(ji,jj,imk,Kmm) + vv(ji,jj-1,imk,Kmm)
@@ -128,7 +128,7 @@ CONTAINS
             pCdU(ji,jj) = - zcd * SQRT(  0.25 * ( zut*zut + zvt*zvt ) + pke0  )
          END_2D
       ELSE                                            !==  standard Cd  ==!
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             imk = k_mk(ji,jj)    ! ocean bottom level at t-points
             zut = uu(ji,jj,imk,Kmm) + uu(ji-1,jj,imk,Kmm)     ! 2 x velocity at t-point
             zvt = vv(ji,jj,imk,Kmm) + vv(ji,jj-1,imk,Kmm)
diff --git a/src/OCE/ZDF/zdfevd.F90 b/src/OCE/ZDF/zdfevd.F90
index df8bfeaa..373fd1f6 100644
--- a/src/OCE/ZDF/zdfevd.F90
+++ b/src/OCE/ZDF/zdfevd.F90
@@ -56,13 +56,14 @@ CONTAINS
       !!
       !! ** Action  :   avt, avm   enhanced where static instability occurs
       !!----------------------------------------------------------------------
-      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time-step indexocean time step
-      INTEGER                    , INTENT(in   ) ::   Kmm, Krhs      ! time level indices
-      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step indexocean time step
+      INTEGER                         , INTENT(in   ) ::   Kmm, Krhs      ! time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !
       INTEGER ::   ji, jj, jk   ! dummy loop indices
-      ! NOTE: [tiling] use a SAVE array to store diagnostics, then send after all tiles are finished. This is necessary because p_avt/p_avm are modified on adjacent tiles when using nn_hls > 1. zavt_evd/zavm_evd are then zero on some points when subsequently calculated for these tiles.
-      REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   zavt_evd, zavm_evd
+      REAL(wp), DIMENSION(T2D(0),jpk)             ::   zavt_evd
+      REAL(wp), DIMENSION(:,:,:),     ALLOCATABLE ::   zavm_evd
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -72,13 +73,10 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '~~~~~~~ '
             IF(lwp) WRITE(numout,*)
          ENDIF
-
-         ALLOCATE( zavt_evd(jpi,jpj,jpk) )
-         IF( nn_evdm == 1 ) ALLOCATE( zavm_evd(jpi,jpj,jpk) )
       ENDIF
       !
       !
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk)         ! set avt prior to evd application
       END_3D
       !
@@ -86,7 +84,8 @@ CONTAINS
       !
       CASE ( 1 )           !==  enhance tracer & momentum Kz  ==!   (if rn2<-1.e-12)
          !
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+         ALLOCATE( zavm_evd(T2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpk )
             zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk)      ! set avm prior to evd application
          END_3D
          !
@@ -96,20 +95,18 @@ CONTAINS
 !            p_avm(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)
 !         END WHERE
          !
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
                p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
                p_avm(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
             ENDIF
          END_3D
          !
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+         DO_3D( 0, 0, 0, 0, 1, jpk )
             zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk) - zavm_evd(ji,jj,jk)   ! change in avm due to evd
          END_3D
-         IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
-            CALL iom_put( "avm_evd", zavm_evd )                ! output this change
-            DEALLOCATE( zavm_evd )
-         ENDIF
+         CALL iom_put( "avm_evd", zavm_evd )                ! output this change
+         DEALLOCATE( zavm_evd )
          !
       CASE DEFAULT         !==  enhance tracer Kz  ==!   (if rn2<-1.e-12) 
 !! change last digits results
@@ -117,24 +114,19 @@ CONTAINS
 !            p_avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)
 !         END WHERE
 
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
                p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
          END_3D
          !
       END SELECT 
       !
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk) - zavt_evd(ji,jj,jk)   ! change in avt due to evd
       END_3D
-      !
+      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
       IF( l_trdtra ) CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_evd, zavt_evd )
       !
-      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
-         CALL iom_put( "avt_evd", zavt_evd )              ! output this change
-         DEALLOCATE( zavt_evd )
-      ENDIF
-      !
    END SUBROUTINE zdf_evd
 
    !!======================================================================
diff --git a/src/OCE/ZDF/zdfgls.F90 b/src/OCE/ZDF/zdfgls.F90
index b2567079..d5fd971f 100644
--- a/src/OCE/ZDF/zdfgls.F90
+++ b/src/OCE/ZDF/zdfgls.F90
@@ -17,7 +17,6 @@ MODULE zdfgls
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and active tracers
    USE dom_oce        ! ocean space and time domain
-   USE domvvl         ! ocean space and time domain : variable volume layer
    USE zdfdrg  , ONLY : ln_drg_OFF            ! top/bottom free-slip flag
    USE zdfdrg  , ONLY : r_z0_top , r_z0_bot   ! top/bottom roughness
    USE zdfdrg  , ONLY : rCdU_top , rCdU_bot   ! top/bottom friction
@@ -126,8 +125,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  FUNCTION zdf_gls_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( hmxl_n(jpi,jpj,jpk) , ustar2_surf(jpi,jpj) ,                     &
-         &      zwall (jpi,jpj,jpk) , ustar2_top (jpi,jpj) , ustar2_bot(jpi,jpj) , STAT= zdf_gls_alloc )
+      ALLOCATE( hmxl_n(A2D(0),jpk) , ustar2_surf(A2D(0)) ,                     &
+         &      zwall (A2D(0),jpk) , ustar2_top (A2D(0)) , ustar2_bot(A2D(0)) , STAT= zdf_gls_alloc )
          !
       CALL mpp_sum ( 'zdfgls', zdf_gls_alloc )
       IF( zdf_gls_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_gls_alloc: failed to allocate arrays' )
@@ -143,10 +142,11 @@ CONTAINS
       !!----------------------------------------------------------------------
       USE zdf_oce , ONLY : en, avtb, avmb   ! ocean vertical physics
       !!
-      INTEGER                             , INTENT(in   ) ::   kt             ! ocean time step
-      INTEGER                             , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   p_sh2          ! shear production term
-      REAL(wp), DIMENSION(:,:,:)          , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time step
+      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(in   ) ::   p_sh2          ! shear production term
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !
       INTEGER  ::   ji, jj, jk    ! dummy loop arguments
       INTEGER  ::   ibot, ibotm1  ! local integers
@@ -157,51 +157,51 @@ CONTAINS
       REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      -
       REAL(wp) ::   gh, gm, shr, dif, zsqen, zavt, zavm !   -      -
       REAL(wp) ::   zmsku, zmskv                        !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zdep
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zkar
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zflxs                 ! Turbulence fluxed induced by internal waves
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zhsro                 ! Surface roughness (surface waves)
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zice_fra              ! Tapering of wave breaking under sea ice
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   eb                    ! tke at time before
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   hmxl_b                ! mixing length at time before
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   eps                   ! dissipation rate
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwall_psi             ! Wall function use in the wb case (ln_sigpsi)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   psi                   ! psi at time now
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zstt, zstm            ! stability function on tracer and momentum
+      REAL(wp), DIMENSION(T2D(0))     ::   zdep
+      REAL(wp), DIMENSION(T2D(0))     ::   zkar
+      REAL(wp), DIMENSION(T2D(0))     ::   zflxs                 ! Turbulence fluxed induced by internal waves
+      REAL(wp), DIMENSION(T2D(0))     ::   zhsro                 ! Surface roughness (surface waves)
+      REAL(wp), DIMENSION(T2D(0))     ::   zice_fra              ! Tapering of wave breaking under sea ice
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   eb                    ! tke at time before
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   hmxl_b                ! mixing length at time before
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   eps                   ! dissipation rate
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zwall_psi             ! Wall function use in the wb case (ln_sigpsi)
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   psi                   ! psi at time now
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zstt, zstm            ! stability function on tracer and momentum
       !!--------------------------------------------------------------------
       !
       ! Preliminary computing
-      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          ustar2_surf(ji,jj) = 0._wp   ;   ustar2_top(ji,jj) = 0._wp   ;   ustar2_bot(ji,jj) = 0._wp
       END_2D
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          psi(ji,jj,jk) = 0._wp   ;   zwall_psi(ji,jj,jk) = 0._wp
       END_3D
 
       SELECT CASE ( nn_z0_ice )
       CASE( 0 )   ;   zice_fra(:,:) = 0._wp
-      CASE( 1 )   ;   zice_fra(:,:) =        TANH( fr_i(A2D(nn_hls)) * 10._wp )
-      CASE( 2 )   ;   zice_fra(:,:) =              fr_i(A2D(nn_hls))
-      CASE( 3 )   ;   zice_fra(:,:) = MIN( 4._wp * fr_i(A2D(nn_hls)) , 1._wp )
+      CASE( 1 )   ;   zice_fra(:,:) =        TANH( fr_i(T2D(0)) * 10._wp )
+      CASE( 2 )   ;   zice_fra(:,:) =              fr_i(T2D(0))
+      CASE( 3 )   ;   zice_fra(:,:) = MIN( 4._wp * fr_i(T2D(0)) , 1._wp )
       END SELECT
 
       ! Compute surface, top and bottom friction at T-points
-      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )          !==  surface ocean friction
+      DO_2D( 0, 0, 0, 0 )          !==  surface ocean friction
          ustar2_surf(ji,jj) = r1_rho0 * taum(ji,jj) * tmask(ji,jj,1)   ! surface friction
       END_2D
       !
       !!gm Rq we may add here r_ke0(_top/_bot) ?  ==>> think about that...
       !
       IF( .NOT.ln_drg_OFF ) THEN     !== top/bottom friction   (explicit before friction)
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )          ! bottom friction (explicit before friction)
+         DO_2D( 0, 0, 0, 0 )          ! bottom friction (explicit before friction)
             zmsku = 0.5_wp * ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) )
             zmskv = 0.5_wp * ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0)
             ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( uu(ji,jj,mbkt(ji,jj),Kbb)+uu(ji-1,jj,mbkt(ji,jj),Kbb) ) )**2  &
                &                                         + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Kbb)+vv(ji,jj-1,mbkt(ji,jj),Kbb) ) )**2  )
          END_2D
          IF( ln_isfcav ) THEN
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )      ! top friction
+            DO_2D( 0, 0, 0, 0 )      ! top friction
                zmsku = 0.5_wp * ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) )
                zmskv = 0.5_wp * ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0)
                ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( uu(ji,jj,mikt(ji,jj),Kbb)+uu(ji-1,jj,mikt(ji,jj),Kbb) ) )**2  &
@@ -214,57 +214,59 @@ CONTAINS
       CASE ( 0 )                          ! Constant roughness
          zhsro(:,:) = rn_hsro
       CASE ( 1 )             ! Standard Charnock formula
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zhsro(ji,jj) = MAX( rsbc_zs1 * ustar2_surf(ji,jj) , rn_hsro )
          END_2D
       CASE ( 2 )             ! Roughness formulae according to Rascle et al., Ocean Modelling (2008)
 !!gm faster coding : the 2 comment lines should be used
 !!gm         zcof = 2._wp * 0.6_wp / 28._wp
 !!gm         zdep(:,:)  = 30._wp * TANH(  zcof/ SQRT( MAX(ustar2_surf(:,:),rsmall) )  )       ! Wave age (eq. 10)
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zcof = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(ji,jj),rsmall))) )          ! Wave age (eq. 10)
             zhsro(ji,jj) = MAX(rsbc_zs2 * ustar2_surf(ji,jj) * zcof**1.5, rn_hsro)        ! zhsro = rn_frac_hs * Hsw (eq. 11)
          END_2D
       CASE ( 3 )             ! Roughness given by the wave model (coupled or read in file)
-         zhsro(:,:) = MAX(rn_frac_hs * hsw(A2D(nn_hls)), rn_hsro)   ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 )
+         DO_2D( 0, 0, 0, 0 )
+            zhsro(ji,jj) = MAX(rn_frac_hs * hsw(ji,jj), rn_hsro)   ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 )
+         END_2D
       END SELECT
       !
       ! adapt roughness where there is sea ice
       SELECT CASE( nn_mxlice )       ! Type of scaling under sea-ice
       !
       CASE( 1 )                      ! scaling with constant sea-ice roughness
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zhsro(ji,jj) = ( (1._wp-zice_fra(ji,jj)) * zhsro(ji,jj) + zice_fra(ji,jj) * rn_hsri )*tmask(ji,jj,1)  + (1._wp - tmask(ji,jj,1))*rn_hsro
          END_2D
          !
       CASE( 2 )                      ! scaling with mean sea-ice thickness
 #if defined key_si3
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zhsro(ji,jj) = ( (1._wp-zice_fra(ji,jj)) * zhsro(ji,jj) + zice_fra(ji,jj) * hm_i(ji,jj) )*tmask(ji,jj,1)  + (1._wp - tmask(ji,jj,1))*rn_hsro
          END_2D
 #endif
          !
       CASE( 3 )                      ! scaling with max sea-ice thickness
 #if defined key_si3 || defined key_cice
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zhsro(ji,jj) = ( (1._wp-zice_fra(ji,jj)) * zhsro(ji,jj) + zice_fra(ji,jj) * MAXVAL(h_i(ji,jj,:)) )*tmask(ji,jj,1)  + (1._wp - tmask(ji,jj,1))*rn_hsro
          END_2D
 #endif
          !
       END SELECT
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  !==  Compute dissipation rate  ==!
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )  !==  Compute dissipation rate  ==!
          eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / hmxl_n(ji,jj,jk)
       END_3D
 
       ! Save tke at before time step
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          eb    (ji,jj,jk) = en    (ji,jj,jk)
          hmxl_b(ji,jj,jk) = hmxl_n(ji,jj,jk)
       END_3D
 
       IF( nn_clos == 0 ) THEN    ! Mellor-Yamada
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             zup   = hmxl_n(ji,jj,jk) * gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)
             zdown = vkarmn * gdepw(ji,jj,jk,Kmm) * ( -gdepw(ji,jj,jk,Kmm) + gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) )
             zcoef = ( zup / MAX( zdown, rsmall ) )
@@ -285,7 +287,7 @@ CONTAINS
       ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal
       ! Warning : after this step, en : right hand side of the matrix
 
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          !
          buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk)     ! stratif. destruction
          !
@@ -326,7 +328,7 @@ CONTAINS
          en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zesh2 * wmask(ji,jj,jk)
       END_3D
       !
-      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          zdiag(ji,jj,jpk) = 1._wp
          !
          ! Set surface condition on zwall_psi (1 at the bottom)
@@ -340,7 +342,7 @@ CONTAINS
       SELECT CASE ( nn_bc_surf )
       !
       CASE ( 0 )             ! Dirichlet boundary condition (set e at k=1 & 2)
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ! First level
             en   (ji,jj,1) = MAX(  rn_emin , rc02r * ustar2_surf(ji,jj) * (1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1)**r2_3  )
             zd_lw(ji,jj,1) = en(ji,jj,1)
@@ -356,7 +358,7 @@ CONTAINS
          END_2D
          !
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                IF( mikt(ji,jj) > 1 )THEN
                   itop   = mikt(ji,jj)       ! k   top w-point
                   itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
@@ -377,7 +379,7 @@ CONTAINS
          !
       CASE ( 1 )             ! Neumann boundary condition (set d(e)/dz)
          !
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ! Dirichlet conditions at k=1
             en   (ji,jj,1) = MAX(  rn_emin , rc02r * ustar2_surf(ji,jj) * (1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1)**r2_3  )
             zd_lw(ji,jj,1) = en(ji,jj,1)
@@ -398,7 +400,7 @@ CONTAINS
          END_2D
          !
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                IF( mikt(ji,jj) > 1 )THEN
                   itop   = mikt(ji,jj)       ! k   top w-point
                   itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
@@ -428,7 +430,7 @@ CONTAINS
       CASE ( 0 )             ! Dirichlet
          !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin
          !                      ! Balance between the production and the dissipation terms
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
 !!gm This means that bottom and ocean w-level above have a specified "en" value.   Sure ????
 !!   With thick deep ocean level thickness, this may be quite large, no ???
 !!   in particular in ocean cavities where top stratification can be large...
@@ -447,7 +449,7 @@ CONTAINS
          !
          ! NOTE: ctl_stop with ln_isfcav when using GLS
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                itop   = mikt(ji,jj)       ! k   top w-point
                itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
                !                                                ! mask at the ocean surface points
@@ -465,7 +467,7 @@ CONTAINS
          !
       CASE ( 1 )             ! Neumman boundary condition
          !
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point
             ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1
             !
@@ -481,7 +483,7 @@ CONTAINS
          END_2D
          ! NOTE: ctl_stop with ln_isfcav when using GLS
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                itop   = mikt(ji,jj)       ! k   top w-point
                itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
                !                                                ! mask at the ocean surface points
@@ -502,17 +504,17 @@ CONTAINS
       ! Matrix inversion (en prescribed at surface and the bottom)
       ! ----------------------------------------------------------
       !
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
          zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1)
       END_3D
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1
          zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1)
       END_3D
-      DO_3DS_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 )           ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
+      DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )           ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
          en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk)
       END_3D
       !                                            ! set the minimum value of tke
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin )
       END_3D
 
@@ -525,22 +527,22 @@ CONTAINS
       SELECT CASE ( nn_clos )
       !
       CASE( 0 )               ! k-kl  (Mellor-Yamada)
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             psi(ji,jj,jk)  = eb(ji,jj,jk) * hmxl_b(ji,jj,jk)
          END_3D
          !
       CASE( 1 )               ! k-eps
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             psi(ji,jj,jk)  = eps(ji,jj,jk)
          END_3D
          !
       CASE( 2 )               ! k-w
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * hmxl_b(ji,jj,jk) )
          END_3D
          !
       CASE( 3 )               ! generic
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn
          END_3D
          !
@@ -553,7 +555,7 @@ CONTAINS
       ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal
       ! Warning : after this step, en : right hand side of the matrix
 
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          !
          ! psi / k
          zratio = psi(ji,jj,jk) / eb(ji,jj,jk)
@@ -591,7 +593,7 @@ CONTAINS
          psi(ji,jj,jk) = psi(ji,jj,jk) + rn_Dt * zesh2 * wmask(ji,jj,jk)
       END_3D
       !
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          zdiag(ji,jj,jpk) = 1._wp
       END_2D
       
@@ -602,7 +604,7 @@ CONTAINS
       !
       CASE ( 0 )             ! Dirichlet boundary conditions
          !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ! Surface value
             zdep    (ji,jj)   = zhsro(ji,jj) * rl_sf ! Cosmetic
             psi     (ji,jj,1) = rc0**rpp * en(ji,jj,1)**rmm * zdep(ji,jj)**rnn * tmask(ji,jj,1)
@@ -621,7 +623,7 @@ CONTAINS
          !
       CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz
          !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ! Surface value: Dirichlet
             zdep    (ji,jj)   = zhsro(ji,jj) * rl_sf
             psi     (ji,jj,1) = rc0**rpp * en(ji,jj,1)**rmm * zdep(ji,jj)**rnn * tmask(ji,jj,1)
@@ -657,7 +659,7 @@ CONTAINS
       CASE ( 0 )             ! Dirichlet
          !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot
          !                      ! Balance between the production and the dissipation terms
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point
             ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1
             zdep(ji,jj) = vkarmn * r_z0_bot
@@ -675,7 +677,7 @@ CONTAINS
          END_2D
          !
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                IF ( mikt(ji,jj) > 1 ) THEN
                   itop   = mikt(ji,jj)       ! k   top w-point
                   itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
@@ -698,7 +700,7 @@ CONTAINS
          !
       CASE ( 1 )             ! Neumman boundary condition
          !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point
             ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1
             !
@@ -722,7 +724,7 @@ CONTAINS
          END_2D
          !
          IF( ln_isfcav) THEN     ! top boundary   (ocean cavity)
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                IF ( mikt(ji,jj) > 1 ) THEN
                   itop   = mikt(ji,jj)       ! k   top w-point
                   itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one
@@ -755,13 +757,13 @@ CONTAINS
       ! Matrix inversion
       ! ----------------
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
          zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1)
       END_3D
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1
          zd_lw(ji,jj,jk) = psi(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1)
       END_3D
-      DO_3DS( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 )           ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
+      DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )           ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
          psi(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * psi(ji,jj,jk+1) ) / zdiag(ji,jj,jk)
       END_3D
 
@@ -771,17 +773,17 @@ CONTAINS
       SELECT CASE ( nn_clos )
       !
       CASE( 0 )               ! k-kl  (Mellor-Yamada)
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             eps(ji,jj,jk) = rc03 * en(ji,jj,jk) * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / MAX( psi(ji,jj,jk), rn_epsmin)
          END_3D
          !
       CASE( 1 )               ! k-eps
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             eps(ji,jj,jk) = psi(ji,jj,jk)
          END_3D
          !
       CASE( 2 )               ! k-w
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk)
          END_3D
          !
@@ -789,7 +791,7 @@ CONTAINS
          zcoef = rc0**( 3._wp  + rpp/rnn )
          zex1  =      ( 1.5_wp + rmm/rnn )
          zex2  = -1._wp / rnn
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             eps(ji,jj,jk) = zcoef * en(ji,jj,jk)**zex1 * psi(ji,jj,jk)**zex2
          END_3D
          !
@@ -797,13 +799,13 @@ CONTAINS
 
       ! Limit dissipation rate under stable stratification
       ! --------------------------------------------------
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )   ! Note that this set boundary conditions on hmxl_n at the same time
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! Note that this set boundary conditions on hmxl_n at the same time
          ! limitation
          eps   (ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin )
          hmxl_n(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk)
       END_3D
       IF( ln_length_lim ) THEN        ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             zrn2 = MAX( rn2(ji,jj,jk), rsmall )
             hmxl_n(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxl_n(ji,jj,jk) )
          END_3D
@@ -816,7 +818,7 @@ CONTAINS
       SELECT CASE ( nn_stab_func )
       !
       CASE ( 0 , 1 )             ! Galperin or Kantha-Clayson stability functions
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             ! zcof =  l²/q²
             zcof = hmxl_b(ji,jj,jk) * hmxl_b(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) )
             ! Gh = -N²l²/q²
@@ -833,7 +835,7 @@ CONTAINS
          END_3D
          !
       CASE ( 2, 3 )               ! Canuto stability functions
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             ! zcof =  l²/q²
             zcof = hmxl_b(ji,jj,jk)*hmxl_b(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) )
             ! Gh = -N²l²/q²
@@ -861,17 +863,16 @@ CONTAINS
       ! Boundary conditions on stability functions for momentum (Neumann):
       ! Lines below are useless if GOTM style Dirichlet conditions are used
 
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          zstm(ji,jj,1) = zstm(ji,jj,2)
          zstm(ji,jj,jpk) = 0.  ! default value, in case jpk > mbkt(ji,jj)+1
          !                   ! Not needed but avoid a bug when looking for undefined values (-fpe0)
       END_2D
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )             ! update bottom with good values
+      DO_2D( 0, 0, 0, 0 )             ! update bottom with good values
          zstm(ji,jj,mbkt(ji,jj)+1) = zstm(ji,jj,mbkt(ji,jj))
       END_2D
-
-      zstt(:,:,  1) = wmask(A2D(nn_hls),  1)  ! default value not needed but avoid a bug when looking for undefined values (-fpe0)
-      zstt(:,:,jpk) = wmask(A2D(nn_hls),jpk)  ! default value not needed but avoid a bug when looking for undefined values (-fpe0)
+      zstt(:,:,  1) = wmask(A2D(0),  1)  ! default value not needed but avoid a bug when looking for undefined values (-fpe0)
+      zstt(:,:,jpk) = wmask(A2D(0),jpk)  ! default value not needed but avoid a bug when looking for undefined values (-fpe0)
 
 !!gm should be done for ISF (top boundary cond.)
 !!gm so, totally new staff needed!!gm
@@ -881,14 +882,14 @@ CONTAINS
       !  -> yes BUT p_avm(:,:1) and p_avm(:,:jpk) are used when we compute zd_lw(:,:2) and zd_up(:,:jpkm1). These values are
       !     later overwritten by surface/bottom boundaries conditions, so we don't really care of p_avm(:,:1) and p_avm(:,:jpk)
       !     for zd_lw and zd_up but they have to be defined to avoid a bug when looking for undefined values (-fpe0)
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk)
          zavt  = zsqen * zstt(ji,jj,jk)
          zavm  = zsqen * zstm(ji,jj,jk)
          p_avt(ji,jj,jk) = MAX( zavt, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine
          p_avm(ji,jj,jk) = MAX( zavm, avmb(jk) )                   ! Note that avm is not masked at the surface and the bottom
       END_3D
-      p_avt(A2D(nn_hls),1) = 0._wp
+      p_avt(:,:,1) = 0._wp
       !
       IF(sn_cfctl%l_prtctl) THEN
          CALL prt_ctl( tab3d_1=en   , clinfo1=' gls  - e: ', tab3d_2=p_avt, clinfo2=' t: ' )
@@ -970,7 +971,8 @@ CONTAINS
                CALL ctl_stop( 'zdf_gls_init: wrong value for nn_mxlice, should be 0,1,2,3 ')
          END SELECT
          IF     ( (nn_mxlice>0).AND.(nn_ice==0) ) THEN
-            CALL ctl_stop( 'zdf_gls_init: with no ice at all, nn_mxlice must be 0 ') 
+            CALL ctl_warn( 'zdf_gls_init: with no ice at all, nn_mxlice is set to 0 ')
+            nn_mxlice = 0
          ELSEIF ( (nn_mxlice>1).AND.(nn_ice==1) ) THEN
             CALL ctl_stop( 'zdf_gls_init: with no ice model, nn_mxlice must be 0 or 1')
          ENDIF
@@ -1212,7 +1214,7 @@ CONTAINS
       !
       !                                !* Wall proximity function
 !!gm tmask or wmask ????
-      zwall(:,:,:) = 1._wp * tmask(:,:,:)
+      zwall(:,:,:) = 1._wp * tmask(A2D(0),:)
 
       !                                !* read or initialize all required files
       CALL gls_rst( nit000, 'READ' )      ! (en, avt_k, avm_k, hmxl_n)
diff --git a/src/OCE/ZDF/zdfiwm.F90 b/src/OCE/ZDF/zdfiwm.F90
index d0a9540e..240adb95 100644
--- a/src/OCE/ZDF/zdfiwm.F90
+++ b/src/OCE/ZDF/zdfiwm.F90
@@ -65,8 +65,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  FUNCTION zdf_iwm_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( ebot_iwm(jpi,jpj),  ecri_iwm(jpi,jpj),  ensq_iwm(jpi,jpj) ,     &
-      &         esho_iwm(jpi,jpj),  hbot_iwm(jpi,jpj),  hcri_iwm(jpi,jpj) , STAT=zdf_iwm_alloc )
+      ALLOCATE( ebot_iwm(A2D(0)),  ecri_iwm(A2D(0)),  ensq_iwm(A2D(0)) ,     &
+      &         esho_iwm(A2D(0)),  hbot_iwm(A2D(0)),  hcri_iwm(A2D(0)) , STAT=zdf_iwm_alloc )
       !
       CALL mpp_sum ( 'zdfiwm', zdf_iwm_alloc )
       IF( zdf_iwm_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_iwm_alloc: failed to allocate arrays' )
@@ -100,7 +100,7 @@ CONTAINS
       !!                 2. Bottom-intensified dissipation above abyssal hills, expressed
       !!              as an algebraic decay above bottom.
       !!                     zemx_iwm(z) = ( ebot_iwm / rho0 ) * ( 1 + hbot_iwm/H ) 
-      !!                                   / ( 1 + (H-z)/hbot_iwm )^2                                
+      !!                                   / ( 1 + (H-z)/hbot_iwm )^2
       !!              where hbot_iwm is the characteristic length scale of the bottom 
       !!              intensification and ebot_iwm is a static 2D map of available power.
       !!                 3. Dissipation scaling in the vertical with the squared buoyancy 
@@ -127,29 +127,32 @@ CONTAINS
       !! References :  de Lavergne et al. JAMES 2020, https://doi.org/10.1029/2020MS002065
       !!               de Lavergne et al. JPO 2016, https://doi.org/10.1175/JPO-D-14-0259.1
       !!----------------------------------------------------------------------
-      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time step
-      INTEGER                    , INTENT(in   ) ::   Kmm            ! time level index      
-      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm          ! momentum Kz (w-points)
-      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avt, p_avs   ! tracer   Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time step
+      INTEGER                         , INTENT(in   ) ::   Kmm            ! time level index
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt, p_avs   ! vertical eddy diffusivity (w-points)
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp), SAVE :: zztmp
       !
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zfact       ! Used for vertical structure
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zReb        ! Turbulence intensity parameter
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zemx_iwm    ! local energy density available for mixing (W/kg)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zav_ratio   ! S/T diffusivity ratio (only for ln_tsdiff=T)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zav_wave    ! Internal wave-induced diffusivity
+      REAL(wp), DIMENSION(T2D(0))     ::   zfact       ! Used for vertical structure
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zReb        ! Turbulence intensity parameter
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zemx_iwm    ! local energy density available for mixing (W/kg)
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zav_ratio   ! S/T diffusivity ratio (only for ln_tsdiff=T)
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zav_wave    ! Internal wave-induced diffusivity
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3d  ! 3D workspace used for iom_put 
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2d  ! 2D     -      -    -     -
       !!----------------------------------------------------------------------
       !
-      !                       !* Initialize appropriately certain variables
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
-         zav_ratio(ji,jj,jk) = 1._wp * wmask(ji,jj,jk)  ! important to set it to 1 here 
-      END_3D
-      IF( iom_use("emix_iwm") )                         zemx_iwm (:,:,:) = 0._wp
-      IF( iom_use("av_wave") .OR. sn_cfctl%l_prtctl )   zav_wave (:,:,:) = 0._wp
+      !                       !* Initialize variables at 1 & jpk for diagnostics
+      zav_ratio(:,:,1  ) = 1._wp * wmask(T2D(0),1  )  ! important to set it to 1 here
+      zav_ratio(:,:,jpk) = 1._wp * wmask(T2D(0),jpk)
+      IF( iom_use("emix_iwm") ) THEN
+         zemx_iwm(:,:,1) = 0._wp ; zemx_iwm(:,:,jpk) = 0._wp
+      ENDIF
+      IF( iom_use("av_wave") .OR. sn_cfctl%l_prtctl ) THEN
+         zav_wave(:,:,1) = 0._wp ; zav_wave(:,:,jpk) = 0._wp
+      ENDIF
       !
       !                       ! ----------------------------- !
       !                       !  Internal wave-driven mixing  !  (compute zav_wave)
@@ -157,79 +160,78 @@ CONTAINS
       !                             
       !                       !* 'cri' component: distribute energy over the time-varying
       !                       !* ocean depth using an exponential decay from the seafloor.
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                ! part independent of the level
-         IF( ht(ji,jj) /= 0._wp ) THEN ; zfact(ji,jj) = ecri_iwm(ji,jj) * r1_rho0 / ( 1._wp - EXP( -ht(ji,jj) * hcri_iwm(ji,jj) ) )
-         ELSE                          ; zfact(ji,jj) = 0._wp
+      DO_2D( 0, 0, 0, 0 )                ! part independent of the level
+         IF( ht(ji,jj,Kmm) /= 0._wp ) THEN ; zfact(ji,jj) = ecri_iwm(ji,jj) * r1_rho0 / ( 1._wp - EXP( -ht(ji,jj,Kmm) * hcri_iwm(ji,jj) ) )
+         ELSE                              ; zfact(ji,jj) = 0._wp
          ENDIF
       END_2D
-
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )      ! complete with the level-dependent part
-         zemx_iwm(ji,jj,jk) = zfact(ji,jj) * (  EXP( ( gdept(ji,jj,jk  ,Kmm) - ht(ji,jj) ) * hcri_iwm(ji,jj) )   &
-            &                                 - EXP( ( gdept(ji,jj,jk-1,Kmm) - ht(ji,jj) ) * hcri_iwm(ji,jj) )   &
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )      ! complete with the level-dependent part
+         zemx_iwm(ji,jj,jk) = zfact(ji,jj) * (  EXP( ( gdept(ji,jj,jk  ,Kmm) - ht(ji,jj,Kmm) ) * hcri_iwm(ji,jj) )   &
+            &                                 - EXP( ( gdept(ji,jj,jk-1,Kmm) - ht(ji,jj,Kmm) ) * hcri_iwm(ji,jj) )   &
             &                                ) * wmask(ji,jj,jk) / e3w(ji,jj,jk,Kmm)
       END_3D
-
                                !* 'bot' component: distribute energy over the time-varying
                                !* ocean depth using an algebraic decay above the seafloor.
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )               ! part independent of the level
-         IF( ht(ji,jj) /= 0._wp ) THEN ; zfact(ji,jj) = ebot_iwm(ji,jj) * ( 1._wp +  hbot_iwm(ji,jj) / ht(ji,jj)  ) * r1_rho0
-         ELSE                          ; zfact(ji,jj) = 0._wp
+
+      DO_2D( 0, 0, 0, 0 )               ! part independent of the level
+         IF( ht(ji,jj,Kmm) /= 0._wp ) THEN ; zfact(ji,jj) = ebot_iwm(ji,jj) * ( 1._wp +  hbot_iwm(ji,jj) / ht(ji,jj,Kmm)  ) * r1_rho0
+         ELSE                              ; zfact(ji,jj) = 0._wp
          ENDIF
       END_2D
 
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )     ! complete with the level-dependent part
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )     ! complete with the level-dependent part
          zemx_iwm(ji,jj,jk) = zemx_iwm(ji,jj,jk) +                                                                           & 
-            &                 zfact(ji,jj) * (  1._wp / ( 1._wp + ( ht(ji,jj) - gdept(ji,jj,jk  ,Kmm) ) / hbot_iwm(ji,jj) )  &
-            &                                 - 1._wp / ( 1._wp + ( ht(ji,jj) - gdept(ji,jj,jk-1,Kmm) ) / hbot_iwm(ji,jj) )  &
+            &                 zfact(ji,jj) * (  1._wp / ( 1._wp + ( ht(ji,jj,Kmm) - gdept(ji,jj,jk  ,Kmm) ) / hbot_iwm(ji,jj) )  &
+            &                                 - 1._wp / ( 1._wp + ( ht(ji,jj,Kmm) - gdept(ji,jj,jk-1,Kmm) ) / hbot_iwm(ji,jj) )  &
             &                                ) * wmask(ji,jj,jk) / e3w(ji,jj,jk,Kmm)
       END_3D
 
                                !* 'nsq' component: distribute energy over the time-varying 
                                !* ocean depth as proportional to rn2
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          zfact(ji,jj) = 0._wp
       END_2D
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )     ! part independent of the level
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )     ! part independent of the level
          zfact(ji,jj) = zfact(ji,jj) + e3w(ji,jj,jk,Kmm) * MAX( 0._wp, rn2(ji,jj,jk) )
       END_3D
       !
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          IF( zfact(ji,jj) /= 0._wp )   zfact(ji,jj) = ensq_iwm(ji,jj) * r1_rho0 / zfact(ji,jj)
       END_2D
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )     ! complete with the level-dependent part
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )     ! complete with the level-dependent part
          zemx_iwm(ji,jj,jk) = zemx_iwm(ji,jj,jk) + zfact(ji,jj) * MAX( 0._wp, rn2(ji,jj,jk) )
       END_3D
 
                                !* 'sho' component: distribute energy over the time-varying 
                                !* ocean depth as proportional to sqrt(rn2)
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          zfact(ji,jj) = 0._wp
       END_2D
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )     ! part independent of the level
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )     ! part independent of the level
          zfact(ji,jj) = zfact(ji,jj) + e3w(ji,jj,jk,Kmm) * SQRT( MAX( 0._wp, rn2(ji,jj,jk) ) )
       END_3D
       !
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          IF( zfact(ji,jj) /= 0._wp )   zfact(ji,jj) = esho_iwm(ji,jj) * r1_rho0 / zfact(ji,jj)
       END_2D
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )     ! complete with the level-dependent part
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )     ! complete with the level-dependent part
          zemx_iwm(ji,jj,jk) = zemx_iwm(ji,jj,jk) + zfact(ji,jj) * SQRT( MAX( 0._wp, rn2(ji,jj,jk) ) )
       END_3D
 
       ! Calculate turbulence intensity parameter Reb
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          zReb(ji,jj,jk) = zemx_iwm(ji,jj,jk) / MAX( 1.e-20_wp, rnu * rn2(ji,jj,jk) )
       END_3D
       !
       ! Define internal wave-induced diffusivity
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          zav_wave(ji,jj,jk) = zReb(ji,jj,jk) * r1_6 * rnu  ! This corresponds to a constant mixing efficiency of 1/6
       END_3D
       !
       IF( ln_mevar ) THEN                                          ! Variable mixing efficiency case : modify zav_wave in the
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224) regimes
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224) regimes
             IF( zReb(ji,jj,jk) > 480.00_wp ) THEN
                zav_wave(ji,jj,jk) = 3.6515_wp * rnu * SQRT( zReb(ji,jj,jk) )
             ELSEIF( zReb(ji,jj,jk) < 10.224_wp ) THEN
@@ -238,7 +240,7 @@ CONTAINS
          END_3D
       ENDIF
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )    ! Bound diffusivity by molecular value and 100 cm2/s
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )    ! Bound diffusivity by molecular value and 100 cm2/s
          zav_wave(ji,jj,jk) = MIN( MAX( 1.4e-7_wp, zav_wave(ji,jj,jk) ), 1.e-2_wp ) * wmask(ji,jj,jk)
       END_3D
       !
@@ -247,15 +249,19 @@ CONTAINS
       !                          ! ----------------------- !
       !
       IF( ln_tsdiff ) THEN                !* Option for differential mixing of salinity and temperature
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) ! Calculate S/T diffusivity ratio as a function of Reb (else it is set to 1)
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! Calculate S/T diffusivity ratio as a function of Reb (else it is set to 1)
             zav_ratio(ji,jj,jk) = ( 0.505_wp + &
                &                    0.495_wp * TANH( 0.92_wp * ( LOG10( MAX( 1.e-20, zReb(ji,jj,jk) * 5._wp * r1_6 ) ) - 0.60_wp ) ) &
                &                  ) * wmask(ji,jj,jk)
          END_3D
+      ELSE
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
+            zav_ratio(ji,jj,jk) = 1._wp * wmask(ji,jj,jk)
+         END_3D
       ENDIF
       CALL iom_put( "av_ratio", zav_ratio )
       !
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* update momentum & tracer diffusivity with wave-driven mixing
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) !* update momentum & tracer diffusivity with wave-driven mixing
          p_avs(ji,jj,jk) = p_avs(ji,jj,jk) + zav_wave(ji,jj,jk) * zav_ratio(ji,jj,jk)
          p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zav_wave(ji,jj,jk)
          p_avm(ji,jj,jk) = p_avm(ji,jj,jk) + zav_wave(ji,jj,jk)
@@ -265,8 +271,10 @@ CONTAINS
                                     !* output useful diagnostics: Kz*N^2 , 
                                     !  vertical integral of rho0 * Kz * N^2 , energy density (zemx_iwm)
       IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN
-         ALLOCATE( z2d(A2D(nn_hls)) , z3d(A2D(nn_hls),jpk) )
-         z2d(:,:) = 0._wp ; z3d(:,:,:) = 0._wp   ! Initialisation for iom_put
+         ALLOCATE( z2d(T2D(0)), z3d(T2D(0),jpk) )
+         ! Initialise 1 & jpk for diagnostics
+         z2d(:,:) = 0._wp ; z3d(:,:,1) = 0._wp ; z3d(:,:,jpk) = 0._wp
+
          DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             z3d(ji,jj,jk) = MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk)
             z2d(ji,jj) = z2d(ji,jj) + rho0 * e3w(ji,jj,jk,Kmm) * z3d(ji,jj,jk) * wmask(ji,jj,jk)
@@ -282,7 +290,7 @@ CONTAINS
          IF( .NOT. l_istiled .OR. ntile == 1 ) zztmp = 0._wp                    ! Do only on the first tile
          DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             zztmp = zztmp + e3w(ji,jj,jk,Kmm) * e1e2t(ji,jj)   &
-               &          * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj)
+               &          * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * smask0_i(ji,jj)
          END_3D
 
          IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
@@ -299,7 +307,7 @@ CONTAINS
          ENDIF
       ENDIF
 
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ')
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=p_avt, clinfo2=' avt: ')
       !
    END SUBROUTINE zdf_iwm
 
@@ -341,14 +349,16 @@ CONTAINS
       INTEGER, PARAMETER            ::   jp_mps = 4
       INTEGER, PARAMETER            ::   jp_dsb = 5
       INTEGER, PARAMETER            ::   jp_dsc = 6
+      INTEGER                       ::   ji, jj
       !
       TYPE(FLD_N), DIMENSION(jpiwm) ::   slf_iwm                        ! array of namelist informations
       TYPE(FLD_N)                   ::   sn_mpb, sn_mpc, sn_mpn, sn_mps ! information about Mixing Power field to be read
       TYPE(FLD_N)                   ::   sn_dsb, sn_dsc                 ! information about Decay Scale field to be read
       TYPE(FLD  ), DIMENSION(jpiwm) ::   sf_iwm                         ! structure of input fields (file informations, fields read)
       !
-      REAL(wp), DIMENSION(jpi,jpj,4) ::   ztmp
-      REAL(wp), DIMENSION(4)         ::   zdia
+      REAL(wp), DIMENSION(A2D(0),4) ::   ztmp
+      REAL(wp), DIMENSION(4)        ::   zdia
+      REAL(wp)                      ::   zcte
       !
       NAMELIST/namzdf_iwm/ ln_mevar, ln_tsdiff, &
           &                cn_dir, sn_mpb, sn_mpc, sn_mpn, sn_mps, sn_dsb, sn_dsc
@@ -373,10 +383,10 @@ CONTAINS
       ! This internal-wave-driven mixing parameterization elevates avt and avm in the interior, and
       ! ensures that avt remains larger than its molecular value (=1.4e-7). Therefore, avtb should 
       ! be set here to a very small value, and avmb to its (uniform) molecular value (=1.4e-6).
-      avmb(:) = rnu              ! molecular value
-      avtb(:) = 1.e-10_wp        ! very small diffusive minimum (background avt is specified in zdf_iwm)    
-      avtb_2d(:,:) = 1._wp       ! uniform 
-      IF(lwp) THEN                  ! Control print
+      avmb(:) = rnu               ! molecular value
+      avtb(:) = 1.e-10_wp         ! very small diffusive minimum (background avt is specified in zdf_iwm)
+      avtb_2d(:,:) = 1._wp        ! uniform
+      IF(lwp) THEN                ! Control print
          WRITE(numout,*)
          WRITE(numout,*) '   Force the background value applied to avm & avt in TKE to be everywhere ',   &
             &               'the viscous molecular value & a very small diffusive value, resp.'
@@ -390,40 +400,46 @@ CONTAINS
       slf_iwm(jp_dsb) = sn_dsb ; slf_iwm(jp_dsc) = sn_dsc
       !
       DO ifpr= 1, jpiwm
-         ALLOCATE( sf_iwm(ifpr)%fnow(jpi,jpj,1)   )
-         IF( slf_iwm(ifpr)%ln_tint ) ALLOCATE( sf_iwm(ifpr)%fdta(jpi,jpj,1,2) )
+         ALLOCATE( sf_iwm(ifpr)%fnow(A2D(0),1)   )
+         IF( slf_iwm(ifpr)%ln_tint ) ALLOCATE( sf_iwm(ifpr)%fdta(A2D(0),1,2) )
       END DO
 
       ! fill sf_iwm with sf_iwm and control print
       CALL fld_fill( sf_iwm, slf_iwm , cn_dir, 'zdfiwm_init', 'iwm input file', 'namiwm' )
 
       !                             ! hard-coded default values
-      sf_iwm(jp_mpb)%fnow(:,:,1) = 1.e-10_wp
-      sf_iwm(jp_mpc)%fnow(:,:,1) = 1.e-10_wp
-      sf_iwm(jp_mpn)%fnow(:,:,1) = 1.e-5_wp
-      sf_iwm(jp_mps)%fnow(:,:,1) = 1.e-10_wp
-      sf_iwm(jp_dsb)%fnow(:,:,1) = 100._wp
-      sf_iwm(jp_dsc)%fnow(:,:,1) = 100._wp
+      DO_2D( 0, 0, 0, 0 )
+         sf_iwm(jp_mpb)%fnow(ji,jj,1) = 1.e-10_wp
+         sf_iwm(jp_mpc)%fnow(ji,jj,1) = 1.e-10_wp
+         sf_iwm(jp_mpn)%fnow(ji,jj,1) = 1.e-5_wp
+         sf_iwm(jp_mps)%fnow(ji,jj,1) = 1.e-10_wp
+         sf_iwm(jp_dsb)%fnow(ji,jj,1) = 100._wp
+         sf_iwm(jp_dsc)%fnow(ji,jj,1) = 100._wp
+      END_2D
 
       !                             ! read necessary fields
       CALL fld_read( nit000, 1, sf_iwm )
 
-      ebot_iwm(:,:) = sf_iwm(1)%fnow(:,:,1) * ssmask(:,:) ! energy flux for dissipation above abyssal hills [W/m2]
-      ecri_iwm(:,:) = sf_iwm(2)%fnow(:,:,1) * ssmask(:,:) ! energy flux for dissipation at topographic slopes [W/m2]
-      ensq_iwm(:,:) = sf_iwm(3)%fnow(:,:,1) * ssmask(:,:) ! energy flux for dissipation scaling with N^2 [W/m2]
-      esho_iwm(:,:) = sf_iwm(4)%fnow(:,:,1) * ssmask(:,:) ! energy flux for dissipation due to shoaling [W/m2]
-      hbot_iwm(:,:) = sf_iwm(5)%fnow(:,:,1)               ! spatially variable decay scale for abyssal hill dissipation [m]
-      hcri_iwm(:,:) = sf_iwm(6)%fnow(:,:,1)               ! spatially variable decay scale for topographic-slope [m]
-
-      hcri_iwm(:,:) = 1._wp / hcri_iwm(:,:) ! only the inverse height is used, hence calculated here once for all
+      DO_2D( 0, 0, 0, 0 )
+         zcte = smask0(ji,jj)
+         ebot_iwm(ji,jj) = sf_iwm(1)%fnow(ji,jj,1) * zcte    ! energy flux for dissipation above abyssal hills [W/m2]
+         ecri_iwm(ji,jj) = sf_iwm(2)%fnow(ji,jj,1) * zcte    ! energy flux for dissipation at topographic slopes [W/m2]
+         ensq_iwm(ji,jj) = sf_iwm(3)%fnow(ji,jj,1) * zcte    ! energy flux for dissipation scaling with N^2 [W/m2]
+         esho_iwm(ji,jj) = sf_iwm(4)%fnow(ji,jj,1) * zcte    ! energy flux for dissipation due to shoaling [W/m2]
+         hbot_iwm(ji,jj) = sf_iwm(5)%fnow(ji,jj,1)           ! spatially variable decay scale for abyssal hill dissipation [m]
+         hcri_iwm(ji,jj) = 1._wp / sf_iwm(6)%fnow(ji,jj,1)   ! inverse decay scale for topographic slope dissipation [m-1]
+      END_2D
 
       ! diags
-      ztmp(:,:,1) = e1e2t(:,:) * ebot_iwm(:,:)
-      ztmp(:,:,2) = e1e2t(:,:) * ecri_iwm(:,:)
-      ztmp(:,:,3) = e1e2t(:,:) * ensq_iwm(:,:)
-      ztmp(:,:,4) = e1e2t(:,:) * esho_iwm(:,:)
+      DO_2D( 0, 0, 0, 0 )
+         zcte = e1e2t(ji,jj)
+         ztmp(ji,jj,1) = zcte * ebot_iwm(ji,jj)
+         ztmp(ji,jj,2) = zcte * ecri_iwm(ji,jj)
+         ztmp(ji,jj,3) = zcte * ensq_iwm(ji,jj)
+         ztmp(ji,jj,4) = zcte * esho_iwm(ji,jj)
+      END_2D
 
-      zdia(1:4) = glob_sum_vec( 'zdfiwm', ztmp(:,:,1:4) )
+      zdia(1:4) = glob_sum_vec( 'zdfiwm', ztmp )
 
       IF(lwp) THEN
          WRITE(numout,*) '      Dissipation above abyssal hills:        ', zdia(1) * 1.e-12_wp, 'TW'
diff --git a/src/OCE/ZDF/zdfmfc.F90 b/src/OCE/ZDF/zdfmfc.F90
index f984b2bf..76999f8c 100644
--- a/src/OCE/ZDF/zdfmfc.F90
+++ b/src/OCE/ZDF/zdfmfc.F90
@@ -19,7 +19,6 @@
    !
    USE oce            ! ocean dynamics and active tracers
    USE dom_oce        ! ocean space and time domain
-   USE domvvl         ! ocean space and time domain : variable volume layer
    USE domzgr
    USE zdf_oce        ! ocean vertical physics
    USE sbc_oce        ! surface boundary condition: ocean
@@ -69,8 +68,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  FUNCTION zdf_edmf_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( edmfa(jpi,jpj,jpk) , edmfb(jpi,jpj,jpk) , edmfc(jpi,jpj,jpk)      &
-         &      , edmftra(jpi,jpj,jpk,2), edmfm(jpi,jpj,jpk) ,  STAT= zdf_mfc_alloc )
+      ALLOCATE( edmfa(A2D(0),jpk) , edmfb(A2D(0),jpk) , edmfc(A2D(0),jpk),      &
+         &      edmftra(A2D(0),jpk,2), edmfm(A2D(0),jpk) ,  STAT= zdf_mfc_alloc )
          !
       IF( lk_mpp             )   CALL mpp_sum ( 'zdfmfc', zdf_mfc_alloc )
       IF( zdf_mfc_alloc /= 0 )   CALL ctl_warn('zdf_mfc_alloc: failed to allocate arrays')
@@ -95,26 +94,26 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: Kmm, Krhs ! time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   ztsp         ! T/S of the plume
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   ztse         ! T/S at W point
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zrwp          !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zrwp2         !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zapp          !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zedmf         !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zepsT, zepsW  !
+      REAL(wp), DIMENSION(T2D(0),jpk,2) ::   ztsp         ! T/S of the plume
+      REAL(wp), DIMENSION(T2D(0),jpk,2) ::   ztse         ! T/S at W point
+      REAL(wp), DIMENSION(T2D(0),jpk) :: zrwp          !
+      REAL(wp), DIMENSION(T2D(0),jpk) :: zrwp2         !
+      REAL(wp), DIMENSION(T2D(0),jpk) :: zapp          !
+      REAL(wp), DIMENSION(T2D(0),jpk) :: zedmf         !
+      REAL(wp), DIMENSION(T2D(0),jpk) :: zepsT, zepsW  !
       !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zustar, zustar2   !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zuws, zvws, zsws, zfnet          !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zfbuo, zrautbm1, zrautb, zraupl
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zwpsurf            !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zop0 , zsp0 !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zrwp_0, zrwp2_0  !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zapp0           !
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zphp, zph, zphpm1, zphm1, zNHydro
-      REAL(wp), DIMENSION(A2D(nn_hls)) :: zhcmo          !
+      REAL(wp), DIMENSION(T2D(0)) :: zustar, zustar2   !
+      REAL(wp), DIMENSION(T2D(0)) :: zuws, zvws, zsws, zfnet          !
+      REAL(wp), DIMENSION(T2D(0)) :: zfbuo, zrautbm1, zrautb, zraupl
+      REAL(wp), DIMENSION(T2D(0)) :: zwpsurf            !
+      REAL(wp), DIMENSION(T2D(0)) :: zop0 , zsp0 !
+      REAL(wp), DIMENSION(T2D(0)) :: zrwp_0, zrwp2_0  !
+      REAL(wp), DIMENSION(T2D(0)) :: zapp0           !
+      REAL(wp), DIMENSION(T2D(0)) :: zphp, zph, zphpm1, zphm1, zNHydro
+      REAL(wp), DIMENSION(T2D(0)) :: zhcmo          !
       !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zn2    ! N^2
-      REAL(wp), DIMENSION(A2D(nn_hls),2  ) ::   zab, zabm1, zabp ! alpha and beta
+      REAL(wp), DIMENSION(T2D(0),jpk)   ::   zn2    ! N^2
+      REAL(wp), DIMENSION(T2D(0),2  ) ::   zab, zabm1, zabp ! alpha and beta
      
       REAL(wp), PARAMETER :: zepsilon = 1.e-30                 ! local small value
 
@@ -135,7 +134,7 @@ CONTAINS
       zcb          = 1._wp
       zcd          = 1._wp
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          !------------------------------------------------------------------
          ! Surface boundary condition
          !------------------------------------------------------------------
@@ -160,8 +159,10 @@ CONTAINS
          !-------------------------------------------
          zrwp (ji,jj,:) =  0._wp ; zrwp2(ji,jj,:) =  0._wp ; zedmf(ji,jj,:) =  0._wp
          zph  (ji,jj)   =  0._wp ; zphm1(ji,jj)   =  0._wp ; zphpm1(ji,jj)  =  0._wp
-         ztsp(ji,jj,:,:)=  0._wp
+      END_2D
 
+      DO_2D( 0, 0, 0, 0 )
+         ztsp(ji,jj,:,:) =  0._wp ; ztse(ji,jj,:,:) =  0._wp
          ! Tracers inside plume (ztsp) and environment (ztse)
          ztsp(ji,jj,1,jp_tem) = pts(ji,jj,1,jp_tem,Kmm) * tmask(ji,jj,1)
          ztsp(ji,jj,1,jp_sal) = pts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1)
@@ -169,17 +170,19 @@ CONTAINS
          ztse(ji,jj,1,jp_sal) = pts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1)
       END_2D
 
-      CALL eos( ztse(:,:,1,:) ,  zrautb(:,:) )
-      CALL eos( ztsp(:,:,1,:) ,  zraupl(:,:) )
+      CALL eos( ztse(:,:,1,:) ,  zrautb(:,:), kbnd=0 )
+      CALL eos( ztsp(:,:,1,:) ,  zraupl(:,:), kbnd=0 )
 
       !-------------------------------------------
       ! Boundary Condition of Mass Flux (plume velo.; convective area, entrain/detrain)
       !-------------------------------------------
-      zhcmo(:,:) = e3t(A1Di(nn_hls),A1Dj(nn_hls),1,Kmm)
-      zfbuo(:,:)   = 0._wp
+      DO_2D( 0, 0, 0, 0 )
+         zhcmo(ji,jj) = e3t(ji,jj,1,Kmm)
+         zfbuo(ji,jj) = 0._wp
+      END_2D
       WHERE ( ABS(zrautb(:,:)) > 1.e-20 ) zfbuo(:,:)   =   &
          &      grav * ( 2.e-4_wp *zfnet(:,:)              &
-         &      - 7.6E-4_wp*pts(A2D(nn_hls),1,jp_sal,Kmm)  &
+         &      - 7.6E-4_wp*pts(T2D(0),1,jp_sal,Kmm)  &
          &      * zsws(:,:)/zrautb(:,:)) * zhcmo(:,:)
 
       zedmf(:,:,1) = -0.065_wp*(ABS(zfbuo(:,:)))**(1._wp/3._wp)*SIGN(1.,zfbuo(:,:))
@@ -211,8 +214,8 @@ CONTAINS
 
          ! Compute the buoyancy acceleration on T-points at jk-1
          zrautbm1(:,:) = zrautb(:,:)
-         CALL eos( pts (:,:,jk  ,:,Kmm) ,  zrautb(:,:)   )
-         CALL eos( ztsp(:,:,jk-1,:    ) ,  zraupl(:,:)   )
+         CALL eos( pts (:,:,jk  ,:,Kmm) ,  zrautb(:,:), kbnd=0 )
+         CALL eos( ztsp(:,:,jk-1,:    ) ,  zraupl(:,:), kbnd=0 )
 
          DO_2D( 0, 0, 0, 0 )
             zphm1(ji,jj)  = zphm1(ji,jj)  + grav * zrautbm1(ji,jj) * e3t(ji,jj,jk-1, Kmm)
@@ -395,9 +398,9 @@ CONTAINS
    
    SUBROUTINE diag_mfc( zdiagi, zdiagd, zdiags, p2dt, Kaa )
 
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::  zdiagi, zdiagd, zdiags  ! inout: tridaig. terms
-      REAL(wp)                            , INTENT(in   ) ::   p2dt                   ! tracer time-step
-      INTEGER                             , INTENT(in   ) ::   Kaa                    ! ocean time level indices
+      REAL(wp), DIMENSION(T2D(0),jpk), INTENT(inout) ::  zdiagi, zdiagd, zdiags  ! inout: tridaig. terms
+      REAL(wp)                       , INTENT(in   ) ::   p2dt                   ! tracer time-step
+      INTEGER                        , INTENT(in   ) ::   Kaa                    ! ocean time level indices
 
       INTEGER  ::   ji, jj, jk  ! dummy  loop arguments   
 
diff --git a/src/OCE/ZDF/zdfmxl.F90 b/src/OCE/ZDF/zdfmxl.F90
index c387bdb1..66dd2e23 100644
--- a/src/OCE/ZDF/zdfmxl.F90
+++ b/src/OCE/ZDF/zdfmxl.F90
@@ -30,7 +30,6 @@ MODULE zdfmxl
    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   nmln    !: number of level in the mixed layer (used by LDF, ZDF, TRD, TOP)
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmld    !: mixing layer depth (turbocline)      [m]   (used by TOP)
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlp    !: mixed layer depth  (rho=rho0+zdcrit) [m]   (used by LDF)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlpt   !: depth of the last T-point inside the mixed layer [m] (used by LDF)
 
    REAL(wp), PUBLIC ::   rho_c = 0.01_wp    !: density criterion for mixed layer depth
    REAL(wp), PUBLIC ::   avt_c = 5.e-4_wp   ! Kz criterion for the turbocline depth
@@ -51,7 +50,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       zdf_mxl_alloc = 0      ! set to zero if no array to be allocated
       IF( .NOT. ALLOCATED( nmln ) ) THEN
-         ALLOCATE( nmln(jpi,jpj), hmld(jpi,jpj), hmlp(jpi,jpj), hmlpt(jpi,jpj), STAT= zdf_mxl_alloc )
+         ALLOCATE( hmld(A2D(0)), nmln(jpi,jpj), hmlp(A2D(1)), STAT= zdf_mxl_alloc )
          !
          CALL mpp_sum ( 'zdfmxl', zdf_mxl_alloc )
          IF( zdf_mxl_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_mxl_alloc: failed to allocate arrays.' )
@@ -70,7 +69,7 @@ CONTAINS
       !!      the density of the corresponding T point (just bellow) bellow a
       !!      given value defined locally as rho(10m) + rho_c
       !!
-      !! ** Action  :   nmln, hmlp, hmlpt
+      !! ** Action  :   nmln, hmlp
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ocean time-step index
       INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
@@ -78,6 +77,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk      ! dummy loop indices
       INTEGER  ::   iik, ikt        ! local integer
       REAL(wp) ::   zN2_c           ! local scalar
+      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zhmlp
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
@@ -89,30 +89,32 @@ CONTAINS
       ENDIF
       !
       ! w-level of the mixing and mixed layers
-      DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          nmln(ji,jj)  = nlb10                  ! Initialization to the number of w ocean point
          hmlp(ji,jj)  = 0._wp                  ! here hmlp used as a dummy variable, integrating vertically N^2
       END_2D
       zN2_c = grav * rho_c * r1_rho0      ! convert density criteria into N^2 criteria
-      DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, nlb10, jpkm1 )   ! Mixed layer level: w-level
+      DO_3D( 0, 0, 0, 0, nlb10, jpkm1 )   ! Mixed layer level: w-level
          ikt = mbkt(ji,jj)
          hmlp(ji,jj) =   &
             & hmlp(ji,jj) + MAX( rn2b(ji,jj,jk) , 0._wp ) * e3w(ji,jj,jk,Kmm)
          IF( hmlp(ji,jj) < zN2_c )   nmln(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level
       END_3D
       ! depth of the mixed layer
-      DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          iik = nmln(ji,jj)
-         hmlp (ji,jj) = gdepw(ji,jj,iik  ,Kmm) * ssmask(ji,jj)    ! Mixed layer depth
-         hmlpt(ji,jj) = gdept(ji,jj,iik-1,Kmm) * ssmask(ji,jj)    ! depth of the last T-point inside the mixed layer
+         hmlp(ji,jj) = gdepw(ji,jj,iik  ,Kmm) * ssmask(ji,jj)    ! Mixed layer depth
       END_2D
       !
       IF( .NOT.l_offline .AND. iom_use("mldr10_1") ) THEN
-         IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN         ! Do only on the last tile
-            IF( ln_isfcav ) THEN  ;  CALL iom_put( "mldr10_1", hmlp - risfdep)   ! mixed layer thickness
-            ELSE                  ;  CALL iom_put( "mldr10_1", hmlp )            ! mixed layer depth
-            END IF
+         ALLOCATE( zhmlp(T2D(0)) )
+         IF( ln_isfcav ) THEN
+            zhmlp(:,:) = hmlp(T2D(0)) - risfdep(T2D(0))           ! mixed layer thickness
+         ELSE
+            zhmlp(:,:) = hmlp(T2D(0))                             ! mixed layer depth
          ENDIF
+         CALL iom_put( "mldr10_1", zhmlp(:,:) )
+         DEALLOCATE( zhmlp )
       ENDIF
       !
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=REAL(nmln,wp), clinfo1=' nmln : ', tab2d_2=hmlp, clinfo2=' hmlp : ' )
@@ -138,24 +140,24 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk      ! dummy loop indices
       INTEGER  ::   iik             ! local integer
-      INTEGER, DIMENSION(A2D(nn_hls)) ::   imld   ! 2D workspace
+      INTEGER, DIMENSION(T2D(0)) ::   imld   ! 2D workspace
       !!----------------------------------------------------------------------
       !
       ! w-level of the turbocline and mixing layer (iom_use)
-      imld(:,:) = mbkt(A2D(nn_hls)) + 1                ! Initialization to the number of w ocean point
-      DO_3DS( 1, 1, 1, 1, jpkm1, nlb10, -1 )   ! from the bottom to nlb10
+      imld(:,:) = mbkt(T2D(0)) + 1                ! Initialization to the number of w ocean point
+      DO_3DS( 0, 0, 0, 0, jpkm1, nlb10, -1 )   ! from the bottom to nlb10
          IF( avt (ji,jj,jk) < avt_c * wmask(ji,jj,jk) )   imld(ji,jj) = jk      ! Turbocline
       END_3D
       ! depth of the mixing layer
-      DO_2D_OVR( 1, 1, 1, 1 )
+      DO_2D( 0, 0, 0, 0 )
          iik = imld(ji,jj)
          hmld (ji,jj) = gdepw(ji,jj,iik  ,Kmm) * ssmask(ji,jj)    ! Turbocline depth
       END_2D
       !
       IF( .NOT.l_offline .AND. iom_use("mldkz5") ) THEN
          IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN         ! Do only on the last tile
-            IF( ln_isfcav ) THEN  ;  CALL iom_put( "mldkz5"  , hmld - risfdep )   ! turbocline thickness
-            ELSE                  ;  CALL iom_put( "mldkz5"  , hmld )             ! turbocline depth
+            IF( ln_isfcav ) THEN  ;  CALL iom_put( "mldkz5"  , hmld - risfdep(A2D(0)) )   ! turbocline thickness
+            ELSE                  ;  CALL iom_put( "mldkz5"  , hmld )                     ! turbocline depth
             END IF
          ENDIF
       ENDIF
diff --git a/src/OCE/ZDF/zdfosm.F90 b/src/OCE/ZDF/zdfosm.F90
index 1a4bfabb..cc76f85f 100644
--- a/src/OCE/ZDF/zdfosm.F90
+++ b/src/OCE/ZDF/zdfosm.F90
@@ -68,6 +68,7 @@ MODULE zdfosm
    USE oce                       ! Ocean dynamics and active tracers
    !                             ! Uses ww from previous time step (which is now wb) to calculate hbl
    USE dom_oce                   ! Ocean space and time domain
+   USE domtile, ONLY : dom_tile_init
    USE zdf_oce                   ! Ocean vertical physics
    USE sbc_oce                   ! Surface boundary condition: ocean
    USE sbcwave                   ! Surface wave parameters
@@ -349,57 +350,58 @@ CONTAINS
       !!         Comments in the code refer to this paper, particularly
       !!         the equation number. (LMD94, here after)
       !!----------------------------------------------------------------------
-      INTEGER                   , INTENT(in   ) ::  kt               ! Ocean time step
-      INTEGER                   , INTENT(in   ) ::  Kbb, Kmm, Krhs   ! Ocean time level indices
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::  p_avm, p_avt     ! Momentum and tracer Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::  kt               ! Ocean time step
+      INTEGER                         , INTENT(in   ) ::  Kbb, Kmm, Krhs   ! Ocean time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::  p_avm            ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::  p_avt            ! vertical eddy diffusivity (w-points)
       !!
       INTEGER ::   ji, jj, jk, jl, jm, jkflt   ! Dummy loop indices
       !!
       REAL(wp) ::   zthermal, zbeta
       REAL(wp) ::   zesh2, zri, zfri   ! Interior Richardson mixing
       !! Scales
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zrad0       ! Surface solar temperature flux (deg m/s)
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zradh       ! Radiative flux at bl base (Buoyancy units)
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zrad0       ! Surface solar temperature flux (deg m/s)
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zradh       ! Radiative flux at bl base (Buoyancy units)
       REAL(wp)                           ::   zradav      ! Radiative flux, bl average (Buoyancy Units)
       REAL(wp)                           ::   zvw0        ! Surface v-momentum flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb0tot     ! Total surface buoyancy flux including insolation
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_ent     ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_min
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_fk_b    ! MLE buoyancy flux averaged over OSBL
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_fk      ! Max MLE buoyancy flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdiff_mle   ! Extra MLE vertical diff
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zvel_mle    ! Velocity scale for dhdt with stable ML and FK
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwb0tot     ! Total surface buoyancy flux including insolation
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwb_ent     ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwb_min
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwb_fk_b    ! MLE buoyancy flux averaged over OSBL
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwb_fk      ! Max MLE buoyancy flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdiff_mle   ! Extra MLE vertical diff
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zvel_mle    ! Velocity scale for dhdt with stable ML and FK
       !! Mixed-layer variables
-      INTEGER,  DIMENSION(A2D(nn_hls-1)) ::   jk_nlev  ! Number of levels
-      INTEGER,  DIMENSION(A2D(nn_hls-1)) ::   jk_ext   ! Offset for external level
+      INTEGER,  DIMENSION(T2D(nn_hls-1)) ::   jk_nlev  ! Number of levels
+      INTEGER,  DIMENSION(T2D(nn_hls-1)) ::   jk_ext   ! Offset for external level
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhbl   ! BL depth - grid
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhml   ! ML depth - grid
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zhbl   ! BL depth - grid
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zhml   ! ML depth - grid
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhmle   ! MLE depth - grid
-      REAL(wp), DIMENSION(A2D(nn_hls))   ::   zmld    ! ML depth on grid
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zhmle   ! MLE depth - grid
+      REAL(wp), DIMENSION(T2D(nn_hls))   ::   zmld    ! ML depth on grid
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdh                          ! Pycnocline depth - grid
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdhdt                        ! BL depth tendency
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdtdz_bl_ext, zdsdz_bl_ext   ! External temperature/salinity gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdbdz_bl_ext                 ! External buoyancy gradients
-      REAL(wp), DIMENSION(A2D(nn_hls))   ::   zdtdx, zdtdy, zdsdx, zdsdy   ! Horizontal gradients for Fox-Kemper parametrization
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdh                          ! Pycnocline depth - grid
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdhdt                        ! BL depth tendency
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdtdz_bl_ext, zdsdz_bl_ext   ! External temperature/salinity gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdbdz_bl_ext                 ! External buoyancy gradients
+      REAL(wp), DIMENSION(T2D(nn_hls))   ::   zdtdx, zdtdy, zdsdx, zdsdy   ! Horizontal gradients for Fox-Kemper parametrization
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdbds_mle   ! Magnitude of horizontal buoyancy gradient
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdbds_mle   ! Magnitude of horizontal buoyancy gradient
       !! Flux-gradient relationship variables
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zshear   ! Shear production
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zshear   ! Shear production
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhbl_t   ! Holds boundary layer depth updated by full timestep
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zhbl_t   ! Holds boundary layer depth updated by full timestep
       !! For calculating Ri#-dependent mixing
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   z2du     ! u-shear^2
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   z2dv     ! v-shear^2
+      REAL(wp), DIMENSION(T2D(nn_hls)) ::   z2du     ! u-shear^2
+      REAL(wp), DIMENSION(T2D(nn_hls)) ::   z2dv     ! v-shear^2
       REAL(wp)                         ::   zrimix   ! Spatial form of ri#-induced diffusion
       !! Temporary variables
       REAL(wp)                                 ::   znd              ! Temporary non-dimensional depth
       REAL(wp)                                 ::   zz0, zz1, zfac
       REAL(wp)                                 ::   zus_x, zus_y     ! Temporary Stokes drift
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk)   ::   zviscos          ! Viscosity
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk)   ::   zdiffut          ! t-diffusivity
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk)   ::   zviscos          ! Viscosity
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk)   ::   zdiffut          ! t-diffusivity
       REAL(wp)                                 ::   zabsstke
       REAL(wp)                                 ::   zsqrtpi, z_two_thirds, zthickness
       REAL(wp)                                 ::   z2k_times_thickness, zsqrt_depth, zexp_depth, zf, zexperfc
@@ -486,8 +488,8 @@ CONTAINS
             &             grav  * zbeta * swsav(ji,jj)                      ! OBSBL
       END_2D
       DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-         suw0(ji,jj)    = -0.5_wp * (utau(ji-1,jj) + utau(ji,jj)) * r1_rho0 * tmask(ji,jj,1)   ! Surface upward velocity fluxes
-         zvw0           = -0.5_wp * (vtau(ji,jj-1) + vtau(ji,jj)) * r1_rho0 * tmask(ji,jj,1)
+         suw0(ji,jj)    = - utau(ji,jj) * r1_rho0 * tmask(ji,jj,1)          ! Surface upward velocity fluxes
+         zvw0           = - vtau(ji,jj) * r1_rho0 * tmask(ji,jj,1)
          sustar(ji,jj)  = MAX( SQRT( SQRT( suw0(ji,jj) * suw0(ji,jj) + zvw0 * zvw0 ) ),   &   ! Friction velocity (sustar), at
             &                  1e-8_wp )                                                      !    T-point : LMD94 eq. 2
          scos_wind(ji,jj) = -1.0_wp * suw0(ji,jj) / ( sustar(ji,jj) * sustar(ji,jj) )
@@ -643,13 +645,13 @@ CONTAINS
       END_2D
       !
       ! Averages over well-mixed and boundary layer, note BL averages use jk_ext=2 everywhere
-      jk_nlev(:,:) = nbld(A2D(nn_hls-1))
+      jk_nlev(:,:) = nbld(T2D(nn_hls-1))
       jk_ext(:,:) = 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    &
          &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   &
          &                           av_ds_bl, av_db_bl, av_du_bl, av_dv_bl )
-      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1
-      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
+      jk_nlev(:,:) = nmld(T2D(nn_hls-1)) - 1
+      jk_ext(:,:) = nbld(T2D(nn_hls-1)) - nmld(T2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    &
          &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   &
          &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml )
@@ -671,7 +673,7 @@ CONTAINS
          DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 5, jpkm1 )
             IF ( hmle(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) mld_prof(ji,jj) = MIN( mbkt(ji,jj), jk)
          END_3D
-         jk_nlev(:,:) = mld_prof(A2D(nn_hls-1))
+         jk_nlev(:,:) = mld_prof(T2D(nn_hls-1))
          CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_mle, av_s_mle,   &
             &                           av_b_mle, av_u_mle, av_v_mle )
          !
@@ -699,7 +701,7 @@ CONTAINS
       ENDIF   ! ln_osm_mle
       !
       !! External gradient below BL needed both with and w/o FK
-      jk_ext(:,:) = nbld(A2D(nn_hls-1)) + 1
+      jk_ext(:,:) = nbld(T2D(nn_hls-1)) + 1
       CALL zdf_osm_external_gradients( Kmm, jk_ext, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext )   ! ag 19/03
       !
       ! Test if pycnocline well resolved
@@ -720,13 +722,13 @@ CONTAINS
       !      END_2D
       !
       ! Recalculate bl averages using jk_ext & ml averages .... note no rotation of u & v here..
-      jk_nlev(:,:) = nbld(A2D(nn_hls-1))
+      jk_nlev(:,:) = nbld(T2D(nn_hls-1))
       jk_ext(:,:) = 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    &
          &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   &
          &                           av_ds_bl, av_db_bl, av_du_bl, av_dv_bl )
-      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1
-      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
+      jk_nlev(:,:) = nmld(T2D(nn_hls-1)) - 1
+      jk_ext(:,:) = nbld(T2D(nn_hls-1)) - nmld(T2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    &
          &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   &
          &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml )   ! ag 19/03
@@ -741,7 +743,7 @@ CONTAINS
          ! Adjustment to represent limiting by ocean bottom
          IF ( mbkt(ji,jj) > 2 ) THEN   ! To ensure mbkt(ji,jj) - 2 > 0 so no incorrect array access
             IF ( zhbl_t(ji,jj) > gdepw(ji, jj,mbkt(ji,jj)-2,Kmm) ) THEN
-               zhbl_t(ji,jj) = MIN( zhbl_t(ji,jj), gdepw(ji,jj,mbkt(ji,jj)-2,Kmm) )   ! ht(:,:))
+               zhbl_t(ji,jj) = MIN( zhbl_t(ji,jj), gdepw(ji,jj,mbkt(ji,jj)-2,Kmm) )   ! ht(:,:,Kmm))
                l_pyc(ji,jj)  = .FALSE.
                l_coup(ji,jj) = .TRUE.   ! ag 19/03
             END IF
@@ -767,7 +769,7 @@ CONTAINS
       ! Is external level in bounds?
       !
       ! Recalculate BL averages and differences using new BL depth
-      jk_nlev(:,:) = nbld(A2D(nn_hls-1))
+      jk_nlev(:,:) = nbld(T2D(nn_hls-1))
       jk_ext(:,:) = 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    &
          &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   &
@@ -799,13 +801,13 @@ CONTAINS
       ! Average over the depth of the mixed layer in the convective boundary layer
       !      jk_ext = nbld - nmld + 1
       ! Recalculate ML averages and differences using new ML depth
-      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1
-      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
+      jk_nlev(:,:) = nmld(T2D(nn_hls-1)) - 1
+      jk_ext(:,:) = nbld(T2D(nn_hls-1)) - nmld(T2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03
       CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    &
          &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   &
          &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml )
       !
-      jk_ext(:,:) = nbld(A2D(nn_hls-1)) + 1
+      jk_ext(:,:) = nbld(T2D(nn_hls-1)) + 1
       CALL zdf_osm_external_gradients( Kmm, jk_ext, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext )
       ! Rotate mean currents and changes onto wind aligned co-ordinates
       CALL zdf_osm_velocity_rotation( av_u_ml,  av_v_ml  )
@@ -833,7 +835,7 @@ CONTAINS
       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !
       ! Rotate non-gradient velocity terms back to model reference frame
-      jk_nlev(:,:) = nbld(A2D(nn_hls-1))
+      jk_nlev(:,:) = nbld(T2D(nn_hls-1))
       CALL zdf_osm_velocity_rotation( ghamu, ghamv, .FALSE.,  2, jk_nlev )
       !
       ! KPP-style Ri# mixing
@@ -910,7 +912,7 @@ CONTAINS
       ! Lateral boundary conditions on zvicos (sign unchanged), needed to caclulate viscosities on u and v grids
       ! CALL lbc_lnk( 'zdfosm', zviscos(:,:,:), 'W', 1.0_wp )
       ! GN 25/8: need to change tmask --> wmask
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          p_avt(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk)
          p_avm(ji,jj,jk) = MAX( zviscos(ji,jj,jk), avmb(jk) ) * tmask(ji,jj,jk)
       END_3D
@@ -919,76 +921,76 @@ CONTAINS
          SELECT CASE (nn_osm_wave)
             ! Stokes drift set by assumimg onstant La#=0.3 (=0) or Pierson-Moskovitz spectrum (=1)
          CASE(0:1)
-            CALL zdf_osm_iomput( "us_x", tmask(A2D(0),1) * sustke(A2D(0)) * scos_wind(A2D(0)) )   ! x surface Stokes drift
-            CALL zdf_osm_iomput( "us_y", tmask(A2D(0),1) * sustke(A2D(0)) * ssin_wind(A2D(0)) )   ! y surface Stokes drift
-            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(A2D(0),1) * sustar(A2D(0))**2 * sustke(A2D(0)) )
+            CALL zdf_osm_iomput( "us_x", tmask(T2D(0),1) * sustke(T2D(0)) * scos_wind(T2D(0)) )   ! x surface Stokes drift
+            CALL zdf_osm_iomput( "us_y", tmask(T2D(0),1) * sustke(T2D(0)) * ssin_wind(T2D(0)) )   ! y surface Stokes drift
+            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(T2D(0),1) * sustar(T2D(0))**2 * sustke(T2D(0)) )
             ! Stokes drift read in from sbcwave  (=2).
          CASE(2:3)
-            CALL zdf_osm_iomput( "us_x",   ut0sd(A2D(0)) * umask(A2D(0),1) )                         ! x surface Stokes drift
-            CALL zdf_osm_iomput( "us_y",   vt0sd(A2D(0)) * vmask(A2D(0),1) )                         ! y surface Stokes drift
-            CALL zdf_osm_iomput( "wmp",    wmp(A2D(0)) * tmask(A2D(0),1) )                           ! Wave mean period
-            CALL zdf_osm_iomput( "hsw",    hsw(A2D(0)) * tmask(A2D(0),1) )                           ! Significant wave height
+            CALL zdf_osm_iomput( "us_x",   ut0sd(T2D(0)) * umask(T2D(0),1) )                         ! x surface Stokes drift
+            CALL zdf_osm_iomput( "us_y",   vt0sd(T2D(0)) * vmask(T2D(0),1) )                         ! y surface Stokes drift
+            CALL zdf_osm_iomput( "wmp",    wmp(T2D(0)) * tmask(T2D(0),1) )                           ! Wave mean period
+            CALL zdf_osm_iomput( "hsw",    hsw(T2D(0)) * tmask(T2D(0),1) )                           ! Significant wave height
             CALL zdf_osm_iomput( "wmp_NP", ( 2.0_wp * rpi * 1.026_wp / ( 0.877_wp * grav ) ) *   &   ! Wave mean period from NP
-               &                           wndm(A2D(0)) * tmask(A2D(0),1) )                          !    spectrum
-            CALL zdf_osm_iomput( "hsw_NP", ( 0.22_wp / grav ) * wndm(A2D(0))**2 * tmask(A2D(0),1) )  ! Significant wave height from
+               &                           wndm(T2D(0)) * tmask(T2D(0),1) )                          !    spectrum
+            CALL zdf_osm_iomput( "hsw_NP", ( 0.22_wp / grav ) * wndm(T2D(0))**2 * tmask(T2D(0),1) )  ! Significant wave height from
             !                                                                                        !    NP spectrum
-            CALL zdf_osm_iomput( "wndm",   wndm(A2D(0)) * tmask(A2D(0),1) )                          ! U_10
-            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(A2D(0),1) * sustar(A2D(0))**2 *   &
-               &                                        SQRT( ut0sd(A2D(0))**2 + vt0sd(A2D(0))**2 ) )
+            CALL zdf_osm_iomput( "wndm",   wndm(T2D(0)) * tmask(T2D(0),1) )                          ! U_10
+            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(T2D(0),1) * sustar(T2D(0))**2 *   &
+               &                                        SQRT( ut0sd(T2D(0))**2 + vt0sd(T2D(0))**2 ) )
          END SELECT
-         CALL zdf_osm_iomput( "zwth0",           tmask(A2D(0),1) * swth0(A2D(0))     )      ! <Tw_0>
-         CALL zdf_osm_iomput( "zws0",            tmask(A2D(0),1) * sws0(A2D(0))      )      ! <Sw_0>
-         CALL zdf_osm_iomput( "zwb0",            tmask(A2D(0),1) * swb0(A2D(0))      )      ! <bw_0>
-         CALL zdf_osm_iomput( "zwbav",           tmask(A2D(0),1) * swbav(A2D(0))     )      ! Upward BL-avged turb buoyancy flux
-         CALL zdf_osm_iomput( "ibld",            tmask(A2D(0),1) * nbld(A2D(0))      )      ! Boundary-layer max k
-         CALL zdf_osm_iomput( "zdt_bl",          tmask(A2D(0),1) * av_dt_bl(A2D(0))  )      ! dt at ml base
-         CALL zdf_osm_iomput( "zds_bl",          tmask(A2D(0),1) * av_ds_bl(A2D(0))  )      ! ds at ml base
-         CALL zdf_osm_iomput( "zdb_bl",          tmask(A2D(0),1) * av_db_bl(A2D(0))  )      ! db at ml base
-         CALL zdf_osm_iomput( "zdu_bl",          tmask(A2D(0),1) * av_du_bl(A2D(0))  )      ! du at ml base
-         CALL zdf_osm_iomput( "zdv_bl",          tmask(A2D(0),1) * av_dv_bl(A2D(0))  )      ! dv at ml base
-         CALL zdf_osm_iomput( "dh",              tmask(A2D(0),1) * dh(A2D(0))        )      ! Initial boundary-layer depth
-         CALL zdf_osm_iomput( "hml",             tmask(A2D(0),1) * hml(A2D(0))       )      ! Initial boundary-layer depth
-         CALL zdf_osm_iomput( "zdt_ml",          tmask(A2D(0),1) * av_dt_ml(A2D(0))  )      ! dt at ml base
-         CALL zdf_osm_iomput( "zds_ml",          tmask(A2D(0),1) * av_ds_ml(A2D(0))  )      ! ds at ml base
-         CALL zdf_osm_iomput( "zdb_ml",          tmask(A2D(0),1) * av_db_ml(A2D(0))  )      ! db at ml base
-         CALL zdf_osm_iomput( "dstokes",         tmask(A2D(0),1) * dstokes(A2D(0))   )      ! Stokes drift penetration depth
-         CALL zdf_osm_iomput( "zustke",          tmask(A2D(0),1) * sustke(A2D(0))    )      ! Stokes drift magnitude at T-points
-         CALL zdf_osm_iomput( "zwstrc",          tmask(A2D(0),1) * swstrc(A2D(0))    )      ! Convective velocity scale
-         CALL zdf_osm_iomput( "zwstrl",          tmask(A2D(0),1) * swstrl(A2D(0))    )      ! Langmuir velocity scale
-         CALL zdf_osm_iomput( "zustar",          tmask(A2D(0),1) * sustar(A2D(0))    )      ! Friction velocity scale
-         CALL zdf_osm_iomput( "zvstr",           tmask(A2D(0),1) * svstr(A2D(0))     )      ! Mixed velocity scale
-         CALL zdf_osm_iomput( "zla",             tmask(A2D(0),1) * sla(A2D(0))       )      ! Langmuir #
-         CALL zdf_osm_iomput( "wind_power",      1000.0_wp * rho0 * tmask(A2D(0),1) *   &   ! BL depth internal to zdf_osm routine
-            &                                    sustar(A2D(0))**3 )
-         CALL zdf_osm_iomput( "wind_wave_power", 1000.0_wp * rho0 * tmask(A2D(0),1) *   &
-            &                                    sustar(A2D(0))**2 * sustke(A2D(0))  )
-         CALL zdf_osm_iomput( "zhbl",            tmask(A2D(0),1) * zhbl(A2D(0))      )      ! BL depth internal to zdf_osm routine
-         CALL zdf_osm_iomput( "zhml",            tmask(A2D(0),1) * zhml(A2D(0))      )      ! ML depth internal to zdf_osm routine
-         CALL zdf_osm_iomput( "imld",            tmask(A2D(0),1) * nmld(A2D(0))      )      ! Index for ML depth internal to zdf_osm
+         CALL zdf_osm_iomput( "zwth0",           tmask(T2D(0),1) * swth0(T2D(0))     )      ! <Tw_0>
+         CALL zdf_osm_iomput( "zws0",            tmask(T2D(0),1) * sws0(T2D(0))      )      ! <Sw_0>
+         CALL zdf_osm_iomput( "zwb0",            tmask(T2D(0),1) * swb0(T2D(0))      )      ! <Sw_0>
+         CALL zdf_osm_iomput( "zwbav",           tmask(T2D(0),1) * swth0(T2D(0))     )      ! Upward BL-avged turb buoyancy flux
+         CALL zdf_osm_iomput( "ibld",            tmask(T2D(0),1) * nbld(T2D(0))      )      ! Boundary-layer max k
+         CALL zdf_osm_iomput( "zdt_bl",          tmask(T2D(0),1) * av_dt_bl(T2D(0))  )      ! dt at ml base
+         CALL zdf_osm_iomput( "zds_bl",          tmask(T2D(0),1) * av_ds_bl(T2D(0))  )      ! ds at ml base
+         CALL zdf_osm_iomput( "zdb_bl",          tmask(T2D(0),1) * av_db_bl(T2D(0))  )      ! db at ml base
+         CALL zdf_osm_iomput( "zdu_bl",          tmask(T2D(0),1) * av_du_bl(T2D(0))  )      ! du at ml base
+         CALL zdf_osm_iomput( "zdv_bl",          tmask(T2D(0),1) * av_dv_bl(T2D(0))  )      ! dv at ml base
+         CALL zdf_osm_iomput( "dh",              tmask(T2D(0),1) * dh(T2D(0))        )      ! Initial boundary-layer depth
+         CALL zdf_osm_iomput( "hml",             tmask(T2D(0),1) * hml(T2D(0))       )      ! Initial boundary-layer depth
+         CALL zdf_osm_iomput( "zdt_ml",          tmask(T2D(0),1) * av_dt_ml(T2D(0))  )      ! dt at ml base
+         CALL zdf_osm_iomput( "zds_ml",          tmask(T2D(0),1) * av_ds_ml(T2D(0))  )      ! ds at ml base
+         CALL zdf_osm_iomput( "zdb_ml",          tmask(T2D(0),1) * av_db_ml(T2D(0))  )      ! db at ml base
+         CALL zdf_osm_iomput( "dstokes",         tmask(T2D(0),1) * dstokes(T2D(0))   )      ! Stokes drift penetration depth
+         CALL zdf_osm_iomput( "zustke",          tmask(T2D(0),1) * sustke(T2D(0))    )      ! Stokes drift magnitude at T-points
+         CALL zdf_osm_iomput( "zwstrc",          tmask(T2D(0),1) * swstrc(T2D(0))    )      ! Convective velocity scale
+         CALL zdf_osm_iomput( "zwstrl",          tmask(T2D(0),1) * swstrl(T2D(0))    )      ! Langmuir velocity scale
+         CALL zdf_osm_iomput( "zustar",          tmask(T2D(0),1) * sustar(T2D(0))    )      ! Friction velocity scale
+         CALL zdf_osm_iomput( "zvstr",           tmask(T2D(0),1) * svstr(T2D(0))     )      ! Mixed velocity scale
+         CALL zdf_osm_iomput( "zla",             tmask(T2D(0),1) * sla(T2D(0))       )      ! Langmuir #
+         CALL zdf_osm_iomput( "wind_power",      1000.0_wp * rho0 * tmask(T2D(0),1) *   &   ! BL depth internal to zdf_osm routine
+            &                                    sustar(T2D(0))**3 )
+         CALL zdf_osm_iomput( "wind_wave_power", 1000.0_wp * rho0 * tmask(T2D(0),1) *   &
+            &                                    sustar(T2D(0))**2 * sustke(T2D(0))  )
+         CALL zdf_osm_iomput( "zhbl",            tmask(T2D(0),1) * zhbl(T2D(0))      )      ! BL depth internal to zdf_osm routine
+         CALL zdf_osm_iomput( "zhml",            tmask(T2D(0),1) * zhml(T2D(0))      )      ! ML depth internal to zdf_osm routine
+         CALL zdf_osm_iomput( "imld",            tmask(T2D(0),1) * nmld(T2D(0))      )      ! Index for ML depth internal to zdf_osm
          !                                                                                  !    routine
-         CALL zdf_osm_iomput( "jp_ext",          tmask(A2D(0),1) * jk_ext(A2D(0))    )      ! =1 if pycnocline resolved internal to
+         CALL zdf_osm_iomput( "jp_ext",          tmask(T2D(0),1) * jk_ext(T2D(0))    )      ! =1 if pycnocline resolved internal to
          !                                                                                  !    zdf_osm routine
-         CALL zdf_osm_iomput( "j_ddh",           tmask(A2D(0),1) * n_ddh(A2D(0))     )      ! Index forpyc thicknessh internal to
+         CALL zdf_osm_iomput( "j_ddh",           tmask(T2D(0),1) * n_ddh(T2D(0))     )      ! Index forpyc thicknessh internal to
          !                                                                                  !    zdf_osm routine
-         CALL zdf_osm_iomput( "zshear",          tmask(A2D(0),1) * zshear(A2D(0))    )      ! Shear production of TKE internal to
+         CALL zdf_osm_iomput( "zshear",          tmask(T2D(0),1) * zshear(T2D(0))    )      ! Shear production of TKE internal to
          !                                                                                  !    zdf_osm routine
-         CALL zdf_osm_iomput( "zdh",             tmask(A2D(0),1) * zdh(A2D(0))       )      ! Pyc thicknessh internal to zdf_osm
+         CALL zdf_osm_iomput( "zdh",             tmask(T2D(0),1) * zdh(T2D(0))       )      ! Pyc thicknessh internal to zdf_osm
          !                                                                                  !    routine
-         CALL zdf_osm_iomput( "zhol",            tmask(A2D(0),1) * shol(A2D(0))      )      ! ML depth internal to zdf_osm routine
-         CALL zdf_osm_iomput( "zwb_ent",         tmask(A2D(0),1) * zwb_ent(A2D(0))   )      ! Upward turb buoyancy entrainment flux
-         CALL zdf_osm_iomput( "zt_ml",           tmask(A2D(0),1) * av_t_ml(A2D(0))   )      ! Average T in ML
-         CALL zdf_osm_iomput( "zmld",            tmask(A2D(0),1) * zmld(A2D(0))      )      ! FK target layer depth
-         CALL zdf_osm_iomput( "zwb_fk",          tmask(A2D(0),1) * zwb_fk(A2D(0))    )      ! FK b flux
-         CALL zdf_osm_iomput( "zwb_fk_b",        tmask(A2D(0),1) * zwb_fk_b(A2D(0))  )      ! FK b flux averaged over ML
-         CALL zdf_osm_iomput( "mld_prof",        tmask(A2D(0),1) * mld_prof(A2D(0))  )      ! FK layer max k
-         CALL zdf_osm_iomput( "zdtdx",           umask(A2D(0),1) * zdtdx(A2D(0))     )      ! FK dtdx at u-pt
-         CALL zdf_osm_iomput( "zdtdy",           vmask(A2D(0),1) * zdtdy(A2D(0))     )      ! FK dtdy at v-pt
-         CALL zdf_osm_iomput( "zdsdx",           umask(A2D(0),1) * zdsdx(A2D(0))     )      ! FK dtdx at u-pt
-         CALL zdf_osm_iomput( "zdsdy",           vmask(A2D(0),1) * zdsdy(A2D(0))     )      ! FK dsdy at v-pt
-         CALL zdf_osm_iomput( "dbdx_mle",        umask(A2D(0),1) * dbdx_mle(A2D(0))  )      ! FK dbdx at u-pt
-         CALL zdf_osm_iomput( "dbdy_mle",        vmask(A2D(0),1) * dbdy_mle(A2D(0))  )      ! FK dbdy at v-pt
-         CALL zdf_osm_iomput( "zdiff_mle",       tmask(A2D(0),1) * zdiff_mle(A2D(0)) )      ! FK diff in MLE at t-pt
-         CALL zdf_osm_iomput( "zvel_mle",        tmask(A2D(0),1) * zvel_mle(A2D(0)) )       ! FK velocity in MLE at t-pt
+         CALL zdf_osm_iomput( "zhol",            tmask(T2D(0),1) * shol(T2D(0))      )      ! ML depth internal to zdf_osm routine
+         CALL zdf_osm_iomput( "zwb_ent",         tmask(T2D(0),1) * zwb_ent(T2D(0))   )      ! Upward turb buoyancy entrainment flux
+         CALL zdf_osm_iomput( "zt_ml",           tmask(T2D(0),1) * av_t_ml(T2D(0))   )      ! Average T in ML
+         CALL zdf_osm_iomput( "zmld",            tmask(T2D(0),1) * zmld(T2D(0))      )      ! FK target layer depth
+         CALL zdf_osm_iomput( "zwb_fk",          tmask(T2D(0),1) * zwb_fk(T2D(0))    )      ! FK b flux
+         CALL zdf_osm_iomput( "zwb_fk_b",        tmask(T2D(0),1) * zwb_fk_b(T2D(0))  )      ! FK b flux averaged over ML
+         CALL zdf_osm_iomput( "mld_prof",        tmask(T2D(0),1) * mld_prof(T2D(0))  )      ! FK layer max k
+         CALL zdf_osm_iomput( "zdtdx",           umask(T2D(0),1) * zdtdx(T2D(0))     )      ! FK dtdx at u-pt
+         CALL zdf_osm_iomput( "zdtdy",           vmask(T2D(0),1) * zdtdy(T2D(0))     )      ! FK dtdy at v-pt
+         CALL zdf_osm_iomput( "zdsdx",           umask(T2D(0),1) * zdsdx(T2D(0))     )      ! FK dtdx at u-pt
+         CALL zdf_osm_iomput( "zdsdy",           vmask(T2D(0),1) * zdsdy(T2D(0))     )      ! FK dsdy at v-pt
+         CALL zdf_osm_iomput( "dbdx_mle",        umask(T2D(0),1) * dbdx_mle(T2D(0))  )      ! FK dbdx at u-pt
+         CALL zdf_osm_iomput( "dbdy_mle",        vmask(T2D(0),1) * dbdy_mle(T2D(0))  )      ! FK dbdy at v-pt
+         CALL zdf_osm_iomput( "zdiff_mle",       tmask(T2D(0),1) * zdiff_mle(T2D(0)) )      ! FK diff in MLE at t-pt
+         CALL zdf_osm_iomput( "zvel_mle",        tmask(T2D(0),1) * zvel_mle(T2D(0))  )      ! FK velocity in MLE at t-pt
       END IF
       !
       ! Lateral boundary conditions on ghamu and ghamv, currently on W-grid (sign unchanged), needed to caclulate gham[uv] on u and
@@ -1038,11 +1040,11 @@ CONTAINS
       !!              knlev+kp_ext
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   )           ::   Kbb, Kmm   ! Ocean time-level indices
-      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   )           ::   knlev      ! Number of levels to average over.
+      INTEGER,  DIMENSION(T2D(nn_hls-1)), INTENT(in   )           ::   knlev      ! Number of levels to average over.
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pt, ps     ! Average temperature and salinity
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pb         ! Average buoyancy
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pu, pv     ! Average current components
-      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   ), OPTIONAL ::   kp_ext     ! External-level offsets
+      INTEGER,  DIMENSION(T2D(nn_hls-1)), INTENT(in   ), OPTIONAL ::   kp_ext     ! External-level offsets
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pdt        ! Difference between average temperature,
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pds        !    salinity,
       REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pdb        !    buoyancy, and
@@ -1050,7 +1052,7 @@ CONTAINS
       !!
       INTEGER                              ::   jk, jkflt, jkmax, ji, jj   ! Loop indices
       INTEGER                              ::   ibld_ext                   ! External-layer index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zthick                     ! Layer thickness
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zthick                     ! Layer thickness
       REAL(wp)                             ::   zthermal                   ! Thermal expansion coefficient
       REAL(wp)                             ::   zbeta                      ! Haline contraction coefficient
       !!----------------------------------------------------------------------
@@ -1176,7 +1178,7 @@ CONTAINS
       REAL(wp),           INTENT(inout), DIMENSION(jpi,jpj,jpk)   ::   pu, pv   ! Components of current
       LOGICAL,  OPTIONAL, INTENT(in   )                           ::   fwd      ! Forward (default) or reverse rotation
       INTEGER,  OPTIONAL, INTENT(in   )                           ::   ktop     ! Minimum depth index
-      INTEGER,  OPTIONAL, INTENT(in   ), DIMENSION(A2D(nn_hls-1)) ::   knlev    ! Array of maximum depth indices
+      INTEGER,  OPTIONAL, INTENT(in   ), DIMENSION(T2D(nn_hls-1)) ::   knlev    ! Array of maximum depth indices
       !!
       INTEGER  ::   ji, jj, jk, jktop, jkmax   ! Loop indices
       REAL(wp) ::   ztmp, zfwd                 ! Auxiliary variables
@@ -1221,17 +1223,17 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   ) ::   Kmm       ! Ocean time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_ent   ! Buoyancy fluxes at base
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_min   !    of well-mixed layer
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pshear    ! Production of TKE due to shear across the pycnocline
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl      ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phml      ! ML depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdh       ! Pycnocline depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pwb_ent   ! Buoyancy fluxes at base
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pwb_min   !    of well-mixed layer
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pshear    ! Production of TKE due to shear across the pycnocline
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl      ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phml      ! ML depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdh       ! Pycnocline depth
       !!
       INTEGER :: jj, ji   ! Loop indices
       !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zekman
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zri_p, zri_b   ! Richardson numbers
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zekman
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zri_p, zri_b   ! Richardson numbers
       REAL(wp)                           ::   zshear_u, zshear_v, zwb_shr
       REAL(wp)                           ::   zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes
       !!
@@ -1268,8 +1270,8 @@ CONTAINS
       DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
          pshear(ji,jj) = 0.0_wp
       END_2D
-      zekman(:,:) = EXP( -1.0_wp * pp_ek * ABS( ff_t(A2D(nn_hls-1)) ) * phbl(A2D(nn_hls-1)) /   &
-         &               MAX( sustar(A2D(nn_hls-1)), 1.e-8 ) )
+      zekman(:,:) = EXP( -1.0_wp * pp_ek * ABS( ff_t(T2D(nn_hls-1)) ) * phbl(T2D(nn_hls-1)) /   &
+         &               MAX( sustar(T2D(nn_hls-1)), 1.e-8 ) )
       !
       DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
          IF ( l_conv(ji,jj) ) THEN
@@ -1384,9 +1386,9 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------   
       INTEGER,                            INTENT(in   ) ::   Kmm            ! Ocean time-level index
-      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   kbase          ! OSBL base layer index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdtdz, pdsdz   ! External gradients of temperature, salinity
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdbdz          !    and buoyancy
+      INTEGER,  DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   kbase          ! OSBL base layer index
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pdtdz, pdsdz   ! External gradients of temperature, salinity
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pdbdz          !    and buoyancy
       !!
       INTEGER  ::   ji, jj, jkb, jkb1
       REAL(wp) ::   zthermal, zbeta
@@ -1428,15 +1430,15 @@ CONTAINS
       !! ** Method  :
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdhdt          ! Rate of change of hbl
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdh            ! Pycnocline depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_min
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk         ! Max MLE buoyancy flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pvel_mle       ! Vvelocity scale for dhdt with stable ML and FK
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pdhdt          ! Rate of change of hbl
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdh            ! Pycnocline depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_min
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(  out) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk         ! Max MLE buoyancy flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pvel_mle       ! Vvelocity scale for dhdt with stable ML and FK
       !!
       INTEGER  ::   jj, ji
       REAL(wp) ::   zgamma_b_nd, zgamma_dh_nd, zpert, zpsi, zari
@@ -1598,11 +1600,11 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   ) ::   Kmm        ! Ocean time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdhdt      ! Rates of change of hbl
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phbl       ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl_t     ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent    ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b   ! MLE buoyancy flux averaged over OSBL
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pdhdt      ! Rates of change of hbl
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   phbl       ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl_t     ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent    ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b   ! MLE buoyancy flux averaged over OSBL
       !!
       INTEGER  ::   jk, jj, ji, jm
       REAL(wp) ::   zhbl_s, zvel_max, zdb
@@ -1698,13 +1700,13 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   ) ::   Kmm            ! Ocean time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdh            ! Pycnocline thickness
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phml           ! ML depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdhdt          ! BL depth tendency
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pdh            ! Pycnocline thickness
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   phml           ! ML depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdhdt          ! BL depth tendency
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL
       !!
       INTEGER  ::   jj, ji
       INTEGER  ::   inhml
@@ -1858,14 +1860,14 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                                 INTENT(in   ) ::   Kmm            ! Ocean time-level index
-      INTEGER,  DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! External-level offsets
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(  out) ::   pdbdz          ! Gradients in the pycnocline
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(  out) ::   palpha
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline thickness
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! Rates of change of hbl
+      INTEGER,  DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! External-level offsets
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk),  INTENT(  out) ::   pdbdz          ! Gradients in the pycnocline
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(  out) ::   palpha
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline thickness
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! Rates of change of hbl
       !!
       INTEGER  ::   jk, jj, ji
       REAL(wp) ::   zbgrad
@@ -1951,7 +1953,7 @@ CONTAINS
       END_2D
       !
       IF ( ln_dia_pyc_scl ) THEN   ! Output of pycnocline gradient profiles
-         CALL zdf_osm_iomput( "zdbdz_pyc", wmask(A2D(0),:) * pdbdz(A2D(0),:) )
+         CALL zdf_osm_iomput( "zdbdz_pyc", wmask(T2D(0),:) * pdbdz(T2D(0),:) )
       END IF
       !
    END SUBROUTINE zdf_osm_pycnocline_buoyancy_profiles
@@ -1969,23 +1971,23 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                                 INTENT(in   ) ::   Kbb, Kmm       ! Ocean time-level indices
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(inout) ::   pdiffut        ! t-diffusivity
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(inout) ::   pviscos        ! Viscosity
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pwb_min
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk),  INTENT(inout) ::   pdiffut        ! t-diffusivity
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk),  INTENT(inout) ::   pviscos        ! Viscosity
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pwb_min
       !!
       INTEGER ::   ji, jj, jk   ! Loop indices
       !! Scales used to calculate eddy diffusivity and viscosity profiles
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdifml_sc,    zvisml_sc
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdifpyc_n_sc, zdifpyc_s_sc
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zvispyc_n_sc, zvispyc_s_sc
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zbeta_d_sc,   zbeta_v_sc
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zb_coup,      zc_coup_vis,  zc_coup_dif
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdifml_sc,    zvisml_sc
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zdifpyc_n_sc, zdifpyc_s_sc
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zvispyc_n_sc, zvispyc_s_sc
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zbeta_d_sc,   zbeta_v_sc
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zb_coup,      zc_coup_vis,  zc_coup_dif
       !!
       REAL(wp) ::   zvel_sc_pyc, zvel_sc_ml, zstab_fac, zz_b
       REAL(wp) ::   za_cubic, zb_d_cubic, zc_d_cubic, zd_d_cubic,   &   ! Coefficients in cubic polynomial specifying diffusivity
@@ -2148,7 +2150,7 @@ CONTAINS
          ENDIF   ! End if ( l_conv )
          !
       END_2D
-      CALL zdf_osm_iomput( "pb_coup", tmask(A2D(0),1) * zb_coup(A2D(0)) )   ! BBL-coupling velocity scale
+      CALL zdf_osm_iomput( "pb_coup", tmask(T2D(0),1) * zb_coup(T2D(0)) )   ! BBL-coupling velocity scale
       !
    END SUBROUTINE zdf_osm_diffusivity_viscosity
 
@@ -2164,39 +2166,39 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                                 INTENT(in   ) ::   Kmm            ! Time-level index
-      INTEGER,  DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! Offset for external level
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdtdz_bl_ext   ! External temperature gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdsdz_bl_ext   ! External salinity gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(in   ) ::   pdiffut        ! t-diffusivity
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(in   ) ::   pviscos        ! Viscosity
-      !!
-      REAL(wp), DIMENSION(A2D(nn_hls-1))     ::   zalpha_pyc   !
-      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk) ::   zdbdz_pyc    ! Parametrised gradient of buoyancy in the pycnocline
+      INTEGER,  DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! Offset for external level
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdtdz_bl_ext   ! External temperature gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdsdz_bl_ext   ! External salinity gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk),  INTENT(in   ) ::   pdiffut        ! t-diffusivity
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk),  INTENT(in   ) ::   pviscos        ! Viscosity
+      !!
+      REAL(wp), DIMENSION(T2D(nn_hls-1))     ::   zalpha_pyc   !
+      REAL(wp), DIMENSION(T2D(nn_hls-1),jpk) ::   zdbdz_pyc    ! Parametrised gradient of buoyancy in the pycnocline
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   z3ddz_pyc_1, z3ddz_pyc_2   ! Pycnocline gradient/shear profiles
       !!
       INTEGER                            ::   ji, jj, jk, jkm_bld, jkf_mld, jkm_mld   ! Loop indices
       INTEGER                            ::   istat                                   ! Memory allocation status
       REAL(wp)                           ::   zznd_d, zznd_ml, zznd_pyc, znd          ! Temporary non-dimensional depths
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_wth_1,zsc_ws_1                      ! Temporary scales
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_uw_1, zsc_uw_2                      ! Temporary scales
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_vw_1, zsc_vw_2                      ! Temporary scales
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztau_sc_u                               ! Dissipation timescale at base of WML
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zsc_wth_1,zsc_ws_1                      ! Temporary scales
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zsc_uw_1, zsc_uw_2                      ! Temporary scales
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zsc_vw_1, zsc_vw_2                      ! Temporary scales
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   ztau_sc_u                               ! Dissipation timescale at base of WML
       REAL(wp)                           ::   zbuoy_pyc_sc, zdelta_pyc                !
       REAL(wp)                           ::   zl_c,zl_l,zl_eps                        ! Used to calculate turbulence length scale
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   za_cubic, zb_cubic                      ! Coefficients in cubic polynomial specifying
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zc_cubic, zd_cubic                      !    diffusivity in pycnocline
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwt_pyc_sc_1, zws_pyc_sc_1              !
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zzeta_pyc                               !
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   za_cubic, zb_cubic                      ! Coefficients in cubic polynomial specifying
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zc_cubic, zd_cubic                      !    diffusivity in pycnocline
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwt_pyc_sc_1, zws_pyc_sc_1              !
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zzeta_pyc                               !
       REAL(wp)                           ::   zomega, zvw_max                         !
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zuw_bse,zvw_bse                         ! Momentum, heat, and salinity fluxes
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwth_ent,zws_ent                        !    at the top of the pycnocline
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_wth_pyc, zsc_ws_pyc                 ! Scales for pycnocline transport term
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zuw_bse,zvw_bse                         ! Momentum, heat, and salinity fluxes
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zwth_ent,zws_ent                        !    at the top of the pycnocline
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   zsc_wth_pyc, zsc_ws_pyc                 ! Scales for pycnocline transport term
       REAL(wp)                           ::   ztmp                                    !
       REAL(wp)                           ::   ztgrad, zsgrad, zbgrad                  ! Variables used to calculate pycnocline
       !!                                                                              !    gradients
@@ -2228,14 +2230,14 @@ CONTAINS
       !
       ! Stokes term in scalar flux, flux-gradient relationship
       ! ------------------------------------------------------
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_wth_1(:,:) = swstrl(A2D(nn_hls-1))**3 * swth0(A2D(nn_hls-1)) /   &
-            &             ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )
-         zsc_ws_1(:,:)  = swstrl(A2D(nn_hls-1))**3 * sws0(A2D(nn_hls-1))  /   &
-            &             ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_wth_1(:,:) = swstrl(T2D(nn_hls-1))**3 * swth0(T2D(nn_hls-1)) /   &
+            &             ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )
+         zsc_ws_1(:,:)  = swstrl(T2D(nn_hls-1))**3 * sws0(T2D(nn_hls-1))  /   &
+            &             ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )
       ELSEWHERE
-         zsc_wth_1(:,:) = 2.0_wp * swthav(A2D(nn_hls-1))
-         zsc_ws_1(:,:)  = 2.0_wp * swsav(A2D(nn_hls-1))
+         zsc_wth_1(:,:) = 2.0_wp * swthav(T2D(nn_hls-1))
+         zsc_ws_1(:,:)  = 2.0_wp * swsav(T2D(nn_hls-1))
       ENDWHERE
       DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) )
          IF ( l_conv(ji,jj) ) THEN
@@ -2258,27 +2260,27 @@ CONTAINS
       END_3D
       !
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "ghamu_00", wmask(A2D(0),:) * ghamu(A2D(0),:) )
-         CALL zdf_osm_iomput( "ghamv_00", wmask(A2D(0),:) * ghamv(A2D(0),:) )
+         CALL zdf_osm_iomput( "ghamu_00", wmask(T2D(0),:) * ghamu(T2D(0),:) )
+         CALL zdf_osm_iomput( "ghamv_00", wmask(T2D(0),:) * ghamv(T2D(0),:) )
       END IF
       !
       ! Stokes term in flux-gradient relationship (note in zsc_uw_n don't use
       ! svstr since term needs to go to zero as swstrl goes to zero)
       ! ---------------------------------------------------------------------
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_uw_1(:,:) = ( swstrl(A2D(nn_hls-1))**3 +                                                &
-            &              0.5_wp * swstrc(A2D(nn_hls-1))**3 )**pthird * sustke(A2D(nn_hls-1)) /   &
-            &              MAX( ( 1.0_wp - 1.0_wp * 6.5_wp * sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) ), 0.2_wp )
-         zsc_uw_2(:,:) = ( swstrl(A2D(nn_hls-1))**3 +                                                &
-            &              0.5_wp * swstrc(A2D(nn_hls-1))**3 )**pthird * sustke(A2D(nn_hls-1)) /   &
-            &              MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) + epsln, 0.12_wp )
-         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * phml(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))**3 *   &
-            &            MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) /                    &
-            &            ( ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 )**( 2.0_wp / 3.0_wp ) + epsln )
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_uw_1(:,:) = ( swstrl(T2D(nn_hls-1))**3 +                                                &
+            &              0.5_wp * swstrc(T2D(nn_hls-1))**3 )**pthird * sustke(T2D(nn_hls-1)) /   &
+            &              MAX( ( 1.0_wp - 1.0_wp * 6.5_wp * sla(T2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) ), 0.2_wp )
+         zsc_uw_2(:,:) = ( swstrl(T2D(nn_hls-1))**3 +                                                &
+            &              0.5_wp * swstrc(T2D(nn_hls-1))**3 )**pthird * sustke(T2D(nn_hls-1)) /   &
+            &              MIN( sla(T2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) + epsln, 0.12_wp )
+         zsc_vw_1(:,:) = ff_t(T2D(nn_hls-1)) * phml(T2D(nn_hls-1)) * sustke(T2D(nn_hls-1))**3 *   &
+            &            MIN( sla(T2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) /                    &
+            &            ( ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 )**( 2.0_wp / 3.0_wp ) + epsln )
       ELSEWHERE
-         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2
-         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * phbl(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))**3 *   &
-            &            MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) / ( svstr(A2D(nn_hls-1))**2 + epsln )
+         zsc_uw_1(:,:) = sustar(T2D(nn_hls-1))**2
+         zsc_vw_1(:,:) = ff_t(T2D(nn_hls-1)) * phbl(T2D(nn_hls-1)) * sustke(T2D(nn_hls-1))**3 *   &
+            &            MIN( sla(T2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) / ( svstr(T2D(nn_hls-1))**2 + epsln )
       ENDWHERE
       DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) )
          IF ( l_conv(ji,jj) ) THEN
@@ -2302,11 +2304,11 @@ CONTAINS
       ! Buoyancy term in flux-gradient relationship [note : includes ROI ratio
       ! (X0.3) and pressure (X0.5)]
       ! ----------------------------------------------------------------------
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_wth_1(:,:) = swbav(A2D(nn_hls-1)) * swth0(A2D(nn_hls-1)) * ( 1.0_wp + EXP( 0.2_wp * shol(A2D(nn_hls-1)) ) ) *   &
-            &             phml(A2D(nn_hls-1)) / ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )
-         zsc_ws_1(:,:)  = swbav(A2D(nn_hls-1)) * sws0(A2D(nn_hls-1))  * ( 1.0_wp + EXP( 0.2_wp * shol(A2D(nn_hls-1)) ) ) *   &
-            &             phml(A2D(nn_hls-1)) / ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_wth_1(:,:) = swbav(T2D(nn_hls-1)) * swth0(T2D(nn_hls-1)) * ( 1.0_wp + EXP( 0.2_wp * shol(T2D(nn_hls-1)) ) ) *   &
+            &             phml(T2D(nn_hls-1)) / ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )
+         zsc_ws_1(:,:)  = swbav(T2D(nn_hls-1)) * sws0(T2D(nn_hls-1))  * ( 1.0_wp + EXP( 0.2_wp * shol(T2D(nn_hls-1)) ) ) *   &
+            &             phml(T2D(nn_hls-1)) / ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )
       ELSEWHERE
          zsc_wth_1(:,:) = 0.0_wp
          zsc_ws_1(:,:)  = 0.0_wp
@@ -2373,16 +2375,16 @@ CONTAINS
       END_3D
       !
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "zwth_ent", tmask(A2D(0),1) * zwth_ent(A2D(0)) )   ! Upward turb. temperature entrainment flux
-         CALL zdf_osm_iomput( "zws_ent",  tmask(A2D(0),1) * zws_ent(A2D(0))  )   ! Upward turb. salinity entrainment flux
+         CALL zdf_osm_iomput( "zwth_ent", tmask(T2D(0),1) * zwth_ent(T2D(0)) )   ! Upward turb. temperature entrainment flux
+         CALL zdf_osm_iomput( "zws_ent",  tmask(T2D(0),1) * zws_ent(T2D(0))  )   ! Upward turb. salinity entrainment flux
       END IF
       !
       zsc_vw_1(:,:) = 0.0_wp
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_uw_1(:,:) = -1.0_wp * swb0(A2D(nn_hls-1)) * sustar(A2D(nn_hls-1))**2 * phml(A2D(nn_hls-1)) /   &
-            &            ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )
-         zsc_uw_2(:,:) =           swb0(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))    * phml(A2D(nn_hls-1)) /   &
-            &            ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )**( 2.0_wp / 3.0_wp )
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_uw_1(:,:) = -1.0_wp * swb0(T2D(nn_hls-1)) * sustar(T2D(nn_hls-1))**2 * phml(T2D(nn_hls-1)) /   &
+            &            ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )
+         zsc_uw_2(:,:) =           swb0(T2D(nn_hls-1)) * sustke(T2D(nn_hls-1))    * phml(T2D(nn_hls-1)) /   &
+            &            ( svstr(T2D(nn_hls-1))**3 + 0.5_wp * swstrc(T2D(nn_hls-1))**3 + epsln )**( 2.0_wp / 3.0_wp )
       ELSEWHERE
          zsc_uw_1(:,:) = 0.0_wp
       ENDWHERE
@@ -2435,25 +2437,25 @@ CONTAINS
       END_3D
       !
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "ghamu_0",    wmask(A2D(0),:) * ghamu(A2D(0),:)  )
-         CALL zdf_osm_iomput( "zsc_uw_1_0", tmask(A2D(0),1) * zsc_uw_1(A2D(0)) )
+         CALL zdf_osm_iomput( "ghamu_0",    wmask(T2D(0),:) * ghamu(T2D(0),:)  )
+         CALL zdf_osm_iomput( "zsc_uw_1_0", tmask(T2D(0),1) * zsc_uw_1(T2D(0)) )
       END IF
       !
       ! Transport term in flux-gradient relationship [note : includes ROI ratio
       ! (X0.3) ]
       ! -----------------------------------------------------------------------
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_wth_1(:,:) = swth0(A2D(nn_hls-1)) / ( 1.0_wp - 0.56_wp * EXP( shol(A2D(nn_hls-1)) ) )
-         zsc_ws_1(:,:)  = sws0(A2D(nn_hls-1))  / ( 1.0_wp - 0.56_wp * EXP( shol(A2D(nn_hls-1)) ) )
-         WHERE ( l_pyc(A2D(nn_hls-1)) )   ! Pycnocline scales
-            zsc_wth_pyc(:,:) = -0.003_wp * swstrc(A2D(nn_hls-1)) * ( 1.0_wp - pdh(A2D(nn_hls-1)) / phbl(A2D(nn_hls-1)) ) *   &
-               &               av_dt_ml(A2D(nn_hls-1))
-            zsc_ws_pyc(:,:)  = -0.003_wp * swstrc(A2D(nn_hls-1)) * ( 1.0_wp - pdh(A2D(nn_hls-1)) / phbl(A2D(nn_hls-1)) ) *   &
-               &               av_ds_ml(A2D(nn_hls-1))
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_wth_1(:,:) = swth0(T2D(nn_hls-1)) / ( 1.0_wp - 0.56_wp * EXP( shol(T2D(nn_hls-1)) ) )
+         zsc_ws_1(:,:)  = sws0(T2D(nn_hls-1))  / ( 1.0_wp - 0.56_wp * EXP( shol(T2D(nn_hls-1)) ) )
+         WHERE ( l_pyc(T2D(nn_hls-1)) )   ! Pycnocline scales
+            zsc_wth_pyc(:,:) = -0.003_wp * swstrc(T2D(nn_hls-1)) * ( 1.0_wp - pdh(T2D(nn_hls-1)) / phbl(T2D(nn_hls-1)) ) *   &
+               &               av_dt_ml(T2D(nn_hls-1))
+            zsc_ws_pyc(:,:)  = -0.003_wp * swstrc(T2D(nn_hls-1)) * ( 1.0_wp - pdh(T2D(nn_hls-1)) / phbl(T2D(nn_hls-1)) ) *   &
+               &               av_ds_ml(T2D(nn_hls-1))
          END WHERE
       ELSEWHERE
-         zsc_wth_1(:,:) = 2.0_wp * swthav(A2D(nn_hls-1))
-         zsc_ws_1(:,:)  =          sws0(A2D(nn_hls-1))
+         zsc_wth_1(:,:) = 2.0_wp * swthav(T2D(nn_hls-1))
+         zsc_ws_1(:,:)  =          sws0(T2D(nn_hls-1))
       END WHERE
       DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, MAX( jkm_mld, jkm_bld ) )
          IF ( l_conv(ji,jj) ) THEN
@@ -2490,14 +2492,14 @@ CONTAINS
          ENDIF
       END_3D
       !
-      WHERE ( l_conv(A2D(nn_hls-1)) )
-         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2
-         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1)) * phml(A2D(nn_hls-1))
+      WHERE ( l_conv(T2D(nn_hls-1)) )
+         zsc_uw_1(:,:) = sustar(T2D(nn_hls-1))**2
+         zsc_vw_1(:,:) = ff_t(T2D(nn_hls-1)) * sustke(T2D(nn_hls-1)) * phml(T2D(nn_hls-1))
       ELSEWHERE
-         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2
+         zsc_uw_1(:,:) = sustar(T2D(nn_hls-1))**2
          zsc_uw_2(:,:) = ( 2.25_wp - 3.0_wp * ( 1.0_wp - EXP( -1.25_wp * 2.0_wp ) ) ) * ( 1.0_wp - EXP( -4.0_wp * 2.0_wp ) ) *   &
             &            zsc_uw_1(:,:)
-         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1)) * phbl(A2D(nn_hls-1))
+         zsc_vw_1(:,:) = ff_t(T2D(nn_hls-1)) * sustke(T2D(nn_hls-1)) * phbl(T2D(nn_hls-1))
          zsc_vw_2(:,:) = -0.11_wp * SIN( 3.14159_wp * ( 2.0_wp + 0.4_wp ) ) * EXP( -1.0_wp * ( 1.5_wp + 2.0_wp )**2 ) *   &
             &            zsc_vw_1(:,:)
       ENDWHERE
@@ -2534,12 +2536,12 @@ CONTAINS
       END_3D
       !
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "ghamu_f",    wmask(A2D(0),:) * ghamu(A2D(0),:)  )
-         CALL zdf_osm_iomput( "ghamv_f",    wmask(A2D(0),:) * ghamv(A2D(0),:)  )
-         CALL zdf_osm_iomput( "zsc_uw_1_f", tmask(A2D(0),1) * zsc_uw_1(A2D(0)) )
-         CALL zdf_osm_iomput( "zsc_vw_1_f", tmask(A2D(0),1) * zsc_vw_1(A2D(0)) )
-         CALL zdf_osm_iomput( "zsc_uw_2_f", tmask(A2D(0),1) * zsc_uw_2(A2D(0)) )
-         CALL zdf_osm_iomput( "zsc_vw_2_f", tmask(A2D(0),1) * zsc_vw_2(A2D(0)) )
+         CALL zdf_osm_iomput( "ghamu_f",    wmask(T2D(0),:) * ghamu(T2D(0),:)  )
+         CALL zdf_osm_iomput( "ghamv_f",    wmask(T2D(0),:) * ghamv(T2D(0),:)  )
+         CALL zdf_osm_iomput( "zsc_uw_1_f", tmask(T2D(0),1) * zsc_uw_1(T2D(0)) )
+         CALL zdf_osm_iomput( "zsc_vw_1_f", tmask(T2D(0),1) * zsc_vw_1(T2D(0)) )
+         CALL zdf_osm_iomput( "zsc_uw_2_f", tmask(T2D(0),1) * zsc_uw_2(T2D(0)) )
+         CALL zdf_osm_iomput( "zsc_vw_2_f", tmask(T2D(0),1) * zsc_vw_2(T2D(0)) )
       END IF
       !
       ! Make surface forced velocity non-gradient terms go to zero at the base
@@ -2563,7 +2565,7 @@ CONTAINS
       ! Pynocline contributions
       !
       IF ( ln_dia_pyc_scl .OR. ln_dia_pyc_shr ) THEN   ! Allocate arrays for output of pycnocline gradient/shear profiles
-         ALLOCATE( z3ddz_pyc_1(A2D(nn_hls),jpk), z3ddz_pyc_2(A2D(nn_hls),jpk), STAT=istat )
+         ALLOCATE( z3ddz_pyc_1(T2D(nn_hls),jpk), z3ddz_pyc_2(T2D(nn_hls),jpk), STAT=istat )
          IF ( istat /= 0 ) CALL ctl_stop( 'zdf_osm: failed to allocate temporary arrays' )
          z3ddz_pyc_1(:,:,:) = 0.0_wp
          z3ddz_pyc_2(:,:,:) = 0.0_wp
@@ -2634,8 +2636,8 @@ CONTAINS
          END IF
       END_3D
       IF ( ln_dia_pyc_scl ) THEN   ! Output of pycnocline gradient profiles
-         CALL zdf_osm_iomput( "zdtdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_1(A2D(0),:) )
-         CALL zdf_osm_iomput( "zdsdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_2(A2D(0),:) )
+         CALL zdf_osm_iomput( "zdtdz_pyc", wmask(T2D(0),:) * z3ddz_pyc_1(T2D(0),:) )
+         CALL zdf_osm_iomput( "zdsdz_pyc", wmask(T2D(0),:) * z3ddz_pyc_2(T2D(0),:) )
       END IF
       DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkm_bld )
          IF ( .NOT. l_conv (ji,jj) ) THEN
@@ -2661,12 +2663,12 @@ CONTAINS
          END IF
       END_3D
       IF ( ln_dia_pyc_shr ) THEN   ! Output of pycnocline shear profiles
-         CALL zdf_osm_iomput( "zdudz_pyc", wmask(A2D(0),:) * z3ddz_pyc_1(A2D(0),:) )
-         CALL zdf_osm_iomput( "zdvdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_2(A2D(0),:) )
+         CALL zdf_osm_iomput( "zdudz_pyc", wmask(T2D(0),:) * z3ddz_pyc_1(T2D(0),:) )
+         CALL zdf_osm_iomput( "zdvdz_pyc", wmask(T2D(0),:) * z3ddz_pyc_2(T2D(0),:) )
       END IF
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "ghamu_b", wmask(A2D(0),:) * ghamu(A2D(0),:) )
-         CALL zdf_osm_iomput( "ghamv_b", wmask(A2D(0),:) * ghamv(A2D(0),:) )
+         CALL zdf_osm_iomput( "ghamu_b", wmask(T2D(0),:) * ghamu(T2D(0),:) )
+         CALL zdf_osm_iomput( "ghamv_b", wmask(T2D(0),:) * ghamv(T2D(0),:) )
       END IF
       IF ( ln_dia_pyc_scl .OR. ln_dia_pyc_shr ) THEN   ! Deallocate arrays used for output of pycnocline gradient/shear profiles
          DEALLOCATE( z3ddz_pyc_1, z3ddz_pyc_2 )
@@ -2680,9 +2682,9 @@ CONTAINS
       END_2D
       !
       IF ( ln_dia_osm ) THEN
-         CALL zdf_osm_iomput( "ghamu_1", wmask(A2D(0),:) * ghamu(A2D(0),:)   )
-         CALL zdf_osm_iomput( "ghamv_1", wmask(A2D(0),:) * ghamv(A2D(0),:)   )
-         CALL zdf_osm_iomput( "zviscos", wmask(A2D(0),:) * pviscos(A2D(0),:) )
+         CALL zdf_osm_iomput( "ghamu_1", wmask(T2D(0),:) * ghamu(T2D(0),:)   )
+         CALL zdf_osm_iomput( "ghamv_1", wmask(T2D(0),:) * ghamv(T2D(0),:)   )
+         CALL zdf_osm_iomput( "zviscos", wmask(T2D(0),:) * pviscos(T2D(0),:) )
       END IF
       !
    END SUBROUTINE zdf_osm_fgr_terms
@@ -2702,26 +2704,26 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   ) ::   Kmm          ! Time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(  out) ::   pmld         ! == Estimated FK BLD used for MLE horizontal gradients == !
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdtdx        ! Horizontal gradient for Fox-Kemper parametrization
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdtdy        ! Horizontal gradient for Fox-Kemper parametrization
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdsdx        ! Horizontal gradient for Fox-Kemper parametrization
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdsdy        ! Horizontal gradient for Fox-Kemper parametrization
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdbds_mle    ! Magnitude of horizontal buoyancy gradient
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(  out) ::   pmld         ! == Estimated FK BLD used for MLE horizontal gradients == !
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(inout) ::   pdtdx        ! Horizontal gradient for Fox-Kemper parametrization
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(inout) ::   pdtdy        ! Horizontal gradient for Fox-Kemper parametrization
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(inout) ::   pdsdx        ! Horizontal gradient for Fox-Kemper parametrization
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(inout) ::   pdsdy        ! Horizontal gradient for Fox-Kemper parametrization
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pdbds_mle    ! Magnitude of horizontal buoyancy gradient
       !!
       INTEGER                               ::   ji, jj, jk   ! Dummy loop indices
-      INTEGER,  DIMENSION(A2D(nn_hls))      ::   jk_mld_prof  ! Base level of MLE layer
+      INTEGER,  DIMENSION(T2D(nn_hls))      ::   jk_mld_prof  ! Base level of MLE layer
       INTEGER                               ::   ikt, ikmax   ! Local integers      
       REAL(wp)                              ::   zc
       REAL(wp)                              ::   zN2_c        ! Local buoyancy difference from 10m value
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   ztm
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zsm
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   ztsm_midu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   ztsm_midv
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   zabu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   zabv
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zmld_midu
-      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zmld_midv
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   ztm
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   zsm
+      REAL(wp), DIMENSION(T2D(nn_hls),jpts) ::   ztsm_midu
+      REAL(wp), DIMENSION(T2D(nn_hls),jpts) ::   ztsm_midv
+      REAL(wp), DIMENSION(T2D(nn_hls),jpts) ::   zabu
+      REAL(wp), DIMENSION(T2D(nn_hls),jpts) ::   zabv
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   zmld_midu
+      REAL(wp), DIMENSION(T2D(nn_hls))      ::   zmld_midv
       !!----------------------------------------------------------------------
       !
       ! ==  MLD used for MLE  ==!
@@ -2743,7 +2745,7 @@ CONTAINS
          mld_prof(ji,jj) = jk_mld_prof(ji,jj)
       END_2D
       !
-      ikmax = MIN( MAXVAL( jk_mld_prof(A2D(nn_hls)) ), jpkm1 )   ! Max level of the computation
+      ikmax = MIN( MAXVAL( jk_mld_prof(T2D(nn_hls)) ), jpkm1 )   ! Max level of the computation
       ztm(:,:) = 0.0_wp
       zsm(:,:) = 0.0_wp
       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, ikmax )
@@ -2811,14 +2813,14 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------      
       INTEGER,                            INTENT(in   ) ::   Kmm         ! Time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pwb_fk
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phmle       ! MLE depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent     ! Buoyancy entrainment flux
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pwb_fk
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phmle       ! MLE depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent     ! Buoyancy entrainment flux
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient
       !!
       INTEGER                            ::   ji, jj, jk        ! Dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   znd_param
+      REAL(wp), DIMENSION(T2D(nn_hls-1)) ::   znd_param
       REAL(wp)                           ::   zthermal, zbeta
       REAL(wp)                           ::   zbuoy
       REAL(wp)                           ::   ztmp
@@ -2923,13 +2925,13 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER,                            INTENT(in   ) ::   Kmm         ! Time-level index
-      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(in   ) ::   pmld        ! == Estimated FK BLD used for MLE horiz gradients == !
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phmle       ! MLE depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pvel_mle    ! Velocity scale for dhdt with stable ML and FK
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdiff_mle   ! Extra MLE vertical diff
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth
-      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb0tot     ! Total surface buoyancy flux including insolation
+      REAL(wp), DIMENSION(T2D(nn_hls)),   INTENT(in   ) ::   pmld        ! == Estimated FK BLD used for MLE horiz gradients == !
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   phmle       ! MLE depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pvel_mle    ! Velocity scale for dhdt with stable ML and FK
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(inout) ::   pdiff_mle   ! Extra MLE vertical diff
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth
+      REAL(wp), DIMENSION(T2D(nn_hls-1)), INTENT(in   ) ::   pwb0tot     ! Total surface buoyancy flux including insolation
       !!
       INTEGER  ::   ji, jj, jk   ! Dummy loop indices
       REAL(wp) ::   ztmp
@@ -2943,6 +2945,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !
       ! Calculate vertical buoyancy, heat and salinity fluxes due to MLE
+      ! BUG: [zdfosm_avt_diag] lbc_lnk changes the value of avt on the northfold (see zdfphy.F90 comment). It seems to stem from here- if ztmp is converted to an array, calling lbc_lnk on this array has the same effect as calling lbc_lnk on avt. I think it could be related to l_conv.
       DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
          IF ( l_conv(ji,jj) ) THEN
             ztmp =  r1_ft(ji,jj) * MIN( 111e3_wp, e1u(ji,jj) ) / rn_osm_mle_lf
@@ -2969,7 +2972,7 @@ CONTAINS
                hmle(ji,jj) = hmle(ji,jj) - 10.0_wp * ( hmle(ji,jj) - hbl(ji,jj) ) * rn_Dt / rn_osm_mle_tau
             END IF
          END IF
-         hmle(ji,jj) = MAX( MIN( hmle(ji,jj), ht(ji,jj) ), gdepw(ji,jj,4,Kmm) )
+         hmle(ji,jj) = MAX( MIN( hmle(ji,jj), ht(ji,jj,Kmm) ), gdepw(ji,jj,4,Kmm) )
          IF ( ln_osm_hmle_limit ) hmle(ji,jj) = MIN( hmle(ji,jj), rn_osm_hmle_limit*hbl(ji,jj) )
          hmle(ji,jj) = pmld(ji,jj)   ! For now try just set hmle to pmld
       END_2D
@@ -3070,6 +3073,13 @@ CONTAINS
             & CALL ctl_stop( 'zdf_osm_init : ln_zdfosm and nn_osm_wave=2, ln_wave and ln_sdw must be true' )
       END IF
       !
+      ! TEMP: Specifically, the issue is that rCdU_bot is accessed on halo points but is no longer defined there. We must remove halo calculations from zdfosm where possible.
+      IF( ln_tile ) THEN
+         CALL ctl_warn( 'zdf_osm_init: tiling is not currently working with OSMOSIS- it is disabled' )
+         ln_tile = .FALSE.
+         CALL dom_tile_init
+      ENDIF
+      !
       ! Flags associated with diagnostic output
       IF ( ln_dia_osm .AND. ( iom_use("zdudz_pyc") .OR. iom_use("zdvdz_pyc") ) )                            ln_dia_pyc_shr = .TRUE.
       IF ( ln_dia_osm .AND. ( iom_use("zdtdz_pyc") .OR. iom_use("zdsdz_pyc") .OR. iom_use("zdbdz_pyc" ) ) ) ln_dia_pyc_scl = .TRUE.
@@ -3196,9 +3206,9 @@ CONTAINS
       !
       ! Initialization of vertical eddy coef. to the background value
       ! -------------------------------------------------------------
-      DO jk = 1, jpk
-         avt(:,:,jk) = avtb(jk) * tmask(:,:,jk)
-      END DO
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         avt(ji,jj,jk) = avtb(jk) * tmask(ji,jj,jk)
+      END_3D
       !
       ! Zero the surface flux for non local term and osm mixed layer depth
       ! ------------------------------------------------------------------
@@ -3447,8 +3457,8 @@ CONTAINS
       !
       IF ( ln_dia_osm .AND. iom_use( cdname ) ) THEN
          IF ( SIZE( posmdia2d, 1 ) == ntei-ntsi+1 .AND. SIZE( posmdia2d, 2 ) == ntej-ntsj+1 ) THEN   ! Halo absent
-            osmdia2d(A2D(0)) = posmdia2d(:,:)
-            CALL iom_put( cdname, osmdia2d(A2D(nn_hls)) )
+            osmdia2d(T2D(0)) = posmdia2d(:,:)
+            CALL iom_put( cdname, osmdia2d(T2D(nn_hls)) )
          ELSE   ! Halo present
             CALL iom_put( cdname, posmdia2d )
          END IF
@@ -3470,8 +3480,8 @@ CONTAINS
       !
       IF ( ln_dia_osm .AND. iom_use( cdname ) ) THEN
          IF ( SIZE( posmdia3d, 1 ) == ntei-ntsi+1 .AND. SIZE( posmdia3d, 2 ) == ntej-ntsj+1 ) THEN   ! Halo absent
-            osmdia3d(A2D(0),:) = posmdia3d(:,:,:)
-            CALL iom_put( cdname, osmdia3d(A2D(nn_hls),:) )
+            osmdia3d(T2D(0),:) = posmdia3d(:,:,:)
+            CALL iom_put( cdname, osmdia3d(T2D(nn_hls),:) )
          ELSE   ! Halo present
             CALL iom_put( cdname, posmdia3d )
          END IF
diff --git a/src/OCE/ZDF/zdfphy.F90 b/src/OCE/ZDF/zdfphy.F90
index 5fbf2322..aa83add7 100644
--- a/src/OCE/ZDF/zdfphy.F90
+++ b/src/OCE/ZDF/zdfphy.F90
@@ -11,8 +11,6 @@ MODULE zdfphy
    !!   zdf_phy       : upadate at each time-step the vertical mixing coeff.
    !!----------------------------------------------------------------------
    USE oce            ! ocean dynamics and tracers variables
-   ! TEMP: [tiling] This change not necessary after finalisation of zdf_osm (not yet tiled)
-   USE domtile
    USE zdf_oce        ! vertical physics: shared variables
    USE zdfdrg         ! vertical physics: top/bottom drag coef.
    USE zdfsh2         ! vertical physics: shear production term of TKE
@@ -31,6 +29,7 @@ MODULE zdfphy
    USE sbc_oce        ! surface module (only for nn_isf in the option compatibility test)
    USE sbcrnf         ! surface boundary condition: runoff variables
    USE sbc_ice        ! sea ice drag
+   USE domtile
 #if defined key_agrif
    USE agrif_oce_interp   ! interpavm
 #endif
@@ -57,7 +56,7 @@ MODULE zdfphy
 
    LOGICAL, PUBLIC ::   l_zdfsh2   ! shear production term flag (=F for CST, =T otherwise (i.e. TKE, GLS, RIC))
 
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avm_k_n !: "Now" avm_k used for calculation of zsh2 with tiling
+   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   sh2 !: Shear term
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -145,8 +144,10 @@ CONTAINS
          Cu_adv(:,:,:) = 0._wp
          wi    (:,:,:) = 0._wp
       ENDIF
-      !                                  ! Initialise zdf_mxl arrays (only hmld as not set everywhere when nn_hls > 1)
+      !                                  ! Initialise zdf_mxl arrays
       IF( zdf_mxl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_mxl : unable to allocate arrays' )
+      ! Initialize halo for diagnostics (only updated on internal points)
+      hmlp(:,:) = 0._wp
       hmld(:,:) = 0._wp
       !                          !==  Background eddy viscosity and diffusivity  ==!
       IF( nn_avb == 0 ) THEN             ! Define avmb, avtb from namelist parameter
@@ -155,7 +156,7 @@ CONTAINS
       ELSE                               ! Background profile of avt (fit a theoretical/observational profile (Krauss 1990)
          avmb(:) = rn_avm0
          avtb(:) = rn_avt0 + ( 3.e-4_wp - 2._wp * rn_avt0 ) * 1.e-4_wp * gdepw_1d(:)   ! m2/s
-         IF(ln_sco .AND. lwp)   CALL ctl_warn( 'avtb profile not valid in sco' )
+         IF(l_sco .AND. lwp)   CALL ctl_warn( 'avtb profile not valid in sco' )
       ENDIF
       !                                  ! 2D shape of the avtb
       avtb_2d(:,:) = 1._wp                   ! uniform
@@ -164,14 +165,14 @@ CONTAINS
            !                                 !   -15S -5S : linear decrease from avt0 to avt0/10.
            !                                 !   -5S  +5N : cst value avt0/10.
            !                                 !    5N  15N : linear increase from avt0/10, to avt0
-           WHERE(-15. <= gphit .AND. gphit < -5 )   avtb_2d = (1.  - 0.09 * (gphit + 15.))
-           WHERE( -5. <= gphit .AND. gphit <  5 )   avtb_2d =  0.1
-           WHERE(  5. <= gphit .AND. gphit < 15 )   avtb_2d = (0.1 + 0.09 * (gphit -  5.))
+           WHERE(-15. <= gphit(A2D(0)) .AND. gphit(A2D(0)) < -5 )   avtb_2d(:,:) = (1.  - 0.09 * (gphit(A2D(0)) + 15.))
+           WHERE( -5. <= gphit(A2D(0)) .AND. gphit(A2D(0)) <  5 )   avtb_2d(:,:) =  0.1
+           WHERE(  5. <= gphit(A2D(0)) .AND. gphit(A2D(0)) < 15 )   avtb_2d(:,:) = (0.1 + 0.09 * (gphit(A2D(0)) -  5.))
       ENDIF
       !
       DO jk = 1, jpk                      ! set turbulent closure Kz to the background value (avt_k, avm_k)
-         avt_k(:,:,jk) = avtb_2d(:,:) * avtb(jk) * wmask (:,:,jk)
-         avm_k(:,:,jk) =                avmb(jk) * wmask (:,:,jk)
+         avt_k(:,:,jk)    = avtb_2d(:,:) * avtb(jk) * wmask(A2D(0),jk)
+         avm_k(A2D(1),jk) =                avmb(jk) * wmask(A2D(1),jk)
       END DO
 !!gm  to be tested only the 1st & last levels
 !      avt  (:,:, 1 ) = 0._wp   ;   avs(:,:, 1 ) = 0._wp   ;   avm  (:,:, 1 ) = 0._wp
@@ -221,7 +222,6 @@ CONTAINS
       IF( ln_zdfcst .OR. ln_zdfosm ) THEN   ;   l_zdfsh2 = .FALSE.
       ELSE                                  ;   l_zdfsh2 = .TRUE.
       ENDIF
-      IF( ln_tile .AND. l_zdfsh2 ) ALLOCATE( avm_k_n(jpi,jpj,jpk) )
       !                          !== Mass Flux Convectiive algorithm  ==!
       IF( ln_zdfmfc )   CALL zdf_mfc_init       ! Convection computed with eddy diffusivity mass flux
       !
@@ -255,11 +255,20 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs   ! ocean time level indices
       !
       INTEGER ::   ji, jj, jk   ! dummy loop indice
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zsh2   ! shear production
       !! ---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('zdf_phy')
       !
+      IF( l_zdfsh2 ) THEN        !* shear production at w-points (energy conserving form)
+         IF( .NOT. l_istiled .OR. ntile == 1 ) THEN                       ! Do only for the full domain
+            IF( ln_tile ) CALL dom_tile_stop( ldhold=.TRUE. )             ! Use full domain
+            ALLOCATE( sh2(A2D(0),jpk) )
+            CALL zdf_sh2( Kbb, Kmm, avm_k,   &     ! <<== in
+               &                      sh2    )     ! ==>> out : shear production
+            IF( ln_tile ) CALL dom_tile_start( ldhold=.TRUE. )            ! Revert to tile domain
+         ENDIF
+      ENDIF
+      !
       IF( l_zdfdrg ) THEN     !==  update top/bottom drag  ==!   (non-linear cases)
          !
          !                       !* bottom drag
@@ -276,11 +285,12 @@ CONTAINS
 #if defined key_si3
       IF ( ln_drgice_imp) THEN
          IF ( ln_isfcav ) THEN
-            DO_2D_OVR( 1, 1, 1, 1 )
+            DO_2D( 0, 0, 0, 0 )
                rCdU_top(ji,jj) = rCdU_top(ji,jj) + ssmask(ji,jj) * tmask(ji,jj,1) * rCdU_ice(ji,jj)
             END_2D
          ELSE
-            DO_2D_OVR( 1, 1, 1, 1 )
+            ! Needed on 1st halo points by dyn_zdf (if ln_drgice_imp or ln_isfcav)
+            DO_2D( 1, 1, 1, 1 )
                rCdU_top(ji,jj) = rCdU_ice(ji,jj)
             END_2D
          ENDIF
@@ -291,23 +301,14 @@ CONTAINS
       !
       !                       !==  Kz from chosen turbulent closure  ==!   (avm_k, avt_k)
       !
-      ! NOTE: [tiling] the closure schemes (zdf_tke etc) will update avm_k. With tiling, the calculation of zsh2 on adjacent tiles then uses both updated (next timestep) and non-updated (current timestep) values of avm_k. To preserve results, we save a read-only copy of the "now" avm_k to use in the calculation of zsh2.
-      IF( l_zdfsh2 ) THEN        !* shear production at w-points (energy conserving form)
-         IF( ln_tile ) THEN
-            IF( ntile == 1 ) avm_k_n(:,:,:) = avm_k(:,:,:)     ! Preserve "now" avm_k for calculation of zsh2
-            CALL zdf_sh2( Kbb, Kmm, avm_k_n, &     ! <<== in
-               &                     zsh2    )     ! ==>> out : shear production
-         ELSE
-            CALL zdf_sh2( Kbb, Kmm, avm_k,   &     ! <<== in
-               &                     zsh2    )     ! ==>> out : shear production
-         ENDIF
-      ENDIF
-      !
       SELECT CASE ( nzdf_phy )                  !* Vertical eddy viscosity and diffusivity coefficients at w-points
-      CASE( np_RIC )   ;   CALL zdf_ric( kt,      Kmm, zsh2, avm_k, avt_k )    ! Richardson number dependent Kz
-      CASE( np_TKE )   ;   CALL zdf_tke( kt, Kbb, Kmm, zsh2, avm_k, avt_k )    ! TKE closure scheme for Kz
-      CASE( np_GLS )   ;   CALL zdf_gls( kt, Kbb, Kmm, zsh2, avm_k, avt_k )    ! GLS closure scheme for Kz
+      CASE( np_RIC )   ;   CALL zdf_ric( kt,      Kmm, sh2, avm_k, avt_k )    ! Richardson number dependent Kz
+      CASE( np_TKE )   ;   CALL zdf_tke( kt, Kbb, Kmm, sh2, avm_k, avt_k )    ! TKE closure scheme for Kz
+      CASE( np_GLS )   ;   CALL zdf_gls( kt, Kbb, Kmm, sh2, avm_k, avt_k )    ! GLS closure scheme for Kz
       CASE( np_OSM )   ;   CALL zdf_osm( kt, Kbb, Kmm, Krhs, avm_k, avt_k )    ! OSMOSIS closure scheme for Kz
+         !                                                                     ! clem: osmosis currently cannot work because
+         !                                                                             it uses qns and qsr that are only defined in the interior (A2D(0))
+         !                                                                             we should do calculations in the interior and put a lbc_lnk at the end
    !     CASE( np_CST )                                  ! Constant Kz (reset avt, avm to the background value)
    !         ! avt_k and avm_k set one for all at initialisation phase
 !!gm         avt(2:jpim1,2:jpjm1,1:jpkm1) = rn_avt0 * wmask(2:jpim1,2:jpjm1,1:jpkm1)
@@ -323,13 +324,13 @@ CONTAINS
 #endif
       !
       !                                         !* start from turbulent closure values
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          avt(ji,jj,jk) = avt_k(ji,jj,jk)
          avm(ji,jj,jk) = avm_k(ji,jj,jk)
       END_3D
       !
       IF( ln_rnf_mouth ) THEN                   !* increase diffusivity at rivers mouths
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, nkrnf )
+         DO_3D( 0, 0, 0, 0, 2, nkrnf )
             avt(ji,jj,jk) = avt(ji,jj,jk) + 2._wp * rn_avt_rnf * rnfmsk(ji,jj) * wmask(ji,jj,jk)
          END_3D
       ENDIF
@@ -340,7 +341,7 @@ CONTAINS
       IF( ln_zdfddm ) THEN                            ! update avt and compute avs
                         CALL zdf_ddm( kt, Kmm,  avm, avt, avs )
       ELSE                                            ! same mixing on all tracers
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             avs(ji,jj,jk) = avt(ji,jj,jk)
          END_3D
       ENDIF
@@ -350,14 +351,14 @@ CONTAINS
       IF( ln_zdfiwm )   CALL zdf_iwm( kt, Kmm, avm, avt, avs )   ! internal wave (de Lavergne et al 2017)
 
       !                                         !* Lateral boundary conditions (sign unchanged)
-      IF(nn_hls==1) THEN                                         ! if nn_hls==2 lbc_lnk done in stp routines
-         IF( l_zdfsh2 ) THEN
-            CALL lbc_lnk( 'zdfphy', avm_k, 'W', 1.0_wp , avt_k, 'W', 1.0_wp,   &
-                  &                 avm  , 'W', 1.0_wp , avt  , 'W', 1.0_wp , avs , 'W', 1.0_wp )
-         ELSE
-            CALL lbc_lnk( 'zdfphy', avm  , 'W', 1.0_wp , avt  , 'W', 1.0_wp , avs , 'W', 1.0_wp )
-         ENDIF
-         !
+      ! Subroutines requiring halo points: zdf_sh2 (avm_k), dia_wri (rCdU_bot), dyn_zdf (avm, rCdU_bot, rCdU_top)
+      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
+         CALL lbc_lnk( 'zdfphy', avm, 'W', 1.0_wp ) ! lbc_lnk for avm_k is in stp
+
+         ! TEMP: [zdfosm_avt_diag] Needed only to preserve diagnostics along the eastern half of the north fold (T-pivot)
+         IF( nn_hls == 1 .AND. ln_zdfosm .AND. ln_osm_mle ) &
+            & CALL lbc_lnk( 'zdfphy', avt, 'W', 1.0_wp, avs, 'W', 1.0_wp )
+
          IF( l_zdfdrg ) THEN     ! drag  have been updated (non-linear cases)
             IF( ln_isfcav ) THEN   ;  CALL lbc_lnk( 'zdfphy', rCdU_top, 'T', 1.0_wp , rCdU_bot, 'T', 1.0_wp )   ! top & bot drag
             ELSE                   ;  CALL lbc_lnk( 'zdfphy', rCdU_bot, 'T', 1.0_wp )                           ! bottom drag only
@@ -377,12 +378,18 @@ CONTAINS
       ENDIF
       !
       ! diagnostics of energy dissipation
-      IF( iom_use('avt_k') .OR. iom_use('avm_k') .OR. iom_use('eshear_k') .OR. iom_use('estrat_k') ) THEN
-         IF( l_zdfsh2 ) THEN
-            CALL iom_put( 'avt_k'   ,   avt_k       * wmask )
-            CALL iom_put( 'avm_k'   ,   avm_k       * wmask )
-            CALL iom_put( 'eshear_k',   zsh2        * wmask )
-            CALL iom_put( 'estrat_k', - avt_k * rn2 * wmask )
+      IF( l_zdfsh2 ) THEN
+         IF( iom_use('eshear_k') ) THEN
+            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
+               sh2(ji,jj,jk) = sh2(ji,jj,jk) * wmask(ji,jj,jk)
+            END_3D
+         ENDIF
+         IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
+            IF( iom_use('avt_k'   ) ) CALL iom_put( 'avt_k'   ,   avt_k                 * wmask(A2D(0),:) )
+            IF( iom_use('avm_k'   ) ) CALL iom_put( 'avm_k'   ,   avm_k                 * wmask(:,:   ,:) )
+            IF( iom_use('estrat_k') ) CALL iom_put( 'estrat_k', - avt_k * rn2(A2D(0),:) * wmask(A2D(0),:) )
+            IF( iom_use('eshear_k') ) CALL iom_put( 'eshear_k',   sh2                                     )
+            DEALLOCATE( sh2 )
          ENDIF
       ENDIF
       !
diff --git a/src/OCE/ZDF/zdfric.F90 b/src/OCE/ZDF/zdfric.F90
index 655cf49c..3f1ab93d 100644
--- a/src/OCE/ZDF/zdfric.F90
+++ b/src/OCE/ZDF/zdfric.F90
@@ -145,18 +145,19 @@ CONTAINS
       !! References : Pacanowski & Philander 1981, JPO, 1441-1451.
       !!              PFJ Lermusiaux 2001.
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT(in   ) ::   kt             ! ocean time-step
-      INTEGER                             , INTENT(in   ) ::   Kmm            ! ocean time level index
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   p_sh2          ! shear production term
-      REAL(wp), DIMENSION(:,:,:)          , INTENT(inout) ::   p_avm, p_avt   ! momentum and tracer Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step
+      INTEGER                         , INTENT(in   ) ::   Kmm            ! ocean time level index
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(in   ) ::   p_sh2          ! shear production term
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !!
       INTEGER  ::   ji, jj, jk                  ! dummy loop indices
       REAL(wp) ::   zcfRi, zav, zustar, zhek    ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zh_ekm  ! 2D workspace
+      REAL(wp), DIMENSION(T2D(0)) ::   zh_ekm  ! 2D workspace
       !!----------------------------------------------------------------------
       !
       !                       !==  avm and avt = F(Richardson number)  ==!
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )       ! coefficient = F(richardson number) (avm-weighted Ri)
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )       ! coefficient = F(richardson number) (avm-weighted Ri)
          zcfRi = 1._wp / (  1._wp + rn_alp * MAX(  0._wp , avm(ji,jj,jk) * rn2(ji,jj,jk) / ( p_sh2(ji,jj,jk) + 1.e-20 ) )  )
          zav   = rn_avmri * zcfRi**nn_ric
          !                          ! avm and avt coefficients
@@ -169,12 +170,12 @@ CONTAINS
       !
       IF( ln_mldw ) THEN      !==  set a minimum value in the Ekman layer  ==!
          !
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
+         DO_2D( 0, 0, 0, 0 )
             zustar = SQRT( taum(ji,jj) * r1_rho0 )
             zhek   = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall )   ! Ekman depth
             zh_ekm(ji,jj) = MAX(  rn_mldmin , MIN( zhek , rn_mldmax )  )   ! set allowed range
          END_2D
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )   !* minimum mixing coeff. within the Ekman layer
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )   !* minimum mixing coeff. within the Ekman layer
             IF( gdept(ji,jj,jk,Kmm) < zh_ekm(ji,jj) ) THEN
                p_avm(ji,jj,jk) = MAX(  p_avm(ji,jj,jk), rn_wvmix  ) * wmask(ji,jj,jk)
                p_avt(ji,jj,jk) = MAX(  p_avt(ji,jj,jk), rn_wtmix  ) * wmask(ji,jj,jk)
diff --git a/src/OCE/ZDF/zdfsh2.F90 b/src/OCE/ZDF/zdfsh2.F90
index 1654a2e1..786c6596 100644
--- a/src/OCE/ZDF/zdfsh2.F90
+++ b/src/OCE/ZDF/zdfsh2.F90
@@ -54,17 +54,17 @@ CONTAINS
       !!                                                   *****
       !! References :   Bruchard, OM 2002
       !! ---------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   Kbb, Kmm             ! ocean time level indices
-      REAL(wp), DIMENSION(:,:,:)           , INTENT(in   ) ::   p_avm                ! vertical eddy viscosity (w-points)
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) , INTENT(  out) ::   p_sh2                ! shear production of TKE (w-points)
+      INTEGER                          , INTENT(in   ) ::   Kbb, Kmm             ! ocean time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in   ) ::   p_avm                ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk) , INTENT(  out) ::   p_sh2                ! shear production of TKE (w-points)
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop arguments
-      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zsh2u, zsh2v   ! 2D workspace
+      REAL(wp), DIMENSION(A2D(1)) ::   zsh2u, zsh2v   ! 2D workspace
       !!--------------------------------------------------------------------
       !
       DO jk = 2, jpkm1                 !* Shear production at uw- and vw-points (energy conserving form)
          IF ( cpl_sdrftx .AND. ln_stshear )  THEN       ! Surface Stokes Drift available  ===>>>  shear + stokes drift contibution
-            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
+            DO_2D( 1, 0, 1, 0 )
                zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) )        &
                   &         * ( uu (ji,jj,jk-1,Kmm) -   uu (ji,jj,jk,Kmm)    &
                   &           + usd(ji,jj,jk-1) -   usd(ji,jj,jk) )  &
@@ -77,7 +77,7 @@ CONTAINS
                   &/ ( e3vw(ji,jj,jk,Kmm) * e3vw(ji,jj,jk,Kbb) ) * wvmask(ji,jj,jk)
             END_2D
          ELSE
-            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )     !* 2 x shear production at uw- and vw-points (energy conserving form)
+            DO_2D( 1, 0, 1, 0 )     !* 2 x shear production at uw- and vw-points (energy conserving form)
                zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) &
                   &         * (   uu(ji,jj,jk-1,Kmm) -   uu(ji,jj,jk,Kmm) ) &
                   &         * (   uu(ji,jj,jk-1,Kbb) -   uu(ji,jj,jk,Kbb) ) &
@@ -90,12 +90,12 @@ CONTAINS
                   &         * wvmask(ji,jj,jk)
             END_2D
          ENDIF
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )     !* shear production at w-point ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked)
+         DO_2D( 0, 0, 0, 0 )     !* shear production at w-point ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked)
             p_sh2(ji,jj,jk) = 0.25 * (   ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) )   &
                &                       + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) )   )
          END_2D
       END DO
-      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! set p_sh2 to 0 at the surface and bottom for output purpose
+      DO_2D( 0, 0, 0, 0 ) ! set p_sh2 to 0 at the surface and bottom for output purpose
          p_sh2(ji,jj,1)   = 0._wp
          p_sh2(ji,jj,jpk) = 0._wp
       END_2D
diff --git a/src/OCE/ZDF/zdfswm.F90 b/src/OCE/ZDF/zdfswm.F90
index 7c6f94d8..16b8d272 100644
--- a/src/OCE/ZDF/zdfswm.F90
+++ b/src/OCE/ZDF/zdfswm.F90
@@ -53,17 +53,17 @@ CONTAINS
       !!               
       !! reference : Qiao et al. GRL, 2004
       !!---------------------------------------------------------------------
-      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time step
-      INTEGER                    , INTENT(in   ) ::   Kmm            ! time level index
-      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm          ! momentum Kz (w-points)
-      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avt, p_avs   ! tracer   Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time step
+      INTEGER                         , INTENT(in   ) ::   Kmm            ! time level index
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt, p_avs   ! vertical eddy diffusivity (w-points)
       !
       INTEGER ::   ji, jj, jk   ! dummy loop indices
       REAL(wp)::   zcoef, zqb   ! local scalar
       !!---------------------------------------------------------------------
       !
       zcoef = 1._wp * 0.353553_wp
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          zqb = zcoef * hsw(ji,jj) * tsd2d(ji,jj) * EXP( -3. * wnum(ji,jj) * gdepw(ji,jj,jk,Kmm) ) * wmask(ji,jj,jk)
          !
          p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zqb
diff --git a/src/OCE/ZDF/zdftke.F90 b/src/OCE/ZDF/zdftke.F90
index 68dd9f6e..4435eb13 100644
--- a/src/OCE/ZDF/zdftke.F90
+++ b/src/OCE/ZDF/zdftke.F90
@@ -42,7 +42,6 @@ MODULE zdftke
    USE oce            ! ocean: dynamics and active tracers variables
    USE phycst         ! physical constants
    USE dom_oce        ! domain: ocean
-   USE domvvl         ! domain: variable volume layer
    USE sbc_oce        ! surface boundary condition: ocean
    USE zdfdrg         ! vertical physics: top/bottom drag coef.
    USE zdfmxl         ! vertical physics: mixed layer
@@ -56,9 +55,7 @@ MODULE zdftke
    USE in_out_manager ! I/O manager
    USE iom            ! I/O manager library
    USE lib_mpp        ! MPP library
-   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
    USE prtctl         ! Print control
-   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
    USE sbcwave        ! Surface boundary waves
 
    IMPLICIT NONE
@@ -114,7 +111,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                ***  FUNCTION zdf_tke_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( htau(jpi,jpj) , dissl(jpi,jpj,jpk) , apdlr(jpi,jpj,jpk) ,   STAT= zdf_tke_alloc )
+      ALLOCATE( htau(A2D(0)) , dissl(A2D(0),jpk) , apdlr(A2D(0),jpk) ,   STAT= zdf_tke_alloc )
       !
       CALL mpp_sum ( 'zdftke', zdf_tke_alloc )
       IF( zdf_tke_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_tke_alloc: failed to allocate arrays' )
@@ -167,10 +164,11 @@ CONTAINS
       !!              Axell, JGR, 2002
       !!              Bruchard OM 2002
       !!----------------------------------------------------------------------
-      INTEGER                             , INTENT(in   ) ::   kt             ! ocean time step
-      INTEGER                             , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   p_sh2          ! shear production term
-      REAL(wp), DIMENSION(:,:,:)          , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points)
+      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time step
+      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(in   ) ::   p_sh2          ! shear production term
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(inout) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !!----------------------------------------------------------------------
       !
       CALL tke_tke( Kbb, Kmm, p_sh2, p_avm, p_avt )   ! now tke (en)
@@ -200,9 +198,10 @@ CONTAINS
       !! ---------------------------------------------------------------------
       USE zdf_oce , ONLY : en   ! ocean vertical physics
       !!
-      INTEGER                              , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) , INTENT(in   ) ::   p_sh2          ! shear production term
-      REAL(wp), DIMENSION(:,:,:)           , INTENT(in   ) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points)
+      INTEGER                         , INTENT(in) ::   Kbb, Kmm       ! ocean time level indices
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(in) ::   p_sh2          ! shear production term
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(in) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !
       INTEGER ::   ji, jj, jk                  ! dummy loop arguments
       REAL(wp) ::   zetop, zebot, zmsku, zmskv ! local scalars
@@ -210,14 +209,14 @@ CONTAINS
       REAL(wp) ::   zcdrag = 1.5e-3            ! drag coefficient
       REAL(wp) ::   zbbrau, zbbirau, zri       ! local scalars
       REAL(wp) ::   zfact1, zfact2, zfact3     !   -      -
-      REAL(wp) ::   ztx2  , zty2  , zcof       !   -      -
+      REAL(wp) ::   zcof                       !   -      -
       REAL(wp) ::   ztau  , zdif               !   -      -
       REAL(wp) ::   zus   , zwlc  , zind       !   -      -
       REAL(wp) ::   zzd_up, zzd_lw             !   -      -
       REAL(wp) ::   ztaui, ztauj, z1_norm
-      INTEGER , DIMENSION(A2D(nn_hls))     ::   imlc
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zice_fra, zhlc, zus3, zWlc2
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zpelc, zdiag, zd_up, zd_lw
+      INTEGER , DIMENSION(T2D(0))     ::   imlc
+      REAL(wp), DIMENSION(T2D(0))     ::   zice_fra, zhlc, zus3, zWlc2
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zpelc, zdiag, zd_up, zd_lw
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztmp ! for diags
       !!--------------------------------------------------------------------
       !
@@ -232,16 +231,16 @@ CONTAINS
       ! ice fraction considered for attenuation of langmuir & wave breaking
       SELECT CASE ( nn_eice )
       CASE( 0 )   ;   zice_fra(:,:) = 0._wp
-      CASE( 1 )   ;   zice_fra(:,:) =        TANH( fr_i(A2D(nn_hls)) * 10._wp )
-      CASE( 2 )   ;   zice_fra(:,:) =              fr_i(A2D(nn_hls))
-      CASE( 3 )   ;   zice_fra(:,:) = MIN( 4._wp * fr_i(A2D(nn_hls)) , 1._wp )
+      CASE( 1 )   ;   zice_fra(:,:) =        TANH( fr_i(T2D(0)) * 10._wp )
+      CASE( 2 )   ;   zice_fra(:,:) =              fr_i(T2D(0))
+      CASE( 3 )   ;   zice_fra(:,:) = MIN( 4._wp * fr_i(T2D(0)) , 1._wp )
       END SELECT
       !
       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !                     !  Surface/top/bottom boundary condition on tke
       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !
-      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+      DO_2D( 0, 0, 0, 0 )
          en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) )
          zdiag(ji,jj,1) = 1._wp/en(ji,jj,1)
          zd_lw(ji,jj,1) = 1._wp
@@ -258,7 +257,7 @@ CONTAINS
       !
       IF( .NOT.ln_drg_OFF ) THEN    !== friction used as top/bottom boundary condition on TKE
          !
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )        ! bottom friction
+         DO_2D( 0, 0, 0, 0 )        ! bottom friction
             zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) )
             zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )
             !                       ! where 0.001875 = (rn_ebb0/rho0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0)
@@ -267,7 +266,7 @@ CONTAINS
             en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj)
          END_2D
          IF( ln_isfcav ) THEN
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )     ! top friction
+            DO_2D( 0, 0, 0, 0 )     ! top friction
                zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) )
                zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )
                !                             ! where 0.001875 = (rn_ebb0/rho0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0)
@@ -294,16 +293,16 @@ CONTAINS
             !                                !     1/2  (W_lc)^2 = MAX( u* u_s + v* v_s , 0 )   only the positive part
 !!gm  ! PS: currently we don't have neither the 2 stress components at t-point !nor the angle between u* and u_s
 !!gm  ! so we will overestimate the LC velocity....   !!gm I will do the work if !LC have an effect !
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
 !!XC                  zWlc2(ji,jj) = 0.5_wp * SQRT( taum(ji,jj) * r1_rho0 * ( ut0sd(ji,jj)**2 +vt0sd(ji,jj)**2 )  )
                   zWlc2(ji,jj) = 0.5_wp *  ( ut0sd(ji,jj)**2 +vt0sd(ji,jj)**2 )
             END_2D
 !
 !  Projection of Stokes drift in the wind stress direction
 !
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-                  ztaui   = 0.5_wp * ( utau(ji,jj) + utau(ji-1,jj) )
-                  ztauj   = 0.5_wp * ( vtau(ji,jj) + vtau(ji,jj-1) )
+            DO_2D( 0, 0, 0, 0 )
+                  ztaui   = utau(ji,jj)
+                  ztauj   = vtau(ji,jj)
                   z1_norm = 1._wp / MAX( SQRT(ztaui*ztaui+ztauj*ztauj), 1.e-12 ) * tmask(ji,jj,1)
                   zWlc2(ji,jj) = 0.5_wp * z1_norm * ( MAX( ut0sd(ji,jj)*ztaui + vt0sd(ji,jj)*ztauj, 0._wp ) )**2
             END_2D
@@ -313,7 +312,7 @@ CONTAINS
             !                                ! Wlc = 0.016 * [|tau|/(rho_air Cdrag) ]^1/2   and thus:
             !                                ! 1/2 Wlc^2 = 0.5 * 0.016 * 0.016 |tau| /( rho_air Cdrag )
             zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag )      ! to convert stress in 10m wind using a constant drag
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                zWlc2(ji,jj) = zcof * taum(ji,jj)
             END_2D
             !
@@ -321,30 +320,30 @@ CONTAINS
          !
          !                       !* Depth of the LC circulation  (Axell 2002, Eq.47)
          !                             !- LHS of Eq.47
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zpelc(ji,jj,1) =  MAX( rn2b(ji,jj,1), 0._wp ) * gdepw(ji,jj,1,Kmm) * e3w(ji,jj,1,Kmm)
          END_2D
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpk )
+         DO_3D( 0, 0, 0, 0, 2, jpk )
             zpelc(ji,jj,jk)  = zpelc(ji,jj,jk-1) +   &
                &          MAX( rn2b(ji,jj,jk), 0._wp ) * gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm)
          END_3D
          !
          !                             !- compare LHS to RHS of Eq.47
-         imlc(:,:) = mbkt(A2D(nn_hls)) + 1       ! Initialization to the number of w ocean point (=2 over land)
-         DO_3DS( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 )
+         imlc(:,:) = mbkt(T2D(0)) + 1       ! Initialization to the number of w ocean point (=2 over land)
+         DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )
             IF( zpelc(ji,jj,jk) > zWlc2(ji,jj) )   imlc(ji,jj) = jk
          END_3D
          !                               ! finite LC depth
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zhlc(ji,jj) = gdepw(ji,jj,imlc(ji,jj),Kmm)
          END_2D
          !
          zcof = 0.016 / SQRT( zrhoa * zcdrag )
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             zus = SQRT( 2. * zWlc2(ji,jj) )             ! Stokes drift
             zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok
          END_2D
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                  !* TKE Langmuir circulation source term added to en
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )                  !* TKE Langmuir circulation source term added to en
             IF ( zus3(ji,jj) /= 0._wp ) THEN
                IF ( gdepw(ji,jj,jk,Kmm) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN
                   !                                           ! vertical velocity due to LC
@@ -365,7 +364,7 @@ CONTAINS
       !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal
       !
       IF( nn_pdl == 1 ) THEN          !* Prandtl number = F( Ri )
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             !                             ! local Richardson number
             IF (rn2b(ji,jj,jk) <= 0.0_wp) then
                 zri = 0.0_wp
@@ -377,7 +376,7 @@ CONTAINS
          END_3D
       ENDIF
       !
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )   !* Matrix and right hand side in en
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )   !* Matrix and right hand side in en
          zcof   = zfact1 * tmask(ji,jj,jk)
          !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical
          !                                   ! eddy coefficient (ensure numerical stability)
@@ -406,14 +405,14 @@ CONTAINS
          SELECT CASE (nn_bc_surf) ! Boundary Condition using surface TKE flux from waves
 
          CASE ( 0 ) ! Dirichlet BC
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )    ! en(1)   = rn_ebb taum / rho0  (min value rn_emin0)
+            DO_2D( 0, 0, 0, 0 )    ! en(1)   = rn_ebb taum / rho0  (min value rn_emin0)
                IF ( phioc(ji,jj) < 0 )  phioc(ji,jj) = 0._wp
                en(ji,jj,1) = MAX( rn_emin0, .5 * ( 15.8 * phioc(ji,jj) / rho0 )**(2./3.) )  * tmask(ji,jj,1)
                zdiag(ji,jj,1) = 1._wp/en(ji,jj,1)  ! choose to keep coherence with former estimation of
             END_2D
 
          CASE ( 1 ) ! Neumann BC
-            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                IF ( phioc(ji,jj) < 0 )  phioc(ji,jj) = 0._wp
                en(ji,jj,2)    = en(ji,jj,2) + ( rn_Dt * phioc(ji,jj) / rho0 ) /e3w(ji,jj,2,Kmm)
                en(ji,jj,1)    = en(ji,jj,2) + (2 * e3t(ji,jj,1,Kmm) * phioc(ji,jj)/rho0) / ( p_avm(ji,jj,1) + p_avm(ji,jj,2) )
@@ -427,23 +426,23 @@ CONTAINS
       ENDIF
       !
       !                          !* Matrix inversion from level 2 (tke prescribed at level 1)
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
          zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1)
       END_3D
 !XC : commented to allow for neumann boundary condition
 !      DO_2D( 0, 0, 0, 0 )
 !         zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke
 !      END_2D
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1)
       END_3D
-      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                          ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
+      DO_2D( 0, 0, 0, 0 )                          ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
          en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1)
       END_2D
-      DO_3DS_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpk-2, 2, -1 )
+      DO_3DS( 0, 0, 0, 0, jpk-2, 2, -1 )
          en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk)
       END_3D
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )                ! set the minimum value of tke
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! set the minimum value of tke
          en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk)
       END_3D
       !
@@ -451,11 +450,11 @@ CONTAINS
       !    ediss = Ce*sqrt(en)/L*en
       !    dissl = sqrt(en)/L
       IF( iom_use('ediss_k') ) THEN
-         ALLOCATE( ztmp(A2D(nn_hls),jpk) )
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         ALLOCATE( ztmp(T2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             ztmp(ji,jj,jk) = zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk) * wmask(ji,jj,jk)
          END_3D
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             ztmp(ji,jj,jpk) = 0._wp
          END_2D
          CALL iom_put( 'ediss_k', ztmp )
@@ -471,21 +470,19 @@ CONTAINS
       ! penetration is partly switched off below sea-ice if nn_eice/=0
       !
       IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction)
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   &
                &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1)
          END_3D
       ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)  (rn_efr fraction)
-         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+         DO_2D( 0, 0, 0, 0 )
             jk = nmln(ji,jj)
             en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   &
                &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1)
          END_2D
       ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability)
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
-            ztx2 = utau(ji-1,jj  ) + utau(ji,jj)
-            zty2 = vtau(ji  ,jj-1) + vtau(ji,jj)
-            ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)    ! module of the mean stress
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
+            ztau = SQRT( utau(ji,jj)*utau(ji,jj) + vtau(ji,jj)*vtau(ji,jj) ) * tmask(ji,jj,1)    ! module of the mean stress
             zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean
             zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications...
             en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   &
@@ -532,14 +529,15 @@ CONTAINS
       !!----------------------------------------------------------------------
       USE zdf_oce , ONLY : en, avtb, avmb, avtb_2d   ! ocean vertical physics
       !!
-      INTEGER                   , INTENT(in   ) ::   Kbb, Kmm       ! ocean time level indices
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points)
+      INTEGER                         , INTENT(in ) ::   Kbb, Kmm       ! ocean time level indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(out) ::   p_avm          ! vertical eddy viscosity (w-points)
+      REAL(wp), DIMENSION(A2D(0) ,jpk), INTENT(out) ::   p_avt          ! vertical eddy diffusivity (w-points)
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars
       REAL(wp) ::   zdku,   zdkv, zsqen       !   -      -
       REAL(wp) ::   zemxl, zemlm, zemlp, zmaxice       !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zmxlm, zmxld   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(0),jpk) ::   zmxlm, zmxld   ! 3D workspace
       !!--------------------------------------------------------------------
       !
       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@@ -563,25 +561,25 @@ CONTAINS
          !
             zraug = vkarmn * 2.e5_wp / ( rho0 * grav )
 #if ! defined key_si3 && ! defined key_cice
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                  ! No sea-ice
+            DO_2D( 0, 0, 0, 0 )                  ! No sea-ice
                zmxlm(ji,jj,1) =  zraug * taum(ji,jj) * tmask(ji,jj,1)
             END_2D
 #else
             SELECT CASE( nn_mxlice )             ! Type of scaling under sea-ice
             !
             CASE( 0 )                      ! No scaling under sea-ice
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+               DO_2D( 0, 0, 0, 0 )
                   zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1)
                END_2D
                !
             CASE( 1 )                      ! scaling with constant sea-ice thickness
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+               DO_2D( 0, 0, 0, 0 )
                   zmxlm(ji,jj,1) =  ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + &
                      &                          fr_i(ji,jj)   * rn_mxlice           ) * tmask(ji,jj,1)
                END_2D
                !
             CASE( 2 )                      ! scaling with mean sea-ice thickness
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+               DO_2D( 0, 0, 0, 0 )
 #if defined key_si3
                   zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + &
                      &                         fr_i(ji,jj)   * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1)
@@ -593,7 +591,7 @@ CONTAINS
                END_2D
                !
             CASE( 3 )                      ! scaling with max sea-ice thickness
-               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+               DO_2D( 0, 0, 0, 0 )
                   zmaxice = MAXVAL( h_i(ji,jj,:) )
                   zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + &
                      &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1)
@@ -602,7 +600,7 @@ CONTAINS
             END SELECT
 #endif
             !
-            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
+            DO_2D( 0, 0, 0, 0 )
                zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) )
             END_2D
             !
@@ -611,7 +609,7 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          zrn2 = MAX( rn2(ji,jj,jk), rsmall )
          zmxlm(ji,jj,jk) = MAX(  rmxl_min,  SQRT( 2._wp * en(ji,jj,jk) / zrn2 )  )
       END_3D
@@ -626,7 +624,7 @@ CONTAINS
  !!gm Not sure of that coding for ISF....
       ! where wmask = 0 set zmxlm == e3w(:,:,:,Kmm)
       CASE ( 0 )           ! bounded by the distance to surface and bottom
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             zemxl = MIN( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm), zmxlm(ji,jj,jk),   &
             &            gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) - gdepw(ji,jj,jk,Kmm) )
             ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj)
@@ -637,33 +635,33 @@ CONTAINS
          END_3D
          !
       CASE ( 1 )           ! bounded by the vertical scale factor
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             zemxl = MIN( e3w(ji,jj,jk,Kmm), zmxlm(ji,jj,jk) )
             zmxlm(ji,jj,jk) = zemxl
             zmxld(ji,jj,jk) = zemxl
          END_3D
          !
       CASE ( 2 )           ! |dk[xml]| bounded by e3t :
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )       ! from the surface to the bottom :
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )       ! from the surface to the bottom :
             zmxlm(ji,jj,jk) =   &
                &    MIN( zmxlm(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) )
          END_3D
-         DO_3DS( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 )   ! from the bottom to the surface :
+         DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )   ! from the bottom to the surface :
             zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) )
             zmxlm(ji,jj,jk) = zemxl
             zmxld(ji,jj,jk) = zemxl
          END_3D
          !
       CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t :
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )        ! from the surface to the bottom : lup
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )        ! from the surface to the bottom : lup
             zmxld(ji,jj,jk) =    &
                &    MIN( zmxld(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) )
          END_3D
-         DO_3DS( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 )   ! from the bottom to the surface : ldown
+         DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )   ! from the bottom to the surface : ldown
             zmxlm(ji,jj,jk) =   &
                &    MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) )
          END_3D
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) )
             zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) )
             zmxlm(ji,jj,jk) = zemlm
@@ -675,7 +673,7 @@ CONTAINS
       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       !                     !  Vertical eddy viscosity and diffusivity  (avm and avt)
       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )   !* vertical eddy viscosity & diffivity at w-points
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !* vertical eddy viscosity & diffivity at w-points
          zsqen = SQRT( en(ji,jj,jk) )
          zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen
          p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk)
@@ -685,7 +683,7 @@ CONTAINS
       !
       !
       IF( nn_pdl == 1 ) THEN          !* Prandtl number case: update avt
-         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 2, jpkm1 )
             p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk)
          END_3D
       ENDIF
@@ -762,7 +760,8 @@ CONTAINS
                CALL ctl_stop( 'zdf_tke_init: wrong value for nn_mxlice, should be 0,1,2,3 or 4')
             END SELECT
             IF     ( (nn_mxlice>0).AND.(nn_ice==0) ) THEN
-               CALL ctl_stop( 'zdf_tke_init: with no ice at all, nn_mxlice must be 0 ') 
+               CALL ctl_warn( 'zdf_tke_init: with no ice at all, nn_mxlice is set to 0 ')
+               nn_mxlice = 0
             ELSEIF ( (nn_mxlice>1).AND.(nn_ice==1) ) THEN
                CALL ctl_stop( 'zdf_tke_init: with no ice model, nn_mxlice must be 0 or 1')
             ENDIF
@@ -821,7 +820,7 @@ CONTAINS
          CASE( 0 )                                 ! constant depth penetration (here 10 meters)
             htau(:,:) = 10._wp
          CASE( 1 )                                 ! F(latitude) : 0.5m to 30m poleward of 40 degrees
-            htau(:,:) = MAX(  0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(:,:) ) ) )   )
+            htau(:,:) = MAX(  0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(A2D(0)) ) ) )   )
          END SELECT
       ENDIF
       !                                !* read or initialize all required files
@@ -865,14 +864,14 @@ CONTAINS
             ELSE                                          ! start TKE from rest
                IF(lwp) WRITE(numout,*)
                IF(lwp) WRITE(numout,*) '   ==>>>   previous run without TKE scheme, set en to background values'
-               en   (:,:,:) = rn_emin * wmask(:,:,:)
+               en   (:,:,:) = rn_emin * wmask(A2D(0),:)
                dissl(:,:,:) = 1.e-12_wp
                ! avt_k, avm_k already set to the background value in zdf_phy_init
             ENDIF
          ELSE                                   !* Start from rest
             IF(lwp) WRITE(numout,*)
             IF(lwp) WRITE(numout,*) '   ==>>>   start from rest: set en to the background value'
-            en   (:,:,:) = rn_emin * wmask(:,:,:)
+            en   (:,:,:) = rn_emin * wmask(A2D(0),:)
             dissl(:,:,:) = 1.e-12_wp
             ! avt_k, avm_k already set to the background value in zdf_phy_init
          ENDIF
diff --git a/src/OCE/do_loop_substitute.h90 b/src/OCE/do_loop_substitute.h90
index f957d074..ad0ec3a2 100644
--- a/src/OCE/do_loop_substitute.h90
+++ b/src/OCE/do_loop_substitute.h90
@@ -56,25 +56,56 @@
 ! Nis0 =   1 + nn_hls     Njs0 =   1 + nn_hls
 ! Nie0 = jpi - nn_hls     Nje0 = jpj - nn_hls
 !
+! Additionally, this file defines several macros for defining and accessing arrays.
+! These return index strides of the form i_lower:i_upper,j_lower:j_upper.
+! The macros mainly serve as substitutions for i-j shape declarations in DIMENSION and ALLOCATE
+! statements, but can also be used for inline stride indexing of arrays.
+! There are three types of macro:
+!
+!    A1Di/A1Dj/A2D - used with arrays that are defined on the MPI domain
+!    T1Di/T1Dj/T2D - used with arrays that are defined on the tile domain
+!             AB2D - used with assumed shape array declarations
+!
+! The first two types have a similar specification to the DO loop macros, with arguments giving the
+! offset with respect to the internal part of the domain:
+!
+!    A1Di(H) = Nis0-(H):Nie0+(H)
+!    T1Di(H) = ntsi-(H):ntei+(H)
+!
+! The third type is used to specify an assumed shape declaration with defined lower bounds, and is used in wrapper
+! subroutines in conjunction with the lbnd_ij function to allow several possible dummy argument shapes:
+!
+!    AB2D(B) = B(1):,B(2):
+!
 #endif
 
-#define DO_2D(L, R, B, T) DO jj = ntsj-(B), ntej+(T) ; DO ji = ntsi-(L), ntei+(R)
-#define DO_2D_OVR(L, R, B, T) DO_2D(L-(L+R)*nthl, R-(R+L)*nthr, B-(B+T)*nthb, T-(T+B)*ntht)
-#define A1Di(H) ntsi-(H):ntei+(H)
-#define A1Dj(H) ntsj-(H):ntej+(H)
+#define A1Di(H) Nis0-(H):Nie0+(H)
+#define A1Dj(H) Njs0-(H):Nje0+(H)
 #define A2D(H) A1Di(H),A1Dj(H)
-#define A1Di_T(T) (ntsi-nn_hls-1)*T+1:
-#define A1Dj_T(T) (ntsj-nn_hls-1)*T+1:
-#define A2D_T(T) A1Di_T(T),A1Dj_T(T)
+
+#define T1Di(H) ntsi-(H):ntei+(H)
+#define T1Dj(H) ntsj-(H):ntej+(H)
+#define T2D(H) T1Di(H),T1Dj(H)
+
+#define AB2D(B) B(1):,B(2):
 #define JPK  :
+#define JPT  :
 #define JPTS  :
 #define KJPT  :
 
+#define DO_1Di(L, R) DO ji = ntsi-(L), ntei+(R)
+#define DO_1Dj(B, T) DO jj = ntsj-(B), ntej+(T)
+
+#define DO_2D(L, R, B, T) DO_1Dj(B, T) ; DO_1Di(L, R)
+#define DO_2Dik(L, R, ks, ke, ki) DO jk = ks, ke, ki ; DO_1Di(L, R)
+#define DO_2D_OVR(L, R, B, T) DO_2D(L-(L+R)*nthl, R-(R+L)*nthr, B-(B+T)*nthb, T-(T+B)*ntht)
+
 #define DO_3D(L, R, B, T, ks, ke) DO jk = ks, ke ; DO_2D(L, R, B, T)
 #define DO_3D_OVR(L, R, B, T, ks, ke) DO jk = ks, ke ; DO_2D_OVR(L, R, B, T)
 
 #define DO_3DS(L, R, B, T, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D(L, R, B, T)
 #define DO_3DS_OVR(L, R, B, T, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D_OVR(L, R, B, T)
 
+#define END_1D   END DO
 #define END_2D   END DO   ;   END DO
-#define END_3D   END DO   ;   END DO   ;   END DO
+#define END_3D   END DO   ;   END DO   ;   END DO
\ No newline at end of file
diff --git a/src/OCE/lib_fortran.F90 b/src/OCE/lib_fortran.F90
index b621373e..ded29e25 100644
--- a/src/OCE/lib_fortran.F90
+++ b/src/OCE/lib_fortran.F90
@@ -88,6 +88,22 @@ CONTAINS
 #     define DIM_3d
 #        include "lib_fortran_generic.h90"
 #     undef DIM_3d
+#  define LOCALONLY
+#     define DIM_2d
+#        include "lib_fortran_generic.h90"
+#     undef DIM_2d
+#     define DIM_3d
+#        include "lib_fortran_generic.h90"
+#     undef DIM_3d
+#  undef LOCALONLY
+#  define VEC
+#     define DIM_3d
+#        include "lib_fortran_generic.h90"
+#     undef DIM_3d
+#     define DIM_4d
+#        include "lib_fortran_generic.h90"
+#     undef DIM_4d
+#  undef VEC
 #  undef GLOBSUM_CODE
 
 #  define GLOBMINMAX_CODE
@@ -107,71 +123,26 @@ CONTAINS
 #           include "lib_fortran_generic.h90"
 #        undef OPERATION_GLOBMAX
 #     undef DIM_3
+#  define VEC
+#     define DIM_3d
+#        define OPERATION_GLOBMIN
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMIN
+#        define OPERATION_GLOBMAX
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMAX
+#     undef DIM_3d
+#     define DIM_4d
+#        define OPERATION_GLOBMIN
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMIN
+#        define OPERATION_GLOBMAX
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMAX
+#     undef DIM_4d
+#  undef VEC
 #  undef GLOBMINMAX_CODE
 
-!                          ! FUNCTION local_sum !
-
-   FUNCTION local_sum_2d( ptab )
-      !!----------------------------------------------------------------------
-      REAL(wp),  INTENT(in   ) ::   ptab(:,:) ! array on which operation is applied
-      COMPLEX(dp)              ::  local_sum_2d
-      !
-      !!-----------------------------------------------------------------------
-      !
-      COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
-      INTEGER    ::   ji, jj    ! dummy loop indices
-      INTEGER    ::   ipi, ipj  ! dimensions
-      !!-----------------------------------------------------------------------
-      !
-      ipi = SIZE(ptab,1)   ! 1st dimension
-      ipj = SIZE(ptab,2)   ! 2nd dimension
-      !
-      ctmp = CMPLX( 0.e0, 0.e0, wp )   ! warning ctmp is cumulated
-
-      DO jj = 1, ipj
-         DO ji = 1, ipi
-            ztmp =  ptab(ji,jj) * tmask_i(ji,jj)
-            CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
-         END DO
-      END DO
-      !
-      local_sum_2d = ctmp
-       
-   END FUNCTION local_sum_2d
-
-   FUNCTION local_sum_3d( ptab )
-      !!----------------------------------------------------------------------
-      REAL(wp),  INTENT(in   ) ::   ptab(:,:,:) ! array on which operation is applied
-      COMPLEX(dp)              ::  local_sum_3d
-      !
-      !!-----------------------------------------------------------------------
-      !
-      COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
-      INTEGER    ::   ji, jj, jk   ! dummy loop indices
-      INTEGER    ::   ipi, ipj, ipk    ! dimensions
-      !!-----------------------------------------------------------------------
-      !
-      ipi = SIZE(ptab,1)   ! 1st dimension
-      ipj = SIZE(ptab,2)   ! 2nd dimension
-      ipk = SIZE(ptab,3)   ! 3rd dimension
-      !
-      ctmp = CMPLX( 0.e0, 0.e0, wp )   ! warning ctmp is cumulated
-
-      DO jk = 1, ipk
-        DO jj = 1, ipj
-          DO ji = 1, ipi
-             ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
-             CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
-          END DO
-        END DO
-      END DO
-      !
-      local_sum_3d = ctmp
-       
-   END FUNCTION local_sum_3d
-
 !                          ! FUNCTION sum3x3 !
 
    SUBROUTINE sum3x3_2d( p2d )
@@ -191,11 +162,11 @@ CONTAINS
       ! work over the whole domain (guarantees all internal cells are set when nn_hls=2)
       !
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         IF( MOD(mig(ji), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
-           & MOD(mjg(jj), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
-            ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
-            jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
-            IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
+         IF( MOD(mig(ji,nn_hls), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
+           & MOD(mjg(jj,nn_hls), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
+            ji2 = MIN(mig(ji,nn_hls)+2, jpiglo) - nimpp + 1                  ! right position of the box
+            jj2 = MIN(mjg(jj,nn_hls)+2, jpjglo) - njmpp + 1                  ! upper position of the box
+            IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                           ! the box is fully included in the local mpi domain
                p2d(ji:ji2,jj:jj2) = SUM(p2d(ji:ji2,jj:jj2))
             ENDIF
          ENDIF
@@ -203,23 +174,23 @@ CONTAINS
       CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1.0_wp )
       ! no need for 2nd exchange when nn_hls > 1
       IF( nn_hls == 1 ) THEN
-         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN   ! 1st column was changed during the previous call to lbc_lnk
-            IF( MOD(mig(    1), 3) == 1 )   &   ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
-               p2d(    1,:) = p2d(    2,:)      ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
-            IF( MOD(mig(    1), 3) == 2 )   &   ! 1st box start at i=3 -> column 1 and 2 correctly computed on west neighbourh
-               p2d(    2,:) = p2d(    1,:)      !  previous lbc_lnk fix column 1 -> copy it to column 2 
+         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN          ! 1st column was changed during the previous call to lbc_lnk
+            IF( MOD(mig(    1,nn_hls), 3) == 1 )   &   ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
+               p2d(    1,:) = p2d(    2,:)             ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
+            IF( MOD(mig(    1,nn_hls), 3) == 2 )   &   ! 1st box start at i=3 -> column 1 and 2 correctly computed on w-neighbourh
+               p2d(    2,:) = p2d(    1,:)             !  previous lbc_lnk fix column 1 -> copy it to column 2 
          ENDIF
          IF( mpiRnei(nn_hls,jpea) > -1 ) THEN
-            IF( MOD(mig(jpi-2), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:)
-            IF( MOD(mig(jpi-2), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpso) > -1 ) THEN
-            IF( MOD(mjg(    1), 3) == 1 )   p2d(:,    1) = p2d(:,    2)
-            IF( MOD(mjg(    1), 3) == 2 )   p2d(:,    2) = p2d(:,    1)
+            IF( MOD(mjg(    1,nn_hls), 3) == 1 )   p2d(:,    1) = p2d(:,    2)
+            IF( MOD(mjg(    1,nn_hls), 3) == 2 )   p2d(:,    2) = p2d(:,    1)
          ENDIF
          IF( mpiRnei(nn_hls,jpno) > -1 ) THEN
-            IF( MOD(mjg(jpj-2), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1)
-            IF( MOD(mjg(jpj-2), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj)
          ENDIF
          CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1.0_wp )
       ENDIF
@@ -247,11 +218,11 @@ CONTAINS
          ! work over the whole domain (guarantees all internal cells are set when nn_hls=2)
          !
          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            IF( MOD(mig(ji), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
-              & MOD(mjg(jj), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
-               ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
-               jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
-               IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
+            IF( MOD(mig(ji,nn_hls), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
+              & MOD(mjg(jj,nn_hls), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
+               ji2 = MIN(mig(ji,nn_hls)+2, jpiglo) - nimpp + 1                  ! right position of the box
+               jj2 = MIN(mjg(jj,nn_hls)+2, jpjglo) - njmpp + 1                  ! upper position of the box
+               IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                           ! the box is fully included in the local mpi domain
                   p3d(ji:ji2,jj:jj2,jn) = SUM(p3d(ji:ji2,jj:jj2,jn))
                ENDIF
             ENDIF
@@ -260,204 +231,29 @@ CONTAINS
       CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1.0_wp )
       ! no need for 2nd exchange when nn_hls > 1
       IF( nn_hls == 1 ) THEN
-         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN    ! 1st column was changed during the previous call to lbc_lnk
-            IF( MOD(mig(    1), 3) == 1 )   &    ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
-               p3d(    1,:,:) = p3d(    2,:,:)   ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
-            IF( MOD(mig(    1), 3) == 2 )   &    ! 1st box start at i=3 -> column 1 and 2 correctly computed on west neighbourh
-               p3d(    2,:,:) = p3d(    1,:,:)   !  previous lbc_lnk fix column 1 -> copy it to column 2 
+         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN           ! 1st column was changed during the previous call to lbc_lnk
+            IF( MOD(mig(    1,nn_hls), 3) == 1 )   &    ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
+               p3d(    1,:,:) = p3d(    2,:,:)          ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
+            IF( MOD(mig(    1,nn_hls), 3) == 2 )   &    ! 1st box start at i=3 -> column 1 and 2 correctly computed on w-neighbourh
+               p3d(    2,:,:) = p3d(    1,:,:)          !  previous lbc_lnk fix column 1 -> copy it to column 2 
          ENDIF
          IF( mpiRnei(nn_hls,jpea) > -1 ) THEN
-            IF( MOD(mig(jpi-2), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:)
-            IF( MOD(mig(jpi-2), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpso) > -1 ) THEN
-            IF( MOD(mjg(    1), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:)
-            IF( MOD(mjg(    1), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:)
+            IF( MOD(mjg(    1,nn_hls), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:)
+            IF( MOD(mjg(    1,nn_hls), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpno) > -1 ) THEN
-            IF( MOD(mjg(jpj-2), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:)
-            IF( MOD(mjg(jpj-2), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:)
          ENDIF
          CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1.0_wp )
       ENDIF
 
    END SUBROUTINE sum3x3_3d
 
-
-   FUNCTION glob_sum_vec_3d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname      ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:) ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3)) ::   ptmp
-      !
-      COMPLEX(dp), DIMENSION(:), ALLOCATABLE ::   ctmp
-      REAL(wp)    ::   ztmp
-      INTEGER     ::   ji , jj , jk     ! dummy loop indices
-      INTEGER     ::   ipi, ipj, ipk    ! dimensions
-      INTEGER     ::   iis, iie, ijs, ije   ! loop start and end
-      !!-----------------------------------------------------------------------
-      !
-      ipi = SIZE(ptab,1)   ! 1st dimension
-      ipj = SIZE(ptab,2)   ! 2nd dimension
-      ipk = SIZE(ptab,3)   ! 3rd dimension
-      !
-      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! do 2D loop only over the inner domain (-> avoid to use undefined values)
-         iis = Nis0   ;   iie = Nie0
-         ijs = Njs0   ;   ije = Nje0
-      ELSE                                     ! I think we are never in this case...
-         iis = 1   ;   iie = jpi
-         ijs = 1   ;   ije = jpj
-      ENDIF
-      !
-      ALLOCATE( ctmp(ipk) )
-      !
-      DO jk = 1, ipk
-         ctmp(jk) = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
-         DO jj = ijs, ije
-            DO ji = iis, iie
-               ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
-               CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp(jk) )
-            END DO
-         END DO
-      END DO
-      CALL mpp_sum( cdname, ctmp(:) )   ! sum over the global domain
-      !
-      ptmp = REAL( ctmp(:), wp )
-      !
-      DEALLOCATE( ctmp )
-      !
-   END FUNCTION glob_sum_vec_3d
-
-   FUNCTION glob_sum_vec_4d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:,:) ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4)) ::   ptmp
-      !
-      COMPLEX(dp), DIMENSION(:), ALLOCATABLE ::   ctmp
-      REAL(wp)    ::   ztmp
-      INTEGER     ::   ji , jj , jk , jl     ! dummy loop indices
-      INTEGER     ::   ipi, ipj, ipk, ipl    ! dimensions
-      INTEGER     ::   iis, iie, ijs, ije    ! loop start and end
-      !!-----------------------------------------------------------------------
-      !
-      ipi = SIZE(ptab,1)   ! 1st dimension
-      ipj = SIZE(ptab,2)   ! 2nd dimension
-      ipk = SIZE(ptab,3)   ! 3rd dimension
-      ipl = SIZE(ptab,4)   ! 4th dimension
-      !
-      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! do 2D loop only over the inner domain (-> avoid to use undefined values)
-         iis = Nis0   ;   iie = Nie0
-         ijs = Njs0   ;   ije = Nje0
-      ELSE                                     ! I think we are never in this case...
-         iis = 1   ;   iie = jpi
-         ijs = 1   ;   ije = jpj
-      ENDIF
-      !
-      ALLOCATE( ctmp(ipl) )
-      !
-      DO jl = 1, ipl
-         ctmp(jl) = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
-         DO jk = 1, ipk
-            DO jj = ijs, ije
-               DO ji = iis, iie
-                  ztmp =  ptab(ji,jj,jk,jl) * tmask_i(ji,jj)
-                  CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp(jl) )
-               END DO
-            END DO
-         END DO
-      END DO
-      CALL mpp_sum( cdname, ctmp(:) )   ! sum over the global domain
-      !
-      ptmp = REAL( ctmp(:), wp )
-      !
-      DEALLOCATE( ctmp )
-      !
-   END FUNCTION glob_sum_vec_4d
-
-   FUNCTION glob_min_vec_3d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:)   ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3)) ::   ptmp
-      !
-      INTEGER     ::   jk    ! dummy loop indice & dimension
-      INTEGER     ::   ipk   ! dimension
-      !!-----------------------------------------------------------------------
-      !
-      ipk = SIZE(ptab,3)
-      DO jk = 1, ipk
-         ptmp(jk) = MINVAL( ptab(:,:,jk) * tmask_i(:,:) )
-      ENDDO
-      !
-      CALL mpp_min( cdname, ptmp (:) )
-      !
-   END FUNCTION glob_min_vec_3d
-
-   FUNCTION glob_min_vec_4d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname          ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:,:)   ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4)) ::   ptmp
-      !
-      INTEGER     ::   jk , jl    ! dummy loop indice & dimension
-      INTEGER     ::   ipk, ipl   ! dimension
-      !!-----------------------------------------------------------------------
-      !
-      ipk = SIZE(ptab,3)
-      ipl = SIZE(ptab,4)
-      DO jl = 1, ipl
-            ptmp(jl) = MINVAL( ptab(:,:,1,jl) * tmask_i(:,:) )         
-         DO jk = 2, ipk
-            ptmp(jl) = MIN( ptmp(jl), MINVAL( ptab(:,:,jk,jl) * tmask_i(:,:) ) )
-         ENDDO
-      ENDDO
-      !
-      CALL mpp_min( cdname, ptmp (:) )
-      !
-   END FUNCTION glob_min_vec_4d
-   
-   FUNCTION glob_max_vec_3d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:)   ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3)) ::   ptmp
-      !
-      INTEGER     ::   jk    ! dummy loop indice & dimension
-      INTEGER     ::   ipk   ! dimension
-      !!-----------------------------------------------------------------------
-      !
-      ipk = SIZE(ptab,3)
-      DO jk = 1, ipk
-         ptmp(jk) = MAXVAL( ptab(:,:,jk) * tmask_i(:,:) )
-      ENDDO
-      !
-      CALL mpp_max( cdname, ptmp (:) )
-      !
-   END FUNCTION glob_max_vec_3d
-
-   FUNCTION glob_max_vec_4d( cdname, ptab ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in) ::   cdname          ! name of the calling subroutine
-      REAL(wp),          INTENT(in) ::   ptab(:,:,:,:)   ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4)) ::   ptmp
-      !
-      INTEGER     ::   jk , jl    ! dummy loop indice & dimension
-      INTEGER     ::   ipk, ipl   ! dimension
-      !!-----------------------------------------------------------------------
-      !
-      ipk = SIZE(ptab,3)
-      ipl = SIZE(ptab,4)
-      DO jl = 1, ipl
-            ptmp(jl) = MAXVAL( ptab(:,:,1,jl) * tmask_i(:,:) )         
-         DO jk = 2, ipk
-            ptmp(jl) = MAX( ptmp(jl), MAXVAL( ptab(:,:,jk,jl) * tmask_i(:,:) ) )
-         ENDDO
-      ENDDO
-      !
-      CALL mpp_max( cdname, ptmp (:) )
-      !
-   END FUNCTION glob_max_vec_4d
    
    SUBROUTINE DDPDD( ydda, yddb )
       !!----------------------------------------------------------------------
diff --git a/src/OCE/lib_fortran_generic.h90 b/src/OCE/lib_fortran_generic.h90
index 5201ad6d..2b84ed31 100644
--- a/src/OCE/lib_fortran_generic.h90
+++ b/src/OCE/lib_fortran_generic.h90
@@ -1,139 +1,205 @@
-#if defined GLOBSUM_CODE
-!                          ! FUNCTION FUNCTION_GLOBSUM !
+/**/
+/*-----------------------------*/
+/*   DEFINE COMMON VARIABLES   */
+/*-----------------------------*/
+/**/
 #   if defined DIM_1d
-#      define XD                1d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
-#      define ARRAY_IN(i,j,k)   ptab(i)
-#      define ARRAY2_IN(i,j,k)  ptab2(i)
-#      define J_SIZE(ptab)      1
-#      define K_SIZE(ptab)      1
-#      define MASK_ARRAY(i,j)   1.
+#      define XD                  1d
+#      define ARRAY_IN(i,j,k,l)   ptab(i)
 #   endif
 #   if defined DIM_2d
-#      define XD                2d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
-#      define ARRAY_IN(i,j,k)   ptab(i,j)
-#      define ARRAY2_IN(i,j,k)  ptab2(i,j)
-#      define J_SIZE(ptab)      SIZE(ptab,2)
-#      define K_SIZE(ptab)      1
-#      define MASK_ARRAY(i,j)   tmask_i(i,j)
+#      define XD                  2d
+#      define ARRAY_IN(i,j,k,l)   ptab(i,j)
+#      define K_SIZE(ptab)        1
+#      define L_SIZE(ptab)        1
+#      define LAST_SIZE           -1
 #   endif
 #   if defined DIM_3d
-#      define XD                3d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
-#      define ARRAY_IN(i,j,k)   ptab(i,j,k)
-#      define ARRAY2_IN(i,j,k)  ptab2(i,j,k)
-#      define J_SIZE(ptab)      SIZE(ptab,2)
-#      define K_SIZE(ptab)      SIZE(ptab,3)
-#      define MASK_ARRAY(i,j)   tmask_i(i,j)
-#   endif
-
-   FUNCTION glob_sum_/**/XD/**/( cdname, ptab )
+#      define XD                  3d
+#      define ARRAY_IN(i,j,k,l)   ptab(i,j,k)
+#      define K_SIZE(ptab)        SIZE(ptab,3)
+#      define L_SIZE(ptab)        1
+#      define LAST_SIZE           SIZE(ptab,3)
+#   endif
+#   if defined DIM_4d
+#      define XD                  4d
+#      define ARRAY_IN(i,j,k,l)   ptab(i,j,k,l)
+#      define K_SIZE(ptab)        SIZE(ptab,3)
+#      define L_SIZE(ptab)        SIZE(ptab,4)
+#      define LAST_SIZE           SIZE(ptab,4)
+#   endif
+#   if defined VEC
+#      define ISVEC               _vec
+#   else
+#      define ISVEC               
+#   endif
+#   if defined LOCALONLY
+#      define TYPENAME           local
+#   else
+#      define TYPENAME           glob
+#   endif
+/**/
+/*-------------------------------*/
+/*   FUNCTION FUNCTION_GLOBSUM   */
+/*-------------------------------*/
+/**/
+#if defined GLOBSUM_CODE
+/**/
+/*   DEFINE LOCAL VARIABLES   */
+/**/
+!
+#   if defined LOCALONLY
+FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD/**/(         ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
-      ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
-      REAL(wp)   ::  glob_sum_/**/XD
-      !
-      !!-----------------------------------------------------------------------
+#   else
+FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD/**/( cdname, ptab ) RESULT( ptmp )
+      !!----------------------------------------------------------------------
+      CHARACTER(len=*), INTENT(in   ) ::   cdname  ! name of the calling subroutine
+#   endif
+      REAL(wp)        , INTENT(in   ) ::   ARRAY_IN(:,:,:,:)   ! array on which operation is applied
       !
+#   if defined VEC
+      REAL(wp)   , DIMENSION(LAST_SIZE) ::   ptmp
+      COMPLEX(dp), DIMENSION(LAST_SIZE) ::   ctmp
+#   else
+      REAL(wp)   ::  ptmp
       COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
-      INTEGER    ::   ji, jj, jk           ! dummy loop indices
-      INTEGER    ::   ipi,ipj, ipk         ! dimensions
-      INTEGER    ::   iis, iie, ijs, ije   ! loop start and end
+#   endif
+      INTEGER    ::    ji,  jj,  jk,  jl        ! dummy loop indices
+      INTEGER    ::   ipi, ipj, ipk, ipl        ! dimensions
+      INTEGER    ::   iisht, ijsht
       !!-----------------------------------------------------------------------
       !
+#  if defined DIM_1d
+      ctmp = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
+      DO ji = 1, SIZE(ptab,1)
+         CALL DDPDD( CMPLX( ptab(ji), 0.e0, dp ), ctmp )
+      END DO
+      !
+#  else
       ipi = SIZE(ptab,1)   ! 1st dimension
-      ipj = J_SIZE(ptab)   ! 2nd dimension
+      ipj = SIZE(ptab,2)   ! 2nd dimension
       ipk = K_SIZE(ptab)   ! 3rd dimension
+      ipl = L_SIZE(ptab)   ! 4th dimension
       !
-      IF( ipi == jpi .AND. ipj == jpj ) THEN   ! do 2D loop only over the inner domain (-> avoid to use undefined values)
-         iis = Nis0   ;   iie = Nie0
-         ijs = Njs0   ;   ije = Nje0
-      ELSE
-         iis = 1   ;   iie = jpi
-         ijs = 1   ;   ije = jpj
-      ENDIF
+      iisht = ( jpi - ipi ) / 2
+      ijsht = ( jpj - ipj ) / 2   ! should be the same as iisht...
       !
       ctmp = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
-      DO jk = 1, ipk
-        DO jj = ijs, ije
-          DO ji = iis, iie
-             ztmp =  ARRAY_IN(ji,jj,jk) * MASK_ARRAY(ji,jj)
-             CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
-          END DO
-        END DO
+      !
+      DO jl = 1, ipl
+         DO jk = 1, ipk
+            DO_2D( 0, 0, 0, 0 )
+               ! warning tmask_i is defined over the full MPI domain but maybe not ptab
+#   define ARRAY_LOOP             ARRAY_IN(ji-iisht,jj-ijsht,jk,jl) * tmask_i(ji,jj)
+#   if   defined VEC && defined DIM_3d
+               CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp(jk) )
+#   endif
+#   if   defined VEC && defined DIM_4d
+               CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp(jl) )
+#   endif
+#   if ! defined VEC
+               CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp )
+#   endif
+            END_2D
+         END DO
       END DO
+      !
+#  endif
+#  if defined LOCALONLY
+      ptmp = ctmp
+#  else       
       CALL mpp_sum( cdname, ctmp )   ! sum over the global domain
-      glob_sum_/**/XD = REAL(ctmp,wp)
-
-   END FUNCTION glob_sum_/**/XD
-
-#undef XD
-#undef ARRAY_TYPE
-#undef ARRAY2_TYPE
-#undef ARRAY_IN
-#undef ARRAY2_IN
-#undef J_SIZE
-#undef K_SIZE
-#undef MASK_ARRAY
+      ptmp = REAL(ctmp, wp)
+#  endif
+      !
+   END FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD
 !
 # endif
+/**/
+/*----------------------------------*/
+/*   FUNCTION FUNCTION_GLOBMINMAX   */
+/*----------------------------------*/
+/**/
 #if defined GLOBMINMAX_CODE
-!                          ! FUNCTION FUNCTION_GLOBMINMAX !
-#   if defined DIM_2d
-#      define XD                2d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
-#      define ARRAY_IN(i,j,k)   ptab(i,j)
-#      define ARRAY2_IN(i,j,k)  ptab2(i,j)
-#      define K_SIZE(ptab)      1
-#   endif
-#   if defined DIM_3d
-#      define XD                3d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
-#      define ARRAY_IN(i,j,k)   ptab(i,j,k)
-#      define ARRAY2_IN(i,j,k)  ptab2(i,j,k)
-#      define K_SIZE(ptab)      SIZE(ptab,3)
-#   endif
+/**/
+/*   DEFINE LOCAL VARIABLES   */
+/**/
 #   if defined OPERATION_GLOBMIN
-#      define OPER min
+#      define OPER      min
+#      define DEFAULT   HUGE(1._wp)
 #   endif
 #   if defined OPERATION_GLOBMAX
-#      define OPER max
+#      define OPER      max
+#      define DEFAULT   -HUGE(1._wp)
 #   endif
-
-   FUNCTION glob_/**/OPER/**/_/**/XD/**/( cdname, ptab )
+!
+#   if defined LOCALONLY
+   FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD/**/(         ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
-      ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
-      REAL(wp)   ::  glob_/**/OPER/**/_/**/XD
-      !
-      !!-----------------------------------------------------------------------
+#   else
+   FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD/**/( cdname, ptab ) RESULT( ptmp )
+      !!----------------------------------------------------------------------
+      CHARACTER(len=*), INTENT(in   ) ::   cdname  ! name of the calling subroutine
+#   endif
+      REAL(wp)        , INTENT(in   ) ::   ARRAY_IN(:,:,:,:)   ! array on which operation is applied
       !
-      COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
-      INTEGER    ::   jk       ! dummy loop indices
-      INTEGER    ::   ipk      ! dimensions
+#   if defined VEC
+      REAL(wp), DIMENSION(LAST_SIZE) ::   ptmp
+#   else
+      REAL(wp)   ::  ptmp
+#   endif
+      INTEGER    ::    ji,  jj,  jk,  jl        ! dummy loop indices
+      INTEGER    ::   ipi, ipj, ipk, ipl        ! dimensions
+      INTEGER    ::   iisht, ijsht
       !!-----------------------------------------------------------------------
       !
+      ipi = SIZE(ptab,1)   ! 1st dimension
+      ipj = SIZE(ptab,2)   ! 2nd dimension
       ipk = K_SIZE(ptab)   ! 3rd dimension
+      ipl = L_SIZE(ptab)   ! 4th dimension
+      !
+      iisht = ( jpi - ipi ) / 2
+      ijsht = ( jpj - ipj ) / 2   ! should be the same as iisht...
       !
-      ztmp = OPER/**/val( ARRAY_IN(:,:,1)*tmask_i(:,:) )
-      DO jk = 2, ipk
-         ztmp = OPER/**/(ztmp, OPER/**/val( ARRAY_IN(:,:,jk)*tmask_i(:,:) ))
-      ENDDO
-
-      CALL mpp_/**/OPER/**/( cdname, ztmp)
-
-      glob_/**/OPER/**/_/**/XD  = ztmp
-
-   END FUNCTION glob_/**/OPER/**/_/**/XD
-
+      ptmp = DEFAULT
+      !
+      DO jl = 1, ipl
+         DO jk = 1, ipk
+#   define ARRAY_LOOP   ARRAY_IN(Nis0-iisht:Nie0-iisht,Njs0-ijsht:Nje0-ijsht,jk,jl)*tmask_i(Nis0:Nie0,Njs0:Nje0) 
+#   if   defined VEC && defined DIM_3d
+            ptmp(jk) = OPER/**/( ptmp(jk), OPER/**/val( ARRAY_LOOP ) )
+#   endif
+#   if   defined VEC && defined DIM_4d
+            ptmp(jl) = OPER/**/( ptmp(jl), OPER/**/val( ARRAY_LOOP ) )
+#   endif
+#   if ! defined VEC
+            ptmp     = OPER/**/( ptmp    , OPER/**/val( ARRAY_LOOP ) )
+#   endif
+         END DO
+      END DO
+      !
+#   if ! defined LOCAL
+      CALL mpp_/**/OPER/**/( cdname, ptmp )
+#   endif
+      !
+   END FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD
+!
+#   undef DEFAULT
+#   undef OPER
+# endif
+/**/
+/*                               */
+/*   UNDEFINE COMMON VARIABLES   */
+/*                               */
+/**/
 #undef XD
-#undef ARRAY_TYPE
-#undef ARRAY2_TYPE
 #undef ARRAY_IN
-#undef ARRAY2_IN
+#   if ! defined DIM_1d  
 #undef K_SIZE
-#undef OPER
-# endif
+#undef L_SIZE
+#undef LAST_SIZE
+#   endif
+#undef ISVEC
+#undef TYPENAME
+#undef ARRAY_LOOP
diff --git a/src/OCE/module_example.F90 b/src/OCE/module_example.F90
index 2620b2ef..b0198f02 100644
--- a/src/OCE/module_example.F90
+++ b/src/OCE/module_example.F90
@@ -88,17 +88,17 @@ CONTAINS
       !! References :   Author et al., Short_name_review, Year
       !!                Give references if exist otherwise suppress these lines
       !!----------------------------------------------------------------------
-      INTEGER , INTENT(in   )                     ::   kt      ! short description 
-      INTEGER , INTENT(inout)                     ::   pvar1   !   -         -
-      REAL(wp), INTENT(  out)                     ::   pvar2   !   -         -
-      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   pvar2   !   -         -
+      INTEGER , INTENT(in   )                         ::   kt      ! short description
+      INTEGER , INTENT(inout)                         ::   pvar1   !   -         -
+      REAL(wp), INTENT(  out)                         ::   pvar2   !   -         -
+      REAL(wp), INTENT(  out), DIMENSION(A2D(nn_hls)) ::   pvar2   !   -         -
       !!
       INTEGER  ::   ji, jj, jk       ! dummy loop arguments  (DOCTOR : start with j, but not jp)
       INTEGER  ::   itoto, itata     ! temporary integers    (DOCTOR : start with i
       REAL(wp) ::   zmlmin, zbbrho   ! temporary scalars     (DOCTOR : start with z)
       REAL(wp) ::   zfact1, zfact2   ! do not use continuation lines in declaration
-      REAL(wp), DIMENSION(A2D(nn_hls))     ::   zwrk_2d   ! 2D workspace
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwrk_3d   ! 3D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls))     ::   zwrk_2d   ! 2D workspace
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zwrk_3d   ! 3D workspace
       !!--------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
diff --git a/src/OCE/nemogcm.F90 b/src/OCE/nemogcm.F90
index 7fd8bc84..20fdf05c 100644
--- a/src/OCE/nemogcm.F90
+++ b/src/OCE/nemogcm.F90
@@ -167,6 +167,7 @@ CONTAINS
       !
       DO WHILE( istp <= nitend .AND. nstop == 0 )
          !
+         ncom_stp = istp
 #  if defined key_qco   ||   defined key_linssh
 #   if defined key_RK3
          CALL stp_RK3
@@ -400,13 +401,7 @@ CONTAINS
       !                             ! mpp parameters and domain decomposition !
       !                             !-----------------------------------------!
       CALL mpp_init
-
-#if defined key_loop_fusion
-      IF( nn_hls == 1 ) THEN
-         CALL ctl_stop( 'STOP', 'nemogcm : Loop fusion can be used only with extra-halo' )
-      ENDIF
-#endif
-
+      !
       CALL halo_mng_init()
       ! Now we know the dimensions of the grid and numout has been set: we can allocate arrays
       CALL nemo_alloc()
diff --git a/src/OCE/oce.F90 b/src/OCE/oce.F90
index c180833b..70ae5ee8 100644
--- a/src/OCE/oce.F90
+++ b/src/OCE/oce.F90
@@ -54,15 +54,6 @@ MODULE oce
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ub2_i_b, vb2_i_b         !: agrif time integrated fluxes 
 #endif
 
-   !! interpolated gradient (only used in zps case)
-   !! ---------------------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gtsu, gtsv   !: horizontal gradient of T, S bottom u-point 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gru , grv    !: horizontal gradient of rd at bottom u-point
-
-   !! (ISF) interpolated gradient (only used for ice shelf case) 
-   !! --------------------- 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gtui, gtvi   !: horizontal gradient of T, S and rd at top u-point 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   grui, grvi   !: horizontal gradient of T, S and rd at top v-point  
    !! (ISF) ice load
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   riceload
 
@@ -105,10 +96,6 @@ CONTAINS
       ii = ii+1
       ALLOCATE( ssh (jpi,jpj,jpt)  , uu_b(jpi,jpj,jpt) , vv_b(jpi,jpj,jpt) ,     &
          &      ssh_frc(jpi,jpj)                                           ,     &
-         &      gtsu(jpi,jpj,jpts) , gtsv(jpi,jpj,jpts)                    ,     &
-         &      gru (jpi,jpj)      , grv (jpi,jpj)                         ,     &
-         &      gtui(jpi,jpj,jpts) , gtvi(jpi,jpj,jpts)                    ,     &
-         &      grui(jpi,jpj)      , grvi(jpi,jpj)                         ,     &
          &      riceload(jpi,jpj)                                          , STAT=ierr(ii) )
          !
       ii = ii+1
diff --git a/src/OCE/par_oce.F90 b/src/OCE/par_oce.F90
index f72dce44..f6ef02fe 100644
--- a/src/OCE/par_oce.F90
+++ b/src/OCE/par_oce.F90
@@ -59,7 +59,8 @@ MODULE par_oce
    INTEGER, PUBLIC ::   jpj   !                                                    !: second dimension
    INTEGER, PUBLIC ::   jpk   ! = jpkglo                                           !: third  dimension
    INTEGER, PUBLIC ::   jpkm1 ! = jpk-1                                            !:   -     -      -
-   INTEGER, PUBLIC ::   jpij  ! = jpi*jpj                                          !:  jpi x jpj
+   !INTEGER, PUBLIC ::  jpij  ! = jpi*jpj                                          !:  jpi x jpj
+   INTEGER, PUBLIC ::   jpij  ! = (jpi-2*nn_hls)*(jpj-2*nn_hls)                    !:  jpi x jpj but without the halos
    INTEGER, PUBLIC ::   jpimax! = ( Ni0glo + jpni-1 ) / jpni + 2*nn_hls            !: maximum jpi
    INTEGER, PUBLIC ::   jpjmax! = ( Nj0glo + jpnj-1 ) / jpnj + 2*nn_hls            !: maximum jpj
 
diff --git a/src/OCE/step.F90 b/src/OCE/step.F90
deleted file mode 100644
index f2f79061..00000000
--- a/src/OCE/step.F90
+++ /dev/null
@@ -1,452 +0,0 @@
-MODULE step
-   !!======================================================================
-   !!                       ***  MODULE step  ***
-   !! Time-stepping   : manager of the ocean, tracer and ice time stepping
-   !!======================================================================
-   !! History :  OPA  !  1991-03  (G. Madec)  Original code
-   !!             -   !  1991-11  (G. Madec)
-   !!             -   !  1992-06  (M. Imbard)  add a first output record
-   !!             -   !  1996-04  (G. Madec)  introduction of dynspg
-   !!             -   !  1996-04  (M.A. Foujols)  introduction of passive tracer
-   !!            8.0  !  1997-06  (G. Madec)  new architecture of call
-   !!            8.2  !  1997-06  (G. Madec, M. Imbard, G. Roullet)  free surface
-   !!             -   !  1999-02  (G. Madec, N. Grima)  hpg implicit
-   !!             -   !  2000-07  (J-M Molines, M. Imbard)  Open Bondary Conditions
-   !!   NEMO     1.0  !  2002-06  (G. Madec)  free form, suppress macro-tasking
-   !!             -   !  2004-08  (C. Talandier) New trends organization
-   !!             -   !  2005-01  (C. Ethe) Add the KPP closure scheme
-   !!             -   !  2005-11  (G. Madec)  Reorganisation of tra and dyn calls
-   !!             -   !  2006-01  (L. Debreu, C. Mazauric)  Agrif implementation
-   !!             -   !  2006-07  (S. Masson)  restart using iom
-   !!            3.2  !  2009-02  (G. Madec, R. Benshila)  reintroduicing z*-coordinate
-   !!             -   !  2009-06  (S. Masson, G. Madec)  TKE restart compatible with key_cpl
-   !!            3.3  !  2010-05  (K. Mogensen, A. Weaver, M. Martin, D. Lea) Assimilation interface
-   !!             -   !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase + merge TRC-TRA
-   !!            3.4  !  2011-04  (G. Madec, C. Ethe) Merge of dtatem and dtasal
-   !!            3.6  !  2012-07  (J. Simeon, G. Madec. C. Ethe)  Online coarsening of outputs
-   !!            3.6  !  2014-04  (F. Roquet, G. Madec) New equations of state
-   !!            3.6  !  2014-10  (E. Clementi, P. Oddo) Add Qiao vertical mixing in case of waves
-   !!            3.7  !  2014-10  (G. Madec)  LDF simplication
-   !!             -   !  2014-12  (G. Madec) remove KPP scheme
-   !!             -   !  2015-11  (J. Chanut) free surface simplification (remove filtered free surface)
-   !!            4.0  !  2017-05  (G. Madec)  introduction of the vertical physics manager (zdfphy)
-   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rewrite in preparation for new timestepping scheme
-   !!----------------------------------------------------------------------
-
-#if defined key_qco   ||   defined key_linssh
-   !!----------------------------------------------------------------------
-   !!   'key_qco'      EMPTY MODULE      Quasi-Eulerian vertical coordinate
-   !!                                OR
-   !!   'key_linssh    EMPTY MODULE       Fixed in time vertical coordinate
-   !!----------------------------------------------------------------------
-#else
-   !!----------------------------------------------------------------------
-   !!   stp             : OCE system time-stepping
-   !!----------------------------------------------------------------------
-   USE step_oce         ! time stepping definition modules
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   stp   ! called by nemogcm.F90
-
-   !                                          !**  time level indices  **!
-   INTEGER, PUBLIC ::   Nbb, Nnn, Naa, Nrhs   !: used by nemo_init
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: step.F90 15398 2021-10-19 08:49:42Z timgraham $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-#if defined key_agrif
-   RECURSIVE SUBROUTINE stp( )
-      INTEGER             ::   kstp   ! ocean time-step index
-#else
-   SUBROUTINE stp( kstp )
-      INTEGER, INTENT(in) ::   kstp   ! ocean time-step index
-#endif
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE stp  ***
-      !!
-      !! ** Purpose : - Time stepping of OCE  (momentum and active tracer eqs.)
-      !!              - Time stepping of SI3 (dynamic and thermodynamic eqs.)
-      !!              - Time stepping of TRC  (passive tracer eqs.)
-      !!
-      !! ** Method  : -1- Update forcings and data
-      !!              -2- Update ocean physics
-      !!              -3- Compute the t and s trends
-      !!              -4- Update t and s
-      !!              -5- Compute the momentum trends
-      !!              -6- Update the horizontal velocity
-      !!              -7- Compute the diagnostics variables (rd,N2, hdiv,w)
-      !!              -8- Outputs and diagnostics
-      !!----------------------------------------------------------------------
-      INTEGER ::   ji, jj, jk, jtile   ! dummy loop indice
-      !! ---------------------------------------------------------------------
-#if defined key_agrif
-      IF( nstop > 0 ) RETURN   ! avoid to go further if an error was detected during previous time step (child grid)
-      kstp = nit000 + Agrif_Nb_Step()
-      Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs   ! agrif_oce module copies of time level indices
-      IF( lk_agrif_debug ) THEN
-         IF( Agrif_Root() .and. lwp)   WRITE(*,*) '---'
-         IF(lwp)   WRITE(*,*) 'Grid Number', Agrif_Fixed(),' time step ', kstp, 'int tstep', Agrif_NbStepint()
-      ENDIF
-      IF( kstp == nit000 + 1 )   lk_agrif_fstep = .FALSE.
-# if defined key_xios
-      IF( Agrif_Nbstepint() == 0 )   CALL iom_swap( cxios_context )
-# endif
-#endif
-      !
-      IF( ln_timing )   CALL timing_start('stp')
-      !
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! model timestep
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      !
-      IF( l_1st_euler ) THEN     ! start or restart with Euler 1st time-step
-         rDt   = rn_Dt   
-         r1_Dt = 1._wp / rDt
-      ENDIF
-      !
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! update I/O and calendar
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      !
-      IF( kstp == nit000 ) THEN                       ! initialize IOM context (must be done after nemo_init for AGRIF+XIOS+OASIS)
-                             CALL iom_init( cxios_context, ld_closedef=.FALSE. )   ! for model grid (including possible AGRIF zoom)
-         IF( lk_diamlr   )   CALL dia_mlr_iom_init    ! with additional setup for multiple-linear-regression analysis
-                             CALL iom_init_closedef
-         IF( ln_crs      )   CALL iom_init( TRIM(cxios_context)//"_crs" )  ! for coarse grid
-      ENDIF
-      IF( kstp == nitrst .AND. lwxios ) THEN
-                             CALL iom_swap(                     cw_ocerst_cxt )
-                             CALL iom_init_closedef(            cw_ocerst_cxt )
-                             CALL iom_setkt( kstp - nit000 + 1, cw_ocerst_cxt )
-#if defined key_top
-                             CALL iom_swap(                     cw_toprst_cxt )
-                             CALL iom_init_closedef(            cw_toprst_cxt )
-                             CALL iom_setkt( kstp - nit000 + 1, cw_toprst_cxt )
-#endif
-      ENDIF
-      IF( kstp + nn_fsbc - 1 == nitrst .AND. lwxios ) THEN
-#if defined key_si3
-                             CALL iom_swap(                     cw_icerst_cxt )
-                             CALL iom_init_closedef(            cw_icerst_cxt )
-                             CALL iom_setkt( kstp - nit000 + 1, cw_icerst_cxt )
-#endif
-         IF( ln_abl      ) THEN
-                             CALL iom_swap(                     cw_ablrst_cxt )
-                             CALL iom_init_closedef(            cw_ablrst_cxt )
-                             CALL iom_setkt( kstp - nit000 + 1, cw_ablrst_cxt )
-         ENDIF
-      ENDIF
-      IF( kstp /= nit000 )   CALL day( kstp )         ! Calendar (day was already called at nit000 in day_init)
-                             CALL iom_setkt( kstp - nit000 + 1,      cxios_context          )   ! tell IOM we are at time step kstp
-      IF( ln_crs         )   CALL iom_setkt( kstp - nit000 + 1, TRIM(cxios_context)//"_crs" )   ! tell IOM we are at time step kstp
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Update external forcing (tides, open boundaries, ice shelf interaction and surface boundary condition (including sea-ice)
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( ln_tide    )   CALL tide_update( kstp )                     ! update tide potential
-      IF( ln_apr_dyn )   CALL sbc_apr ( kstp )                        ! atmospheric pressure (NB: call before bdy_dta which needs ssh_ib)
-      IF( ln_bdy     )   CALL bdy_dta ( kstp, Nnn )                   ! update dynamic & tracer data at open boundaries
-      IF( ln_isf     )   CALL isf_stp ( kstp, Nnn )
-                         CALL sbc     ( kstp, Nbb, Nnn )              ! Sea Boundary Condition (including sea-ice)
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Update stochastic parameters and random T/S fluctuations
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      IF( ln_sto_eos )   CALL sto_par( kstp )                         ! Stochastic parameters
-      IF( ln_sto_eos )   CALL sto_pts( ts(:,:,:,:,Nnn)  )             ! Random T/S fluctuations
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Ocean physics update
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      !  THERMODYNAMICS
-                         CALL eos_rab( ts(:,:,:,:,Nbb), rab_b, Nnn )       ! before local thermal/haline expension ratio at T-points
-                         CALL eos_rab( ts(:,:,:,:,Nnn), rab_n, Nnn )       ! now    local thermal/haline expension ratio at T-points
-                         CALL bn2    ( ts(:,:,:,:,Nbb), rab_b, rn2b, Nnn ) ! before Brunt-Vaisala frequency
-                         CALL bn2    ( ts(:,:,:,:,Nnn), rab_n, rn2, Nnn  ) ! now    Brunt-Vaisala frequency
-
-      !  VERTICAL PHYSICS
-      ! lbc_lnk needed for zdf_sh2 when using nn_hls = 2, moved here to allow tiling in zdf_phy
-      IF( nn_hls == 2 .AND. l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp )
-
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] ZDF tiling loop
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-                         CALL zdf_phy( kstp, Nbb, Nnn, Nrhs )   ! vertical physics update (top/bot drag, avt, avs, avm + MLD)
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-      !  LATERAL  PHYSICS
-      !
-      IF( ln_zps .OR. l_ldfslp ) CALL eos( ts(:,:,:,:,Nbb), rhd, gdept_0(:,:,:) )               ! before in situ density
-
-      IF( ln_zps .AND. .NOT. ln_isfcav)                                    &
-            &            CALL zps_hde    ( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv,  &  ! Partial steps: before horizontal gradient
-            &                                          rhd, gru , grv    )       ! of t, s, rd at the last ocean level
-
-      IF( ln_zps .AND.       ln_isfcav)                                                &
-            &            CALL zps_hde_isf( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, gtui, gtvi,  &  ! Partial steps for top cell (ISF)
-            &                                          rhd, gru , grv , grui, grvi   )       ! of t, s, rd at the first ocean level
-
-      IF( l_ldfslp ) THEN                             ! slope of lateral mixing
-         IF( ln_traldf_triad ) THEN
-                         CALL ldf_slp_triad( kstp, Nbb, Nnn )             ! before slope for triad operator
-         ELSE
-                         CALL ldf_slp     ( kstp, rhd, rn2b, Nbb, Nnn )   ! before slope for standard operator
-         ENDIF
-      ENDIF
-      !                                                                        ! eddy diffusivity coeff.
-      IF( l_ldftra_time .OR. l_ldfeiv_time )   CALL ldf_tra( kstp, Nbb, Nnn )  !       and/or eiv coeff.
-      IF( l_ldfdyn_time                    )   CALL ldf_dyn( kstp, Nbb )       ! eddy viscosity coeff.
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      !  Ocean dynamics : hdiv, ssh, e3, u, v, w
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-
-                         CALL ssh_nxt       ( kstp, Nbb, Nnn, ssh, Naa )   ! after ssh (includes call to div_hor)
-      IF( .NOT.ln_linssh )   &
-                       & CALL dom_vvl_sf_nxt( kstp, Nbb, Nnn,      Naa )   ! after vertical scale factors
-                         CALL wzv           ( kstp, Nbb, Nnn, Naa, ww  )   ! now cross-level velocity
-      IF( ln_zad_Aimp )  CALL wAimp         ( kstp,      Nnn           )   ! Adaptive-implicit vertical advection partitioning
-                         CALL eos    ( ts(:,:,:,:,Nnn), rhd, rhop, gdept(:,:,:,Nnn) )  ! now in situ density for hpg computation
-
-
-                         uu(:,:,:,Nrhs) = 0._wp            ! set dynamics trends to zero
-                         vv(:,:,:,Nrhs) = 0._wp
-
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] DYN tiling loop (1)
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-         IF(  lk_asminc .AND. ln_asmiau .AND. ln_dyninc )   &
-                  &         CALL dyn_asm_inc   ( kstp, Nbb, Nnn, uu, vv, Nrhs )  ! apply dynamics assimilation increment
-         IF( ln_bkgwri )    CALL asm_bkg_wri( kstp, Nnn )     ! output background fields
-         IF( ln_bdy     )   CALL bdy_dyn3d_dmp ( kstp, Nbb,      uu, vv, Nrhs )  ! bdy damping trends
-#if defined key_agrif
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-      IF(.NOT. Agrif_Root())  &
-               &         CALL Agrif_Sponge_dyn        ! momentum sponge
-
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] DYN tiling loop (1, continued)
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-#endif
-                            CALL dyn_adv( kstp, Nbb, Nnn      , uu, vv, Nrhs )  ! advection (VF or FF)	==> RHS
-                            CALL dyn_vor( kstp,      Nnn      , uu, vv, Nrhs )  ! vorticity           	==> RHS
-                            CALL dyn_ldf( kstp, Nbb, Nnn      , uu, vv, Nrhs )  ! lateral mixing
-         IF( ln_zdfosm  )   CALL dyn_osm( kstp,      Nnn      , uu, vv, Nrhs )  ! OSMOSIS non-local velocity fluxes ==> RHS
-                            CALL dyn_hpg( kstp,      Nnn      , uu, vv, Nrhs )  ! horizontal gradient of Hydrostatic pressure
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-                            CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa )  ! surface pressure gradient
-
-                                                      ! With split-explicit free surface, since now transports have been updated and ssh(:,:,Nrhs) as well
-      IF( ln_dynspg_ts ) THEN                         ! vertical scale factors and vertical velocity need to be updated
-         IF( ln_tile ) CALL dom_tile_start      ! [tiling] DYN tiling loop (2- div_hor only)
-         DO jtile = 1, nijtile
-            IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-                             CALL div_hor       ( kstp, Nbb, Nnn )               ! Horizontal divergence  (2nd call in time-split case)
-         END DO
-         IF( ln_tile ) CALL dom_tile_stop
-
-         IF(.NOT. ln_linssh) CALL dom_vvl_sf_nxt( kstp, Nbb, Nnn, Naa, kcall=2 )  ! after vertical scale factors (update depth average component)
-      ENDIF
-
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] DYN tiling loop (3- dyn_zdf only)
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-                               CALL dyn_zdf    ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa  )  ! vertical diffusion
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-      IF( ln_dynspg_ts ) THEN                                                       ! vertical scale factors and vertical velocity need to be updated
-                            CALL wzv        ( kstp, Nbb, Nnn, Naa, ww )             ! Nnn cross-level velocity
-         IF( ln_zad_Aimp )  CALL wAimp      ( kstp,      Nnn )                      ! Adaptive-implicit vertical advection partitioning
-      ENDIF
-
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! cool skin
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF ( ln_diurnal )  CALL diurnal_layers( kstp )
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! diagnostics and outputs
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( ln_floats  )   CALL flo_stp   ( kstp, Nbb, Nnn )      ! drifting Floats
-      IF( ln_diacfl  )   CALL dia_cfl   ( kstp,      Nnn )      ! Courant number diagnostics
-                         CALL dia_hth   ( kstp,      Nnn )      ! Thermocline depth (20 degres isotherm depth)
-      IF( ln_diadct  )   CALL dia_dct   ( kstp,      Nnn )      ! Transports
-                         CALL dia_ar5   ( kstp,      Nnn )      ! ar5 diag
-                         CALL dia_ptr   ( kstp,      Nnn )      ! Poleward adv/ldf TRansports diagnostics
-                         CALL dia_wri   ( kstp,      Nnn )      ! ocean model: outputs
-      IF( ln_crs     )   CALL crs_fld   ( kstp,      Nnn )      ! ocean model: online field coarsening & output
-      IF( lk_diadetide ) CALL dia_detide( kstp )                ! Weights computation for daily detiding of model diagnostics
-      IF( lk_diamlr  )   CALL dia_mlr                           ! Update time used in multiple-linear-regression analysis
-
-#if defined key_top
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Passive Tracer Model
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-                         CALL trc_stp    ( kstp, Nbb, Nnn, Nrhs, Naa )           ! time-stepping
-#endif
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Active tracers
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-                         ts(:,:,:,:,Nrhs) = 0._wp         ! set tracer trends to zero
-
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] TRA tiling loop (1)
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-         IF(  lk_asminc .AND. ln_asmiau .AND. &
-            & ln_trainc )   CALL tra_asm_inc( kstp, Nbb, Nnn, ts, Nrhs )  ! apply tracer assimilation increment
-                            CALL tra_sbc    ( kstp,      Nnn, ts, Nrhs )  ! surface boundary condition
-         IF( ln_traqsr  )   CALL tra_qsr    ( kstp,      Nnn, ts, Nrhs )  ! penetrative solar radiation qsr
-         IF( ln_isf     )   CALL tra_isf    ( kstp,      Nnn, ts, Nrhs )  ! ice shelf heat flux
-         IF( ln_trabbc  )   CALL tra_bbc    ( kstp,      Nnn, ts, Nrhs )  ! bottom heat flux
-         IF( ln_trabbl  )   CALL tra_bbl    ( kstp, Nbb, Nnn, ts, Nrhs )  ! advective (and/or diffusive) bottom boundary layer scheme
-         IF( ln_tradmp  )   CALL tra_dmp    ( kstp, Nbb, Nnn, ts, Nrhs )  ! internal damping trends
-         IF( ln_bdy     )   CALL bdy_tra_dmp( kstp, Nbb,      ts, Nrhs )  ! bdy damping trends
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-#if defined key_agrif
-      IF(.NOT. Agrif_Root() )   THEN
-                            CALL Agrif_Sponge_tra        ! tracers sponge
-      ENDIF
-#endif
-
-      ! TEMP: [tiling] Separate loop over tile domains (due to tra_adv workarounds for tiling)
-      IF( ln_tile ) CALL dom_tile_start         ! [tiling] TRA tiling loop (2)
-      DO jtile = 1, nijtile
-         IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )
-
-                            CALL tra_adv    ( kstp, Nbb, Nnn, Naa, ts, Nrhs )  ! hor. + vert. advection	==> RHS
-         IF( ln_zdfmfc  )   CALL tra_mfc    ( kstp, Nbb,      ts, Nrhs )  ! Mass Flux Convection
-         IF( ln_zdfosm  ) THEN
-                            CALL tra_osm    ( kstp,      Nnn, ts, Nrhs )  ! OSMOSIS non-local tracer fluxes ==> RHS
-            IF( lrst_oce )  CALL osm_rst    ( kstp,      Nnn, 'WRITE'  )  ! write OSMOSIS outputs + ww (so must do here) to restarts
-         ENDIF
-                            CALL tra_ldf    ( kstp, Nbb, Nnn, ts, Nrhs )  ! lateral mixing
-
-                            CALL tra_zdf    ( kstp, Nbb, Nnn, Nrhs, ts, Naa  )  ! vertical mixing and after tracer fields
-         IF( ln_zdfnpc  )   CALL tra_npc    ( kstp,      Nnn, Nrhs, ts, Naa  )  ! update after fields by non-penetrative convection
-      END DO
-      IF( ln_tile ) CALL dom_tile_stop
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Set boundary conditions, time filter and swap time levels
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-!!jc1: For agrif, it would be much better to finalize tracers/momentum here (e.g. bdy conditions) and move the swap
-!!    (and time filtering) after Agrif update. Then restart would be done after and would contain updated fields.
-!!    If so:
-!!    (i) no need to call agrif update at initialization time
-!!    (ii) no need to update "before" fields
-!!
-!!    Apart from creating new tra_swp/dyn_swp routines, this however:
-!!    (i) makes boundary conditions at initialization time computed from updated fields which is not the case between
-!!    two restarts => restartability issue. One can circumvent this, maybe, by assuming "interface separation",
-!!    e.g. a shift of the feedback interface inside child domain.
-!!    (ii) requires that all restart outputs of updated variables by agrif (e.g. passive tracers/tke/barotropic arrays) are done at the same
-!!    place.
-!!
-!!jc2: dynnxt must be the latest call. e3t(:,:,:,Nbb) are indeed updated in that routine
-                         CALL tra_atf       ( kstp, Nbb, Nnn, Naa, ts )                      ! time filtering of "now" tracer arrays
-                         CALL dyn_atf       ( kstp, Nbb, Nnn, Naa, uu, vv, e3t, e3u, e3v  )  ! time filtering of "now" velocities and scale factors
-                         CALL ssh_atf       ( kstp, Nbb, Nnn, Naa, ssh )                     ! time filtering of "now" sea surface height
-      !
-      ! Swap time levels
-      Nrhs = Nbb
-      Nbb = Nnn
-      Nnn = Naa
-      Naa = Nrhs
-      !
-      IF(.NOT.ln_linssh) CALL dom_vvl_sf_update( kstp, Nbb, Nnn, Naa )  ! recompute vertical scale factors
-      !
-      IF( ln_diahsb  )   CALL dia_hsb       ( kstp, Nbb, Nnn )  ! - ML - global conservation diagnostics
-
-!!gm : This does not only concern the dynamics ==>>> add a new title
-!!gm2: why ouput restart before AGRIF update?
-!!
-!!jc: That would be better, but see comment above
-!!
-      IF( lrst_oce   )   CALL rst_write    ( kstp, Nbb, Nnn )   ! write output ocean restart file
-      IF( ln_sto_eos )   CALL sto_rst_write( kstp )   ! write restart file for stochastic parameters
-
-#if defined key_agrif
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! AGRIF recursive integration
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-                         Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs      ! agrif_oce module copies of time level indices
-                         CALL Agrif_Integrate_ChildGrids( stp )       ! allows to finish all the Child Grids before updating
-
-#endif
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Control
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-                         CALL stp_ctl      ( kstp, Nnn )
-
-#if defined key_agrif
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! AGRIF update
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( Agrif_NbStepint() == 0 .AND. nstop == 0 )   &
-         &               CALL Agrif_update_all( )                  ! Update all components
-
-#endif
-      IF( ln_diaobs .AND. nstop == 0 )   &
-         &               CALL dia_obs( kstp, Nnn )  ! obs-minus-model (assimilation) diags (after dynamics update)
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! File manipulation at the end of the first time step
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( kstp == nit000 ) THEN                          ! 1st time step only
-                                        CALL iom_close( numror )   ! close input  ocean restart file
-         IF( lrxios )                   CALL iom_context_finalize( cr_ocerst_cxt )
-         IF(lwm)                        CALL FLUSH    ( numond )   ! flush output namelist oce
-         IF(lwm .AND. numoni /= -1 )    CALL FLUSH    ( numoni )   ! flush output namelist ice (if exist)
-      ENDIF
-
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Coupled mode
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( lk_oasis .AND. nstop == 0 )   CALL sbc_cpl_snd( kstp, Nbb, Nnn )     ! coupled mode : field exchanges
-      !
-#if defined key_xios
-      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-      ! Finalize contextes if end of simulation or error detected
-      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      IF( kstp == nitend .OR. nstop > 0 ) THEN
-                      CALL iom_context_finalize(      cxios_context          ) ! needed for XIOS+AGRIF
-         IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) !
-      ENDIF
-#endif
-      !
-      IF( l_1st_euler ) THEN         ! recover Leap-frog timestep
-         rDt   = 2._wp * rn_Dt
-         r1_Dt = 1._wp / rDt
-         l_1st_euler = .FALSE.
-      ENDIF
-      !
-      IF( ln_timing )   CALL timing_stop('stp')
-      !
-   END SUBROUTINE stp
-   !
-#endif
-   !!======================================================================
-END MODULE step
diff --git a/src/OCE/step_oce.F90 b/src/OCE/step_oce.F90
index 38dda2a2..36d6d6ba 100644
--- a/src/OCE/step_oce.F90
+++ b/src/OCE/step_oce.F90
@@ -32,8 +32,6 @@ MODULE step_oce
    USE sshwzv          ! vertical velocity and ssh        (ssh_nxt routine)
    !                                                      (ssh_swp routine)
    !                                                      (wzv     routine)
-   USE domvvl          ! variable vertical scale factors  (dom_vvl_sf_nxt routine)
-   !                                                      (dom_vvl_sf_swp routine)
    
    USE divhor          ! horizontal divergence            (div_hor routine)
    USE dynadv          ! advection                        (dyn_adv routine)
@@ -42,7 +40,7 @@ MODULE step_oce
    USE dynldf          ! lateral momentum diffusion       (dyn_ldf routine)
    USE dynzdf          ! vertical diffusion               (dyn_zdf routine)
    USE dynspg          ! surface pressure gradient        (dyn_spg routine)
-   USE dynatf          ! time-filtering                   (dyn_atf routine)
+   USE dynatf_qco          ! time-filtering                   (dyn_atf routine)
    USE dyndmp          ! current damping                  (dyn_dmp routine)
 
    USE traqsr          ! solar radiation penetration      (tra_qsr routine)
@@ -54,7 +52,7 @@ MODULE step_oce
    USE traadv          ! advection scheme control     (tra_adv_ctl routine)
    USE traldf          ! lateral mixing                   (tra_ldf routine)
    USE trazdf          ! vertical mixing                  (tra_zdf routine)
-   USE traatf          ! time filtering                   (tra_atf routine)
+   USE traatf_qco          ! time filtering                   (tra_atf routine)
    USE tranpc          ! non-penetrative convection       (tra_npc routine)
 
    USE eosbn2          ! equation of state                (eos_bn2 routine)
@@ -75,8 +73,6 @@ MODULE step_oce
    USE diu_layers      ! diurnal SST bulk and coolskin routines
    USE sbc_oce         ! surface fluxes  
    
-   USE zpshde          ! partial step: hor. derivative     (zps_hde routine)
-
    USE diawri          ! Standard run outputs             (dia_wri routine)
    USE diaptr          ! poleward transports              (dia_ptr routine)
    USE diadct          ! sections transports              (dia_dct routine)
diff --git a/src/OCE/stp2d.F90 b/src/OCE/stp2d.F90
index 96170dc2..4c6b814e 100644
--- a/src/OCE/stp2d.F90
+++ b/src/OCE/stp2d.F90
@@ -137,8 +137,15 @@ CONTAINS
       CALL dyn_hpg( kt  , Kbb     , uu, vv, Krhs )           ! horizontal gradient of Hydrostatic pressure
       !
       !                             !*  vertical averaging  *!
+#if defined key_vco_1d
+      DO_2D( 0, 0, 0, 0 )
+         Ue_rhs(ji,jj) = SUM( e3u_0(ji,jj,:) * uu(ji,jj,:,Krhs) * umask(ji,jj,:) ) * r1_hu_0(ji,jj)
+         Ve_rhs(ji,jj) = SUM( e3v_0(ji,jj,:) * vv(ji,jj,:,Krhs) * vmask(ji,jj,:) ) * r1_hv_0(ji,jj)
+      END_2D
+#else
       Ue_rhs(:,:) = SUM( e3u_0(:,:,:) * uu(:,:,:,Krhs) * umask(:,:,:), DIM=3 ) * r1_hu_0(:,:)
       Ve_rhs(:,:) = SUM( e3v_0(:,:,:) * vv(:,:,:,Krhs) * vmask(:,:,:), DIM=3 ) * r1_hv_0(:,:)
+#endif
 
       !                       !===========================!
       !                       !==  external 2D forcing  ==!
@@ -151,14 +158,14 @@ CONTAINS
       !                             !* wind forcing *!
       IF( ln_bt_fw ) THEN
          DO_2D( 0, 0, 0, 0 )
-            Ue_rhs(ji,jj) =  Ue_rhs(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kbb)
-            Ve_rhs(ji,jj) =  Ve_rhs(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kbb)
+            Ue_rhs(ji,jj) =  Ue_rhs(ji,jj) + r1_rho0 * utauU(ji,jj) * r1_hu(ji,jj,Kbb)
+            Ve_rhs(ji,jj) =  Ve_rhs(ji,jj) + r1_rho0 * vtauV(ji,jj) * r1_hv(ji,jj,Kbb)
          END_2D
       ELSE
          zztmp = r1_rho0 * r1_2
          DO_2D( 0, 0, 0, 0 )
-            Ue_rhs(ji,jj) =  Ue_rhs(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kbb)
-            Ve_rhs(ji,jj) =  Ve_rhs(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kbb)
+            Ue_rhs(ji,jj) =  Ue_rhs(ji,jj) + zztmp * ( utau_b(ji,jj) + utauU(ji,jj) ) * r1_hu(ji,jj,Kbb)
+            Ve_rhs(ji,jj) =  Ve_rhs(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtauV(ji,jj) ) * r1_hv(ji,jj,Kbb)
          END_2D
       ENDIF
       !
@@ -172,10 +179,10 @@ CONTAINS
          ELSE                                         ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW)
             zztmp = grav * r1_2
             DO_2D( 0, 0, 0, 0 )
-               Ue_rhs(ji,jj) = Ue_rhs(ji,jj) + zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)  &
-                    &                                   + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj)
-               Ve_rhs(ji,jj) = Ve_rhs(ji,jj) + zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)  &
-                    &                                   + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj)
+               Ue_rhs(ji,jj) = Ue_rhs(ji,jj) + zztmp * (  ( ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) )   &   ! add () for NP repro
+                    &                                   + ( ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj) ) ) * r1_e1u(ji,jj)
+               Ve_rhs(ji,jj) = Ve_rhs(ji,jj) + zztmp * (  ( ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) )   &   ! add () for NP repro
+                    &                                   + ( ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj) ) ) * r1_e2v(ji,jj)
             END_2D
          ENDIF
       ENDIF
diff --git a/src/OCE/stpctl.F90 b/src/OCE/stpctl.F90
index 96358bf9..b8cc8aaa 100644
--- a/src/OCE/stpctl.F90
+++ b/src/OCE/stpctl.F90
@@ -231,7 +231,7 @@ CONTAINS
             iloc(1:3,3) = MINLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             iloc(1:3,4) = MAXLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/src/OCE/stpmlf.F90 b/src/OCE/stpmlf.F90
index 32eb6c8d..04667fa6 100644
--- a/src/OCE/stpmlf.F90
+++ b/src/OCE/stpmlf.F90
@@ -93,7 +93,6 @@ CONTAINS
       !!              -8- Outputs and diagnostics
       !!----------------------------------------------------------------------
       INTEGER ::   ji, jj, jk, jn, jtile   ! dummy loop indice
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)       ::   zgdept
       !! ---------------------------------------------------------------------
 #if defined key_agrif
       IF( nstop > 0 ) RETURN   ! avoid to go further if an error was detected during previous time step (child grid)
@@ -164,6 +163,8 @@ CONTAINS
       IF( ln_bdy     )   CALL bdy_dta ( kstp, Nnn )                   ! update dynamic & tracer data at open boundaries
       IF( ln_isf     )   CALL isf_stp ( kstp, Nnn )
                          CALL sbc     ( kstp, Nbb, Nnn )              ! Sea Boundary Condition (including sea-ice)
+!!$      IF( ln_isf     )   CALL isf_stp ( kstp, Nnn )
+                         !clem: problem with isf and cpl: sbcfwb needs isf but isf needs fwf from sbccpl
 
       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ! Update stochastic parameters and random T/S fluctuations
@@ -190,21 +191,12 @@ CONTAINS
 
       !  LATERAL  PHYSICS
       !
-      IF( ln_zps .OR. l_ldfslp ) CALL eos( ts(:,:,:,:,Nbb), rhd, gdept_0(:,:,:) )               ! before in situ density
-
-      IF( ln_zps .AND. .NOT. ln_isfcav)                                    &
-            &            CALL zps_hde    ( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv,  &  ! Partial steps: before horizontal gradient
-            &                                          rhd, gru , grv    )       ! of t, s, rd at the last ocean level
-
-      IF( ln_zps .AND.       ln_isfcav)                                                &
-            &            CALL zps_hde_isf( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, gtui, gtvi,  &  ! Partial steps for top cell (ISF)
-            &                                          rhd, gru , grv , grui, grvi   )       ! of t, s, rd at the first ocean level
-
       IF( l_ldfslp ) THEN                             ! slope of lateral mixing
          IF( ln_traldf_triad ) THEN
                          CALL ldf_slp_triad( kstp, Nbb, Nnn )             ! before slope for triad operator
          ELSE
-                         CALL ldf_slp     ( kstp, rhd, rn2b, Nbb, Nnn )   ! before slope for standard operator
+                         CALL eos ( ts, Nbb, rhd )                        ! before in situ density
+                         CALL ldf_slp( kstp, rhd, rn2b, Nbb, Nnn )        ! before slope for standard operator
          ENDIF
       ENDIF
       !                                                                        ! eddy diffusivity coeff.
@@ -214,7 +206,7 @@ CONTAINS
       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       !  Ocean dynamics : hdiv, ssh, e3, u, v, w
       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-      
+
                          CALL ssh_nxt    ( kstp, Nbb, Nnn, ssh,  Naa )   ! after ssh (includes call to div_hor)
       IF( .NOT.lk_linssh ) THEN
                          CALL dom_qco_r3c( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa)           )   ! "after" ssh/h_0 ratio at t,u,v pts
@@ -223,12 +215,7 @@ CONTAINS
       ENDIF
                          CALL wzv        ( kstp, Nbb, Nnn, Naa, ww  )    ! Nnn cross-level velocity
       IF( ln_zad_Aimp )  CALL wAimp      ( kstp,      Nnn           )    ! Adaptive-implicit vertical advection partitioning
-                         ALLOCATE( zgdept(jpi,jpj,jpk) )
-                         DO jk = 1, jpk
-                            zgdept(:,:,jk) = gdept(:,:,jk,Nnn)
-                         END DO
-                         CALL eos        ( ts(:,:,:,:,Nnn), rhd, rhop, zgdept ) ! now in situ density for hpg computation
-                         DEALLOCATE( zgdept )
+                         CALL eos        ( ts, Nnn, rhd, rhop )          ! now in situ density for hpg computation
 
                          uu(:,:,:,Nrhs) = 0._wp            ! set dynamics trends to zero
                          vv(:,:,:,Nrhs) = 0._wp
@@ -554,8 +541,8 @@ CONTAINS
       CALL lbc_lnk( 'finalize_lbc', puu(:,:,:,       Kaa), 'U', -1., pvv(:,:,:       ,Kaa), 'V', -1.   &
                        &          , pts(:,:,:,jp_tem,Kaa), 'T',  1., pts(:,:,:,jp_sal,Kaa), 'T',  1. )
       !
-      ! lbc_lnk needed for zdf_sh2 when using nn_hls = 2, moved here to allow tiling in zdf_phy
-      IF( nn_hls == 2 .AND. l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp )
+      ! lbc_lnk needed for zdf_sh2, moved here to allow tiling in zdf_phy
+      IF( l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp )
 
       ! dom_qco_r3c defines over [nn_hls, nn_hls-1, nn_hls, nn_hls-1]
       IF( nn_hls == 2 .AND. .NOT. lk_linssh ) THEN
diff --git a/src/OCE/stprk3.F90 b/src/OCE/stprk3.F90
index 337b55f6..e535e9e9 100644
--- a/src/OCE/stprk3.F90
+++ b/src/OCE/stprk3.F90
@@ -127,6 +127,8 @@ CONTAINS
       IF( ln_bdy     )   CALL bdy_dta    ( kstp, Nbb )                     ! update dynamic & tracer data at open boundaries
       IF( ln_isf     )   CALL isf_stp    ( kstp, Nbb )                     ! update iceshelf geometry
                          CALL sbc        ( kstp, Nbb, Nbb )                ! Sea Boundary Condition (including sea-ice)
+!!$      IF( ln_isf     )   CALL isf_stp    ( kstp, Nbb )                     ! update iceshelf geometry
+                         !clem: problem with isf and cpl: sbcfwb needs isf but isf needs fwf from sbccpl
 
       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ! Update stochastic parameters and random T/S fluctuations
@@ -157,21 +159,12 @@ CONTAINS
 !!gm gdep
       !  LATERAL  PHYSICS
       !
-      IF( ln_zps .OR. l_ldfslp ) CALL eos( ts(:,:,:,:,Nbb), rhd, gdept_0(:,:,:) )               ! before in situ density
-
-      IF( ln_zps .AND. .NOT. ln_isfcav)                                    &
-            &            CALL zps_hde    ( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv,  &  ! Partial steps: before horizontal gradient
-            &                                          rhd, gru , grv    )       ! of t, s, rd at the last ocean level
-
-      IF( ln_zps .AND.       ln_isfcav)                                                &
-            &            CALL zps_hde_isf( kstp, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, gtui, gtvi,  &  ! Partial steps for top cell (ISF)
-            &                                          rhd, gru , grv , grui, grvi   )       ! of t, s, rd at the first ocean level
-
       IF( l_ldfslp ) THEN                             ! slope of lateral mixing
          IF( ln_traldf_triad ) THEN
-                         CALL ldf_slp_triad( kstp, Nbb, Nbb )             ! before slope for triad operator
+                         CALL ldf_slp_triad( kstp, Nbb, Nbb )        ! before slope for triad operator
          ELSE
-                         CALL ldf_slp     ( kstp, rhd, rn2b, Nbb, Nbb )   ! before slope for standard operator
+                         CALL eos ( ts, Nbb, rhd )                   ! before in situ density
+                         CALL ldf_slp( kstp, rhd, rn2b, Nbb, Nbb )   ! before slope for standard operator
          ENDIF
       ENDIF
       !                                                                        ! eddy diffusivity coeff.
diff --git a/src/OCE/stprk3_stg.F90 b/src/OCE/stprk3_stg.F90
index e413a253..63395d5c 100644
--- a/src/OCE/stprk3_stg.F90
+++ b/src/OCE/stprk3_stg.F90
@@ -317,7 +317,7 @@ CONTAINS
          ts(:,:,:,jn,Krhs) = 0._wp                                   ! set tracer trends to zero (:,:,:) needed otherwise it does not work (?)
       END DO
 
-      CALL eos( ts(:,:,:,:,Kmm), rhd, rhop, gdept_0 ) ! now in potential density for tra_mle computation
+      CALL eos( ts, Kmm, rhd, rhop ) ! now in potential density for tra_mle computation
 !===>>> CAUTION here may be without GM velocity but stokes drift required ! 0 barotropic divergence for GM  != 0 barotropic divergence for SD 
 !!st consistence 2D / 3D - flux de masse 
       CALL tra_adv( kstp, Kbb, Kmm, Kaa, ts, Krhs, zaU, zaV, ww )       ! hor. + vert. advection	==> RHS
@@ -428,14 +428,15 @@ CONTAINS
       END SELECT      
       !                                         !==  correction of the barotropic (all stages)  ==!    at Kaa = N+1/3, N+1/2 or N+1
       !                                                           ! barotropic velocity correction
-      zub(A2D(0)) = uu_b(A2D(0),Kaa) - SUM( e3u_0(A2D(0),:)*uu(A2D(0),:,Kaa), 3 ) * r1_hu_0(A2D(0))
-      zvb(A2D(0)) = vv_b(A2D(0),Kaa) - SUM( e3v_0(A2D(0),:)*vv(A2D(0),:,Kaa), 3 ) * r1_hv_0(A2D(0))
+      DO_2D( 0, 0, 0, 0 )
+         zub(ji,jj) = uu_b(ji,jj,Kaa) - SUM( e3u_0(ji,jj,:)*uu(ji,jj,:,Kaa) ) * r1_hu_0(ji,jj)
+         zvb(ji,jj) = vv_b(ji,jj,Kaa) - SUM( e3v_0(ji,jj,:)*vv(ji,jj,:,Kaa) ) * r1_hv_0(ji,jj)
+      END_2D
       !
       DO jk = 1, jpkm1                                            ! corrected horizontal velocity
-         uu(A2D(0),jk,Kaa) = uu(A2D(0),jk,Kaa) + zub(A2D(0))*umask(A2D(0),jk)
-         vv(A2D(0),jk,Kaa) = vv(A2D(0),jk,Kaa) + zvb(A2D(0))*vmask(A2D(0),jk)
+         uu(T2D(0),jk,Kaa) = uu(T2D(0),jk,Kaa) + zub(T2D(0))*umask(T2D(0),jk)
+         vv(T2D(0),jk,Kaa) = vv(T2D(0),jk,Kaa) + zvb(T2D(0))*vmask(T2D(0),jk)
       END DO
-         
 
       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ! Set boundary conditions
diff --git a/src/OCE/trc_oce.F90 b/src/OCE/trc_oce.F90
index f7b8309e..28a2f7fc 100644
--- a/src/OCE/trc_oce.F90
+++ b/src/OCE/trc_oce.F90
@@ -43,6 +43,9 @@ MODULE trc_oce
    !!----------------------------------------------------------------------
    LOGICAL, PUBLIC, PARAMETER ::   lk_top     = .FALSE.   !: TOP model
 #endif
+
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: trc_oce.F90 13286 2020-07-09 15:48:29Z smasson $ 
@@ -54,7 +57,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                  ***  trc_oce_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( etot3(jpi,jpj,jpk), oce_co2(jpi,jpj), qsr_mean(jpi,jpj), STAT=trc_oce_alloc )
+      ALLOCATE( etot3(A2D(0),jpk), oce_co2(A2D(0)), qsr_mean(A2D(0)), STAT=trc_oce_alloc )
 
       IF( trc_oce_alloc /= 0 )   CALL ctl_warn('trc_oce_alloc: failed to allocate etot3 array')
       !
@@ -247,7 +250,11 @@ CONTAINS
       pjl = jpkm1
       DO jk = jpkm1, 1, -1
          IF(SUM(tmask(:,:,jk)) > 0 ) THEN
-            zem = MAXVAL( gdepw_0(:,:,jk+1) * tmask(:,:,jk) )
+#if defined key_vco_3d
+            zem = MAXVAL( gdepw_3d(:,:,jk+1) * tmask(:,:,jk) )
+#else
+            zem = MAXVAL( gdepw_1d(jk+1) * tmask(:,:,jk) )
+#endif
             IF( zem >= zhext )   pjl = jk                       ! last T-level reached by Qsr
          ELSE
             pjl = jk                                            ! or regional sea-bed depth 
diff --git a/src/OFF/dtadyn.F90 b/src/OFF/dtadyn.F90
index 3a68e312..aed7dfb5 100644
--- a/src/OFF/dtadyn.F90
+++ b/src/OFF/dtadyn.F90
@@ -24,8 +24,6 @@ MODULE dtadyn
    USE dom_oce         ! ocean domain: variables
 #if defined key_qco 
    USE domqco          ! variable volume
-#elif ! defined key_linssh
-   USE domvvl
 #endif
    USE zdf_oce         ! ocean vertical physics: variables
    USE sbc_oce         ! surface module: variables
@@ -38,7 +36,6 @@ MODULE dtadyn
    USE zdfmxl          ! vertical physics: mixed layer depth
    USE eosbn2          ! equation of state - Brunt Vaisala frequency
    USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
-   USE zpshde          ! z-coord. with partial steps: horizontal derivatives
    USE in_out_manager  ! I/O manager
    USE iom             ! I/O library
    USE lib_mpp         ! distributed memory computing library
@@ -80,7 +77,7 @@ MODULE dtadyn
    INTEGER  , SAVE      ::   jf_wnd         ! index of wind speed
    INTEGER  , SAVE      ::   jf_ice         ! index of sea ice cover
    INTEGER  , SAVE      ::   jf_rnf         ! index of river runoff
-   INTEGER  , SAVE      ::   jf_fmf         ! index of downward salt flux
+   INTEGER  , SAVE      ::   jf_fwf         ! index of downward freshwater flux
    INTEGER  , SAVE      ::   jf_ubl         ! index of u-bbl coef
    INTEGER  , SAVE      ::   jf_vbl         ! index of v-bbl coef
    INTEGER  , SAVE      ::   jf_div         ! index of e3t
@@ -136,15 +133,15 @@ CONTAINS
       !
       IF( l_ldfslp .AND. .NOT.ln_c1d )   CALL  dta_dyn_slp( kt, Kbb, Kmm )    ! Computation of slopes
       !
-      ts(:,:,:,jp_tem,Kmm) = sf_dyn(jf_tem)%fnow(:,:,:)  * tmask(:,:,:)    ! temperature
-      ts(:,:,:,jp_sal,Kmm) = sf_dyn(jf_sal)%fnow(:,:,:)  * tmask(:,:,:)    ! salinity
-      wndm(:,:)            = sf_dyn(jf_wnd)%fnow(:,:,1)  * tmask(:,:,1)    ! wind speed - needed for gas exchange
-      fmmflx(:,:)          = sf_dyn(jf_fmf)%fnow(:,:,1)  * tmask(:,:,1)    ! downward salt flux (v3.5+)
-      fr_i(:,:)            = sf_dyn(jf_ice)%fnow(:,:,1)  * tmask(:,:,1)    ! Sea-ice fraction
-      qsr (:,:)            = sf_dyn(jf_qsr)%fnow(:,:,1)  * tmask(:,:,1)    ! solar radiation
-      emp (:,:)            = sf_dyn(jf_emp)%fnow(:,:,1)  * tmask(:,:,1)    ! E-P
+      ts(:,:,:,jp_tem,Kmm) =   sf_dyn(jf_tem)%fnow(:,:,:) * tmask (:,:,:)  ! temperature
+      ts(:,:,:,jp_sal,Kmm) =   sf_dyn(jf_sal)%fnow(:,:,:) * tmask (:,:,:)  ! salinity
+      wndm(:,:)            =   sf_dyn(jf_wnd)%fnow(:,:,1) * smask0(:,:)    ! wind speed - needed for gas exchange
+      fwfice(:,:)          = - sf_dyn(jf_fwf)%fnow(:,:,1) * smask0(:,:)    ! ice-ocean freshwater flux (>0 to the ocean)
+      fr_i(:,:)            =   sf_dyn(jf_ice)%fnow(:,:,1) * tmask (:,:,1)  ! Sea-ice fraction
+      qsr (:,:)            =   sf_dyn(jf_qsr)%fnow(:,:,1) * smask0(:,:)    ! solar radiation
+      emp (:,:)            =   sf_dyn(jf_emp)%fnow(:,:,1) * tmask (:,:,1)  ! E-P
       IF( ln_dynrnf ) THEN 
-         rnf (:,:)         = sf_dyn(jf_rnf)%fnow(:,:,1) * tmask(:,:,1)    ! E-P
+         rnf (:,:)         = sf_dyn(jf_rnf)%fnow(:,:,1) * tmask (:,:,1)  ! rnf
          IF( ln_dynrnf_depth .AND. .NOT. ln_linssh )    CALL  dta_dyn_rnf( Kmm )
       ENDIF
       !
@@ -160,8 +157,8 @@ CONTAINS
 #if defined key_qco
          CALL dta_dyn_ssh( kt, zhdivtr, ssh(:,:,Kbb), zemp, ssh(:,:,Kaa) )
          CALL dom_qco_r3c( ssh(:,:,Kaa), r3t(:,:,Kaa), r3u(:,:,Kaa), r3v(:,:,Kaa) )
-#else
-         CALL dta_dyn_ssh( kt, zhdivtr, ssh(:,:,Kbb), zemp, ssh(:,:,Kaa), e3t(:,:,:,Kaa) )  !=  ssh, vertical scale factor
+#elif defined key_linssh
+         CALL dta_dyn_ssh( kt, zhdivtr, ssh(:,:,Kbb), zemp, ssh(:,:,Kaa) )
 #endif
          DEALLOCATE( zemp , zhdivtr )
          !                                           Write in the tracer restart file
@@ -175,16 +172,19 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      CALL eos    ( ts(:,:,:,:,Kmm), rhd, gdept_0(:,:,:) ) ! In any case, we need rhd
+      CALL eos    ( ts(:,:,:,:,:), Kmm, rhd ) ! In any case, we need rhd
+!!st      CALL eos    ( ts(:,:,:,:,Kmm), rhd, gdept_0(:,:,:) ) ! In any case, we need rhd
       CALL eos_rab( ts(:,:,:,:,Kmm), rab_n, Kmm )       ! now    local thermal/haline expension ratio at T-points
       CALL bn2    ( ts(:,:,:,:,Kmm), rab_n, rn2, Kmm )  ! before Brunt-Vaisala frequency need for zdfmxl
 
       rn2b(:,:,:) = rn2(:,:,:)         ! needed for zdfmxl
       CALL zdf_mxl( kt, Kmm )          ! In any case, we need mxl
       !
-      hmld(:,:)       = sf_dyn(jf_mld)%fnow(:,:,1) * tmask(:,:,1)    ! mixed layer depht
-      avt(:,:,:)      = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:)    ! vertical diffusive coefficient 
-      avs(:,:,:)      = avt(:,:,:)
+      hmld(:,:)       = sf_dyn(jf_mld)%fnow(:,:,1) * smask0(:,:)   ! mixed layer depht
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         avt(ji,jj,jk) = sf_dyn(jf_avt)%fnow(ji,jj,jk) * tmask(ji,jj,jk)    ! vertical diffusive coefficient
+         avs(ji,jj,jk) = avt(ji,jj,jk)
+      END_3D
       !
       IF( ln_trabbl .AND. .NOT.ln_c1d ) THEN       ! diffusive Bottom boundary layer param 
          ahu_bbl(:,:) = sf_dyn(jf_ubl)%fnow(:,:,1) * umask(:,:,1)    ! bbl diffusive coef
@@ -192,7 +192,8 @@ CONTAINS
       ENDIF
       !
       !
-      CALL eos( ts(:,:,:,:,Kmm), rhd, gdept_0(:,:,:) ) ! In any case, we need rhd
+      CALL eos    ( ts(:,:,:,:,:), Kmm, rhd ) ! In any case, we need rhd
+!!st      CALL eos( ts(:,:,:,:,Kmm), rhd, gdept_0(:,:,:) ) ! In any case, we need rhd
       !
       IF(sn_cfctl%l_prtctl) THEN                 ! print control
          CALL prt_ctl(tab3d_1=ts(:,:,:,jp_tem,Kmm), clinfo1=' tn      - : ', mask1=tmask )
@@ -224,20 +225,20 @@ CONTAINS
       INTEGER  :: jfld                               ! dummy loop arguments
       INTEGER  :: inum, idv, idimv                   ! local integer
       INTEGER  :: ios                                ! Local integer output status for namelist read
-      INTEGER  :: ji, jj, jk
+      INTEGER  :: ji, jj, jk, ipk
       !!
       CHARACTER(len=100)            ::  cn_dir        !   Root directory for location of core files
       TYPE(FLD_N), DIMENSION(jpfld) ::  slf_d         ! array of namelist informations on the fields to read
       TYPE(FLD_N) :: sn_uwd, sn_vwd, sn_wwd, sn_empb, sn_emp  ! informations about the fields to be read
       TYPE(FLD_N) :: sn_tem , sn_sal , sn_avt   !   "                 "
-      TYPE(FLD_N) :: sn_mld, sn_qsr, sn_wnd , sn_ice , sn_fmf   !   "               "
+      TYPE(FLD_N) :: sn_mld, sn_qsr, sn_wnd , sn_ice , sn_fwf   !   "               "
       TYPE(FLD_N) :: sn_ubl, sn_vbl, sn_rnf    !   "              "
       TYPE(FLD_N) :: sn_div  ! informations about the fields to be read
       !!
       NAMELIST/namdta_dyn/cn_dir, ln_dynrnf, ln_dynrnf_depth, &
          &                sn_uwd, sn_vwd, sn_wwd, sn_emp,               &
          &                sn_avt, sn_tem, sn_sal, sn_mld , sn_qsr ,     &
-         &                sn_wnd, sn_ice, sn_fmf,                       &
+         &                sn_wnd, sn_ice, sn_fwf,                       &
          &                sn_ubl, sn_vbl, sn_rnf,                       &
          &                sn_empb, sn_div 
       !!----------------------------------------------------------------------
@@ -261,13 +262,13 @@ CONTAINS
       ! 
       jf_uwd  = 1     ;   jf_vwd  = 2    ;   jf_wwd = 3    ;   jf_emp = 4    ;   jf_avt = 5
       jf_tem  = 6     ;   jf_sal  = 7    ;   jf_mld = 8    ;   jf_qsr = 9
-      jf_wnd  = 10    ;   jf_ice  = 11   ;   jf_fmf = 12   ;   jfld   = jf_fmf
+      jf_wnd  = 10    ;   jf_ice  = 11   ;   jf_fwf = 12   ;   jfld   = jf_fwf
       !
       slf_d(jf_uwd)  = sn_uwd    ;   slf_d(jf_vwd)  = sn_vwd   ;   slf_d(jf_wwd) = sn_wwd
       slf_d(jf_emp)  = sn_emp    ;   slf_d(jf_avt)  = sn_avt
       slf_d(jf_tem)  = sn_tem    ;   slf_d(jf_sal)  = sn_sal   ;   slf_d(jf_mld) = sn_mld
       slf_d(jf_qsr)  = sn_qsr    ;   slf_d(jf_wnd)  = sn_wnd   ;   slf_d(jf_ice) = sn_ice
-      slf_d(jf_fmf)  = sn_fmf
+      slf_d(jf_fwf)  = sn_fwf
       !
       IF( .NOT.ln_linssh ) THEN
                jf_div  = jfld + 1   ;         jf_empb  = jfld + 2    ;   jfld = jf_empb
@@ -308,12 +309,15 @@ CONTAINS
          idimv = iom_file ( sf_dyn(ifpr)%num )%ndims(idv)                 ! number of dimension for variable sdjf%clvar
          CALL iom_close( sf_dyn(ifpr)%num )                               ! close file if already open
          ierr1=0
-         IF( idimv == 3 ) THEN    ! 2D variable
-                                      ALLOCATE( sf_dyn(ifpr)%fnow(jpi,jpj,1)    , STAT=ierr0 )
-            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(jpi,jpj,1,2)  , STAT=ierr1 )
-         ELSE                     ! 3D variable
-                                      ALLOCATE( sf_dyn(ifpr)%fnow(jpi,jpj,jpk)  , STAT=ierr0 )
-            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(jpi,jpj,jpk,2), STAT=ierr1 )
+         IF( idimv == 3 ) THEN ; ipk = 1     ! 2D variable
+         ELSE                  ; ipk = jpk   ! 3D variable
+         ENDIF
+         IF( ifpr == jf_mld .OR. ifpr == jf_qsr .OR. ifpr == jf_wnd .OR. ifpr == jf_fwf .OR. ifpr == jf_avt ) THEN
+                                      ALLOCATE( sf_dyn(ifpr)%fnow(A2D(0),ipk)   , STAT=ierr0 )
+            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(A2D(0),ipk,2) , STAT=ierr1 )
+         ELSE
+                                      ALLOCATE( sf_dyn(ifpr)%fnow(jpi,jpj,ipk)  , STAT=ierr0 )
+            IF( slf_d(ifpr)%ln_tint ) ALLOCATE( sf_dyn(ifpr)%fdta(jpi,jpj,ipk,2), STAT=ierr1 )
          ENDIF
          IF( ierr0 + ierr1 > 0 ) THEN
             CALL ctl_stop( 'dta_dyn_init : unable to allocate sf_dyn array structure' )   ;   RETURN
@@ -349,14 +353,6 @@ CONTAINS
 #if defined key_qco
         CALL dom_qco_r3c( ssh(:,:,Kbb), r3t(:,:,Kbb), r3u(:,:,Kbb), r3v(:,:,Kbb) )
         CALL dom_qco_r3c( ssh(:,:,Kmm), r3t(:,:,Kmm), r3u(:,:,Kmm), r3v(:,:,Kmm) )
-#else
-        DO jk = 1, jpkm1
-           e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm) * r1_ht_0(:,:) * tmask(:,:,jk) )
-           e3t(:,:,jk,Kbb) = e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kbb) * r1_ht_0(:,:) * tmask(:,:,jk) )
-        ENDDO
-
-        CALL dta_dyn_sf_interp( nit000, Kmm )
-        CALL dta_dyn_sf_interp( nit000, Kbb )
 #endif
 #endif
       ENDIF
@@ -392,47 +388,6 @@ CONTAINS
    END SUBROUTINE dta_dyn_atf
    
    
-#if ! defined key_qco && ! defined key_linssh
-
-   SUBROUTINE dta_dyn_sf_interp( kt, Kmm )
-      !!---------------------------------------------------------------------
-      !!                    ***  ROUTINE dta_dyn_sf_interp  ***
-      !!
-      !! ** Purpose :   Calculate scale factors at U/V/W points and depths
-      !!                given the after e3t field
-      !!---------------------------------------------------------------------
-      INTEGER, INTENT(in) :: kt   ! time step
-      INTEGER, INTENT(in) :: Kmm  ! ocean time level indices
-      !
-      INTEGER             :: ji, jj, jk
-      REAL(wp)            :: zcoef
-      !!---------------------------------------------------------------------
-
-      ! Horizontal scale factor interpolations
-      ! --------------------------------------
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3u(:,:,:,Kmm), 'U' )
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3v(:,:,:,Kmm), 'V' )
-
-      ! Vertical scale factor interpolations
-      ! ------------------------------------
-      CALL dom_vvl_interpol( e3t(:,:,:,Kmm), e3w (:,:,:,Kmm), 'W' )
-
-      ! t- and w- points depth
-      ! ----------------------
-      gdept(:,:,1,Kmm) = 0.5_wp * e3w(:,:,1,Kmm)
-      gdepw(:,:,1,Kmm) = 0.0_wp
-      !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk )
-         zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
-         gdepw(ji,jj,jk,Kmm) = gdepw(ji,jj,jk-1,Kmm) + e3t(ji,jj,jk-1,Kmm)
-         gdept(ji,jj,jk,Kmm) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm) + 0.5 * e3w(ji,jj,jk,Kmm))  &
-            &                + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm) + e3w(ji,jj,jk,Kmm))
-      END_3D
-      !
-   END SUBROUTINE dta_dyn_sf_interp
-
-#endif
-
    SUBROUTINE dta_dyn_ssh( kt, phdivtr, psshb,  pemp, pssha, pe3ta )
       !!----------------------------------------------------------------------
       !!                ***  ROUTINE dta_dyn_wzv  ***
@@ -506,7 +461,7 @@ CONTAINS
          CALL iom_close( inum )                                        ! close file
          !
          nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( h_rnf(ji,jj) > 0._wp ) THEN
                jk = 2
                DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1
@@ -521,15 +476,17 @@ CONTAINS
          END_2D
          !
          ! set the associated depth
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             h_rnf(ji,jj) = 0._wp
             DO jk = 1, nk_rnf(ji,jj)
                h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)
             END DO
          END_2D
       ELSE                                       ! runoffs applied at the surface
-         nk_rnf(:,:) = 1
-         h_rnf (:,:) = e3t(:,:,1,Kmm)
+         DO_2D( 0, 0, 0, 0 )
+            nk_rnf(ji,jj) = 1
+            h_rnf (ji,jj) = e3t(ji,jj,1,Kmm)
+         END_2D
       ENDIF
       nkrnf_max = MAXVAL( nk_rnf(:,:) )
       hrnf_max = MAXVAL( h_rnf(:,:) )
@@ -557,7 +514,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !
       !  update the depth over which runoffs are distributed
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          h_rnf(ji,jj) = 0._wp
          DO jk = 1, nk_rnf(ji,jj)                           ! recalculates h_rnf to be the depth in metres
              h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)   ! to the bottom of the relevant grid box
@@ -576,7 +533,7 @@ CONTAINS
       INTEGER,  INTENT(in) :: kt       ! time step
       INTEGER,  INTENT(in) :: Kbb, Kmm ! ocean time level indices
       !
-      INTEGER  ::   ji, jj     ! dummy loop indices
+      INTEGER  ::   ji, jj, jk ! dummy loop indices
       REAL(wp) ::   ztinta     ! ratio applied to after  records when doing time interpolation
       REAL(wp) ::   ztintb     ! ratio applied to before records when doing time interpolation
       INTEGER  ::   iswap 
@@ -589,8 +546,10 @@ CONTAINS
          IF( kt == nit000 ) THEN
             IF(lwp) WRITE(numout,*) ' Compute new slopes at kt = ', kt
             zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%nbb) * tmask(:,:,:)   ! temperature
-            zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%nbb) * tmask(:,:,:)   ! salinity 
-            avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%nbb) * tmask(:,:,:)   ! vertical diffusive coef.
+            zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%nbb) * tmask(:,:,:)   ! salinity
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               avt(ji,jj,jk)  = sf_dyn(jf_avt)%fdta(ji,jj,jk,sf_dyn(jf_avt)%nbb) * tmask(ji,jj,jk)   ! vertical diffusive coef.
+            END_3D
             CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm )
             uslpdta (:,:,:,1) = zuslp (:,:,:) 
             vslpdta (:,:,:,1) = zvslp (:,:,:) 
@@ -599,7 +558,9 @@ CONTAINS
             !
             zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%naa) * tmask(:,:,:)   ! temperature
             zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%naa) * tmask(:,:,:)   ! salinity 
-            avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%naa) * tmask(:,:,:)   ! vertical diffusive coef.
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               avt(ji,jj,jk)  = sf_dyn(jf_avt)%fdta(ji,jj,jk,sf_dyn(jf_avt)%naa) * tmask(ji,jj,jk)   ! vertical diffusive coef.
+            END_3D
             CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm )
             uslpdta (:,:,:,2) = zuslp (:,:,:) 
             vslpdta (:,:,:,2) = zvslp (:,:,:) 
@@ -618,7 +579,9 @@ CONTAINS
               !
               zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fdta(:,:,:,sf_dyn(jf_tem)%naa) * tmask(:,:,:)   ! temperature
               zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fdta(:,:,:,sf_dyn(jf_sal)%naa) * tmask(:,:,:)   ! salinity 
-              avt(:,:,:)        = sf_dyn(jf_avt)%fdta(:,:,:,sf_dyn(jf_avt)%naa) * tmask(:,:,:)   ! vertical diffusive coef.
+              DO_3D( 0, 0, 0, 0, 1, jpk )
+                 avt(ji,jj,jk)  = sf_dyn(jf_avt)%fdta(ji,jj,jk,sf_dyn(jf_avt)%naa) * tmask(ji,jj,jk)   ! vertical diffusive coef.
+              END_3D
               CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm )
               !
               uslpdta (:,:,:,2) = zuslp (:,:,:) 
@@ -642,7 +605,9 @@ CONTAINS
       ELSE
          zts(:,:,:,jp_tem) = sf_dyn(jf_tem)%fnow(:,:,:) * tmask(:,:,:)   ! temperature
          zts(:,:,:,jp_sal) = sf_dyn(jf_sal)%fnow(:,:,:) * tmask(:,:,:)   ! salinity 
-         avt(:,:,:)        = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:)   ! vertical diffusive coef.
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            avt(ji,jj,jk)  = sf_dyn(jf_avt)%fnow(ji,jj,jk) * tmask(ji,jj,jk)   ! vertical diffusive coef.
+         END_3D
          CALL compute_slopes( kt, zts, zuslp, zvslp, zwslpi, zwslpj, Kbb, Kmm )
          !
          IF( l_ldfslp .AND. .NOT.ln_c1d ) THEN    ! Computes slopes (here avt is used as workspace)
@@ -670,19 +635,17 @@ CONTAINS
       INTEGER ,                              INTENT(in ) :: Kbb, Kmm ! ocean time level indices
       !!---------------------------------------------------------------------
       !
+      INTEGER  ::   ji,jj, jk   ! dummy loop indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdep0
+      !
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         zdep0(ji,jj,jk) = gdept_0(ji,jj,jk)
+      END_3D
       IF( l_ldfslp .AND. .NOT.ln_c1d ) THEN    ! Computes slopes (here avt is used as workspace)
-         CALL eos    ( pts, rhd, gdept_0(:,:,:) )
+         CALL eos    ( pts, rhd, zdep0 )
          CALL eos_rab( pts, rab_n, Kmm )       ! now local thermal/haline expension ratio at T-points
          CALL bn2    ( pts, rab_n, rn2, Kmm  ) ! now    Brunt-Vaisala
 
-      ! Partial steps: before Horizontal DErivative
-      IF( ln_zps  .AND. .NOT. ln_isfcav)                            &
-         &            CALL zps_hde    ( kt, jpts, pts, gtsu, gtsv,  &  ! Partial steps: before horizontal gradient
-         &                                        rhd, gru , grv    )  ! of t, s, rd at the last ocean level
-      IF( ln_zps .AND.        ln_isfcav)                            &
-         &            CALL zps_hde_isf( kt, jpts, pts, gtsu, gtsv, gtui, gtvi, &  ! Partial steps for top cell (ISF)
-         &                                        rhd, gru , grv , grui, grvi )  ! of t, s, rd at the first ocean level
-
          rn2b(:,:,:) = rn2(:,:,:)                ! needed for zdfmxl
          CALL zdf_mxl( kt, Kmm )                 ! mixed layer depth
          CALL ldf_slp( kt, rhd, rn2, Kbb, Kmm )  ! slopes
@@ -716,6 +679,8 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kmm  ! ocean time level index
       !
       !!----------------------------------------------------------------------
+      INTEGER  ::   ji,jj, jk   ! dummy loop indices
+      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdep0
       !
       IF( ln_timing )   CALL timing_start( 'dta_dyn_sed')
       !
@@ -729,7 +694,10 @@ CONTAINS
       ts(:,:,:,jp_tem,Kmm) = sf_dyn(jf_tem)%fnow(:,:,:)  * tmask(:,:,:)    ! temperature
       ts(:,:,:,jp_sal,Kmm) = sf_dyn(jf_sal)%fnow(:,:,:)  * tmask(:,:,:)    ! salinity
       !
-      CALL eos    ( ts(:,:,:,:,Kmm), rhd, gdept_0(:,:,:) ) ! In any case, we need rhd
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         zdep0(ji,jj,jk) = gdept_0(ji,jj,jk)
+      END_3D
+      CALL eos    ( ts(:,:,:,:,Kmm), rhd, zdep0 ) ! In any case, we need rhd
 
       IF(sn_cfctl%l_prtctl) THEN                     ! print control
          CALL prt_ctl(tab3d_1=ts(:,:,:,jp_tem,Kmm), clinfo1=' tn      - : ', mask1=tmask )
diff --git a/src/OFF/nemogcm.F90 b/src/OFF/nemogcm.F90
index 9e83a727..536f3348 100644
--- a/src/OFF/nemogcm.F90
+++ b/src/OFF/nemogcm.F90
@@ -121,6 +121,7 @@ CONTAINS
       CALL iom_init( cxios_context )      ! iom_put initialization (must be done after nemo_init for AGRIF+XIOS+OASIS)
       ! 
       DO WHILE ( istp <= nitend .AND. nstop == 0 )    !==  OFF time-stepping  ==!
+         ncom_stp = istp
          IF( ln_timing ) THEN
             zstptiming = MPI_Wtime()
             IF ( istp == ( nit000 + 1 ) ) elapsed_time = zstptiming
@@ -323,12 +324,6 @@ CONTAINS
       !
       CALL mpp_init
 
-#if defined key_loop_fusion
-      IF( nn_hls == 1 ) THEN
-         CALL ctl_stop( 'STOP', 'nemogcm : Loop fusion can be used only with extra-halo' )
-      ENDIF
-#endif
-
       CALL halo_mng_init()
       ! Now we know the dimensions of the grid and numout has been set: we can allocate arrays
       CALL nemo_alloc()
diff --git a/src/SAS/diawri.F90 b/src/SAS/diawri.F90
index 68c13c0b..8d0c2ece 100644
--- a/src/SAS/diawri.F90
+++ b/src/SAS/diawri.F90
@@ -317,22 +317,22 @@ CONTAINS
 		 !
 		 ENDIF
 !
+         CALL histdef( nid_T, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   &  ! utau
+            &          jpi, jpj, nh_T, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
+         CALL histdef( nid_T, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   &  ! vtau
+            &          jpi, jpj, nh_T, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
 
          CALL histend( nid_T, snc4chunks=snc4set )
 
          !                                                                                      !!! nid_U : 3D
          CALL histdef( nid_U, "ssu_m", "Velocity component in x-direction", "m/s"   ,         &  ! ssu
             &          jpi, jpj, nh_U, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
-         CALL histdef( nid_U, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   &  ! utau
-            &          jpi, jpj, nh_U, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
 
          CALL histend( nid_U, snc4chunks=snc4set )
 
          !                                                                                      !!! nid_V : 3D
          CALL histdef( nid_V, "ssv_m", "Velocity component in y-direction", "m/s",            &  ! ssv_m
             &          jpi, jpj, nh_V, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
-         CALL histdef( nid_V, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   &  ! vtau
-            &          jpi, jpj, nh_V, 1  , 1, 1  , - 99, 32, clop, zsto, zout )
 
          CALL histend( nid_V, snc4chunks=snc4set )
 
@@ -366,6 +366,8 @@ CONTAINS
       CALL histwrite( nid_T, "soshfldo", it, qsr           , ndim_hT, ndex_hT )   ! solar heat flux
       CALL histwrite( nid_T, "soicecov", it, fr_i          , ndim_hT, ndex_hT )   ! ice fraction   
       CALL histwrite( nid_T, "sowindsp", it, wndm          , ndim_hT, ndex_hT )   ! wind speed   
+      CALL histwrite( nid_T, "sozotaux", it, utau          , ndim_hT, ndex_hT )   ! i-wind stress
+      CALL histwrite( nid_T, "sometauy", it, vtau          , ndim_hT, ndex_hT )   ! j-wind stress
 !
       IF( ln_abl ) THEN 
 	     ALLOCATE( zw3d_abl(jpi,jpj,jpka) )
@@ -393,11 +395,9 @@ CONTAINS
 
          ! Write fields on U grid
       CALL histwrite( nid_U, "ssu_m"   , it, ssu_m         , ndim_hU, ndex_hU )   ! i-current speed
-      CALL histwrite( nid_U, "sozotaux", it, utau          , ndim_hU, ndex_hU )   ! i-wind stress
 
          ! Write fields on V grid
       CALL histwrite( nid_V, "ssv_m"   , it, ssv_m         , ndim_hV, ndex_hV )   ! j-current speed
-      CALL histwrite( nid_V, "sometauy", it, vtau          , ndim_hV, ndex_hV )   ! j-wind stress
 
       ! 3. Close all files
       ! ---------------------------------------
diff --git a/src/SAS/nemogcm.F90 b/src/SAS/nemogcm.F90
index ce1716e4..5a531137 100644
--- a/src/SAS/nemogcm.F90
+++ b/src/SAS/nemogcm.F90
@@ -124,6 +124,7 @@ CONTAINS
 #endif
       !
       DO WHILE( istp <= nitend .AND. nstop == 0 )
+         ncom_stp = istp
          CALL stp
          istp = istp + 1
       END DO
@@ -217,7 +218,6 @@ CONTAINS
       IF( lk_oasis ) THEN   ;   cxios_context = 'sas'    ! when coupling SAS to OCE
       ELSE                  ;   cxios_context = 'nemo'   ! 
       ENDIF
-      nn_hls = 1
       !
       l_SAS = .TRUE.   ! used in domain:dom_nam
       !
@@ -350,12 +350,6 @@ CONTAINS
       !                             !-----------------------------------------!
       CALL mpp_init
 
-#if defined key_loop_fusion
-      IF( nn_hls == 1 ) THEN
-         CALL ctl_stop( 'STOP', 'nemogcm : Loop fusion can be used only with extra-halo' )
-      ENDIF
-#endif
-
       CALL halo_mng_init()
       ! Now we know the dimensions of the grid and numout has been set: we can allocate arrays
       CALL nemo_alloc()
@@ -390,6 +384,7 @@ CONTAINS
 
 #if defined key_agrif
       uu(:,:,:,:) = 0.0_wp   ;   vv(:,:,:,:) = 0.0_wp   ;   ts(:,:,:,:,:) = 0.0_wp   ! needed for interp done at initialization phase
+      uu_b(:,:,:) = 0.0_wp   ;   vv_b(:,:,:) = 0.0_wp
 #endif 
       !                                      ! external forcing 
                            CALL sbc_init( Nbb, Nnn, Naa )  ! Forcings : surface module 
diff --git a/src/SAS/sbcssm.F90 b/src/SAS/sbcssm.F90
index bd72a97a..0cef6ea8 100644
--- a/src/SAS/sbcssm.F90
+++ b/src/SAS/sbcssm.F90
@@ -18,7 +18,6 @@ MODULE sbcssm
    USE phycst         ! physical constants
    USE eosbn2         ! equation of state - Brunt Vaisala frequency
    USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
-   USE zpshde         ! z-coord. with partial steps: horizontal derivatives
    USE closea         ! for ln_closea
    USE icb_oce        ! for icebergs
    !
@@ -55,6 +54,7 @@ MODULE sbcssm
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_ssm_3d  ! structure of input fields (file information, fields read)
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_ssm_2d  ! structure of input fields (file information, fields read)
 
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/SAS 4.0 , NEMO Consortium (2018)
    !! $Id: sbcssm.F90 15023 2021-06-18 14:35:25Z gsamson $
diff --git a/src/SAS/stpctl.F90 b/src/SAS/stpctl.F90
index 6de0e1db..7157843f 100644
--- a/src/SAS/stpctl.F90
+++ b/src/SAS/stpctl.F90
@@ -36,6 +36,9 @@ MODULE stpctl
    INTEGER, PARAMETER         ::   jpvar = 3
    INTEGER                    ::   nrunid   ! netcdf file id
    INTEGER, DIMENSION(jpvar)  ::   nvarid   ! netcdf variable id
+
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/SAS 4.0 , NEMO Consortium (2018)
    !! $Id: stpctl.F90 14433 2021-02-11 08:06:49Z smasson $
@@ -77,8 +80,8 @@ CONTAINS
       IF( nstop > 0 .AND. ngrdstop > -1 )   RETURN   !   stpctl was already called by a child grid
       !
       ll_wrtstp  = ( MOD( kt-nit000, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend )
-      ll_colruns = ll_wrtstp .AND. sn_cfctl%l_runstat .AND. jpnij > 1
-      ll_wrtruns = ( ll_colruns .OR. jpnij == 1 ) .AND. lwm
+      ll_colruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. jpnij > 1
+      ll_wrtruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. lwm
       !
       IF( kt == nit000 ) THEN
          !
@@ -132,7 +135,7 @@ CONTAINS
       !
       zmax(1) = MAXVAL(      vt_i (:,:)      , mask = llmsk )                   ! max ice thickness
       zmax(2) = MAXVAL( ABS( u_ice(:,:) )    , mask = llmsk )                   ! max ice velocity (zonal only)
-      zmax(3) = MAXVAL(     -tm_i (:,:) + rt0, mask = llmsk )                   ! min ice temperature (in degC)
+      zmax(3) = MAXVAL(     -tm_i (:,:) + rt0, mask = llmsk(A2D(0)) )           ! min ice temperature (in degC)
       zmax(jpvar+1) = REAL( nstop, wp )                                         ! stop indicator
       !
       !                                   !==               get global extrema             ==!
@@ -172,9 +175,9 @@ CONTAINS
             ! first: close the netcdf file, so we can read it
             IF( lwm .AND. kt /= nitend )   istatus = NF90_CLOSE(nrunid)
             ! get global loc on the min/max
-            CALL mpp_maxloc( 'stpctl',      vt_i(:,:)      , llmsk, zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F 
-            CALL mpp_maxloc( 'stpctl',ABS( u_ice(:,:) )    , llmsk, zzz, iloc(1:2,2) )
-            CALL mpp_minloc( 'stpctl',      tm_i(:,:) - rt0, llmsk, zzz, iloc(1:2,3) )
+            CALL mpp_maxloc( 'stpctl',      vt_i(:,:)      , llmsk        , zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F 
+            CALL mpp_maxloc( 'stpctl',ABS( u_ice(:,:) )    , llmsk        , zzz, iloc(1:2,2) )
+            CALL mpp_minloc( 'stpctl',      tm_i(:,:) - rt0, llmsk(A2D(0)), zzz, iloc(1:2,3) )
             ! find which subdomain has the max.
             iareamin(:) = jpnij+1   ;   iareamax(:) = 0   ;   iareasum(:) = 0
             DO ji = 1, jptst
@@ -187,11 +190,11 @@ CONTAINS
             CALL mpp_sum( "stpctl", iareasum )         ! sum over the global domain
          ELSE                    ! find local min and max locations:
             ! if we are here, this means that the subdomain contains some oce points -> no need to test the mask used in maxloc
-            iloc(1:2,1) = MAXLOC(       vt_i(:,:)      , mask = llmsk )
-            iloc(1:2,2) = MAXLOC( ABS( u_ice(:,:) )    , mask = llmsk )
-            iloc(1:2,3) = MINLOC(       tm_i(:,:) - rt0, mask = llmsk )
+            iloc(1:2,1) = MAXLOC(       vt_i(:,:)      , mask = llmsk         )
+            iloc(1:2,2) = MAXLOC( ABS( u_ice(:,:) )    , mask = llmsk         )
+            iloc(1:2,3) = MINLOC(       tm_i(:,:) - rt0, mask = llmsk(A2D(0)) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
@@ -209,11 +212,11 @@ CONTAINS
          CALL dia_wri_state( Kmm, 'output.abort' )     ! create an output.abort file
          !
          IF( ll_colruns .OR. jpnij == 1 ) THEN   ! all processes synchronized -> use lwp to print in opened ocean.output files
-            IF(lwp) THEN   ;   CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 )
+            IF(lwp) THEN   ;   CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ctmp4, ' ', ctmp6 )
             ELSE           ;   nstop = MAX(1, nstop)   ! make sure nstop > 0 (automatically done when calling ctl_stop)
             ENDIF
          ELSE                                    ! only mpi subdomains with errors are here -> STOP now
-            CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 )
+            CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ctmp4, ' ', ctmp6 )
          ENDIF
          !
       ENDIF
diff --git a/src/SWE/domzgr_substitute.h90 b/src/SWE/domzgr_substitute.h90
index fb57c1cc..79de7ea0 100644
--- a/src/SWE/domzgr_substitute.h90
+++ b/src/SWE/domzgr_substitute.h90
@@ -10,6 +10,38 @@
 !! $Id$
 !! Software governed by the CeCILL license (see ./LICENSE)
 !!----------------------------------------------------------------------
+#if defined key_vco_1d  ||   defined key_vco_1d3d
+#     define  gdept_0(i,j,k)  gdept_1d(k)
+#     define  gdepw_0(i,j,k)  gdepw_1d(k)
+#     define  e3w_0(i,j,k)    e3w_1d(k)
+#     define  e3uw_0(i,j,k)   e3w_1d(k)
+#     define  e3vw_0(i,j,k)   e3w_1d(k)
+# if defined key_vco_1d
+#     define  e3t_0(i,j,k)    e3t_1d(k)
+#     define  e3u_0(i,j,k)    e3t_1d(k)
+#     define  e3v_0(i,j,k)    e3t_1d(k)
+#     define  e3f_0(i,j,k)    e3t_1d(k)
+# elif defined key_vco_1d3d
+#     define  e3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3u_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3v_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3f_0(i,j,k)    e3t_3d(i,j,k)
+# endif
+#elif defined key_vco_3d
+#     define  gdept_0(i,j,k)  gdept_3d(i,j,k)
+#     define  gdepw_0(i,j,k)  gdepw_3d(i,j,k)
+#     define  e3w_0(i,j,k)    e3w_3d(i,j,k)
+#     define  e3uw_0(i,j,k)   e3w_3d(i,j,k)
+#     define  e3vw_0(i,j,k)   e3w_3d(i,j,k)
+!
+#     define  e3t_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3u_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3v_0(i,j,k)    e3t_3d(i,j,k)
+#     define  e3f_0(i,j,k)    e3t_3d(i,j,k)
+#else
+      E-R-R-O-R : key_vco_1d, key_vco_1d3d, or key_vco_3d ABSOLUTELY need to be defined in your cpp_* file !
+#endif
+!
 #if defined key_qco
 #   define  e3t(i,j,k,t)   (e3t_0(i,j,k)*(1._wp+r3t(i,j,t)))
 #   define  e3u(i,j,k,t)   (e3u_0(i,j,k)*(1._wp+r3u(i,j,t)))
@@ -19,13 +51,13 @@
 #   define  e3w(i,j,k,t)   (e3w_0(i,j,k)*(1._wp+r3t(i,j,t)))
 #   define  e3uw(i,j,k,t)  (e3uw_0(i,j,k)*(1._wp+r3u(i,j,t)))
 #   define  e3vw(i,j,k,t)  (e3vw_0(i,j,k)*(1._wp+r3v(i,j,t)))
-#   define  ht(i,j)        (ht_0(i,j)+ssh(i,j,Kmm))
+#   define  ht(i,j,t)      (ht_0(i,j)+ssh(i,j,t))
 #   define  hu(i,j,t)      (hu_0(i,j)*(1._wp+r3u(i,j,t)))
 #   define  hv(i,j,t)      (hv_0(i,j)*(1._wp+r3v(i,j,t)))
 #   define  r1_hu(i,j,t)   (r1_hu_0(i,j)/(1._wp+r3u(i,j,t)))
 #   define  r1_hv(i,j,t)   (r1_hv_0(i,j)/(1._wp+r3v(i,j,t)))
 #   define  gdept(i,j,k,t) (gdept_0(i,j,k)*(1._wp+r3t(i,j,t)))
 #   define  gdepw(i,j,k,t) (gdepw_0(i,j,k)*(1._wp+r3t(i,j,t)))
-#   define  gde3w(i,j,k)   (gdept_0(i,j,k)*(1._wp+r3t(i,j,Kmm))-ssh(i,j,Kmm))
+#   define  gdept_z0(i,j,k,t) (gdept(i,j,k,t)-ssh(i,j,t)) 
 #endif
 !!----------------------------------------------------------------------
diff --git a/src/SWE/nemogcm.F90 b/src/SWE/nemogcm.F90
index 4ab150e6..e943cc2f 100644
--- a/src/SWE/nemogcm.F90
+++ b/src/SWE/nemogcm.F90
@@ -274,11 +274,9 @@ CONTAINS
       !                             !-----------------------------------------!
       CALL mpp_init
 
-#if defined key_loop_fusion
       IF( nn_hls == 1 ) THEN
          CALL ctl_stop( 'STOP', 'nemogcm : Loop fusion can be used only with extra-halo' )
       ENDIF
-#endif
 
       CALL halo_mng_init()
       ! Now we know the dimensions of the grid and numout has been set: we can allocate arrays
diff --git a/src/SWE/stp_oce.F90 b/src/SWE/stp_oce.F90
index 17c05584..adeff53e 100644
--- a/src/SWE/stp_oce.F90
+++ b/src/SWE/stp_oce.F90
@@ -30,10 +30,7 @@ MODULE stp_oce
 
    USE sshwzv          ! vertical velocity and ssh        (ssh_nxt routine)
    !                                                      (ssh_swp routine)
-   !                                                      (wzv     routine)
-   USE domvvl          ! variable vertical scale factors  (dom_vvl_sf_nxt routine)
-   !                                                      (dom_vvl_sf_swp routine)
-   
+ 
    USE divhor          ! horizontal divergence            (div_hor routine)
    USE dynadv          ! advection                        (dyn_adv routine)
    USE dynvor          ! vorticity term                   (dyn_vor routine)
@@ -41,7 +38,7 @@ MODULE stp_oce
    USE dynldf          ! lateral momentum diffusion       (dyn_ldf routine)
    USE dynzdf          ! vertical diffusion               (dyn_zdf routine)
    USE dynspg          ! surface pressure gradient        (dyn_spg routine)
-   USE dynatf          ! time-filtering                   (dyn_atf routine)
+   USE dynatf_qco          ! time-filtering                   (dyn_atf routine)
 
    USE traqsr          ! solar radiation penetration      (tra_qsr routine)
    USE traisf          ! ice shelf                        (tra_isf routine)
@@ -52,7 +49,7 @@ MODULE stp_oce
    USE traadv          ! advection scheme control     (tra_adv_ctl routine)
    USE traldf          ! lateral mixing                   (tra_ldf routine)
    USE trazdf          ! vertical mixing                  (tra_zdf routine)
-   USE traatf          ! time filtering                   (tra_atf routine)
+   USE traatf_qco          ! time filtering                   (tra_atf routine)
    USE tranpc          ! non-penetrative convection       (tra_npc routine)
 
    USE eosbn2          ! equation of state                (eos_bn2 routine)
@@ -72,8 +69,6 @@ MODULE stp_oce
    USE diu_layers      ! diurnal SST bulk and coolskin routines
    USE sbc_oce         ! surface fluxes  
    
-   USE zpshde          ! partial step: hor. derivative     (zps_hde routine)
-
    USE diawri          ! Standard run outputs             (dia_wri routine)
    USE diaptr          ! poleward transports              (dia_ptr routine)
    USE diadct          ! sections transports              (dia_dct routine)
diff --git a/src/SWE/stpctl.F90 b/src/SWE/stpctl.F90
index 74def0ee..633e73c8 100644
--- a/src/SWE/stpctl.F90
+++ b/src/SWE/stpctl.F90
@@ -32,6 +32,9 @@ MODULE stpctl
    INTEGER, PARAMETER         ::   jpvar = 2
    INTEGER                    ::   nrunid   ! netcdf file id
    INTEGER, DIMENSION(jpvar)  ::   nvarid   ! netcdf variable id
+
+   !! * Substitutions
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: stpctl.F90 14143 2020-12-09 21:26:04Z techene $
@@ -75,8 +78,8 @@ CONTAINS
       IF( nstop > 0 .AND. ngrdstop > -1 )   RETURN   !   stpctl was already called by a child grid
       !
       ll_wrtstp  = ( MOD( kt-nit000, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend )
-      ll_colruns = ll_wrtstp .AND. sn_cfctl%l_runstat .AND. jpnij > 1
-      ll_wrtruns = ( ll_colruns .OR. jpnij == 1 ) .AND. lwm
+      ll_colruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. jpnij > 1
+      ll_wrtruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. lwm
       !
       IF( kt == nit000 ) THEN
          !
@@ -185,7 +188,7 @@ CONTAINS
             llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
             iloc(1:3,2) = MAXLOC( ABS(  uu(:,:,:,       Kmm)), mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/src/SWE/stpmlf.F90 b/src/SWE/stpmlf.F90
index 5494248c..4c49e55a 100644
--- a/src/SWE/stpmlf.F90
+++ b/src/SWE/stpmlf.F90
@@ -114,9 +114,9 @@ CONTAINS
          zrhs_u =        - grav * ( ssh(ji+1,jj,Nnn) - ssh(ji,jj,Nnn) ) * r1_e1u(ji,jj)
          zrhs_v =        - grav * ( ssh(ji,jj+1,Nnn) - ssh(ji,jj,Nnn) ) * r1_e2v(ji,jj)
          !                                                              ! wind stress and layer friction
-         zrhs_u = zrhs_u + z1_2rho0 * ( utau_b(ji,jj) + utau(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
+         zrhs_u = zrhs_u + z1_2rho0 * ( utau_b(ji,jj) + utauU(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
             &                                  - rn_rfr * uu(ji,jj,jk,Nbb)
-         zrhs_v = zrhs_v + z1_2rho0 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
+         zrhs_v = zrhs_v + z1_2rho0 * ( vtau_b(ji,jj) + vtauV(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
             &                                  - rn_rfr * vv(ji,jj,jk,Nbb)
          !                                                              ! ==> RHS
          uu(ji,jj,jk,Nrhs) = uu(ji,jj,jk,Nrhs) + zrhs_u
diff --git a/src/SWE/stprk3.F90 b/src/SWE/stprk3.F90
index 0e1a1910..2fded6ae 100644
--- a/src/SWE/stprk3.F90
+++ b/src/SWE/stprk3.F90
@@ -135,9 +135,9 @@ CONTAINS
          zrhs_v =        - grav    * ( ssh(ji,jj+1,Nbb) - ssh(ji,jj,Nbb) ) * r1_e2v(ji,jj)
 #if defined key_RK3all
          !                                          ! wind stress and layer friction
-         zrhs_u = zrhs_u + r1_rho0 * ( z5_6*utau_b(ji,jj) + (1._wp - z5_6)*utau(ji,jj) ) / e3u(ji,jj,jk,Nbb)   &
+         zrhs_u = zrhs_u + r1_rho0 * ( z5_6*utau_b(ji,jj) + (1._wp - z5_6)*utauU(ji,jj) ) / e3u(ji,jj,jk,Nbb)   &
             &            - rn_rfr  * uu(ji,jj,jk,Nbb)
-         zrhs_v = zrhs_v + r1_rho0 * ( z5_6*vtau_b(ji,jj) + (1._wp - z5_6)*vtau(ji,jj) ) / e3v(ji,jj,jk,Nbb)   &
+         zrhs_v = zrhs_v + r1_rho0 * ( z5_6*vtau_b(ji,jj) + (1._wp - z5_6)*vtauV(ji,jj) ) / e3v(ji,jj,jk,Nbb)   &
             &            - rn_rfr  * vv(ji,jj,jk,Nbb)
 #endif
          !                                          ! ==> RHS
@@ -201,9 +201,9 @@ CONTAINS
          zrhs_v =        - grav    * ( ssh(ji,jj+1,Nnn) - ssh(ji,jj,Nnn) ) * r1_e2v(ji,jj)
 #if defined key_RK3all
          !                                          ! wind stress and layer friction
-         zrhs_u = zrhs_u + r1_rho0 * ( z3_4*utau_b(ji,jj) + (1._wp - z3_4)*utau(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
+         zrhs_u = zrhs_u + r1_rho0 * ( z3_4*utau_b(ji,jj) + (1._wp - z3_4)*utauU(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
             &            - rn_rfr  * uu(ji,jj,jk,Nbb)
-         zrhs_v = zrhs_v + r1_rho0 * ( z3_4*vtau_b(ji,jj) + (1._wp - z3_4)*vtau(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
+         zrhs_v = zrhs_v + r1_rho0 * ( z3_4*vtau_b(ji,jj) + (1._wp - z3_4)*vtauV(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
             &            - rn_rfr  * vv(ji,jj,jk,Nbb)
 #endif
          !                                          ! ==> RHS
@@ -265,9 +265,9 @@ CONTAINS
          zrhs_u =        - grav * ( ssh(ji+1,jj,Nnn) - ssh(ji,jj,Nnn) ) * r1_e1u(ji,jj)
          zrhs_v =        - grav * ( ssh(ji,jj+1,Nnn) - ssh(ji,jj,Nnn) ) * r1_e2v(ji,jj)
          !                                          ! wind stress and layer friction
-         zrhs_u = zrhs_u + z1_2rho0 * ( utau_b(ji,jj) + utau(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
+         zrhs_u = zrhs_u + z1_2rho0 * ( utau_b(ji,jj) + utauU(ji,jj) ) / e3u(ji,jj,jk,Nnn)   &
             &            - rn_rfr   * uu(ji,jj,jk,Nbb)
-         zrhs_v = zrhs_v + z1_2rho0 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
+         zrhs_v = zrhs_v + z1_2rho0 * ( vtau_b(ji,jj) + vtauV(ji,jj) ) / e3v(ji,jj,jk,Nnn)   &
             &            - rn_rfr   * vv(ji,jj,jk,Nbb)
          !                                          ! ==> RHS
          uu(ji,jj,jk,Nrhs) = uu(ji,jj,jk,Nrhs) + zrhs_u
diff --git a/src/TOP/AGE/trcsms_age.F90 b/src/TOP/AGE/trcsms_age.F90
index 8e793d23..c862523b 100644
--- a/src/TOP/AGE/trcsms_age.F90
+++ b/src/TOP/AGE/trcsms_age.F90
@@ -46,7 +46,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt              ! ocean time-step index
       INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs  ! ocean time level
-      INTEGER ::   jn, jk   ! dummy loop index
+      INTEGER ::   jk   ! dummy loop index
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('trc_sms_age')
@@ -68,7 +68,7 @@ CONTAINS
          tr(:,:,jk,jp_age,Krhs) = tmask(:,:,jk) * rryear
       END DO
       !
-      IF( l_trdtrc  )   CALL trd_trc( tr(:,:,:,jp_age,Krhs), jn, jptra_sms, kt, Kmm )   ! save trends
+      IF( l_trdtrc  )   CALL trd_trc( tr(:,:,:,jp_age,Krhs), jp_age, jptra_sms, kt, Kmm )   ! save trends
       !
       IF( ln_timing )   CALL timing_stop('trc_sms_age')
       !
diff --git a/src/TOP/AGE/trcwri_age.F90 b/src/TOP/AGE/trcwri_age.F90
index 98b7c686..3df7b3e7 100644
--- a/src/TOP/AGE/trcwri_age.F90
+++ b/src/TOP/AGE/trcwri_age.F90
@@ -28,7 +28,6 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER, INTENT(in)  :: Kmm  ! time level indices
       CHARACTER (len=20)   :: cltra
-      INTEGER              :: jn
       !!---------------------------------------------------------------------
 
       ! write the tracer concentrations in the file
diff --git a/src/TOP/C14/sms_c14.F90 b/src/TOP/C14/sms_c14.F90
index bdea7776..a9971f6a 100644
--- a/src/TOP/C14/sms_c14.F90
+++ b/src/TOP/C14/sms_c14.F90
@@ -51,6 +51,8 @@ MODULE sms_c14
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)     ::   spco2      ! Atmospheric CO2
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)     ::   tyrco2     ! Time (yr) atmospheric CO2 data
 
+         !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
    !! $Id: sms_c14.F90 10071 2018-08-28 14:49:04Z nicolasmartin $ 
@@ -64,9 +66,9 @@ CONTAINS
       !!                  ***  ROUTINE trc_sms_c14_alloc  ***
       !!----------------------------------------------------------------------
       sms_c14_alloc = 0
-      ALLOCATE( exch_c14(jpi,jpj)        ,  exch_co2(jpi,jpj)        ,   &
-         &      qtr_c14(jpi,jpj)         ,  qint_c14(jpi,jpj)        ,   &
-         &      c14sbc(jpi,jpj)          ,  STAT = sms_c14_alloc )
+      ALLOCATE( exch_c14(A2D(0))        ,  exch_co2(A2D(0))        ,   &
+         &      qtr_c14(A2D(0))         ,  qint_c14(A2D(0))        ,   &
+         &      c14sbc(A2D(0))          ,  STAT = sms_c14_alloc )
          !
       !
    END FUNCTION sms_c14_alloc
diff --git a/src/TOP/C14/trcatm_c14.F90 b/src/TOP/C14/trcatm_c14.F90
index 54a76806..d09dcf5d 100644
--- a/src/TOP/C14/trcatm_c14.F90
+++ b/src/TOP/C14/trcatm_c14.F90
@@ -59,6 +59,13 @@ CONTAINS
       !
       tyrc14_now = 0._wp   ! initialize
       !
+      IF( kc14typ == 0) THEN
+         co2sbc=pco2at
+         DO_2D( 0, 0, 0, 0 )
+            c14sbc(ji,jj) = rc14at
+         END_2D
+      ENDIF
+      !
       IF(kc14typ >= 1) THEN  ! Transient atmospheric forcing: CO2
       !
          clfile = TRIM( cfileco2 )
@@ -116,10 +123,10 @@ CONTAINS
        ! Linear  interpolation of the C-14 source fonction
        ! in linear latitude bands  (20N,40N) and (20S,40S)
        !------------------------------------------------------
-            ALLOCATE( fareaz  (jpi,jpj ,nc14zon) , STAT=ierr3 )
+            ALLOCATE( fareaz(A2D(0) ,nc14zon) , STAT=ierr3 )
             IF( ierr3 /= 0 )   CALL ctl_stop( 'STOP', 'trc_atm_c14_ini: unable to allocate fareaz' )
       !
-            DO_2D( 1, 1, 1, 1 )                 ! from C14b package
+            DO_2D( 0, 0, 0, 0 )                 ! from C14b package
               IF( gphit(ji,jj) >= yn40 ) THEN
                  fareaz(ji,jj,1) = 0.
                  fareaz(ji,jj,2) = 0.
@@ -205,9 +212,9 @@ CONTAINS
       !! ** Action  :   atmospheric values interpolated at time-step kt
       !!----------------------------------------------------------------------
       INTEGER                 , INTENT(in   )   ::   kt       ! ocean time-step
-      REAL(wp), DIMENSION(:,:), INTENT(  out)   ::   c14sbc   ! atm c14 ratio
+      REAL(wp), DIMENSION(A2D(0)), INTENT(  out)   ::   c14sbc   ! atm c14 ratio
       REAL(wp),                 INTENT(  out)   ::   co2sbc   ! atm co2 p
-      INTEGER                                   ::   jz       ! dummy loop indice
+      INTEGER                                   ::   ji, jj, jz       ! dummy loop indice
       REAL(wp)                              ::   zdint,zint   ! work
       REAL(wp), DIMENSION(nc14zon)              ::   zonbc14  ! work
       !
@@ -215,10 +222,6 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_start('trc_atm_c14')
       !
-      IF( kc14typ == 0) THEN
-         co2sbc=pco2at
-         c14sbc(:,:)=rc14at
-      ENDIF
       !
       IF(kc14typ >= 1) THEN  ! Transient C14 & CO2
       !
diff --git a/src/TOP/C14/trcsms_c14.F90 b/src/TOP/C14/trcsms_c14.F90
index 9ce0a584..0135dc8c 100644
--- a/src/TOP/C14/trcsms_c14.F90
+++ b/src/TOP/C14/trcsms_c14.F90
@@ -80,7 +80,7 @@ CONTAINS
       !  CO2 solubility (Weiss, 1974; Wanninkhof, 2014) 
       ! -------------------------------------------------------------------
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tmask(ji,jj,1) >  0. ) THEN
             !
             zt   = MIN( 40. , ts(ji,jj,1,jp_tem,Kmm) )
@@ -121,21 +121,21 @@ CONTAINS
       !
       ! Flux of C-14 from air-to-sea; units: (C14/C ratio) x m/s
       !                               already masked
-      qtr_c14(:,:) = exch_c14(:,:) * ( c14sbc(:,:) - tr(:,:,1,jp_c14,Kbb) )
+      DO_2D( 0, 0, 0, 0 )
+         qtr_c14(ji,jj) = exch_c14(ji,jj) * ( c14sbc(ji,jj) - tr(ji,jj,1,jp_c14,Kbb) )
+      END_2D
             
       ! cumulation of air-to-sea flux at each time step
       qint_c14(:,:) = qint_c14(:,:) + qtr_c14(:,:) * rn_Dt
       !
       ! Add the surface flux to the trend of jp_c14
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          tr(ji,jj,1,jp_c14,Krhs) = tr(ji,jj,1,jp_c14,Krhs) + qtr_c14(ji,jj) / e3t(ji,jj,1,Kmm) 
       END_2D
       !
       ! Computation of decay effects on jp_c14
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
-         !
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          tr(ji,jj,jk,jp_c14,Krhs) = tr(ji,jj,jk,jp_c14,Krhs) - rlam14 * tr(ji,jj,jk,jp_c14,Kbb) * tmask(ji,jj,jk) 
-         !
       END_3D
       !
       IF( lrst_trc ) THEN
diff --git a/src/TOP/C14/trcwri_c14.F90 b/src/TOP/C14/trcwri_c14.F90
index 7f3de9f0..7fcda51a 100644
--- a/src/TOP/C14/trcwri_c14.F90
+++ b/src/TOP/C14/trcwri_c14.F90
@@ -38,8 +38,8 @@ CONTAINS
       CHARACTER (len=20)   :: cltra         ! short title for tracer
       INTEGER              :: ji,jj,jk,jn   ! dummy loop indexes
       REAL(wp)             :: zage,zarea,ztemp   ! temporary
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   :: zres, z2d ! temporary storage 2D
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3d , zz3d ! temporary storage 3D
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   :: z2d ! temporary storage 2D
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3d ! temporary storage 3D
       !!---------------------------------------------------------------------
  
       ! write the tracer concentrations in the file
@@ -49,41 +49,35 @@ CONTAINS
 
       ! compute and write the tracer diagnostic in the file
       ! ---------------------------------------
+      IF( iom_use("qtr_c14") ) CALL iom_put( "qtr_c14" , rsiyea * qtr_c14(:,:)  )   !  Radiocarbon surf flux [./m2/yr]
+                               CALL iom_put( "qint_c14", qint_c14(:,:)  )         ! cumulative flux [./m2]
       
       IF( iom_use("DeltaC14") .OR. iom_use("C14Age") .OR. iom_use("RAge")   ) THEN
          !
-         ALLOCATE( z2d(jpi,jpj), zres(jpi,jpj) )
-         ALLOCATE( z3d(jpi,jpj,jpk), zz3d(jpi,jpj,jpk) )
+         ALLOCATE( z2d(A2D(0)), z3d(A2D(0),jpk) )
          !
          zage = -1._wp / rlam14 / rsiyea  ! factor for radioages in year
          z3d(:,:,:)  = 1._wp
-         zz3d(:,:,:) = 0._wp
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             IF( tmask(ji,jj,jk) > 0._wp) THEN
-               z3d (ji,jj,jk) = tr(ji,jj,jk,jp_c14,Kmm)
-               zz3d(ji,jj,jk) = LOG( z3d(ji,jj,jk) )
+               z3d(ji,jj,jk) = tr(ji,jj,jk,jp_c14,Kmm)
             ENDIF
          END_3D
-         zres(:,:) = z3d(:,:,1)
+         CALL iom_put( "C14Age", zage * LOG( z3d(:,:,:) ) )            !  Radiocarbon age [yr]
 
          ! Reservoir age [yr]
-         z2d(:,:) =0._wp
-         jk = 1
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            ztemp = zres(ji,jj) / c14sbc(ji,jj)
-            IF( ztemp > 0._wp .AND. tmask(ji,jj,jk) > 0._wp ) z2d(ji,jj) = LOG( ztemp )
+         z2d(:,:) = 0._wp
+         DO_2D( 0, 0, 0, 0 )
+            ztemp = z3d(ji,jj,1) / c14sbc(ji,jj)
+            IF( ztemp > 0._wp .AND. tmask(ji,jj,1) > 0._wp ) z2d(ji,jj) = LOG( ztemp )
          END_2D
+         CALL iom_put( "RAge" , zage * z2d(:,:) )                     ! Reservoir age [yr]
          !
          z3d(:,:,:) = 1.d03 * ( z3d(:,:,:) - 1._wp )
          CALL iom_put( "DeltaC14" , z3d(:,:,:)  )  ! Delta C14 [permil]
-         CALL iom_put( "C14Age"   , zage * zz3d(:,:,:) )            !  Radiocarbon age [yr]
-
-         CALL iom_put( "qtr_c14", rsiyea * qtr_c14(:,:)  )            !  Radiocarbon surf flux [./m2/yr]
-         CALL iom_put( "qint_c14" , qint_c14  )                       ! cumulative flux [./m2]
-         CALL iom_put( "RAge" , zage * z2d(:,:) )                     ! Reservoir age [yr]
          !
-         DEALLOCATE( z2d, zres, z3d, zz3d )
+         DEALLOCATE( z2d, z3d )
          !
       ENDIF
       !
@@ -91,23 +85,35 @@ CONTAINS
       !
       CALL iom_put( "AtmCO2", co2sbc )  !     global atmospheric CO2 [ppm]
     
-      IF( iom_use("AtmC14") ) THEN
-         zarea = glob_sum( 'trcwri_c14', e1e2t(:,:) )           ! global ocean surface
-         ztemp = glob_sum( 'trcwri_c14', c14sbc(:,:) * e1e2t(:,:) )
-         ztemp = ( ztemp / zarea - 1._wp ) * 1000._wp
-         CALL iom_put( "AtmC14" , ztemp )   ! Global atmospheric DeltaC14 [permil]
-      ENDIF
-      IF( iom_use("K_C14") ) THEN
-         ztemp = glob_sum ( 'trcwri_c14', exch_c14(:,:) * e1e2t(:,:) )
-         ztemp = rsiyea * ztemp / zarea
-         CALL iom_put( "K_C14" , ztemp )   ! global mean exchange velocity for C14/C ratio [m/yr]
-      ENDIF
-      IF( iom_use("K_CO2") ) THEN
+      IF( iom_use("AtmC14") .OR. iom_use("K_C14") .OR. iom_use("K_CO2") ) THEN
          zarea = glob_sum( 'trcwri_c14', e1e2t(:,:) )           ! global ocean surface
-         ztemp = glob_sum ( 'trcwri_c14', exch_co2(:,:) * e1e2t(:,:) )
-         ztemp = 360000._wp * ztemp / zarea       ! cm/h units: directly comparable with literature
-         CALL iom_put( "K_CO2", ztemp )  !  global mean CO2 piston velocity [cm/hr]
-      ENDIF
+         ALLOCATE( z2d(A2D(0)) )
+         IF( iom_use("AtmC14") ) THEN
+            DO_2D( 0, 0, 0, 0 )
+               z2d(ji,jj) = c14sbc(ji,jj) * e1e2t(ji,jj)
+            END_2D
+            ztemp = glob_sum( 'trcwri_c14', z2d(:,:) )
+            ztemp = ( ztemp / zarea - 1._wp ) * 1000._wp
+            CALL iom_put( "AtmC14" , ztemp )   ! Global atmospheric DeltaC14 [permil]
+         ENDIF
+         IF( iom_use("K_C14") ) THEN
+             DO_2D( 0, 0, 0, 0 )
+                z2d(ji,jj) = exch_c14(ji,jj) * e1e2t(ji,jj)
+             END_2D
+             ztemp = glob_sum( 'trcwri_c14', z2d(:,:) )
+             ztemp = rsiyea * ztemp / zarea
+             CALL iom_put( "K_C14" , ztemp )   ! global mean exchange velocity for C14/C ratio [m/yr]
+         ENDIF
+         IF( iom_use("K_CO2") ) THEN
+            DO_2D( 0, 0, 0, 0 )
+               z2d(ji,jj) = exch_co2(ji,jj) * e1e2t(ji,jj)
+            END_2D
+            ztemp = glob_sum( 'trcwri_c14', z2d(:,:) )
+            ztemp = 360000._wp * ztemp / zarea       ! cm/h units: directly comparable with literature
+            CALL iom_put( "K_CO2", ztemp )  !  global mean CO2 piston velocity [cm/hr]
+         ENDIF
+         DEALLOCATE( z2d )
+      END IF
       IF( iom_use("C14Inv") ) THEN
          ztemp = glob_sum( 'trcwri_c14', tr(:,:,:,jp_c14,Kmm) * cvol(:,:,:) )
          ztemp = atomc14 * xdicsur * ztemp
diff --git a/src/TOP/CFC/trcini_cfc.F90 b/src/TOP/CFC/trcini_cfc.F90
index cacfee08..5d759a13 100644
--- a/src/TOP/CFC/trcini_cfc.F90
+++ b/src/TOP/CFC/trcini_cfc.F90
@@ -131,7 +131,7 @@ CONTAINS
       ! Linear interpolation between 2 hemispheric function of latitud between ylats and ylatn
       !---------------------------------------------------------------------------------------
       zyd = ylatn - ylats      
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF(     gphit(ji,jj) >= ylatn ) THEN   ;   xphem(ji,jj) = 1.e0
          ELSEIF( gphit(ji,jj) <= ylats ) THEN   ;   xphem(ji,jj) = 0.e0
          ELSE                                   ;   xphem(ji,jj) = ( gphit(ji,jj) - ylats) / zyd
diff --git a/src/TOP/CFC/trcsms_cfc.F90 b/src/TOP/CFC/trcsms_cfc.F90
index 32e9b63e..e473c088 100644
--- a/src/TOP/CFC/trcsms_cfc.F90
+++ b/src/TOP/CFC/trcsms_cfc.F90
@@ -124,9 +124,9 @@ CONTAINS
                &           +  atm_cfc(iyear_end, jm, jl) * REAL(im2, wp) ) / 12.
          END DO
          
-         !                                                         !------------!
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                   !  i-j loop  !
-            !                                                      !------------!
+         !                                     !------------!
+         DO_2D( 0, 0, 0, 0 )                   !  i-j loop  !
+            !                                  !------------!
             ! space interpolation
             zpp_cfc  =       xphem(ji,jj)   * zpatm(1,jl)   &
                &     + ( 1.- xphem(ji,jj) ) * zpatm(2,jl)
@@ -309,8 +309,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE trc_sms_cfc_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( xphem   (jpi,jpj)        , atm_cfc(jpyear,jphem,jp_cfc)  ,    &
-         &      qtr_cfc (jpi,jpj,jp_cfc) , qint_cfc(jpi,jpj,jp_cfc)      ,    &
+      ALLOCATE( xphem   (A2D(0))        , atm_cfc(jpyear,jphem,jp_cfc)  ,    &
+         &      qtr_cfc (A2D(0),jp_cfc) , qint_cfc(A2D(0),jp_cfc)      ,    &
          &      soa(4,jp_cfc)    ,  sob(3,jp_cfc)   ,  sca(5,jp_cfc)     ,    &
          &      STAT=trc_sms_cfc_alloc )
          !
diff --git a/src/TOP/PISCES/P2Z/p2zbio.F90 b/src/TOP/PISCES/P2Z/p2zbio.F90
index ecbfc9f4..4100534f 100644
--- a/src/TOP/PISCES/P2Z/p2zbio.F90
+++ b/src/TOP/PISCES/P2Z/p2zbio.F90
@@ -104,7 +104,6 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_start('p2z_bio')
       !
-      IF( lk_iomput )   ALLOCATE( zw2d(jpi,jpj,17), zw3d(jpi,jpj,jpk,3) )
 
       IF( kt == nittrc000 ) THEN
          IF(lwp) WRITE(numout,*)
@@ -112,18 +111,18 @@ CONTAINS
          IF(lwp) WRITE(numout,*) ' ~~~~~~~'
       ENDIF
 
-      xksi(:,:) = 0.e0        ! zooplakton closure ( fbod)
       IF( lk_iomput ) THEN
-         zw2d  (:,:,:) = 0._wp
-         zw3d(:,:,:,:) = 0._wp
+         ALLOCATE( zw3d(A2D(0),jpk,3) )   ;   zw3d(:,:,jpk,:) = 0._wp
+         ALLOCATE( zw2d(A2D(0),17) )      ;   zw2d(:,:,:) = 0._wp
       ENDIF
+      !
+      xksi(:,:) = 0.e0        ! zooplakton closure ( fbod)
 
       !                                      ! -------------------------- !
-      DO jk = 1, jpkbm1                      !  Upper ocean (bio-layers)  !
+      DO_3D( 0, 0, 0, 0, 1, jpkbm1 )         !  Upper ocean (bio-layers)  !
          !                                   ! -------------------------- !
-         DO_2D( 0, 0, 0, 0 )
-            ! trophic variables( det, zoo, phy, no3, nh4, dom)
-            ! ------------------------------------------------
+         ! trophic variables( det, zoo, phy, no3, nh4, dom)
+         ! ------------------------------------------------
 
             ! negative trophic variables DO not contribute to the fluxes
             zdet = MAX( 0.e0, tr(ji,jj,jk,jpdet,Kmm) )
@@ -235,13 +234,11 @@ CONTAINS
                zw3d(ji,jj,jk,3) = znh4no3 * 86400   
                 ! 
              ENDIF
-         END_2D
-      END DO
+      END_3D
 
       !                                      ! -------------------------- !
-      DO jk = jpkb, jpkm1                    !  Upper ocean (bio-layers)  !
+      DO_3D( 0, 0, 0, 0, jpkb, jpkm1 )       !  Upper ocean (bio-layers)  !
          !                                   ! -------------------------- !
-         DO_2D( 0, 0, 0, 0 )
             ! remineralisation of all quantities towards nitrate 
 
             !    trophic variables( det, zoo, phy, no3, nh4, dom)
@@ -334,12 +331,9 @@ CONTAINS
                zw3d(ji,jj,jk,3) = znh4no3 * 86400._wp
                !
             ENDIF
-         END_2D
-      END DO
+      END_3D
       !
       IF( lk_iomput ) THEN
-         CALL lbc_lnk( 'p2zbio', zw2d(:,:,:),'T', 1.0_wp )
-         CALL lbc_lnk( 'p2zbio', zw3d(:,:,:,1),'T', 1.0_wp, zw3d(:,:,:,2),'T', 1.0_wp, zw3d(:,:,:,3),'T', 1.0_wp )
          ! Save diagnostics
          CALL iom_put( "TNO3PHY", zw2d(:,:,1) )
          CALL iom_put( "TNH4PHY", zw2d(:,:,2) )
@@ -362,6 +356,8 @@ CONTAINS
          CALL iom_put( "FNH4PHY", zw3d(:,:,:,2) )
          CALL iom_put( "FNH4NO3", zw3d(:,:,:,3) )
          !
+         DEALLOCATE( zw2d, zw3d )
+         !
       ENDIF
 
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -370,8 +366,6 @@ CONTAINS
          CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
       ENDIF
       !
-      IF( lk_iomput )   DEALLOCATE( zw2d, zw3d )
-      !
       IF( ln_timing )  CALL timing_stop('p2z_bio')
       !
    END SUBROUTINE p2z_bio
diff --git a/src/TOP/PISCES/P2Z/p2zexp.F90 b/src/TOP/PISCES/P2Z/p2zexp.F90
index d5fe6fe1..71ed7709 100644
--- a/src/TOP/PISCES/P2Z/p2zexp.F90
+++ b/src/TOP/PISCES/P2Z/p2zexp.F90
@@ -65,7 +65,7 @@ CONTAINS
       !!
       INTEGER  ::   ji, jj, jk, jl, ikt
       REAL(wp) ::   zgeolpoc, zfact, zwork, ze3t, zsedpocd, zmaskt
-      REAL(wp), DIMENSION(jpi,jpj)   ::  zsedpoca
+      REAL(wp), DIMENSION(A2D(0))   ::  zsedpoca
       CHARACTER (len=25) :: charout
       !!---------------------------------------------------------------------
       !
@@ -106,7 +106,7 @@ CONTAINS
          tr(ji,jj,1,jpno3,Krhs) = tr(ji,jj,1,jpno3,Krhs) + zgeolpoc * cmask(ji,jj) / areacot / e3t(ji,jj,1,Kmm)
       END_2D
 
-      CALL lbc_lnk( 'p2zexp', sedpocn, 'T', 1.0_wp )
+!      CALL lbc_lnk( 'p2zexp', sedpocn, 'T', 1.0_wp )
  
       ! Oa & Ek: diagnostics depending on jpdia2d !          left as example
       IF( lk_iomput )  CALL iom_put( "SEDPOC" , sedpocn )
@@ -120,7 +120,7 @@ CONTAINS
         !                                              
       ELSE
         !
-        DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+        DO_2D( 0, 0, 0, 0 )
            zsedpocd = zsedpoca(ji,jj) - 2. * sedpocn(ji,jj) + sedpocb(ji,jj)      ! time laplacian on tracers
            sedpocb(ji,jj) = sedpocn(ji,jj) + rn_atfp * zsedpocd                     ! sedpocb <-- filtered sedpocn
            sedpocn(ji,jj) = zsedpoca(ji,jj)                                       ! sedpocn <-- sedpoca
@@ -156,8 +156,8 @@ CONTAINS
       INTEGER, INTENT(in)  ::  Kmm      ! time level index
       INTEGER  ::   ji, jj, jk
       REAL(wp) ::   zmaskt, zfluo, zfluu
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zrro
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdm0
+      REAL(wp), DIMENSION(A2D(0)    ) :: zrro, zarea
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zdm0
       !!---------------------------------------------------------------------
       !
       IF(lwp) THEN
@@ -171,9 +171,9 @@ CONTAINS
       ! Calculate vertical distribution of newly formed biogenic poc
       ! in the water column in the case of max. possible bottom depth
       ! ------------------------------------------------------------
-      zdm0 = 0._wp
-      zrro = 1._wp
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, jpkb, jpkm1 )
+      zdm0(:,:,:) = 0._wp
+      zrro(:,:) = 1._wp
+      DO_3D( 0, 0, 0, 0, jpkb, jpkm1 )
          zfluo = ( gdepw(ji,jj,jk  ,Kmm) / gdepw(ji,jj,jpkb,Kmm) )**xhr
          zfluu = ( gdepw(ji,jj,jk+1,Kmm) / gdepw(ji,jj,jpkb,Kmm) )**xhr
          IF( zfluo.GT.1. )   zfluo = 1._wp
@@ -190,14 +190,14 @@ CONTAINS
       ! ----------------------------------------------------------------------
       dminl(:,:)   = 0._wp
       dmin3(:,:,:) = zdm0
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          IF( tmask(ji,jj,jk) == 0._wp ) THEN
             dminl(ji,jj) = dminl(ji,jj) + dmin3(ji,jj,jk)
             dmin3(ji,jj,jk) = 0._wp
          ENDIF
       END_3D
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tmask(ji,jj,1) == 0 )   dmin3(ji,jj,1) = 0._wp
       END_2D
 
@@ -209,8 +209,11 @@ CONTAINS
             IF( zmaskt == 0. )   cmask(ji,jj) = 1._wp
          END IF
       END_2D
-      CALL lbc_lnk( 'p2zexp', cmask , 'T', 1.0_wp )      ! lateral boundary conditions on cmask   (sign unchanged)
-      areacot = glob_sum( 'p2zexp', e1e2t(:,:) * cmask(:,:) )
+!      CALL lbc_lnk( 'p2zexp', cmask , 'T', 1.0_wp )      ! lateral boundary conditions on cmask   (sign unchanged)
+      DO_2D( 0, 0, 0, 0 )
+         zarea(ji,jj) = e1e2t(ji,jj) * cmask(ji,jj)  
+      END_2D
+      areacot = glob_sum( 'p2zexp', zarea(:,:) )
       !
       IF( ln_rsttr ) THEN
          CALL iom_get( numrtr, jpdom_auto, 'SEDB'//ctrcnm(jpdet), sedpocb(:,:) )
@@ -226,8 +229,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE p2z_exp_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( cmask(jpi,jpj) , dminl(jpi,jpj) , dmin3(jpi,jpj,jpk), &
-         &      sedpocb(jpi,jpj) , sedpocn(jpi,jpj),   STAT=p2z_exp_alloc )
+      ALLOCATE( cmask(A2D(0)) , dminl(A2D(0)) , dmin3(A2D(0),jpk), &
+         &      sedpocb(A2D(0)) , sedpocn(A2D(0)),   STAT=p2z_exp_alloc )
       IF( p2z_exp_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p2z_exp_alloc : failed to allocate arrays.' )
       !
    END FUNCTION p2z_exp_alloc
diff --git a/src/TOP/PISCES/P2Z/p2zopt.F90 b/src/TOP/PISCES/P2Z/p2zopt.F90
index 85f8b3e2..4c8268de 100644
--- a/src/TOP/PISCES/P2Z/p2zopt.F90
+++ b/src/TOP/PISCES/P2Z/p2zopt.F90
@@ -70,8 +70,8 @@ CONTAINS
       REAL(wp) ::   zpig                ! log of the total pigment
       REAL(wp) ::   zkr, zkg            ! total absorption coefficient in red and green
       REAL(wp) ::   zcoef               ! temporary scalar
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zpar100, zpar0m
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zparr, zparg
+      REAL(wp), DIMENSION(A2D(0)    ) :: zpar100, zpar0m
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zparr, zparg
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p2z_opt')
@@ -85,8 +85,14 @@ CONTAINS
 
       !                                          ! surface irradiance
       !                                          ! ------------------
-      IF( ln_dm2dc ) THEN   ;   zpar0m(:,:) = qsr_mean(:,:) * 0.43
-      ELSE                  ;   zpar0m(:,:) = qsr     (:,:) * 0.43
+      IF( ln_dm2dc ) THEN  
+         DO_2D( 0, 0, 0, 0 )
+            zpar0m(ji,jj) = qsr_mean(ji,jj) * 0.43
+         END_2D
+      ELSE  
+         DO_2D( 0, 0, 0, 0 )
+            zpar0m(ji,jj) = qsr(ji,jj) * 0.43
+         END_2D
       ENDIF
       zpar100(:,:)   = zpar0m(:,:) * 0.01
       zparr  (:,:,1) = zpar0m(:,:) * 0.5
@@ -94,14 +100,14 @@ CONTAINS
 
       !                                          ! Photosynthetically Available Radiation (PAR)
       zcoef = 12 * redf / rcchl / rpig           ! --------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk )
+      DO_3D( 0, 0, 0, 0, 2, jpk )
          zpig = LOG(  MAX( TINY(0.), tr(ji,jj,jk-1,jpphy,Kmm) ) * zcoef  )
          zkr  = xkr0 + xkrp * EXP( xlr * zpig )
          zkg  = xkg0 + xkgp * EXP( xlg * zpig )
          zparr(ji,jj,jk) = zparr(ji,jj,jk-1) * EXP( -zkr * e3t(ji,jj,jk-1,Kmm) )
          zparg(ji,jj,jk) = zparg(ji,jj,jk-1) * EXP( -zkg * e3t(ji,jj,jk-1,Kmm) )
       END_3D
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) ! mean par at t-levels
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! mean par at t-levels
          zpig = LOG(  MAX( TINY(0.), tr(ji,jj,jk,jpphy,Kmm) ) * zcoef  )
          zkr  = xkr0 + xkrp * EXP( xlr * zpig )
          zkg  = xkg0 + xkgp * EXP( xlg * zpig )
@@ -113,11 +119,11 @@ CONTAINS
       !                                          ! Euphotic layer
       !                                          ! --------------
       neln(:,:) = 1                                   ! euphotic layer level
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )  ! (i.e. 1rst T-level strictly below EL bottom)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )  ! (i.e. 1rst T-level strictly below EL bottom)
         IF( etot(ji,jj,jk) >= zpar100(ji,jj) )   neln(ji,jj) = jk + 1 
       END_3D
       !                                               ! Euphotic layer depth
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
+      DO_2D( 0, 0, 0, 0 ) 
          heup(ji,jj) = gdepw(ji,jj,neln(ji,jj),Kmm)
       END_2D
 
diff --git a/src/TOP/PISCES/P2Z/p2zsed.F90 b/src/TOP/PISCES/P2Z/p2zsed.F90
index 66f24308..50d7e769 100644
--- a/src/TOP/PISCES/P2Z/p2zsed.F90
+++ b/src/TOP/PISCES/P2Z/p2zsed.F90
@@ -61,10 +61,11 @@ CONTAINS
       INTEGER, INTENT( in ) ::   kt         ! ocean time-step index      
       INTEGER, INTENT( in ) ::   Kmm, Krhs  ! time level indices
       !
-      INTEGER  ::   ji, jj, jk, jl, ierr
+      INTEGER  ::   ji, jj, jk
       CHARACTER (len=25) :: charout
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zw2d
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwork, ztra
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zwork
+      REAL(wp) :: ztra
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p2z_sed')
@@ -83,22 +84,26 @@ CONTAINS
       zwork(:,:,jpk) = 0.e0      ! bottom value  set to zero
 
       ! tracer flux at w-point: we use -vsed (downward flux)  with simplification : no e1*e2
-      DO jk = 2, jpkm1
-         zwork(:,:,jk) = -vsed * tr(:,:,jk-1,jpdet,Kmm)
-      END DO
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
+         zwork(ji,jj,jk) = -vsed * tr(ji,jj,jk-1,jpdet,Kmm)
+      END_3D
 
       ! tracer flux divergence at t-point added to the general trend
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
-         ztra(ji,jj,jk)  = - ( zwork(ji,jj,jk) - zwork(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
-         tr(ji,jj,jk,jpdet,Krhs) = tr(ji,jj,jk,jpdet,Krhs) + ztra(ji,jj,jk) 
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
+         ztra  = - ( zwork(ji,jj,jk) - zwork(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
+         tr(ji,jj,jk,jpdet,Krhs) = tr(ji,jj,jk,jpdet,Krhs) + ztra
       END_3D
 
       IF( lk_iomput )  THEN
          IF( iom_use( "TDETSED" ) ) THEN
-            ALLOCATE( zw2d(jpi,jpj) )
-            zw2d(:,:) =  ztra(:,:,1) * e3t(:,:,1,Kmm) * 86400._wp
+            ALLOCATE( zw2d(A2D(0)) )
+            DO_2D( 0, 0, 0, 0 ) 
+               zw2d(ji,jj)  = - ( zwork(ji,jj,1) - zwork(ji,jj,2) ) * 86400._wp
+            END_2D
             DO jk = 2, jpkm1
-               zw2d(:,:) = zw2d(:,:) + ztra(:,:,jk) * e3t(:,:,jk,Kmm) * 86400._wp
+               DO_2D( 0, 0, 0, 0 ) 
+                  zw2d(ji,jj) = zw2d(ji,jj) - ( zwork(ji,jj,jk) - zwork(ji,jj,jk+1) ) * 86400._wp
+               END_2D
             END DO
             CALL iom_put( "TDETSED", zw2d )
             DEALLOCATE( zw2d )
diff --git a/src/TOP/PISCES/P4Z/p4zagg.F90 b/src/TOP/PISCES/P4Z/p4zagg.F90
index 6eb5208f..9c16b164 100644
--- a/src/TOP/PISCES/P4Z/p4zagg.F90
+++ b/src/TOP/PISCES/P4Z/p4zagg.F90
@@ -70,7 +70,7 @@ CONTAINS
       ! PISCES part
       IF( ln_p4z ) THEN
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             !
             zfact = xstep * xdiss(ji,jj,jk)
             ! Part I : Coagulation dependent on turbulence
@@ -117,7 +117,7 @@ CONTAINS
       ELSE    ! ln_p5z
         ! PISCES-QUOTA part
         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             !
             zfact = xstep * xdiss(ji,jj,jk)
             !  Part I : Coagulation dependent on turbulence
diff --git a/src/TOP/PISCES/P4Z/p4zbc.F90 b/src/TOP/PISCES/P4Z/p4zbc.F90
index f649f91f..c05ae9a1 100644
--- a/src/TOP/PISCES/P4Z/p4zbc.F90
+++ b/src/TOP/PISCES/P4Z/p4zbc.F90
@@ -13,6 +13,7 @@ MODULE p4zbc
    USE sms_pisces      !  PISCES Source Minus Sink variables
    USE iom             !  I/O manager
    USE fldread         !  time interpolation
+   USE prtctl          !  print control for debugging
    USE trcbc
 
    IMPLICIT NONE
@@ -36,7 +37,6 @@ MODULE p4zbc
    LOGICAL , PUBLIC ::   ll_river     !: boolean for river input of nutrients
    LOGICAL , PUBLIC ::   ll_ndepo     !: boolean for atmospheric deposition of N
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_dust      ! structure of input dust
-   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_ironsed   ! structure of input iron from sediment
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_hydrofe   ! structure of input iron from sediment
 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dust    !: dust fields
@@ -74,6 +74,8 @@ CONTAINS
       REAL(wp) ::  zcoef, zwdust, zrivdin, zdustdep, zndep
       !
       CHARACTER (len=25) :: charout
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zw2d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_bc')
@@ -84,7 +86,9 @@ CONTAINS
       IF( ll_dust )  THEN
          !
          CALL fld_read( kt, 1, sf_dust )
-         dust(:,:) = MAX( rtrn, sf_dust(1)%fnow(:,:,1) )
+         DO_2D( 0, 0, 0, 0 )
+            dust(ji,jj) = MAX( rtrn, sf_dust(1)%fnow(ji,jj,1) )
+         END_2D
          !
          ! Iron solubilization of particles in the water column
          ! dust in kg/m2/s ---> 1/55.85 to put in mol/Fe ;  wdust in m/d
@@ -99,7 +103,7 @@ CONTAINS
 
          ! Atmospheric input of Iron dissolves in the water column
          IF ( ln_trc_sbc(jpfer) ) THEN
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) )
                !
                tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zdustdep * mfrac / mMass_Fe 
@@ -107,16 +111,18 @@ CONTAINS
 
             IF( lk_iomput ) THEN
                 ! surface downward dust depo of iron
+                ALLOCATE( zw2d(A2D(0)) ) 
                 jl = n_trc_indsbc(jpfer)
-                CALL iom_put( "Irondep", ( rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / rn_sbc_time ) * 1.e+3 * tmask(:,:,1) )
-
+                zw2d(A2D(0)) = rf_trsfac(jl) * ( sf_trcsbc(jl)%fnow(A2D(0),1) / rn_sbc_time ) * 1.e+3 * tmask(A2D(0),1)
+                CALL iom_put( "Irondep", zw2d )
+                DEALLOCATE( zw2d )
             ENDIF
 
          ENDIF
 
          ! Atmospheric input of PO4 dissolves in the water column
          IF ( ln_trc_sbc(jppo4) ) THEN
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) )
                !
                tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P
@@ -125,7 +131,7 @@ CONTAINS
 
          ! Atmospheric input of Si dissolves in the water column
          IF ( ln_trc_sbc(jpsil) ) THEN
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )
+            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) )
                !
                tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si
@@ -135,7 +141,10 @@ CONTAINS
          !
          IF( lk_iomput ) THEN
              ! dust concentration at surface
-             CALL iom_put( "pdust"  , dust(:,:) / ( wdust / rday ) * tmask(:,:,1) ) ! dust concentration at surface
+             ALLOCATE( zw2d(A2D(0)) )
+             zw2d(A2D(0)) = dust(A2D(0)) / ( wdust / rday ) * tmask(A2D(0),1)
+             CALL iom_put( "pdust", zw2d )
+             DEALLOCATE( zw2d )
          ENDIF
       ENDIF
 
@@ -144,7 +153,7 @@ CONTAINS
       ! ----------------------------------------------------------
       IF( ll_river ) THEN
           jl = n_trc_indcbc(jpno3)
-          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+          DO_2D( 0, 0, 0, 0 )
              DO jk = 1, nk_rnf(ji,jj)
                 zcoef = rn_rfact / ( e1e2t(ji,jj) * h_rnf(ji,jj) * rn_cbc_time ) * tmask(ji,jj,1)
                 zrivdin = rf_trcfac(jl) * sf_trccbc(jl)%fnow(ji,jj,1) * zcoef
@@ -158,14 +167,14 @@ CONTAINS
       IF( ll_ndepo ) THEN
          IF( ln_trc_sbc(jpno3) ) THEN
             jl = n_trc_indsbc(jpno3)
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time
                tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) - rno3 * zndep * rfact
             END_2D
          ENDIF
          IF( ln_trc_sbc(jpnh4) ) THEN
             jl = n_trc_indsbc(jpnh4)
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            DO_2D( 0, 0, 0, 0 )
                zndep = rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) / e3t(ji,jj,1,Kmm) / rn_sbc_time
                tr(ji,jj,1,jptal,Krhs) = tr(ji,jj,1,jptal,Krhs) + rno3 * zndep * rfact
             END_2D
@@ -183,41 +192,71 @@ CONTAINS
          ! Simple parameterization assuming a fixed constant concentration in
          ! sea-ice (icefeinput)
          ! ------------------------------------------------------------------         
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             zdep     = rfact / e3t(ji,jj,1,Kmm)
-            zwflux   = fmmflx(ji,jj) / 1000._wp
-            zironice =  MAX( -0.99 * tr(ji,jj,1,jpfer,Kbb), -zwflux * icefeinput * zdep )
+            zwflux   = fwfice(ji,jj) / 1000._wp
+            zironice =  MAX( -0.99 * tr(ji,jj,1,jpfer,Kbb), zwflux * icefeinput * zdep )
             tr(ji,jj,1,jpfer,Krhs) = tr(ji,jj,1,jpfer,Krhs) + zironice
          END_2D
          !
-         ! iron flux from ice
-         IF( lk_iomput ) &
-         & CALL iom_put( "Ironice", MAX( -0.99 * tr(:,:,1,jpfer,Kbb), (-1.*fmmflx(:,:)/1000._wp )*icefeinput*1.e+3*tmask(:,:,1)) )
+         IF( lk_iomput ) THEN
+            ! iron flux from ice
+            ALLOCATE( zw2d(A2D(0)) )
+            zw2d(A2D(0)) = MAX( -0.99 * tr(A2D(0),1,jpfer,Kbb), (fwfice(:,:)/1000._wp )*icefeinput*1.e+3*tmask(A2D(0),1))
+            CALL iom_put( "Ironice", zw2d )
+            DEALLOCATE( zw2d )
+         ENDIF
          !
       ENDIF
 
       ! Add the external input of iron from sediment mobilization
       ! ------------------------------------------------------
       IF( ln_ironsed .AND. .NOT.lk_sed ) THEN
-          tr(:,:,:,jpfer,Krhs) = tr(:,:,:,jpfer,Krhs) + ironsed(:,:,:) * rfact
-          !
-          IF( lk_iomput )  CALL iom_put( "Ironsed", ironsed(:,:,:) * 1.e+3 * tmask(:,:,:) ) 
+          DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + ironsed(ji,jj,jk) * rfact
+         END_3D
+         !
+         IF( lk_iomput ) THEN
+            ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+            zw3d(A2D(0),1:jpkm1) = ironsed(A2D(0),1:jpkm1) * 1.e+3 * tmask(A2D(0),1:jpkm1)
+            CALL iom_put( "Ironsed", zw3d )
+            DEALLOCATE( zw3d )
+         ENDIF
       ENDIF
 
       ! Add the external input of iron from hydrothermal vents
       ! ------------------------------------------------------
       IF( ln_hydrofe ) THEN
          CALL fld_read( kt, 1, sf_hydrofe )
-         DO jk = 1, jpk
-            hydrofe(:,:,jk) = ( MAX( rtrn, sf_hydrofe(1)%fnow(:,:,jk) ) * hratio ) &
-              &              / ( e1e2t(:,:) * e3t(:,:,jk,Kmm) * ryyss + rtrn ) / 1000._wp &
-              &              * tmask(:,:,jk)
-         ENDDO
-                         tr(:,:,:,jpfer,Krhs) = tr(:,:,:,jpfer,Krhs) + hydrofe(:,:,:) * rfact
-         IF( ln_ligand ) tr(:,:,:,jplgw,Krhs) = tr(:,:,:,jplgw,Krhs) + ( hydrofe(:,:,:) * lgw_rath ) * rfact
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            hydrofe(ji,jj,jk) = ( MAX( rtrn, sf_hydrofe(1)%fnow(ji,jj,jk) ) * hratio ) &
+              &              / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * ryyss + rtrn ) / 1000._wp &
+              &              * tmask(ji,jj,jk)
+         END_3D
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+              tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + hydrofe(ji,jj,jk) * rfact
+         END_3D
+         IF( ln_ligand ) THEN
+            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+               tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + ( hydrofe(ji,jj,jk) * lgw_rath ) * rfact
+            END_3D
+         ENDIF
          !
-         IF( lk_iomput ) CALL iom_put( "HYDR", hydrofe(:,:,:) * 1.e+3 * tmask(:,:,:) ) ! hydrothermal iron input
+         IF( lk_iomput ) THEN
+            ! hydrothermal iron input
+            ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+            zw3d(A2D(0),1:jpkm1) = hydrofe(A2D(0),1:jpkm1) * 1.e+3 * tmask(A2D(0),1:jpkm1)
+            CALL iom_put( "HYDR", zw3d )
+            DEALLOCATE( zw3d )
+         ENDIF
       ENDIF
+      !
+      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
+         WRITE(charout, FMT="('bc')")
+         CALL prt_ctl_info( charout, cdcomp = 'top' )
+         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
+      ENDIF
+      !
       IF( ln_timing )  CALL timing_stop('p4z_bc')
       !
    END SUBROUTINE p4z_bc
@@ -303,7 +342,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) '    initialize dust input from atmosphere '
          IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
          !
-         ALLOCATE( dust(jpi,jpj) ) 
+         ALLOCATE( dust(A2D(0)) ) 
          !
          ALLOCATE( sf_dust(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst
          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_bc_init: unable to allocate sf_dust structure' )
@@ -321,7 +360,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   ln_ironsed=T , computation of an island mask to enhance coastal supply of iron'
          !
-         ALLOCATE( ironsed(jpi,jpj,jpk) )    ! allocation
+         ALLOCATE( ironsed(A2D(0),jpk) )    ! allocation
          !
          CALL iom_open ( TRIM( sn_ironsed%clname ), numiron )
          ALLOCATE( zcmask(jpi,jpj,jpk) )
@@ -350,7 +389,7 @@ CONTAINS
          !
          CALL lbc_lnk( 'p4zbc', zcmask , 'T', 1.0_wp )      ! lateral boundary conditions on cmask   (sign unchanged)
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
             zexpide   = MIN( 8.,( gdept(ji,jj,jk,Kmm) / 500. )**(-1.5) )
             zdenitide = -0.9543 + 0.7662 * LOG( zexpide ) - 0.235 * LOG( zexpide )**2
             zcmask(ji,jj,jk) = zcmask(ji,jj,jk) * MIN( 1., EXP( zdenitide ) / 0.5 )
@@ -358,9 +397,9 @@ CONTAINS
          ! Coastal supply of iron
          ! -------------------------
          ironsed(:,:,jpk) = 0._wp
-         DO jk = 1, jpkm1
-            ironsed(:,:,jk) = sedfeinput * zcmask(:,:,jk) / ( e3t_0(:,:,jk) * rday )
-         END DO
+         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+            ironsed(ji,jj,jk) = sedfeinput * zcmask(ji,jj,jk) / ( e3t_0(ji,jj,jk) * rday )
+         END_3D
          DEALLOCATE( zcmask)
       ENDIF
       !
@@ -371,7 +410,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   ln_hydrofe=T , Input of iron from hydrothermal vents'
          !
-         ALLOCATE( hydrofe(jpi,jpj,jpk) )    ! allocation
+         ALLOCATE( hydrofe(A2D(0),jpk) )    ! allocation
          !
          ALLOCATE( sf_hydrofe(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst
          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_bc_init: unable to allocate sf_hydro structure' )
diff --git a/src/TOP/PISCES/P4Z/p4zbio.F90 b/src/TOP/PISCES/P4Z/p4zbio.F90
index d2a21ea1..65f61f4f 100644
--- a/src/TOP/PISCES/P4Z/p4zbio.F90
+++ b/src/TOP/PISCES/P4Z/p4zbio.F90
@@ -72,7 +72,7 @@ CONTAINS
       ! OF PHYTOPLANKTON AND DETRITUS. Shear rate is supposed to equal 1
       ! in the mixed layer and 0.1 below the mixed layer.
       xdiss(:,:,:) = 1.
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 2, jpkm1 )
          IF( gdepw(ji,jj,jk+1,Kmm) > hmld(ji,jj) )   xdiss(ji,jj,jk) = 0.01
       END_3D
 
diff --git a/src/TOP/PISCES/P4Z/p4zche.F90 b/src/TOP/PISCES/P4Z/p4zche.F90
index a71f9350..8d9f68fe 100644
--- a/src/TOP/PISCES/P4Z/p4zche.F90
+++ b/src/TOP/PISCES/P4Z/p4zche.F90
@@ -168,9 +168,13 @@ CONTAINS
       ! practical salinity
       ! -------------------------------------------------------------
       IF (neos == -1) THEN
-         salinprac(:,:,:) = ts(:,:,:,jp_sal,Kmm) * 35.0 / 35.16504
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            salinprac(ji,jj,jk) = ts(ji,jj,jk,jp_sal,Kmm) * 35.0 / 35.16504
+         END_3D
       ELSE
-         salinprac(:,:,:) = ts(:,:,:,jp_sal,Kmm)
+         DO_3D( 0, 0, 0, 0, 1, jpk )
+            salinprac(ji,jj,jk) = ts(ji,jj,jk,jp_sal,Kmm)
+         END_3D
       ENDIF
 
       !
@@ -179,7 +183,7 @@ CONTAINS
       ! potential temperature to in situ temperature. The errors is less than 
       ! 0.04°C relative to an exact computation
       ! ---------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          zpres = gdept(ji,jj,jk,Kmm) / 1000.
          za1 = 0.04 * ( 1.0 + 0.185 * ts(ji,jj,jk,jp_tem,Kmm) + 0.035 * (salinprac(ji,jj,jk) - 35.0) )
          za2 = 0.0075 * ( 1.0 - ts(ji,jj,jk,jp_tem,Kmm) / 30.0 )
@@ -188,7 +192,7 @@ CONTAINS
       !
       ! CHEMICAL CONSTANTS - SURFACE LAYER
       ! ----------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          !                             ! SET ABSOLUTE TEMPERATURE
          ztkel = tempis(ji,jj,1) + 273.15
          zt    = ztkel * 0.01
@@ -216,7 +220,7 @@ CONTAINS
 
       ! OXYGEN SOLUBILITY - DEEP OCEAN
       ! -------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          ztkel = tempis(ji,jj,jk) + 273.15
          zsal  = salinprac(ji,jj,jk) + ( 1.- tmask(ji,jj,jk) ) * 35.
          zsal2 = zsal * zsal
@@ -235,7 +239,7 @@ CONTAINS
 
       ! CHEMICAL CONSTANTS - DEEP OCEAN
       ! -------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
           ! SET PRESSION ACCORDING TO SAUNDER (1980)
           zplat   = SIN ( ABS(gphit(ji,jj)*3.141592654/180.) )
           zc1 = 5.92E-3 + zplat**2 * 5.25E-3
@@ -452,7 +456,7 @@ CONTAINS
       !!                    and the 2nd order approximation does not have 
       !!                    a solution
       !!---------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT)  ::  p_hini
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(OUT)  ::  p_hini
       INTEGER,                          INTENT(in)   ::  Kbb      ! time level indices
       INTEGER  ::   ji, jj, jk
       REAL(wp)  ::  zca1, zba1
@@ -463,7 +467,7 @@ CONTAINS
 
       IF( ln_timing )  CALL timing_start('ahini_for_at')
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
       zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. )
       p_alkcb  = tr(ji,jj,jk,jptal,Kbb) * zrhd
       p_dictot = tr(ji,jj,jk,jpdic,Kbb) * zrhd
@@ -512,13 +516,13 @@ CONTAINS
    ! inf(TA - [OH-] + [H+]) and sup(TA - [OH-] + [H+])
 
    ! Argument variables
-   REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: p_alknw_inf
-   REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT) :: p_alknw_sup
+   REAL(wp), DIMENSION(A2D(0),jpk), INTENT(OUT) :: p_alknw_inf
+   REAL(wp), DIMENSION(A2D(0),jpk), INTENT(OUT) :: p_alknw_sup
    INTEGER,                          INTENT(in)  ::  Kbb      ! time level indices
    INTEGER  ::   ji, jj, jk
    REAL(wp)  ::  zrhd
 
-    DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+    DO_3D( 0, 0, 0, 0, 1, jpk )
       zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. )
       p_alknw_inf(ji,jj,jk) =  -tr(ji,jj,jk,jppo4,Kbb) * zrhd - sulfat(ji,jj,jk) &
       &              - fluorid(ji,jj,jk)
@@ -536,8 +540,8 @@ CONTAINS
 
    ! Argument variables
    !--------------------
-   REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN)   :: p_hini
-   REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(OUT)  :: zhi
+   REAL(wp), DIMENSION(A2D(0),jpk), INTENT(IN)   :: p_hini
+   REAL(wp), DIMENSION(A2D(0),jpk), INTENT(OUT)  :: zhi
    INTEGER,                          INTENT(in)   :: Kbb  ! time level indices
 
    ! Local variables
@@ -557,17 +561,17 @@ CONTAINS
    REAL(wp)  ::  zrhd, p_alktot, zdic, zbot, zpt, zst, zft, zsit
    LOGICAL   ::  l_exitnow
    REAL(wp), PARAMETER :: pz_exp_threshold = 1.0
-   REAL(wp), DIMENSION(jpi,jpj,jpk) :: zalknw_inf, zalknw_sup, rmask, zh_min, zh_max, zeqn_absmin
+   REAL(wp), DIMENSION(A2D(0),jpk) :: zalknw_inf, zalknw_sup, rmask, zh_min, zh_max, zeqn_absmin
 
    IF( ln_timing )  CALL timing_start('solve_at_general')
 
    CALL anw_infsup( zalknw_inf, zalknw_sup, Kbb )
 
-   rmask(:,:,:) = tmask(:,:,:)
+   rmask(A2D(0),1:jpk) = tmask(A2D(0),1:jpk)
    zhi(:,:,:)   = 0.
 
    ! TOTAL H+ scale: conversion factor for Htot = aphscale * Hfree
-   DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+   DO_3D( 0, 0, 0, 0, 1, jpk )
       IF (rmask(ji,jj,jk) == 1.) THEN
          zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. )
          p_alktot = tr(ji,jj,jk,jptal,Kbb) * zrhd
@@ -597,7 +601,7 @@ CONTAINS
    zeqn_absmin(:,:,:) = HUGE(1._wp)
 
    DO jn = 1, jp_maxniter_atgen 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
       IF (rmask(ji,jj,jk) == 1.) THEN
          zrhd = 1._wp / ( rhd(ji,jj,jk) + 1. )
          p_alktot = tr(ji,jj,jk,jptal,Kbb) * zrhd
@@ -797,17 +801,17 @@ CONTAINS
 
       ierr(:) = 0
 
-      ALLOCATE( sio3eq(jpi,jpj,jpk), fekeq(jpi,jpj,jpk), chemc(jpi,jpj,3), chemo2(jpi,jpj,jpk), STAT=ierr(1) )
+      ALLOCATE( sio3eq(A2D(0),jpk), fekeq(A2D(0),jpk), chemc(A2D(0),3), chemo2(A2D(0),jpk), STAT=ierr(1) )
 
-      ALLOCATE( akb3(jpi,jpj,jpk)     , tempis(jpi, jpj, jpk),       &
-         &      akw3(jpi,jpj,jpk)     , borat (jpi,jpj,jpk)  ,       &
-         &      aks3(jpi,jpj,jpk)     , akf3(jpi,jpj,jpk)    ,       &
-         &      ak1p3(jpi,jpj,jpk)    , ak2p3(jpi,jpj,jpk)   ,       &
-         &      ak3p3(jpi,jpj,jpk)    , aksi3(jpi,jpj,jpk)   ,       &
-         &      fluorid(jpi,jpj,jpk)  , sulfat(jpi,jpj,jpk)  ,       &
-         &      salinprac(jpi,jpj,jpk),                 STAT=ierr(2) )
+      ALLOCATE( akb3(A2D(0),jpk)     , tempis(A2D(0),jpk),       &
+         &      akw3(A2D(0),jpk)     , borat (A2D(0),jpk)  ,       &
+         &      aks3(A2D(0),jpk)     , akf3(A2D(0),jpk)    ,       &
+         &      ak1p3(A2D(0),jpk)    , ak2p3(A2D(0),jpk)   ,       &
+         &      ak3p3(A2D(0),jpk)    , aksi3(A2D(0),jpk)   ,       &
+         &      fluorid(A2D(0),jpk)  , sulfat(A2D(0),jpk)  ,       &
+         &      salinprac(A2D(0),jpk),                 STAT=ierr(2) )
 
-      ALLOCATE( fesol(jpi,jpj,jpk,5), STAT=ierr(3) )
+      ALLOCATE( fesol(A2D(0),jpk,5), STAT=ierr(3) )
 
       !* Variable for chemistry of the CO2 cycle
       p4z_che_alloc = MAXVAL( ierr )
diff --git a/src/TOP/PISCES/P4Z/p4zfechem.F90 b/src/TOP/PISCES/P4Z/p4zfechem.F90
index 25987664..2e05446d 100644
--- a/src/TOP/PISCES/P4Z/p4zfechem.F90
+++ b/src/TOP/PISCES/P4Z/p4zfechem.F90
@@ -31,6 +31,7 @@ MODULE p4zfechem
    REAL(wp), PUBLIC ::   kfep         !: rate constant for nanoparticle formation
    REAL(wp), PUBLIC ::   scaveff      !: Fraction of scavenged iron that is considered as being subject to solubilization
 
+   LOGICAL  :: l_dia_fechem
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -58,36 +59,41 @@ CONTAINS
       REAL(wp) ::   zkeq, zfesatur, fe3sol, zligco
       REAL(wp) ::   zscave, zaggdfea, zaggdfeb, ztrc, zdust, zklight
       REAL(wp) ::   ztfe, zhplus, zxlam, zaggliga, zaggligb
-      REAL(wp) ::   zprecip, zprecipno3,  zconsfe, za1
+      REAL(wp) ::   zprecip, zprecipno3,  zconsfe, za1, ztl1, zfel1
       REAL(wp) ::   zrfact2
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, zfeprecip, zFeL1, zfecoll
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zcoll3d, zscav3d, zlcoll3d
+      REAL(wp), DIMENSION(A2D(0),jpk) ::   zFe3, ztotlig,  zfecoll
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zcoll3d, zscav3d, zfeprecip
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_fechem')
       !
-      zFe3     (:,:,jpk) = 0.
-      zFeL1    (:,:,jpk) = 0.
-      zTL1     (:,:,jpk) = 0.
-      zfeprecip(:,:,jpk) = 0.
-      zcoll3d  (:,:,jpk) = 0.
-      zscav3d  (:,:,jpk) = 0.
-      zlcoll3d (:,:,jpk) = 0.
-      zfecoll  (:,:,jpk) = 0.
-      xfecolagg(:,:,jpk) = 0.
-      xcoagfe  (:,:,jpk) = 0.
+      IF( kt == nittrc000 )  &
+         l_dia_fechem  = iom_use( "Fe3" ) .OR. iom_use( "FeL1" ) .OR. iom_use( "TL1" ) .OR.  &
+            &            iom_use( "Totlig" ) .OR. iom_use( "Biron" ) .OR. iom_use( "FESCAV" ) .OR.  &
+            &            iom_use( "FECOLL" ) .OR. iom_use( "FEPREC" ) 
+
+      IF( l_dia_fechem )  ALLOCATE( zcoll3d(A2D(0),jpk), zscav3d(A2D(0),jpk), zfeprecip(A2D(0),jpk) ) 
       !
       ! Total ligand concentration : Ligands can be chosen to be constant or variable
       ! Parameterization from Pham and Ito (2018)
       ! -------------------------------------------------
-      xfecolagg(:,:,:) = ligand * 1E9 + MAX(0., chemo2(:,:,:) - tr(:,:,:,jpoxy,Kbb) ) / 400.E-6
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         xfecolagg(ji,jj,jk) = ligand * 1E9 + MAX(0., chemo2(ji,jj,jk) - tr(ji,jj,jk,jpoxy,Kbb) ) / 400.E-6
+      END_3D
+      !
       IF( ln_ligvar ) THEN
-         ztotlig(:,:,:) =  0.09 * 0.667 * tr(:,:,:,jpdoc,Kbb) * 1E6 + xfecolagg(:,:,:)
-         ztotlig(:,:,:) =  MIN( ztotlig(:,:,:), 10. )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            ztotlig(ji,jj,jk) =  0.09 * 0.667 * tr(ji,jj,jk,jpdoc,Kbb) * 1E6 + xfecolagg(ji,jj,jk)
+            ztotlig(ji,jj,jk) =  MIN( ztotlig(ji,jj,jk), 10. )
+         END_3D
       ELSE
-        IF( ln_ligand ) THEN  ;   ztotlig(:,:,:) = tr(:,:,:,jplgw,Kbb) * 1E9
-        ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9 
+        IF( ln_ligand ) THEN  
+           DO_3D( 0, 0, 0, 0, 1, jpkm1)
+              ztotlig(ji,jj,jk) = tr(ji,jj,jk,jplgw,Kbb) * 1E9
+           END_3D
+        ELSE
+             ztotlig(:,:,:) = ligand * 1E9 
         ENDIF
       ENDIF
 
@@ -96,20 +102,22 @@ CONTAINS
       ! This model is based on one ligand, Fe2+ and Fe3+ 
       ! Chemistry is supposed to be fast enough to be at equilibrium
       ! ------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-          zTL1(ji,jj,jk)  = ztotlig(ji,jj,jk)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+          ztl1            = ztotlig(ji,jj,jk)
           zkeq            = fekeq(ji,jj,jk)
           zklight         = 4.77E-7 * etot(ji,jj,jk) * 0.5 / ( 10**(-6.3) )
           zconsfe         = consfe3(ji,jj,jk) / ( 10**(-6.3) )
-          zfesatur        = zTL1(ji,jj,jk) * 1E-9
+          zfesatur        = ztl1 * 1E-9
           ztfe            = (1.0 + zklight) * tr(ji,jj,jk,jpfer,Kbb) 
           ! Fe' is the root of a 2nd order polynom
           za1 =  1. + zfesatur * zkeq + zklight +  zconsfe - zkeq * tr(ji,jj,jk,jpfer,Kbb)
           zFe3 (ji,jj,jk) = ( -1 * za1 + SQRT( za1**2 + 4. * ztfe * zkeq) ) / ( 2. * zkeq + rtrn )
-          zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) )
       END_3D
       !
-      plig(:,:,:) =  MAX( 0., ( zFeL1(:,:,:) / ( tr(:,:,:,jpfer,Kbb) + rtrn ) ) )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         zfel1 = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) )
+         plig(ji,jj,jk) =  MAX( 0., ( zfel1 / ( tr(ji,jj,jk,jpfer,Kbb) + rtrn ) ) )
+      END_3D
       !
       zdust = 0.         ! if no dust available
 
@@ -125,16 +133,27 @@ CONTAINS
       ! to coagulate
       ! ----------------------------------------------------------------------
       IF (ln_ligand) THEN
-         zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:) * MAX(0., tr(:,:,:,jplgw,Kbb) - xfecolagg(:,:,:) * 1.0E-9 ) / ( tr(:,:,:,jplgw,Kbb) + rtrn ) 
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zfel1 = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) )
+            zfecoll(ji,jj,jk) = 0.5 * zfel1 * MAX(0., ztotlig(ji,jj,jk) - xfecolagg(ji,jj,jk) ) &
+                  &              / ( ztotlig(ji,jj,jk) + rtrn ) 
+         END_3D
       ELSE
          IF (ln_ligvar) THEN
-            zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:) * MAX(0., tr(:,:,:,jplgw,Kbb) - xfecolagg(:,:,:) * 1.0E-9 ) / ( tr(:,:,:,jplgw,Kbb) + rtrn )   
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfel1 = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) )
+               zfecoll(ji,jj,jk) = 0.5 * zfel1 * MAX(0., ztotlig(ji,jj,jk) - xfecolagg(ji,jj,jk) ) &
+                  &              / ( ztotlig(ji,jj,jk) + rtrn ) 
+            END_3D
          ELSE
-            zfecoll(:,:,:) = 0.5 * zFeL1(:,:,:)
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfel1 = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) - zFe3(ji,jj,jk) )
+               zfecoll(ji,jj,jk) = 0.5 * zfel1
+            END_3D
          ENDIF
       ENDIF
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! Scavenging rate of iron. This scavenging rate depends on the load of particles of sea water. 
          ! This parameterization assumes a simple second order kinetics (k[Particles][Fe]).
          ! Scavenging onto dust is also included as evidenced from the DUNE experiments.
@@ -150,8 +169,6 @@ CONTAINS
          ! This occurs in anoxic waters only
          zprecipno3 = 2.0 * 130.0 * tr(ji,jj,jk,jpno3,Kbb) * nitrfac(ji,jj,jk) * xstep * zFe3(ji,jj,jk)
          !
-         zfeprecip(ji,jj,jk) = zprecip + zprecipno3
-         !
          ztrc   = ( tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + tr(ji,jj,jk,jpcal,Kbb) + tr(ji,jj,jk,jpgsi,Kbb) ) * 1.e6 
          ztrc = MAX( rtrn, ztrc )
          IF( ll_dust )  zdust  = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk)
@@ -173,7 +190,7 @@ CONTAINS
          xcoagfe(ji,jj,jk) = zlam1a + zlam1b
          !
          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb &
-         &                       - zfeprecip(ji,jj,jk)
+         &                       - ( zprecip + zprecipno3 )
 
          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc
          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * scaveff * tr(ji,jj,jk,jppoc,Kbb) / ztrc
@@ -192,27 +209,56 @@ CONTAINS
           tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zaggdfea
           tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zaggdfeb
           !
-          zscav3d(ji,jj,jk)   = zscave 
-          zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb
+          IF( l_dia_fechem ) THEN
+             zscav3d(ji,jj,jk)   = zscave 
+             zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb
+             zfeprecip(ji,jj,jk) = zprecip + zprecipno3
+          ENDIF
          !
       END_3D
       !
       !  Define the bioavailable fraction of iron
       !  ----------------------------------------
-      biron(:,:,:) = tr(:,:,:,jpfer,Kbb) 
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         biron(ji,jj,jk) = tr(ji,jj,jk,jpfer,Kbb) 
+      END_3D
       !
       !  Output of some diagnostics variables
       !     ---------------------------------
-      IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s
-         IF( iom_use("Fe3")    )  CALL iom_put("Fe3"    , zFe3   (:,:,:)       * tmask(:,:,:) )   ! Fe3+
-         IF( iom_use("FeL1")   )  CALL iom_put("FeL1"   , zFeL1  (:,:,:)       * tmask(:,:,:) )   ! FeL1
-         IF( iom_use("TL1")    )  CALL iom_put("TL1"    , zTL1   (:,:,:)       * tmask(:,:,:) )   ! TL1
-         IF( iom_use("Totlig") )  CALL iom_put("Totlig" , ztotlig(:,:,:)       * tmask(:,:,:) )   ! TL
-         IF( iom_use("Biron")  )  CALL iom_put("Biron"  , biron  (:,:,:)  * 1e9 * tmask(:,:,:) )   ! biron
-         IF( iom_use("FESCAV") )  CALL iom_put("FESCAV" , zscav3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 )
-         IF( iom_use("FECOLL") )  CALL iom_put("FECOLL" , zcoll3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 )
-         IF( iom_use("FEPREC") )  CALL iom_put("FEPREC" , zfeprecip(:,:,:) *1e9*tmask(:,:,:)*zrfact2 )
+      IF( lk_iomput .AND.  knt == nrdttrc ) THEN
+        !
+        IF( l_dia_fechem ) THEN
+           zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s
+           ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+           ! Fe3+
+           zw3d(A2D(0),1:jpkm1) = zFe3(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "Fe3", zw3d )
+           !  FeL1
+           zw3d(A2D(0),1:jpkm1) = MAX( 0., tr(A2D(0),1:jpkm1,jpfer,Kbb) - zFe3(A2D(0),1:jpkm1) ) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "FeL1", zw3d )
+           ! TL1 = Totlig
+           zw3d(A2D(0),1:jpkm1) = ztotlig(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "TL1", zw3d )
+           ! Totlig
+           zw3d(A2D(0),1:jpkm1) = ztotlig(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "Totlig", zw3d )
+           ! biron
+           zw3d(A2D(0),1:jpkm1) = biron(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "Biron", zw3d )
+           ! FESCAV
+           zw3d(A2D(0),1:jpkm1) = zscav3d(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) * zrfact2
+           CALL iom_put( "FESCAV", zw3d )
+           ! FECOLL
+           zw3d(A2D(0),1:jpkm1) = zcoll3d(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) * zrfact2
+           CALL iom_put( "FECOLL", zw3d )
+           ! FEPREC
+           zw3d(A2D(0),1:jpkm1) = zfeprecip(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) * zrfact2
+           CALL iom_put( "FEPREC", zw3d )
+           !
+           DEALLOCATE( zcoll3d, zscav3d, zfeprecip, zw3d ) 
+           !
+        ENDIF
+        !
       ENDIF
 
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
diff --git a/src/TOP/PISCES/P4Z/p4zflx.F90 b/src/TOP/PISCES/P4Z/p4zflx.F90
index 051985ba..243abb82 100644
--- a/src/TOP/PISCES/P4Z/p4zflx.F90
+++ b/src/TOP/PISCES/P4Z/p4zflx.F90
@@ -52,6 +52,9 @@ MODULE p4zflx
 
    REAL(wp) ::   xconv  = 0.01_wp / 3600._wp   !: coefficients for conversion 
 
+   LOGICAL  :: l_dia_cflx, l_dia_tcflx
+   LOGICAL  :: l_dia_oflx, l_dia_kg
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -83,11 +86,20 @@ CONTAINS
       REAL(wp) ::   zph, zdic, zsch_o2, zsch_co2
       REAL(wp) ::   zyr_dec, zdco2dt
       CHARACTER (len=25) ::   charout
-      REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3, zoflx,  zpco2atm, zpco2oce  
+      REAL(wp), DIMENSION(A2D(0)) ::   zkgco2, zkgo2, zh2co3, zoflx,  zpco2atm, zpco2oce  
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zw2d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_flx')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_cflx  = iom_use( "Cflx"    ) .OR. iom_use( "Dpco2" )  &
+            &     .OR. iom_use( "pCO2sea" ) .OR. iom_use( "AtmCo2" )
+         l_dia_oflx  = iom_use( "Oflx"    ) .OR. iom_use( "Dpo2" )  
+         l_dia_tcflx = iom_use( "tcflx"   ) .OR. iom_use( "tcflxcum" )
+         l_dia_kg    = iom_use( "Kg"   ) 
+      ENDIF
+      
       ! SURFACE CHEMISTRY (PCO2 AND [H+] IN
       !     SURFACE LAYER); THE RESULT OF THIS CALCULATION
       !     IS USED TO COMPUTE AIR-SEA FLUX OF CO2
@@ -108,9 +120,13 @@ CONTAINS
          satmco2(:,:) = atcco2 
       ENDIF
 
-      IF( l_co2cpl )   satmco2(:,:) = atm_co2(:,:)
+      IF( l_co2cpl ) THEN
+         DO_2D( 0, 0, 0, 0 )
+            satmco2(ji,jj) = atm_co2(ji,jj)
+         END_2D
+      ENDIF
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ! DUMMY VARIABLES FOR DIC, H+, AND BORATE
          zrhd = rhd(ji,jj,1) + 1._wp
          zdic  = tr(ji,jj,1,jpdic,Kbb)
@@ -126,7 +142,7 @@ CONTAINS
       ! FIRST COMPUTE GAS EXCHANGE COEFFICIENTS
       ! -------------------------------------------
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ztc  = MIN( 35., ts(ji,jj,1,jp_tem,Kmm) )
          ztc2 = ztc * ztc
          ztc3 = ztc * ztc2 
@@ -145,7 +161,7 @@ CONTAINS
       END_2D
 
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ztkel = tempis(ji,jj,1) + 273.15
          zsal  = salinprac(ji,jj,1) + ( 1.- tmask(ji,jj,1) ) * 35.
          zvapsw    = EXP(24.4543 - 67.4509*(100.0/ztkel) - 4.8489*LOG(ztkel/100) - 0.000544*zsal)
@@ -170,12 +186,16 @@ CONTAINS
          tr(ji,jj,1,jpoxy,Krhs) = tr(ji,jj,1,jpoxy,Krhs) + zoflx(ji,jj) * rfact2 / e3t(ji,jj,1,Kmm)
       END_2D
 
-      IF( iom_use("tcflx") .OR. iom_use("tcflxcum") .OR. kt == nitrst   &
-         &                 .OR. (ln_check_mass .AND. kt == nitend) )    &
-         t_oce_co2_flx  = glob_sum( 'p4zflx', oce_co2(:,:) * e1e2t(:,:) * 1000. )                    !  Total Flux of Carbon
-      t_oce_co2_flx_cum = t_oce_co2_flx_cum + t_oce_co2_flx       !  Cumulative Total Flux of Carbon
-!      t_atm_co2_flx     = glob_sum( 'p4zflx', satmco2(:,:) * e1e2t(:,:) )       ! Total atmospheric pCO2
-      t_atm_co2_flx     =  atcco2      ! Total atmospheric pCO2
+      IF( l_dia_tcflx .OR. kt == nitrst   &
+         &           .OR. (ln_check_mass .AND. kt == nitend) )  THEN
+         ALLOCATE( zw2d(A2D(0)) )
+         zw2d(A2D(0)) = oce_co2(A2D(0)) * e1e2t(A2D(0)) * 1000._wp
+         t_oce_co2_flx  = glob_sum( 'p4zflx',  zw2d(:,:) )                    !  Total Flux of Carbon
+         t_oce_co2_flx_cum = t_oce_co2_flx_cum + t_oce_co2_flx       !  Cumulative Total Flux of Carbon
+!        t_atm_co2_flx     = glob_sum( 'p4zflx', satmco2(:,:) * e1e2t(:,:) )       ! Total atmospheric pCO2
+         t_atm_co2_flx     =  atcco2      ! Total atmospheric pCO2
+         DEALLOCATE( zw2d )
+      ENDIF
  
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
          WRITE(charout, FMT="('flx ')")
@@ -184,15 +204,47 @@ CONTAINS
       ENDIF
 
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         CALL iom_put( "AtmCo2"  , satmco2(:,:) * tmask(:,:,1) )   ! Atmospheric CO2 concentration
-         CALL iom_put( "Cflx"    , oce_co2(:,:) * 1000. ) 
-         CALL iom_put( "Oflx"    , zoflx(:,:) * 1000.  )
-         CALL iom_put( "Kg"      , zkgco2(:,:) * tmask(:,:,1)  )
-         CALL iom_put( "Dpco2"   , ( zpco2atm(:,:) - zpco2oce(:,:) ) * tmask(:,:,1) )
-         CALL iom_put( "pCO2sea" , zpco2oce(:,:) * tmask(:,:,1) )
-         CALL iom_put( "Dpo2"    , ( atcox * patm(:,:) - atcox * tr(:,:,1,jpoxy,Kbb) / ( chemo2(:,:,1) + rtrn ) ) * tmask(:,:,1) )
-         CALL iom_put( "tcflx"   , t_oce_co2_flx     )   ! molC/s
-         CALL iom_put( "tcflxcum", t_oce_co2_flx_cum )   ! molC
+        !
+        IF( l_dia_cflx ) THEN
+           ALLOCATE( zw2d(A2D(0)) ) 
+           ! Atmospheric CO2 concentration
+           zw2d(A2D(0)) = satmco2(A2D(0)) * tmask(A2D(0),1)
+           CALL iom_put( "AtmCo2", zw2d )
+           ! Carbon flux
+           zw2d(A2D(0)) = oce_co2(A2D(0)) * 1000._wp
+           CALL iom_put( "Cflx", zw2d )
+           ! atmospheric Dpco2 
+           zw2d(A2D(0)) =  ( zpco2atm(A2D(0)) - zpco2oce(A2D(0)) ) * tmask(A2D(0),1)
+           CALL iom_put( "Dpco2", zw2d )
+           ! oceanic Dpco2 
+           zw2d(A2D(0)) =  zpco2oce(A2D(0)) * tmask(A2D(0),1)
+           CALL iom_put( "pCO2sea", zw2d )
+           !
+           DEALLOCATE( zw2d )
+        ENDIF
+        !
+        IF( l_dia_oflx ) THEN
+           ALLOCATE( zw2d(A2D(0)) ) 
+           !  oxygen flux 
+           CALL iom_put( "Oflx", zoflx * 1000._wp )
+           !  Dpo2 
+           zw2d(A2D(0)) =  ( atcox * patm(A2D(0)) - atcox * tr(A2D(0),1,jpoxy,Kbb) &
+                            / ( chemo2(A2D(0),1) + rtrn ) ) * tmask(A2D(0),1) 
+           CALL iom_put( "Dpo2", zw2d )
+           DEALLOCATE( zw2d )
+        ENDIF
+        !
+        IF( l_dia_kg ) THEN
+           ALLOCATE( zw2d(A2D(0)) ) 
+           zw2d(A2D(0)) = zkgco2(A2D(0)) * tmask(A2D(0),1)
+           CALL iom_put( "Kg", zw2d )
+           DEALLOCATE( zw2d )
+        ENDIF
+        IF( l_dia_tcflx ) THEN
+          CALL iom_put( "tcflx"   , t_oce_co2_flx )    ! global flux of carbon
+          CALL iom_put( "tcflxcum", t_oce_co2_flx_cum )   !  Cumulative flux of carbon
+        ENDIF
+        !
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('p4z_flx')
@@ -267,7 +319,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) '    Spatialized Atmospheric pCO2 from an external file'
       ENDIF
       !
-      oce_co2(:,:)  = 0._wp                ! Initialization of Flux of Carbon
+!      oce_co2(:,:)  = 0._wp                ! Initialization of Flux of Carbon
       t_oce_co2_flx = 0._wp
       t_atm_co2_flx = 0._wp
       !
@@ -288,6 +340,7 @@ CONTAINS
       CHARACTER(len=100) ::   cn_dir      ! Root directory for location of ssr files
       TYPE(FLD_N)        ::   sn_patm     ! informations about the fields to be read
       TYPE(FLD_N)        ::   sn_atmco2   ! informations about the fields to be read
+      INTEGER  :: ji, jj
       !!
       NAMELIST/nampisatm/ ln_presatm, ln_presatmco2, sn_patm, sn_atmco2, cn_dir
       !!----------------------------------------------------------------------
@@ -337,12 +390,16 @@ CONTAINS
       !
       IF( ln_presatm ) THEN
          CALL fld_read( kt, 1, sf_patm )               !* input Patm provided at kt + 1/2
-         patm(:,:) = sf_patm(1)%fnow(:,:,1)/101325.0     ! atmospheric pressure
+         DO_2D( 0, 0, 0, 0 )
+            patm(ji,jj) = sf_patm(1)%fnow(ji,jj,1)/101325.0     ! atmospheric pressure
+         END_2D
       ENDIF
       !
       IF( ln_presatmco2 ) THEN
          CALL fld_read( kt, 1, sf_atmco2 )               !* input atmco2 provided at kt + 1/2
-         satmco2(:,:) = sf_atmco2(1)%fnow(:,:,1)                        ! atmospheric pressure
+         DO_2D( 0, 0, 0, 0 )
+            satmco2(ji,jj) = sf_atmco2(1)%fnow(ji,jj,1)                        ! atmospheric pressure
+         END_2D
       ELSE
          satmco2(:,:) = atcco2    ! Initialize atmco2 if no reading from a file
       ENDIF
@@ -354,7 +411,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE p4z_flx_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( satmco2(jpi,jpj), patm(jpi,jpj), STAT=p4z_flx_alloc )
+      ALLOCATE( satmco2(A2D(0)), patm(A2D(0)), STAT=p4z_flx_alloc )
       !
       IF( p4z_flx_alloc /= 0 )   CALL ctl_stop( 'STOP', 'p4z_flx_alloc : failed to allocate arrays' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zint.F90 b/src/TOP/PISCES/P4Z/p4zint.F90
index 9b95c2e4..c0243fc4 100644
--- a/src/TOP/PISCES/P4Z/p4zint.F90
+++ b/src/TOP/PISCES/P4Z/p4zint.F90
@@ -44,16 +44,18 @@ CONTAINS
       !
       ! Computation of phyto and zoo metabolic rate
       ! -------------------------------------------
-      ! Generic temperature dependence (Eppley, 1972)
-      tgfunc (:,:,:) = EXP( 0.0631 * ts(:,:,:,jp_tem,Kmm) )
-      ! Temperature dependence of mesozooplankton (Buitenhuis et al. (2005))
-      tgfunc2(:,:,:) = EXP( 0.0761 * ts(:,:,:,jp_tem,Kmm) )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
+         ! Generic temperature dependence (Eppley, 1972)
+         tgfunc (ji,jj,jk) = EXP( 0.0631 * ts(ji,jj,jk,jp_tem,Kmm) )
+         ! Temperature dependence of mesozooplankton (Buitenhuis et al. (2005))
+         tgfunc2(ji,jj,jk) = EXP( 0.0761 * ts(ji,jj,jk,jp_tem,Kmm) )
+      END_3D
 
 
       ! Computation of the silicon dependant half saturation  constant for silica uptake
       ! This is based on an old study by Pondaven et al. (1998)
       ! --------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          zvar = tr(ji,jj,1,jpsil,Kbb) * tr(ji,jj,1,jpsil,Kbb)
          xksimax(ji,jj) = MAX( xksimax(ji,jj), ( 1.+ 7.* zvar / ( xksilim * xksilim + zvar ) ) * 1e-6 )
       END_2D
@@ -73,14 +75,14 @@ CONTAINS
       zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
 
       ! day length in hours
-      strn(:,:) = 0.
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+!      strn(:,:) = 0.
+      DO_2D( 0, 0, 0, 0 )
          zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
          zargu = MAX( -1., MIN(  1., zargu ) )
          strn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
       END_2D
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
         ! denitrification factor computed from O2 levels
          ! This factor diagnoses below which level of O2 denitrification
          ! is active
diff --git a/src/TOP/PISCES/P4Z/p4zligand.F90 b/src/TOP/PISCES/P4Z/p4zligand.F90
index 07ce54c4..40fe75fd 100644
--- a/src/TOP/PISCES/P4Z/p4zligand.F90
+++ b/src/TOP/PISCES/P4Z/p4zligand.F90
@@ -26,6 +26,8 @@ MODULE p4zligand
    REAL(wp), PUBLIC ::  prlgw    !: Photochemical of weak ligand
    REAL(wp), PUBLIC ::  xklig    !: 1/2 saturation constant of photolysis
 
+   LOGICAL  ::  l_dia_ligand
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -44,62 +46,117 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt, knt   ! ocean time step
       INTEGER, INTENT(in)  ::  Kbb, Krhs ! time level indices
       !
-      INTEGER  ::   ji, jj, jk
-      REAL(wp) ::   zlgwp, zlgwpr, zlgwr, zlablgw 
-      REAL(wp) ::   zlam1a, zlam1b, zaggliga, zligco
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zligrem, zligpr, zligprod, zlcoll3d
+      INTEGER  :: ji, jj, jk
+      REAL(wp) :: zlgwp, zlgwpr, zlgwr, zlablgw 
+      REAL(wp) :: zlam1a, zlam1b, zaggliga, zligco
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zligrem, zligpr, zligprod, zlcoll3d
       CHARACTER (len=25) ::   charout
       !!---------------------------------------------------------------------
       !
+      IF( kt == nittrc000 )  &
+          &  l_dia_ligand = iom_use( "LIGREM" ) .OR. iom_use( "LIGPR" ) &
+          &            .OR. iom_use( "LPRODR" ) .OR. iom_use( "LGWCOLL" )
+
       IF( ln_timing )   CALL timing_start('p4z_ligand')
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-         !
-         ! ------------------------------------------------------------------
-         ! Remineralization of iron ligands
-         ! ------------------------------------------------------------------
-         ! production from remineralisation of organic matter
+      ! ------------------------------------------------------------------
+      ! Remineralization of iron ligands
+      ! ------------------------------------------------------------------
+
+      ! production from remineralisation of organic matter
+      IF( l_dia_ligand ) THEN
+         ALLOCATE( zligprod(A2D(0),jpk) )   ;    zligprod(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligprod(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zlgwp = orem(ji,jj,jk) * rlig
-         ! decay of weak ligand
-         ! This is based on the idea that as LGW is lower
-         ! there is a larger fraction of refractory OM
+         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zlgwp 
+         !
+      END_3D
+      !
+      IF( l_dia_ligand .AND. ( lk_iomput .AND. knt == nrdttrc ) ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligprod(ji,jj,jk) = ( tr(ji,jj,jk,jplgw,Krhs) - zligprod(ji,jj,jk) )  &
+                &               * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+         END_3D
+         CALL iom_put( "LPRODR", zligprod )
+         DEALLOCATE( zligprod ) 
+      ENDIF
+
+      ! Decay of weak ligand
+      ! This is based on the idea that as LGW is lower
+      ! there is a larger fraction of refractory OM
+      IF( l_dia_ligand ) THEN
+         ALLOCATE( zligrem(A2D(0),jpk) )   ;    zligrem(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligrem(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zlgwr = ( 1.0 / rlgs * MAX(0., tr(ji,jj,jk,jplgw,Kbb) - xfecolagg(ji,jj,jk) * 1.0E-9 )    &
          &       + 1.0 / rlgw * xfecolagg(ji,jj,jk) * 1.0E-9 ) / ( rtrn + tr(ji,jj,jk,jplgw,Kbb) )
          zlgwr = zlgwr * tgfunc(ji,jj,jk) * ( xstep / nyear_len(1) ) * blim(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb)
-         ! photochem loss of weak ligand
+         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zlgwr 
+      END_3D
+      !
+      IF( l_dia_ligand .AND. ( lk_iomput .AND. knt == nrdttrc ) ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligrem(ji,jj,jk) = - ( tr(ji,jj,jk,jplgw,Krhs) - zligrem(ji,jj,jk) )  &
+                &               * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+         END_3D
+         CALL iom_put( "LIGREM", zligrem )
+         DEALLOCATE( zligrem ) 
+      ENDIF
+
+      ! photochem loss of weak ligand
+      IF( l_dia_ligand ) THEN
+         ALLOCATE( zligpr(A2D(0),jpk) )   ;    zligpr(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligpr(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zlgwpr = prlgw * xstep * etot(ji,jj,jk) * tr(ji,jj,jk,jplgw,Kbb)**3 * (1. - fr_i(ji,jj))   &
          &        / ( tr(ji,jj,jk,jplgw,Kbb)**2 + (xklig)**2)
-         ! Coagulation of ligands due to various processes (Brownian, shear, diff. sedimentation
-         ! xcoagfe is computed in p4zfechem
-         ! -------------------------------------------------------------------------------------
-         ! 50% of the ligands are supposed to be in the colloidal size fraction
-         ! as for FeL
+
+         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zlgwpr
+      END_3D
+      !
+      IF( l_dia_ligand .AND. ( lk_iomput .AND. knt == nrdttrc ) ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zligpr(ji,jj,jk) = - ( tr(ji,jj,jk,jplgw,Krhs) - zligpr(ji,jj,jk) )  &
+               &               * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+         END_3D
+         CALL iom_put( "LIGPR", zligpr )
+         DEALLOCATE( zligpr ) 
+      ENDIF
+
+      ! Coagulation of ligands due to various processes (Brownian, shear, diff. sedimentation
+      ! xcoagfe is computed in p4zfechem
+      ! -------------------------------------------------------------------------------------
+      ! 50% of the ligands are supposed to be in the colloidal size fraction as for FeL
+      IF( l_dia_ligand ) THEN
+         ALLOCATE( zlcoll3d(A2D(0),jpk) )   ;    zlcoll3d(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zlcoll3d(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zligco   = 0.5 * MAX(0., tr(ji,jj,jk,jplgw,Kbb) - xfecolagg(ji,jj,jk) * 1.0E-9 )
          zaggliga = xcoagfe(ji,jj,jk) * xstep * zligco
 
-         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zlgwp - zlgwr - zlgwpr - zaggliga
-         !
-         zligrem(ji,jj,jk)   = zlgwr
-         zligpr(ji,jj,jk)    = zlgwpr
-         zligprod(ji,jj,jk)  = zlgwp
-         zlcoll3d(ji,jj,jk)  = zaggliga
+         tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zaggliga
       END_3D
       !
-      !  Output of some diagnostics variables
-      !     ---------------------------------
-      IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         IF( iom_use( "LIGREM" ) ) THEN
-           zligrem(:,:,jpk) = 0.  ; CALL iom_put( "LIGREM", zligrem(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
-         IF( iom_use( "LIGPR" ) ) THEN
-           zligpr(:,:,jpk) = 0.   ; CALL iom_put( "LIGPR" , zligpr(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
-         IF( iom_use( "LPRODR" ) ) THEN
-           zligprod(:,:,jpk) = 0. ; CALL iom_put( "LPRODR", zligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
-         IF( iom_use( "LGWCOLL" ) ) THEN
-            zlcoll3d(:,:,jpk) = 0. ; CALL iom_put( "LGWCOLL", zlcoll3d(:,:,:) * 1.e9 *  1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
+      IF( l_dia_ligand .AND. ( lk_iomput .AND. knt == nrdttrc ) ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zlcoll3d(ji,jj,jk) = - ( tr(ji,jj,jk,jplgw,Krhs) - zlcoll3d(ji,jj,jk) )  &
+                &                 * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+         END_3D
+         CALL iom_put( "LGWCOLL", zlcoll3d )
+         DEALLOCATE( zlcoll3d ) 
       ENDIF
       !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
diff --git a/src/TOP/PISCES/P4Z/p4zlim.F90 b/src/TOP/PISCES/P4Z/p4zlim.F90
index 4e227808..d388955f 100644
--- a/src/TOP/PISCES/P4Z/p4zlim.F90
+++ b/src/TOP/PISCES/P4Z/p4zlim.F90
@@ -68,6 +68,8 @@ MODULE p4zlim
    REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.3125 * 0.5 * 1.5
    REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.3125 * 0.5 
 
+   LOGICAL  :: l_dia_nut_lim, l_dia_iron_lim, l_dia_size_lim, l_dia_fracal
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -98,13 +100,21 @@ CONTAINS
       REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4   
       REAL(wp) ::   fananof, fadiatf, znutlim, zfalim
       REAL(wp) ::   znutlimtot, zlimno3, zlimnh4, zbiron
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_lim')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_nut_lim  = iom_use( "LNnut"   ) .OR. iom_use( "LDnut" )  
+         l_dia_iron_lim = iom_use( "LNFe"    ) .OR. iom_use( "LDFe"  )
+         l_dia_size_lim = iom_use( "SIZEN"   ) .OR. iom_use( "SIZED" )
+         l_dia_fracal   = iom_use( "xfracal" )
+      ENDIF
+      !
       sizena(:,:,:) = 1.0  ;  sizeda(:,:,:) = 1.0
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          
          ! Computation of a variable Ks for iron on diatoms taking into account
          ! that increasing biomass is made of generally bigger cells
@@ -219,7 +229,7 @@ CONTAINS
       ! Size estimation of phytoplankton based on total biomass
       ! Assumes that larger biomass implies addition of larger cells
       ! ------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcoef = tr(ji,jj,jk,jpphy,Kbb) - MIN(xsizephy, tr(ji,jj,jk,jpphy,Kbb) )
          sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef )
          zcoef = tr(ji,jj,jk,jpdia,Kbb) - MIN(xsizedia, tr(ji,jj,jk,jpdia,Kbb) )
@@ -231,7 +241,7 @@ CONTAINS
       ! This is a purely adhoc formulation described in Aumont et al. (2015)
       ! This fraction depends on nutrient limitation, light, temperature
       ! --------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zlim1  = xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) 
          zlim2  = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concnnh4 )
          zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  6.E-11   )
@@ -250,7 +260,7 @@ CONTAINS
          xfracal(ji,jj,jk) = MAX( 0.02, xfracal(ji,jj,jk) )
       END_3D
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! denitrification factor computed from O2 levels
          nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - tr(ji,jj,jk,jpoxy,Kbb) )    &
             &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  )
@@ -263,13 +273,41 @@ CONTAINS
       END_3D
       !
       IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
-        CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
-        CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
-        CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
-        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "SIZEN"  , sizen  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
+        !
+        IF( l_dia_fracal ) THEN   ! fraction of calcifiers
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xfracal(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "xfracal",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_nut_lim ) THEN   ! Nutrient limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LNnut",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimdia(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDnut",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_iron_lim ) THEN   ! Iron limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xlimnfe(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LNFe",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimdfe(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDFe",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_size_lim ) THEN   ! Size limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = sizen(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "SIZEN",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = sized(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "SIZED",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('p4z_lim')
@@ -355,16 +393,16 @@ CONTAINS
       !!----------------------------------------------------------------------
 
       !*  Biological arrays for phytoplankton growth
-      ALLOCATE( xnanono3(jpi,jpj,jpk), xdiatno3(jpi,jpj,jpk),       &
-         &      xnanonh4(jpi,jpj,jpk), xdiatnh4(jpi,jpj,jpk),       &
-         &      xnanopo4(jpi,jpj,jpk), xdiatpo4(jpi,jpj,jpk),       &
-         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       &
-         &      xlimphy (jpi,jpj,jpk), xlimdia (jpi,jpj,jpk),       &
-         &      xlimnfe (jpi,jpj,jpk), xlimdfe (jpi,jpj,jpk),       &
-         &      xlimbac (jpi,jpj,jpk), xlimbacl(jpi,jpj,jpk),       &
-         &      concnfe (jpi,jpj,jpk), concdfe (jpi,jpj,jpk),       &
-         &      xqfuncfecn(jpi,jpj,jpk), xqfuncfecd(jpi,jpj,jpk),   &
-         &      xlimsi  (jpi,jpj,jpk), STAT=p4z_lim_alloc )
+      ALLOCATE( xnanono3(A2D(0),jpk), xdiatno3(A2D(0),jpk),       &
+         &      xnanonh4(A2D(0),jpk), xdiatnh4(A2D(0),jpk),       &
+         &      xnanopo4(A2D(0),jpk), xdiatpo4(A2D(0),jpk),       &
+         &      xnanofer(A2D(0),jpk), xdiatfer(A2D(0),jpk),       &
+         &      xlimphy (A2D(0),jpk), xlimdia (A2D(0),jpk),       &
+         &      xlimnfe (A2D(0),jpk), xlimdfe (A2D(0),jpk),       &
+         &      xlimbac (A2D(0),jpk), xlimbacl(A2D(0),jpk),       &
+         &      concnfe (A2D(0),jpk), concdfe (A2D(0),jpk),       &
+         &      xqfuncfecn(A2D(0),jpk), xqfuncfecd(A2D(0),jpk),   &
+         &      xlimsi  (A2D(0),jpk), STAT=p4z_lim_alloc )
       !
       IF( p4z_lim_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_lim_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zlys.F90 b/src/TOP/PISCES/P4Z/p4zlys.F90
index 007835e1..61db35c3 100644
--- a/src/TOP/PISCES/P4Z/p4zlys.F90
+++ b/src/TOP/PISCES/P4Z/p4zlys.F90
@@ -32,7 +32,8 @@ MODULE p4zlys
    REAL(wp), PUBLIC ::   kdca   !: diss. rate constant calcite
    REAL(wp), PUBLIC ::   nca    !: order of reaction for calcite dissolution
 
-   INTEGER  ::   rmtss              ! number of seconds per month 
+   INTEGER  :: rmtss              ! number of seconds per month 
+   LOGICAL  :: l_dia
 
    !! * Module variables
    REAL(wp) :: calcon = 1.03E-2           !: mean calcite concentration [Ca2+]  in sea water [mole/kg solution]
@@ -63,23 +64,36 @@ CONTAINS
       INTEGER, INTENT(in)  ::  Kbb, Krhs ! time level indices
       !
       INTEGER  ::   ji, jj, jk, jn
-      REAL(wp) ::   zdispot, zrhd, zcalcon
+      REAL(wp) ::   zdispot, zrhd, zcalcon, ztra
       REAL(wp) ::   zomegaca, zexcess, zexcess0, zkd
       CHARACTER (len=25) ::   charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zco3, zcaldiss, zhinit, zhi, zco3sat
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zhinit, zhi, zco3
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)  :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )  CALL timing_start('p4z_lys')
       !
-
-      zhinit  (:,:,:) = hi(:,:,:) / ( rhd(:,:,:) + 1._wp )
+     IF( kt == nittrc000 )  &
+           & l_dia = iom_use( "PH" ) .OR. iom_use( "CO3" ) .OR. iom_use( "CO3sat" ) .OR. iom_use( "DCAL" )
+
+      IF( l_dia )   THEN                  !* Save ta and sa trends
+         ALLOCATE( zw3d(A2D(0),jpk) )    ;    zw3d(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zw3d(ji,jj,jk) = tr(ji,jj,jk,jpdic,Krhs)  ! we be used to compute DCAL if needed
+         END_3D
+      ENDIF
+      !
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         zhinit(ji,jj,jk) = hi(ji,jj,jk) / ( rhd(ji,jj,jk) + 1._wp )
+      END_3D
       !
       !     -------------------------------------------
       !     COMPUTE [CO3--] and [H+] CONCENTRATIONS
       !     -------------------------------------------
 
       CALL solve_at_general( zhinit, zhi, Kbb )
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zco3(ji,jj,jk) = tr(ji,jj,jk,jpdic,Kbb) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2   &
             &             + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn )
          hi  (ji,jj,jk) = zhi(ji,jj,jk) * ( rhd(ji,jj,jk) + 1._wp )
@@ -91,14 +105,13 @@ CONTAINS
       !        MGCO3)
       !     ---------------------------------------------------------
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
 
          ! DEVIATION OF [CO3--] FROM SATURATION VALUE
          ! Salinity dependance in zomegaca and divide by rhd to have good units
          zcalcon  = calcon * ( salinprac(ji,jj,jk) / 35._wp )
          zrhd    = rhd(ji,jj,jk) + 1._wp
          zomegaca = ( zcalcon * zco3(ji,jj,jk) ) / ( aksp(ji,jj,jk) * zrhd + rtrn )
-         zco3sat(ji,jj,jk) = aksp(ji,jj,jk) * zrhd / ( zcalcon + rtrn )
 
          ! SET DEGREE OF UNDER-/SUPERSATURATION
          excess(ji,jj,jk) = 1._wp - zomegaca
@@ -116,25 +129,42 @@ CONTAINS
 
         !  CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3],
         !       AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION
-        zcaldiss(ji,jj,jk)  = zdispot * rfact2 / rmtss ! calcite dissolution
+        ztra  = zdispot * rfact2 / rmtss ! calcite dissolution
         !
-        tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * zcaldiss(ji,jj,jk)
-        tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) -      zcaldiss(ji,jj,jk)
-        tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) +      zcaldiss(ji,jj,jk)
+        tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ztra
+        tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) -      ztra
+        tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) +      ztra
       END_3D
       !
 
-      IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         CALL iom_put( "PH" , -1. * LOG10( MAX( hi(:,:,:), rtrn ) ) * tmask(:,:,:) )
-         IF( iom_use( "CO3" ) ) THEN
-            zco3(:,:,jpk) = 0.    ; CALL iom_put( "CO3"   , zco3(:,:,:)     * 1.e+3           * tmask(:,:,:) )
+      IF( l_dia .AND. knt == nrdttrc ) THEN
+         IF( iom_use( "DCAL" ) ) THEN  ! calcite dissolution
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zw3d(ji,jj,jk) = ( tr(ji,jj,jk,jpdic,Krhs) - zw3d(ji,jj,jk) ) * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+             END_3D
+             CALL iom_put( "DCAL", zw3d ) 
+         ENDIF              
+         IF( iom_use( "PH" ) ) THEN
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zw3d(ji,jj,jk) = -1. * LOG10( MAX( hi(ji,jj,jk), rtrn ) ) * tmask(ji,jj,jk) 
+            END_3D
+            CALL iom_put( "PH" , zw3d )
          ENDIF
-         IF( iom_use( "CO3sat" ) ) THEN
-           zco3sat(:,:,jpk) = 0.  ; CALL iom_put( "CO3sat", zco3sat(:,:,:)  * 1.e+3           * tmask(:,:,:) )
+         IF( iom_use( "CO3" ) ) THEN  ! bicarbonate 
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zw3d(ji,jj,jk) = zco3(ji,jj,jk) * 1.e+3 * tmask(ji,jj,jk) 
+             END_3D
+             CALL iom_put( "CO3", zw3d ) 
          ENDIF
-         IF( iom_use( "DCAL" ) ) THEN
-           zcaldiss(:,:,jpk) = 0. ; CALL iom_put( "DCAL"  , zcaldiss(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF              
+         IF( iom_use( "CO3sat" ) ) THEN  ! calcite saturation
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zrhd  = rhd(ji,jj,jk) + 1._wp
+                zw3d(ji,jj,jk) = aksp(ji,jj,jk) * zrhd / ( calcon * ( salinprac(ji,jj,jk) / 35._wp ) + rtrn )  &
+                 &            * 1.e+3 * tmask(ji,jj,jk)
+             END_3D
+             CALL iom_put( "CO3sat", zw3d ) 
+         ENDIF
+         DEALLOCATE( zw3d )
       ENDIF
       !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -185,6 +215,9 @@ CONTAINS
       ! Number of seconds per month 
       rmtss =  nyear_len(1) * rday / raamo
       !
+      ! CE not really needed ; tempory, shoub be removed when quotan( A2D(0),jpk )
+      excess(:,:,:) = 0._wp
+      !
    END SUBROUTINE p4z_lys_init
 
    !!======================================================================
diff --git a/src/TOP/PISCES/P4Z/p4zmeso.F90 b/src/TOP/PISCES/P4Z/p4zmeso.F90
index 0033e0b8..d13609af 100644
--- a/src/TOP/PISCES/P4Z/p4zmeso.F90
+++ b/src/TOP/PISCES/P4Z/p4zmeso.F90
@@ -52,6 +52,7 @@ MODULE p4zmeso
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth
    INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth
 
+   LOGICAL          :: l_dia_fezoo2, l_dia_graz2, l_dia_lprodz2
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -89,16 +90,30 @@ CONTAINS
       REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep
       REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick 
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigbsi
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zgrazing2, zfezoo2, zzligprod2, zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_meso')
       !
-      zgrazing(:,:,:) = 0._wp   ;  zgrapoc(:,:,:) = 0._wp
-      zfezoo2 (:,:,:) = 0._wp   ;  zgrarem(:,:,:) = 0._wp
+      IF( kt == nittrc000 )  THEN
+         l_dia_graz2   = iom_use( "GRAZ2" )
+         l_dia_fezoo2  = iom_use( "FEZOO2" )
+         l_dia_lprodz2 = ln_ligand .AND. iom_use( "LPRODZ2" )
+      ENDIF
+      IF( l_dia_lprodz2 ) THEN
+         ALLOCATE( zzligprod2(A2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zzligprod2(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_graz2 ) THEN
+         ALLOCATE( zgrazing2(A2D(0),jpk) )
+      ENDIF
+      !
+      zgrapoc(:,:,:) = 0._wp    ;  zgrarem(:,:,:) = 0._wp
       zgraref (:,:,:) = 0._wp   ;  zgrapof(:,:,:) = 0._wp
       zgrabsi (:,:,:) = 0._wp
       !
@@ -108,7 +123,7 @@ CONTAINS
       ! ---------------------------------------------
       IF (ln_dvm_meso) CALL p4z_meso_depmig( Kbb, Kmm )
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompam   = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - 1.e-9 ), 0.e0 )
          zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
 
@@ -210,6 +225,7 @@ CONTAINS
          zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
          !
          zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg
+
          ! Compute the proportion of filter feeders. It is assumed steady state.
          ! ---------------------------------------------------------------------  
          zproport  = 0._wp
@@ -247,14 +263,13 @@ CONTAINS
 
 
          ! Total ingestion rates in C, N, Fe
-         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg
+         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg  ! grazing by mesozooplankton
+         IF( l_dia_graz2 ) zgrazing2(ji,jj,jk) = zgraztotc
+
          zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk)   &
          &   + zgrazpoc + zgrazffep + zgrazffeg
          zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg
 
-         ! Total grazing ( grazing by microzoo is already computed in p4zmicro )
-         zgrazing(ji,jj,jk) = zgraztotc
-
          ! Mesozooplankton efficiency. 
          ! We adopt a formulation proposed by Mitra et al. (2007)
          ! The gross growth efficiency is controled by the most limiting nutrient.
@@ -345,7 +360,7 @@ CONTAINS
         ! This fraction is sumed over the euphotic zone and is removed from 
         ! the fluxes driven by mesozooplankton in the euphotic zone.
         ! --------------------------------------------------------------------
-        DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
+        DO_3D( 0, 0, 0, 0, 1, jpk)
             zmigreltime = (1. - strn(ji,jj))
             zmigthick   = (1. - zmigreltime ) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
             IF ( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN
@@ -366,7 +381,7 @@ CONTAINS
          ! The inorganic and organic fluxes induced by migrating organisms are added at the 
          ! the migration depth (corresponding indice is set by kmig)
          ! --------------------------------------------------------------------------------
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             IF( tmask(ji,jj,1) == 1.) THEN
                jkt = kmig(ji,jj)
                zdep = 1. / e3t(ji,jj,jkt,Kmm)
@@ -387,7 +402,7 @@ CONTAINS
       !   Update the arrays TRA which contain the biological sources and sinks
       !   This only concerns the variables which are affected by DVM (inorganic 
       !   nutrients, DOC agands, and particulate organic carbon). 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
+      DO_3D( 0, 0, 0, 0, 1, jpk)
          tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarem(ji,jj,jk) * sigma2
          tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarem(ji,jj,jk) * sigma2
          tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 )
@@ -397,7 +412,6 @@ CONTAINS
          !
          tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) * sigma2
          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk)
-         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
          tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) * sigma2
          tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarem(ji,jj,jk) * sigma2             
          tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk)
@@ -408,11 +422,45 @@ CONTAINS
       !
       ! Write the output
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-        CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production 
-        CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo
-        CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-        IF( ln_ligand ) &
-         & CALL iom_put( "LPRODZ2", zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  )
+        !
+        IF( iom_use ( "PCAL" ) ) THEN   ! Calcite production
+            ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zw3d(ji,jj,jk) = prodcal(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+            END_3D
+          CALL iom_put( "PCAL", zw3d )
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        !
+        IF( l_dia_graz2 ) THEN  !   Total grazing of phyto by zooplankton
+            zgrazing2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zgrazing2(ji,jj,jk) =  zgrazing2(ji,jj,jk) *  1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in mol/m2/s
+            END_3D
+            CALL iom_put( "GRAZ2" , zgrazing2 )
+            DEALLOCATE( zgrazing2 )
+        ENDIF
+        !
+        IF( l_dia_fezoo2 ) THEN
+            ALLOCATE( zfezoo2(A2D(0),jpk) )   ;     zfezoo2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfezoo2(ji,jj,jk) =  zgraref(ji,jj,jk) * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "FEZOO2", zfezoo2 )
+           DEALLOCATE( zfezoo2 )
+        ENDIF
+        !
+        IF( l_dia_lprodz2 ) THEN
+            zzligprod2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zzligprod2(ji,jj,jk) = ( tr(ji,jj,jk,jplgw,Krhs) - zzligprod2(ji,jj,jk) ) &
+                   &                * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "LPRODZ2", zzligprod2 )
+           DEALLOCATE( zzligprod2 )
+        ENDIF
+        !
       ENDIF
       !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -502,7 +550,7 @@ CONTAINS
       INTEGER  :: ji, jj, jk
       !
       REAL(wp) :: ztotchl, z1dep
-      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
+      REAL(wp), DIMENSION(A2D(0)) :: oxymoy, tempmoy, zdepmoy
 
       !!---------------------------------------------------------------------
       !
@@ -517,7 +565,7 @@ CONTAINS
       ! Compute the averaged values of oxygen, temperature over the domain 
       ! 150m to 500 m depth.
       ! ------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
+      DO_3D( 0, 0, 0, 0, 1, jpk)
          IF( tmask(ji,jj,jk) == 1.) THEN
             IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN
                oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm)
@@ -530,7 +578,7 @@ CONTAINS
       ! Compute the difference between surface values and the mean values in the mesopelagic
       ! domain
       ! ------------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          z1dep = 1. / ( zdepmoy(ji,jj) + rtrn )
          oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep
          tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep
@@ -539,7 +587,7 @@ CONTAINS
       ! Computation of the migration depth based on the parameterization of 
       ! Bianchi et al. (2013)
       ! -------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tmask(ji,jj,1) == 1. ) THEN
             ztotchl = ( tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6
             depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
@@ -548,7 +596,7 @@ CONTAINS
       ! 
       ! Computation of the corresponding jk indice 
       ! ------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN
              kmig(ji,jj) = jk
           ENDIF
@@ -560,7 +608,7 @@ CONTAINS
       ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
       ! that it falls above the OMZ
       ! -----------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN
             DO jk = kmig(ji,jj),1,-1
                IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN
@@ -580,7 +628,7 @@ CONTAINS
       !!                     ***  ROUTINE p4z_meso_alloc  ***
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc  )
+      ALLOCATE( depmig(A2D(0)), kmig(A2D(0)), STAT= p4z_meso_alloc  )
       !
       IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zmicro.F90 b/src/TOP/PISCES/P4Z/p4zmicro.F90
index f91b04d7..a18a41e3 100644
--- a/src/TOP/PISCES/P4Z/p4zmicro.F90
+++ b/src/TOP/PISCES/P4Z/p4zmicro.F90
@@ -44,6 +44,8 @@ MODULE p4zmicro
    REAL(wp), PUBLIC ::   xsigma      !: Width of the grazing window
    REAL(wp), PUBLIC ::   xsigmadel   !: Maximum additional width of the grazing window at low food density 
 
+   LOGICAL          :: l_dia_fezoo, l_dia_graz1, l_dia_lprodz
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -78,20 +80,35 @@ CONTAINS
       REAL(wp) :: zrespz, ztortz, zgrasratf, zgrasratn
       REAL(wp) :: zgraznc, zgrazpoc, zgrazdc, zgrazpof, zgrazdf, zgraznf
       REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmptot, zproport
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zzligprod
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zgrazing, zfezoo, zzligprod
       CHARACTER (len=25) :: charout
 
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_micro')
       !
-      IF (ln_ligand) THEN
-         ALLOCATE( zzligprod(jpi,jpj,jpk) )
-         zzligprod(:,:,:) = 0._wp
+      IF( kt == nittrc000 )  THEN
+         l_dia_graz1  = iom_use( "GRAZ1" )
+         l_dia_fezoo  = iom_use( "FEZOO" )
+         l_dia_lprodz = ln_ligand .AND. iom_use( "LPRODZ" )
+      ENDIF
+      IF( l_dia_lprodz ) THEN
+         ALLOCATE( zzligprod(A2D(0),jpk) ) 
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zzligprod(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_fezoo ) THEN
+         ALLOCATE( zfezoo(A2D(0),jpk) ) 
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zfezoo(ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_graz1 ) THEN
+         ALLOCATE( zgrazing(A2D(0),jpk) ) 
       ENDIF
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 )
          zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz
 
@@ -170,14 +187,12 @@ CONTAINS
          zgrazdf   = zgrazdc  * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn)
          !
          ! Total ingestion rate in C, Fe, N units
-         zgraztotc = zgraznc + zgrazpoc + zgrazdc
+         zgraztotc = zgraznc + zgrazpoc + zgrazdc   ! grazing by microzooplankton
+         IF( l_dia_graz1 )   zgrazing(ji,jj,jk) = zgraztotc
+
          zgraztotf = zgraznf + zgrazdf  + zgrazpof 
          zgraztotn = zgraznc * quotan(ji,jj,jk) + zgrazpoc + zgrazdc * quotad(ji,jj,jk)
 
-         ! Grazing by microzooplankton
-         zgrazing(ji,jj,jk) = zgraztotc
-
-
          ! Microzooplankton efficiency. 
          ! We adopt a formulation proposed by Mitra et al. (2007)
          ! The gross growth efficiency is controled by the most limiting nutrient.
@@ -215,12 +230,10 @@ CONTAINS
          !
          IF( ln_ligand ) THEN
             tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + (zgrarem - zgrarsig) * ldocz
-            zzligprod(ji,jj,jk) = (zgrarem - zgrarsig) * ldocz
          ENDIF
          !
          tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarsig
          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgrafer
-         zfezoo(ji,jj,jk)    = zgrafer
          tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zgrapoc
          prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + zgrapoc
          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zgraztotf * unass
@@ -257,15 +270,36 @@ CONTAINS
       END_3D
       !
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-        IF( iom_use("GRAZ1") ) THEN  !   Total grazing of phyto by zooplankton
-           zgrazing(:,:,jpk) = 0._wp   ; CALL iom_put( "GRAZ1" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) 
-         ENDIF
-         IF( iom_use("FEZOO") ) THEN  
-           zfezoo (:,:,jpk) = 0._wp    ; CALL iom_put( "FEZOO", zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
-         IF( ln_ligand ) THEN
-            zzligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ", zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:))
-         ENDIF
+        !
+        IF( l_dia_graz1 ) THEN  !   Total grazing of phyto by zooplankton
+            zgrazing(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zgrazing(ji,jj,jk) = zgrazing(ji,jj,jk) *  1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in mol/m2/s
+            END_3D
+            CALL iom_put( "GRAZ1" , zgrazing )
+            DEALLOCATE( zgrazing )
+        ENDIF
+        !
+        IF( l_dia_fezoo ) THEN
+            zfezoo(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfezoo(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Krhs) - zfezoo(ji,jj,jk) ) &
+                  &              * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "FEZOO", zfezoo )
+           DEALLOCATE( zfezoo )
+        ENDIF
+        !
+        IF( l_dia_lprodz ) THEN
+            zzligprod(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zzligprod(ji,jj,jk) = ( tr(ji,jj,jk,jplgw,Krhs) - zzligprod(ji,jj,jk) ) &
+                   &                * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "LPRODZ", zzligprod )
+           DEALLOCATE( zzligprod )
+        ENDIF
+        !
       ENDIF
       !
       IF(sn_cfctl%l_prttrc) THEN      ! print mean trends (used for debugging)
diff --git a/src/TOP/PISCES/P4Z/p4zmort.F90 b/src/TOP/PISCES/P4Z/p4zmort.F90
index 5a32dd99..3c3903e7 100644
--- a/src/TOP/PISCES/P4Z/p4zmort.F90
+++ b/src/TOP/PISCES/P4Z/p4zmort.F90
@@ -74,7 +74,7 @@ CONTAINS
       IF( ln_timing )   CALL timing_start('p4z_mort_nano')
       !
       prodcal(:,:,:) = 0._wp   ! calcite production variable set to zero
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 )
 
          ! Quadratic mortality of nano due to aggregation during
@@ -152,7 +152,7 @@ CONTAINS
       ! This is due to the production of EPS by stressed cells
       ! -------------------------------------------------------------
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
 
          zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - 1e-9), 0. )
 
diff --git a/src/TOP/PISCES/P4Z/p4zopt.F90 b/src/TOP/PISCES/P4Z/p4zopt.F90
index 8daf2edf..8ff01e2c 100644
--- a/src/TOP/PISCES/P4Z/p4zopt.F90
+++ b/src/TOP/PISCES/P4Z/p4zopt.F90
@@ -36,7 +36,9 @@ MODULE p4zopt
    INTEGER  :: ntimes_par                ! number of time steps in a file
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   par_varsw      ! PAR fraction of shortwave
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ekb, ekg, ekr  ! wavelength (Red-Green-Blue)
-   
+ 
+   LOGICAL  :: l_dia_heup, l_dia_par 
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -63,21 +65,28 @@ CONTAINS
       INTEGER  ::   irgb
       REAL(wp) ::   zchl
       REAL(wp) ::   zc0 , zc1 , zc2, zc3, z1_dep
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zetmp5
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zqsr100, zqsr_corr
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpar, ze0, ze1, ze2, ze3
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zetmp5
+      REAL(wp), DIMENSION(A2D(0)    ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4
+      REAL(wp), DIMENSION(A2D(0)    ) :: zqsr100, zqsr_corr
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zpar, ze0, ze1, ze2, ze3
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zw2d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_opt')
 
+      IF( kt == nittrc000 )  THEN
+         l_dia_heup = iom_use( "Heup") 
+         l_dia_par  = iom_use( "PAR" ) 
+      ENDIF
+
       IF( knt == 1 .AND. ln_varpar )   CALL p4z_opt_sbc( kt )
 
       !     Initialisation of variables used to compute PAR
       !     -----------------------------------------------
-      ze1(:,:,:) = 0._wp
-      ze2(:,:,:) = 0._wp
-      ze3(:,:,:) = 0._wp
+!      ze1(:,:,:) = 0._wp
+!      ze2(:,:,:) = 0._wp
+!      ze3(:,:,:) = 0._wp
 
       !
       ! Attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue)
@@ -88,7 +97,7 @@ CONTAINS
       !
       ! Computation of the light attenuation parameters based on a 
       ! look-up table
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zchl =  ( tr(ji,jj,jk,jpnch,Kbb) + tr(ji,jj,jk,jpdch,Kbb) + rtrn ) * 1.e6
          IF( ln_p5z )   zchl = zchl + tr(ji,jj,jk,jppch,Kbb) * 1.e6
          zchl = MIN(  10. , MAX( 0.05, zchl )  )
@@ -116,36 +125,40 @@ CONTAINS
             ! not fully correct with LIM3 and SI3 but no information is 
             ! currently available to do a better job. SHould be improved in the 
             ! (near) future.
-            zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn )
+            DO_2D( 0, 0, 0, 0 )
+               zqsr_corr(ji,jj) = qsr_mean(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+            END_2D
             !
             CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 )
             !
             ! Used PAR is computed for each phytoplankton species
             ! etot_ndcy is PAR at level jk averaged over 24h.
             ! Due to their size, they have different light absorption characteristics
-            DO jk = 1, nksr
-               etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nksr )
+               etot_ndcy(ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk)
+            END_3D
             !
             ! SW over the ice free zone of the grid cell. This assumes that
             ! SW is zero below sea ice which is a very crude assumption that is 
             ! not fully correct with LIM3 and SI3 but no information is 
             ! currently available to do a better job. SHould be improved in the 
             ! (near) future.
-            zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
+            DO_2D( 0, 0, 0, 0 )
+               zqsr_corr(ji,jj) = qsr(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+            END_2D
             !
             CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 )
             !
             ! Total PAR computation at level jk that includes the diurnal cycle
-            DO jk = 1, nksr
-               etot (:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
-               enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)
-               ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nksr )
+               etot (ji,jj,jk) =         ze1(ji,jj,jk) +        ze2(ji,jj,jk) +        ze3(ji,jj,jk)
+               enano(ji,jj,jk) =  1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk)
+               ediat(ji,jj,jk) =  1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk)
+            END_3D
             IF( ln_p5z ) THEN
-               DO jk = 1, nksr
-                  epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
-               END DO
+               DO_3D( 0, 0, 0, 0, 1, nksr )
+                  epico(ji,jj,jk) =  1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk)
+               END_3D
             ENDIF
 
          ELSE ! No diurnal cycle in PISCES
@@ -157,22 +170,24 @@ CONTAINS
             ! not fully correct with LIM3 and SI3 but no information is 
             ! currently available to do a better job. SHould be improved in the 
             ! (near) future.
-            zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn )
+            DO_2D( 0, 0, 0, 0 )
+               zqsr_corr(ji,jj) = qsr_mean(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+            END_2D
             !
             CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 ) 
             !
             ! Used PAR is computed for each phytoplankton species
             ! etot_ndcy is PAR at level jk averaged over 24h.
             ! Due to their size, they have different light absorption characteristics
-            DO jk = 1, nksr      
-               etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
-               enano    (:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)
-               ediat    (:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nksr )
+               etot_ndcy(ji,jj,jk) =         ze1(ji,jj,jk) +        ze2(ji,jj,jk) +        ze3(ji,jj,jk)
+               enano    (ji,jj,jk) =  1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk)
+               ediat    (ji,jj,jk) =  1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk)
+            END_3D
             IF( ln_p5z ) THEN
-               DO jk = 1, nksr      
-                  epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
-               END DO
+               DO_3D( 0, 0, 0, 0, 1, nksr )
+                  epico(ji,jj,jk) =  1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk)
+               END_3D
             ENDIF
             !
             ! SW over the ice free zone of the grid cell. This assumes that
@@ -180,14 +195,16 @@ CONTAINS
             ! not fully correct with LIM3 and SI3 but no information is 
             ! currently available to do a better job. SHould be improved in the 
             ! (near) future.
-            zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
+            DO_2D( 0, 0, 0, 0 )
+               zqsr_corr(ji,jj) = qsr(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+            END_2D
             !
             CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3 ) 
             !
             ! Total PAR computation at level jk that includes the diurnal cycle
-            DO jk = 1, nksr      
-               etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nksr )
+               etot(ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk)
+            END_3D
          ENDIF
          !
       ELSE   ! no diurnal cycle
@@ -198,22 +215,24 @@ CONTAINS
          ! not fully correct with LIM3 and SI3 but no information is 
          ! currently available to do a better job. SHould be improved in the 
          ! (near) future.
-         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
+         DO_2D( 0, 0, 0, 0 )
+            zqsr_corr(ji,jj) = qsr(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+         END_2D
          !
          CALL p4z_opt_par( kt, Kmm, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100  ) 
          !
 
          ! Used PAR is computed for each phytoplankton species
          ! Due to their size, they have different light absorption characteristics
-         DO jk = 1, nksr      
-            etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)    ! Total PAR
-            enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)  ! Nanophytoplankton
-            ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)  ! Diatoms
-         END DO
+         DO_3D( 0, 0, 0, 0, 1, nksr )
+            etot (ji,jj,jk) =         ze1(ji,jj,jk) +        ze2(ji,jj,jk) +        ze3(ji,jj,jk)
+            enano(ji,jj,jk) =  1.85 * ze1(ji,jj,jk) + 0.69 * ze2(ji,jj,jk) + 0.46 * ze3(ji,jj,jk)
+            ediat(ji,jj,jk) =  1.62 * ze1(ji,jj,jk) + 0.74 * ze2(ji,jj,jk) + 0.63 * ze3(ji,jj,jk)
+         END_3D
          IF( ln_p5z ) THEN
-            DO jk = 1, nksr      
-              epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)  ! Picophytoplankton (PISCES-QUOTA)
-            END DO
+            DO_3D( 0, 0, 0, 0, 1, nksr )
+               epico(ji,jj,jk) =  1.94 * ze1(ji,jj,jk) + 0.66 * ze2(ji,jj,jk) + 0.4 * ze3(ji,jj,jk) ! Picophytoplankton (PISCES-QUOTA)
+            END_3D
          ENDIF
          etot_ndcy(:,:,:) =  etot(:,:,:) 
       ENDIF
@@ -224,10 +243,12 @@ CONTAINS
          !                                     !  ------------------------
          CALL p4z_opt_par( kt, Kmm, qsr, ze1, ze2, ze3, pe0=ze0 )
          !
-         etot3(:,:,1) =  qsr(:,:) * tmask(:,:,1)
-         DO jk = 2, nksr + 1
-            etot3(:,:,jk) =  ( ze0(:,:,jk) + ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) ) * tmask(:,:,jk)
-         END DO
+         DO_2D( 0, 0, 0, 0 )
+            etot3(ji,jj,1) =  qsr(ji,jj) * tmask(ji,jj,1)
+         END_2D
+         DO_3D( 0, 0, 0, 0, 2, nksr+1 )
+            etot3(ji,jj,jk) =  ( ze0(ji,jj,jk) + ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk) ) * tmask(ji,jj,jk)
+         END_3D
          !                                     !  ------------------------
       ENDIF
       
@@ -236,11 +257,13 @@ CONTAINS
       ! (1) The classical definition based on the relative threshold value
       ! (2) An alternative definition based on a absolute threshold value.
       ! -------------------------------------------------------------------
-      neln(:,:) = 1
-      heup   (:,:) = gdepw(:,:,2,Kmm)
-      heup_01(:,:) = gdepw(:,:,2,Kmm)
+      DO_2D( 0, 0, 0, 0 )
+         neln   (ji,jj) = 1
+         heup   (ji,jj) = gdepw(ji,jj,2,Kmm)
+         heup_01(ji,jj) = gdepw(ji,jj,2,Kmm)
+      END_2D
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksr)
+      DO_3D( 0, 0, 0, 0, 2, nksr)
         IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >=  zqsr100(ji,jj) )  THEN
            neln(ji,jj) = jk+1                    ! Euphotic level : 1rst T-level strictly below Euphotic layer
            !                                     ! nb: ensure the compatibility with nmld_trc definition in trd_mld_trc_zint
@@ -261,7 +284,7 @@ CONTAINS
       zetmp1 (:,:)   = 0.e0
       zetmp2 (:,:)   = 0.e0
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+      DO_3D( 0, 0, 0, 0, 1, nksr)
          IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
             zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Actual PAR for remineralisation
             zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Par averaged over 24h for production
@@ -272,7 +295,7 @@ CONTAINS
       emoy(:,:,:) = etot(:,:,:)       ! remineralisation
       zpar(:,:,:) = etot_ndcy(:,:,:)  ! diagnostic : PAR with no diurnal cycle 
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+      DO_3D( 0, 0, 0, 0, 1, nksr)
          IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
             z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
             emoy (ji,jj,jk) = zetmp1(ji,jj) * z1_dep
@@ -286,7 +309,7 @@ CONTAINS
       zetmp3 (:,:)   = 0.e0
       zetmp4 (:,:)   = 0.e0
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+      DO_3D( 0, 0, 0, 0, 1, nksr)
          IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN
             zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Nanophytoplankton
             zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * e3t(ji,jj,jk,Kmm) ! Diatoms
@@ -296,7 +319,7 @@ CONTAINS
       enanom(:,:,:) = enano(:,:,:)
       ediatm(:,:,:) = ediat(:,:,:)
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+      DO_3D( 0, 0, 0, 0, 1, nksr)
          IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
             z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
             enanom(ji,jj,jk) = zetmp3(ji,jj) * z1_dep
@@ -306,8 +329,8 @@ CONTAINS
       !
       IF( ln_p5z ) THEN
          ! Picophytoplankton when using PISCES-QUOTA
-         ALLOCATE( zetmp5(jpi,jpj) )  ;   zetmp5 (:,:) = 0.e0
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+         ALLOCATE( zetmp5(A2D(0)) )  ;   zetmp5 (:,:) = 0.e0
+         DO_3D( 0, 0, 0, 0, 1, nksr)
             IF( gdepw(ji,jj,jk+1,Kmm) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN
                zetmp5(ji,jj)  = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t(ji,jj,jk,Kmm)
             ENDIF
@@ -315,7 +338,7 @@ CONTAINS
          !
          epicom(:,:,:) = epico(:,:,:)
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr)
+         DO_3D( 0, 0, 0, 0, 1, nksr)
             IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
                z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
                epicom(ji,jj,jk) = zetmp5(ji,jj) * z1_dep
@@ -325,10 +348,24 @@ CONTAINS
       ENDIF
       !
       IF( lk_iomput .AND.  knt == nrdttrc ) THEN
-         CALL iom_put( "Heup" , heup(:,:  ) * tmask(:,:,1) )  ! euphotic layer deptht
-         IF( iom_use( "PAR" ) ) THEN
-            zpar(:,:,1) = zpar(:,:,1) * ( 1._wp - fr_i(:,:) )
-            CALL iom_put( "PAR", zpar(:,:,:) * tmask(:,:,:) )  ! Photosynthetically Available Radiation
+         IF( l_dia_heup ) THEN
+           ALLOCATE( zw2d(A2D(0)) ) 
+           DO_2D( 0, 0, 0, 0 )
+             zw2d(ji,jj) = heup(ji,jj) * tmask(ji,jj,1)
+           END_2D
+           CALL iom_put( "Heup", zw2d )  ! Euphotic layer depth
+           DEALLOCATE( zw2d ) 
+        ENDIF
+        IF( l_dia_par ) THEN
+           ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+           DO_2D( 0, 0, 0, 0 )
+              zw3d(ji,jj,1) = zpar(ji,jj,1) * ( 1._wp - fr_i(ji,jj) ) * tmask(ji,jj,1)
+           END_2D
+           DO_3D( 0, 0, 0, 0, 2, jpkm1)
+              zw3d(ji,jj,jk) = zpar(ji,jj,jk) * tmask(ji,jj,jk)
+           END_3D
+           CALL iom_put( "PAR", zw3d )  ! Photosynthetically Available Radiation
+           DEALLOCATE( zw3d ) 
          ENDIF
       ENDIF
       !
@@ -345,15 +382,15 @@ CONTAINS
       !!                for a given shortwave radiation
       !!
       !!----------------------------------------------------------------------
-      INTEGER                         , INTENT(in)              ::   kt                ! ocean time-step
-      INTEGER                         , INTENT(in)              ::   Kmm               ! ocean time-index
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   )           ::   pqsr              ! shortwave
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pe1 , pe2 , pe3   ! PAR ( R-G-B)
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout), OPTIONAL ::   pe0               !
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(  out), OPTIONAL ::   pqsr100           !
+      INTEGER                        , INTENT(in)              ::   kt                ! ocean time-step
+      INTEGER                        , INTENT(in)              ::   Kmm               ! ocean time-index
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in   )           ::   pqsr              ! shortwave
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(inout)           ::   pe1 , pe2 , pe3   ! PAR ( R-G-B)
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(inout), OPTIONAL ::   pe0               !
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(  out), OPTIONAL ::   pqsr100           !
       !
       INTEGER    ::   ji, jj, jk     ! dummy loop indices
-      REAL(wp), DIMENSION(jpi,jpj) ::  zqsr   ! shortwave
+      REAL(wp), DIMENSION(A2D(0)) ::  zqsr   ! shortwave
       !!----------------------------------------------------------------------
 
       !  Real shortwave
@@ -371,7 +408,7 @@ CONTAINS
          pe2(:,:,1) = zqsr(:,:)
          pe3(:,:,1) = zqsr(:,:)
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksr + 1)
+         DO_3D( 0, 0, 0, 0, 2, nksr + 1)
             pe0(ji,jj,jk) = pe0(ji,jj,jk-1) * EXP( -e3t(ji,jj,jk-1,Kmm) * xsi0r )
             pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        )
             pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        )
@@ -384,7 +421,7 @@ CONTAINS
         pe2(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekg(:,:,1) )
         pe3(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekr(:,:,1) )
         !
-        DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksr)
+        DO_3D( 0, 0, 0, 0, 2, nksr)
            pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -0.5 * ( ekb(ji,jj,jk-1) + ekb(ji,jj,jk) ) )
            pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -0.5 * ( ekg(ji,jj,jk-1) + ekg(ji,jj,jk) ) )
            pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -0.5 * ( ekr(ji,jj,jk-1) + ekr(ji,jj,jk) ) )
@@ -419,7 +456,9 @@ CONTAINS
       IF( ln_varpar ) THEN
          IF( kt == nit000 .OR. ( kt /= nit000 .AND. ntimes_par > 1 ) ) THEN
             CALL fld_read( kt, 1, sf_par )
-            par_varsw(:,:) = ( sf_par(1)%fnow(:,:,1) ) / 3.0
+            DO_2D( 0, 0, 0, 0 )
+               par_varsw(ji,jj) = ( sf_par(1)%fnow(ji,jj,1) ) / 3.0
+            END_2D
          ENDIF
       ENDIF
       !
@@ -479,7 +518,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*)
          IF(lwp) WRITE(numout,*) '   ==>>>   initialize variable par fraction (ln_varpar=T)'
          !
-         ALLOCATE( par_varsw(jpi,jpj) )
+         ALLOCATE( par_varsw(A2D(0)) )
          !
          ALLOCATE( sf_par(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst
          IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_opt_init: unable to allocate sf_par structure' )
@@ -510,8 +549,7 @@ CONTAINS
       !!                     ***  ROUTINE p4z_opt_alloc  ***
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( ekb(jpi,jpj,jpk), ekr(jpi,jpj,jpk),  &
-                ekg(jpi,jpj,jpk), STAT= p4z_opt_alloc  ) 
+      ALLOCATE( ekb(A2D(0),jpk), ekr(A2D(0),jpk), ekg(A2D(0),jpk), STAT= p4z_opt_alloc  ) 
       !
       IF( p4z_opt_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_opt_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zpoc.F90 b/src/TOP/PISCES/P4Z/p4zpoc.F90
index 54b8f202..823d416a 100644
--- a/src/TOP/PISCES/P4Z/p4zpoc.F90
+++ b/src/TOP/PISCES/P4Z/p4zpoc.F90
@@ -38,6 +38,8 @@ MODULE p4zpoc
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   alphan, reminp   !: variable lability of POC and initial distribution
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   alphap           !: lability distribution of small particles
 
+   REAL(wp )   :: solgoc
+   LOGICAL     :: l_dia_remin_part
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -70,40 +72,32 @@ CONTAINS
       INTEGER  ::   ji, jj, jk, jn
       REAL(wp) ::   zremip, zremig, zdep, zorem, zorem2, zofer
       REAL(wp) ::   zopon, zopop, zopoc, zopoc2, zopon2, zopop2
-      REAL(wp) ::   zsizek, zsizek1, alphat, remint, solgoc, zpoc
+      REAL(wp) ::   zsizek, zsizek1, alphat, remint, zpoc, zremipart
       REAL(wp) ::   zofer2, zofer3
-      REAL(wp) ::   zrfact2
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj  )   :: totprod, totthick, totcons 
-      REAL(wp), DIMENSION(jpi,jpj,jpk)   :: zremipoc, zremigoc, zorem3, ztremint, zfolimi
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jcpoc) :: alphag
+      REAL(wp), DIMENSION(A2D(0)  )   :: totprod, totthick, totcons 
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zorem3, ztremint
+      REAL(wp), DIMENSION(A2D(0),jpk,jcpoc) :: alphag
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zremipoc, zremigoc, zfolimi
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )  CALL timing_start('p4z_poc')
       !
-      ! Initialization of local variables
-      ! ---------------------------------
-
-      ! Here we compute the GOC -> POC rate due to the shrinking
-      ! of the fecal pellets/aggregates as a result of bacterial
-      ! solubilization
-      ! This is based on a fractal dimension of 2.56 and a spectral
-      ! slope of -3.6 (identical to what is used in p4zsink to compute
-      ! aggregation
-      solgoc = 0.04/ 2.56 * 1./ ( 1.-50**(-0.04) )
-
+      IF( kt == nittrc000 ) & 
+          &      l_dia_remin_part = iom_use( "REMINP" ) .OR. iom_use( "REMING" ) .OR. iom_use( "REMINF" )
+      !
+     IF( l_dia_remin_part ) THEN
+         ALLOCATE( zfolimi (A2D(0),jpk) )  ;  zfolimi (A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zfolimi (ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs)
+         END_3D
+     ENDIF
       ! Initialisation of temporary arrays
-      IF( ln_p4z ) THEN
-         zremipoc(:,:,:) = xremip
-         zremigoc(:,:,:) = xremip
-      ELSE    ! ln_p5z
-         zremipoc(:,:,:) = xremipc
-         zremigoc(:,:,:) = xremipc
+      IF( ln_p4z ) THEN   ;   ztremint(:,:,:) = xremip
+      ELSE                ;   ztremint(:,:,:) = xremipc ! ln_p5z
       ENDIF
       zorem3(:,:,:)   = 0.
       orem  (:,:,:)   = 0.
-      ztremint(:,:,:) = 0.
-      zfolimi (:,:,:) = 0.
 
       ! Initialisation of the lability distributions that are set to 
       ! the distribution of newly produced organic particles
@@ -117,8 +111,7 @@ CONTAINS
      ! lability class is specified in the namelist, this is equivalent to 
      ! a standard parameterisation with a constant lability
      ! -----------------------------------------------------------------------
-     ztremint(:,:,:) = zremigoc(:,:,:)
-     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+     DO_3D( 0, 0, 0, 0, 2, jpkm1)
         IF (tmask(ji,jj,jk) == 1.) THEN
           zdep = hmld(ji,jj)
           !
@@ -197,19 +190,23 @@ CONTAINS
           ENDIF
         ENDIF
      END_3D
-
-      IF( ln_p4z ) THEN   ;   zremigoc(:,:,:) = MIN( xremip , ztremint(:,:,:) )
-      ELSE                ;   zremigoc(:,:,:) = MIN( xremipc, ztremint(:,:,:) )
-      ENDIF
-
-      IF( ln_p4z ) THEN
+     !
+     IF( l_dia_remin_part ) THEN
+        ALLOCATE( zremigoc(A2D(0),jpk) )  ;  zremigoc(A2D(0),jpk) = 0._wp
+        DO_3D( 0, 0, 0, 0, 1, jpkm1)
+           zremigoc(ji,jj,jk) = tr(ji,jj,jk,jpdoc,Krhs)
+        END_3D
+     ENDIF
+     !
+     IF( ln_p4z ) THEN
          ! The standard PISCES part
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             ! POC degradation by bacterial activity. It is a function 
             ! of the mean lability and of temperature. This also includes
             ! shrinking of particles due to the bacterial activity
             ! -----------------------------------------------------------
-            zremig = zremigoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk)
+            zremipart = MIN( xremip, ztremint(ji,jj,jk) )
+            zremig = zremipart * xstep * tgfunc(ji,jj,jk)
             zorem2  = zremig * tr(ji,jj,jk,jpgoc,Kbb)
             orem(ji,jj,jk)      = zorem2
             zorem3(ji,jj,jk) = zremig * solgoc * tr(ji,jj,jk,jpgoc,Kbb)
@@ -223,15 +220,15 @@ CONTAINS
             tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zofer2 - zofer3
             tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem2
             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer2
-            zfolimi(ji,jj,jk)   = zofer2
          END_3D
       ELSE
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             ! POC degradation by bacterial activity. It is a function 
             ! of the mean lability and of temperature. This also includes
             ! shrinking of particles due to the bacterial activity
             ! --------------------------------------------------------
-            zremig = zremigoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk)
+            zremipart = MIN( xremipc, ztremint(ji,jj,jk) )
+            zremig = zremipart * xstep * tgfunc(ji,jj,jk)
             zopoc2 = zremig  * tr(ji,jj,jk,jpgoc,Kbb)
             orem(ji,jj,jk) = zopoc2
             zorem3(ji,jj,jk) = zremig * solgoc * tr(ji,jj,jk,jpgoc,Kbb)
@@ -252,7 +249,12 @@ CONTAINS
             tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zopon2 * (1. + solgoc)
             tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zopop2 * (1. + solgoc)
             tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zofer2 * (1. + solgoc)
-            zfolimi(ji,jj,jk)   = zofer2
+         END_3D
+      ENDIF
+      IF( l_dia_remin_part ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zremigoc(ji,jj,jk) = ( tr(ji,jj,jk,jpdoc,Krhs) - zremigoc(ji,jj,jk) ) / &
+                                 ( xstep * tgfunc(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) * tmask(ji,jj,jk) ! =zremipart
          END_3D
       ENDIF
 
@@ -274,7 +276,7 @@ CONTAINS
 
      ! intregrated production and consumption of POC in the mixed layer
      ! ----------------------------------------------------------------
-     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+     DO_3D( 0, 0, 0, 0, 1, jpkm1)
         zdep = hmld(ji,jj)
         IF (tmask(ji,jj,jk) == 1. .AND. gdept(ji,jj,jk,Kmm) <= zdep ) THEN
           totprod(ji,jj) = totprod(ji,jj) + prodpoc(ji,jj,jk) * e3t(ji,jj,jk,Kmm) * rday/ rfact2
@@ -289,8 +291,7 @@ CONTAINS
      ! layer, this spectrum is supposed to be uniform as a result of intense
      ! mixing.
      ! ---------------------------------------------------------------------
-     ztremint(:,:,:) = zremipoc(:,:,:)
-     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+     DO_3D( 0, 0, 0, 0, 1, jpkm1)
         IF (tmask(ji,jj,jk) == 1.) THEN
           zdep = hmld(ji,jj)
           alphat = 0.0
@@ -313,9 +314,6 @@ CONTAINS
         ENDIF
      END_3D
      !
-     IF( ln_p4z ) THEN   ;  zremipoc(:,:,:) = MIN( xremip , ztremint(:,:,:) )
-     ELSE                ;  zremipoc(:,:,:) = MIN( xremipc, ztremint(:,:,:) )
-     ENDIF
 
      ! The lability parameterization is used here. The code is here 
      ! almost identical to what is done for big particles. The only difference
@@ -323,7 +321,7 @@ CONTAINS
      ! that since we need the lability spectrum of GOC, GOC spectrum 
      ! should be determined before.
      ! -----------------------------------------------------------------------
-     DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1)
+     DO_3D( 0, 0, 0, 0, 2, jpkm1)
         IF (tmask(ji,jj,jk) == 1.) THEN
           zdep = hmld(ji,jj)
           IF( gdept(ji,jj,jk,Kmm) > zdep ) THEN
@@ -392,19 +390,22 @@ CONTAINS
         ENDIF
      END_3D
 
-     IF( ln_p4z ) THEN   ;   zremipoc(:,:,:) = MIN( xremip , ztremint(:,:,:) )
-     ELSE                ;   zremipoc(:,:,:) = MIN( xremipc, ztremint(:,:,:) )
+     IF( l_dia_remin_part ) THEN
+         ALLOCATE( zremipoc(A2D(0),jpk) )  ;  zremipoc(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zremipoc(ji,jj,jk) = tr(ji,jj,jk,jpdoc,Krhs)
+         END_3D
      ENDIF
-
      IF( ln_p4z ) THEN
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             IF (tmask(ji,jj,jk) == 1.) THEN
               ! POC disaggregation by turbulence and bacterial activity.It is a function
               ! of the mean lability and of temperature  
               ! --------------------------------------------------------
-              zremip          = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk)
-              zorem           = zremip * tr(ji,jj,jk,jppoc,Kbb)
-              zofer           = zremip * tr(ji,jj,jk,jpsfe,Kbb)
+              zremipart = MIN( xremip, ztremint(ji,jj,jk) )  
+              zremip = zremipart * xstep * tgfunc(ji,jj,jk)
+              zorem  = zremip * tr(ji,jj,jk,jppoc,Kbb)
+              zofer  = zremip * tr(ji,jj,jk,jpsfe,Kbb)
               
               ! Update of the TRA arrays
               tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zorem
@@ -412,15 +413,15 @@ CONTAINS
               tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer
               tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zorem
               tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zofer
-              zfolimi(ji,jj,jk)   = zfolimi(ji,jj,jk) + zofer
             ENDIF
          END_3D
      ELSE
-       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+       DO_3D( 0, 0, 0, 0, 1, jpkm1)
           ! POC disaggregation by turbulence and bacterial activity.It is a function
           ! of the mean lability and of temperature  
           !--------------------------------------------------------
-          zremip = zremipoc(ji,jj,jk) * xstep * tgfunc(ji,jj,jk)
+          zremipart = MIN( xremipc, ztremint(ji,jj,jk) )  
+          zremip = zremipart * xstep * tgfunc(ji,jj,jk)
           zopoc  = zremip * tr(ji,jj,jk,jppoc,Kbb)
           orem(ji,jj,jk)  = orem(ji,jj,jk) + zopoc
           zopon  = xremipn / xremipc * zremip * tr(ji,jj,jk,jppon,Kbb)
@@ -436,16 +437,22 @@ CONTAINS
           tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zopon 
           tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zopop 
           tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zofer 
-          zfolimi(ji,jj,jk)   = zfolimi(ji,jj,jk) + zofer
        END_3D
      ENDIF
+     IF( l_dia_remin_part ) THEN
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zremipoc(ji,jj,jk) = ( tr(ji,jj,jk,jpdoc,Krhs) - zremipoc(ji,jj,jk) ) / &
+                                 ( xstep * tgfunc(ji,jj,jk) * tr(ji,jj,jk,jppoc,Kbb) + rtrn ) * tmask(ji,jj,jk)
+            zfolimi (ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Krhs) - zfolimi (ji,jj,jk) ) * tmask(ji,jj,jk)
+         END_3D
+     ENDIF
 
-     IF( lk_iomput ) THEN
-        IF( knt == nrdttrc ) THEN
-          zrfact2 = 1.e3 * rfact2r
-          CALL iom_put( "REMINP" , zremipoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of small particles
-          CALL iom_put( "REMING" , zremigoc(:,:,:) * tmask(:,:,:) )  ! Remineralisation rate of large particles
-          CALL iom_put( "REMINF" , zfolimi(:,:,:)  * tmask(:,:,:)  * 1.e+9 * zrfact2 )  ! Remineralisation of biogenic particulate iron
+     IF( lk_iomput .AND. knt == nrdttrc ) THEN
+        IF( l_dia_remin_part ) THEN
+            CALL iom_put( "REMINP", zremipoc )  ! Remineralisation rate of small particles
+            CALL iom_put( "REMING", zremigoc ) ! Remineralisation rate of large particles
+            CALL iom_put( "REMINF", zfolimi * 1.e+9 * 1.e3 * rfact2r ) ! Remineralisation of biogenic particulate iron
+            DEALLOCATE ( zremipoc, zremigoc, zfolimi )  
         ENDIF
      ENDIF
 
@@ -508,7 +515,7 @@ CONTAINS
       ! Discretization along the lability space
       ! ---------------------------------------
       !
-      ALLOCATE( alphan(jcpoc) , reminp(jcpoc) , alphap(jpi,jpj,jpk,jcpoc) )
+      ALLOCATE( alphan(jcpoc) , reminp(jcpoc) , alphap(A2D(0),jpk,jcpoc) )
       !
       IF (jcpoc > 1) THEN  ! Case when more than one lability class is used
          !
@@ -543,6 +550,14 @@ CONTAINS
          alphap(:,:,:,jn) = alphan(jn)
       END DO
 
+      ! Here we compute the GOC -> POC rate due to the shrinking
+      ! of the fecal pellets/aggregates as a result of bacterial
+      ! solubilization
+      ! This is based on a fractal dimension of 2.56 and a spectral
+      ! slope of -3.6 (identical to what is used in p4zsink to compute
+      ! aggregation
+      solgoc = 0.04/ 2.56 * 1./ ( 1.-50**(-0.04) )
+
    END SUBROUTINE p4z_poc_init
 
 
diff --git a/src/TOP/PISCES/P4Z/p4zprod.F90 b/src/TOP/PISCES/P4Z/p4zprod.F90
index 59ca90cc..6a89fb6a 100644
--- a/src/TOP/PISCES/P4Z/p4zprod.F90
+++ b/src/TOP/PISCES/P4Z/p4zprod.F90
@@ -45,6 +45,8 @@ MODULE p4zprod
    REAL(wp) ::   texcretn   ! 1 - excretn 
    REAL(wp) ::   texcretd   ! 1 - excretd        
 
+   LOGICAL  :: l_dia_ppphy, l_dia_ppnew, l_dia_ppbfe, l_dia_ppbsi
+   LOGICAL  :: l_dia_mu, l_dia_light, l_dia_lprod
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -75,32 +77,38 @@ CONTAINS
       REAL(wp) ::   zproddoc, zprodsil, zprodfer, zprodlig
       REAL(wp) ::   zpislopen, zpisloped, zfact
       REAL(wp) ::   zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm
-      REAL(wp) ::   zprod, zval
+      REAL(wp) ::   zprod, zval, zmxl_fac, zmxl_chl, zpronewn, zpronewd
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt  
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln   
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprmax, zmxl
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zpislopeadn, zpislopeadd, zysopt  
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprdia, zprbio, zprchld, zprchln   
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprorcan, zprorcad
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprofed, zprofen
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_prod')
       !
-      !  Allocate temporary workspace
-      !
-      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed(:,:,:) = 0._wp
-      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp
-      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia(:,:,:) = 0._wp
-      zprbio  (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln(:,:,:) = 0._wp 
-      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
+      IF( kt == nittrc000 ) THEN
+         l_dia_ppphy = iom_use( "PPPHYN" ) .OR. iom_use( "PPPHYD" ) .OR. iom_use( "TPP"  ) 
+         l_dia_ppnew = iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) .OR. iom_use( "TPNEW")
+         l_dia_ppbfe = iom_use( "PFeN"   ) .OR. iom_use( "PFeD"   ) .OR. iom_use( "TPBFE") 
+         l_dia_ppbsi = iom_use( "PBSi"   ) 
+         l_dia_mu    = iom_use( "Mumax"  ) .OR. iom_use( "MuN"    ) .OR. iom_use( "MuD") 
+         l_dia_light = iom_use( "LNlight") .OR. iom_use( "LDlight") 
+         l_dia_lprod = ln_ligand .AND. ( iom_use( "LPRODP") .OR. iom_use( "LDETP") )
+      ENDIF
+
+      ! Initialize the local arrays
+      zprorcan(:,:,:) = 0._wp    ;    zprorcad(:,:,:) = 0._wp
+      zprofen (:,:,:) = 0._wp    ;    zprofed (:,:,:) = 0._wp
+      zprchld (:,:,:) = 0._wp    ;    zprchln (:,:,:) = 0._wp 
+      zprbio  (:,:,:) = 0._wp    ;    zprdia  (:,:,:) = 0._wp 
+      zmxl    (:,:,:) = 0._wp    ;    zysopt  (:,:,:) = 0._wp
 
       ! Computation of the maximimum production. Based on a Q10 description
-      ! of the thermal dependency
-      ! Parameters are taken from Bissinger et al. (2008)
-      zprmaxn(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:)
-      zprmaxd(:,:,:) = zprmaxn(:,:,:)
+      ! of the thermal dependency. Parameters are taken from Bissinger et al. (2008)
+      zprmax(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:)
 
       ! Intermittency is supposed to have a similar effect on production as 
       ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac. 
@@ -109,39 +117,39 @@ CONTAINS
       ! absolute light level definition of the euphotic zone
       ! ------------------------------------------------------------------------- 
       IF ( ln_p4z_dcyc ) THEN    ! Diurnal cycle in PISCES
-
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
                IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
                   zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
                ENDIF
-               zmxl_chl(ji,jj,jk) = zval / 24.
-               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
+               zmxl(ji,jj,jk) = zval
             ENDIF
          END_3D
- 
       ELSE ! No diurnal cycle in PISCES
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
                zval = MAX( 1., strn(ji,jj) )
                IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
                   zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
                ENDIF
-               zmxl_chl(ji,jj,jk) = zval / 24.
-               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
+               zmxl(ji,jj,jk) = zval
             ENDIF
          END_3D
-
       ENDIF
 
-      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
-      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+            zmxl_fac      = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) )
+            zprbio(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac
+            zprdia(ji,jj,jk) = zprmax(ji,jj,jk) * zmxl_fac
+         ENDIF
+      END_3D
 
       ! The formulation proposed by Geider et al. (1997) has been modified 
       ! to exclude the effect of nutrient limitation and temperature in the PI
       ! curve following Vichi et al. (2007)
       ! -----------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
             ztn         = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. )
             zadap       = xadap * ztn / ( 2.+ ztn )
@@ -160,18 +168,17 @@ CONTAINS
             ! Diatoms
             zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )   &
             &                   * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn)
-         ENDIF
-      END_3D
-
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+             !
              ! Computation of production function for Carbon
              ! Actual light levels are used here 
              ! ----------------------------------------------
+             zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) )
+             zmxl_chl = zmxl(ji,jj,jk) / 24.
+             !
              zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
-             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
+             &            * zmxl_fac * rday + rtrn)
              zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
-             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
+             &            * zmxl_fac * rday + rtrn)
              zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  )
              zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  )
 
@@ -180,28 +187,27 @@ CONTAINS
              !  is used here (acclimation is in general slower than 
              !  the characteristic time scales of vertical mixing)
              !  ------------------------------------------------------
-             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
-             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
-             zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
-             zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
+             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmax(ji,jj,jk) * zmxl_chl * rday + rtrn )
+             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmax(ji,jj,jk) * zmxl_chl * rday + rtrn )
+             zprchln(ji,jj,jk) = zprmax(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
+             zprchld(ji,jj,jk) = zprmax(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
          ENDIF
       END_3D
 
       !  Computation of a proxy of the N/C quota from nutrient limitation 
       !  and light limitation. Steady state is assumed to allow the computation
       !  ----------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
           zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   &
-          &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
+          &      * zprmax(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
           quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
           zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   &
-          &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
+          &      * zprmax(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
           quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
       END_3D
 
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
           IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
              ! Si/C of diatoms
              ! ------------------------
@@ -213,7 +219,7 @@ CONTAINS
              ! proposed by Gurney and Davidson (1999).
              ! -----------------------------------------------------------------------
             zlim  = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 )
-            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
+            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn )
             zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb)
             IF (gphit(ji,jj) < -30 ) THEN
               zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
@@ -234,20 +240,18 @@ CONTAINS
       ! Sea-ice effect on production
       ! No production is assumed below sea ice
       ! -------------------------------------- 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
          zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
       END_3D
 
       ! Computation of the various production  and nutrient uptake terms
       ! ---------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
             !  production terms for nanophyto. (C)
             zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2
 
-            !  New production (uptake of NO3)
-            zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
             !
             ! Size computation
             ! Size is made a function of the limitation of of phytoplankton growth
@@ -255,7 +259,7 @@ CONTAINS
             ! size at time step t+1 and is thus updated at the end of the 
             ! current time step
             ! --------------------------------------------------------------------
-            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn )
+            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn )
             zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
             sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) )
 
@@ -266,15 +270,13 @@ CONTAINS
             zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) )
             zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) )
             zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
-            zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
+            zprofen(ji,jj,jk) = zfecnm * zprmax(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
             &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  &
             &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   &
             &          * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2
             ! production terms of diatoms (C)
             zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2
 
-            ! New production (uptake of NO3)
-            zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
 
             ! Size computation
             ! Size is made a function of the limitation of of phytoplankton growth
@@ -282,7 +284,7 @@ CONTAINS
             ! size at time step t+1 and is thus updated at the end of the 
             ! current time step. 
             ! --------------------------------------------------------------------
-            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
+            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmax(ji,jj,jk) + rtrn )
             zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
             sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) )
 
@@ -293,7 +295,7 @@ CONTAINS
             zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) )
             zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) )
             zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
-            zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  &
+            zprofed(ji,jj,jk) = zfecdm * zprmax(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  &
             &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  &
             &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   &
             &          * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2
@@ -303,17 +305,18 @@ CONTAINS
       ! Computation of the chlorophyll production terms
       ! The parameterization is taken from Geider et al. (1997)
       ! -------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+            zmxl_chl = zmxl(ji,jj,jk)  / 24.
             !  production terms for nanophyto. ( chlorophyll )
-            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
+            znanotot = enanom(ji,jj,jk) / ( zmxl_chl + rtrn )
             zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
             zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
             zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / &
                                   & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn)
 
             !  production terms for diatoms ( chlorophyll )
-            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
+            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl + rtrn )
             zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
             zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
             zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / &
@@ -326,12 +329,16 @@ CONTAINS
       END_3D
 
       !   Update the arrays TRA which contain the biological sources and sinks
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+           ! New production (uptake of NO3)
+           zpronewn = zprorcan(ji,jj,jk) * xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
+           zpronewd = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
+           !
            zpptot   = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk)
-           zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk)
+           zpnewtot = zpronewn + zpronewd
            zpregtot = zpptot - zpnewtot
-           zprodsil  = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
+           zprodsil  = zprmax(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
            zproddoc  = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
            zprodfer  = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
            !
@@ -362,7 +369,7 @@ CONTAINS
      ! Shaked et al. (2020)
      ! -------------------------------------------------------------------------
      IF( ln_ligand ) THEN
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
               zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
               zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
@@ -373,41 +380,121 @@ CONTAINS
          END_3D
      ENDIF
 
-
-    ! Output of the diagnostics
     ! Total primary production per year
-    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
-         & tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
-
+    IF( l_dia_ppphy .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  THEN
+       ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+       DO_3D( 0, 0, 0, 0, 1, jpkm1)
+          zw3d(ji,jj,jk) = ( zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) ) * cvol(ji,jj,jk)
+       END_3D
+       tpp = glob_sum( 'p4zprod', zw3d )
+       DEALLOCATE ( zw3d )
+    ENDIF
+    
     IF( lk_iomput .AND.  knt == nrdttrc ) THEN
-       zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
        !
-       CALL iom_put( "PPPHYN"  , zprorcan(:,:,:) * zfact * tmask(:,:,:) )  ! primary production by nanophyto
-       CALL iom_put( "PPPHYD"  , zprorcad(:,:,:) * zfact * tmask(:,:,:)   ) ! primary production by diatomes
-       CALL iom_put( "PPNEWN"  , zpronewn(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by nanophyto
-       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes
-       CALL iom_put( "PBSi"    , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production
-       CALL iom_put( "PFeN"    , zprofen(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto
-       CALL iom_put( "PFeD"    , zprofed(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes
-       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN
-           ALLOCATE(  zpligprod(jpi,jpj,jpk) )
-           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:)
-           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) )
-           !
-           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) & 
-             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) )
-           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) )
-           DEALLOCATE(  zpligprod )
+       IF( l_dia_ppphy ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          ! primary production by nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PPPHYN", zw3d )  
+          ! primary production by diatomes
+          zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PPPHYD", zw3d )  
+          ! total primary production
+          zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) +  zprorcad(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "TPP", zw3d )  
+          CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
+       IF( l_dia_ppnew ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          ! new primary production by nano
+          zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) * xnanono3(A2D(0),1:jpkm1) &
+                &              / ( xnanono3(A2D(0),1:jpkm1) + xnanonh4(A2D(0),1:jpkm1) + rtrn ) ) &
+                &                  * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PPNEWN", zw3d )  
+          ! new primary production by diatomes
+          zw3d(A2D(0),1:jpkm1) = ( zprorcad(A2D(0),1:jpkm1) * xdiatno3(A2D(0),1:jpkm1) &
+                &              / ( xdiatno3(A2D(0),1:jpkm1) + xdiatnh4(A2D(0),1:jpkm1) + rtrn ) ) &
+                &                  * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PPNEWD", zw3d )  
+          ! total new production 
+          zw3d(A2D(0),1:jpkm1) = (    ( zprorcan(A2D(0),1:jpkm1) * xnanono3(A2D(0),1:jpkm1) &
+                &                   / ( xnanono3(A2D(0),1:jpkm1) + xnanonh4(A2D(0),1:jpkm1) + rtrn ) ) &
+                &                +    ( zprorcad(A2D(0),1:jpkm1) * xdiatno3(A2D(0),1:jpkm1) &
+                &                   / ( xdiatno3(A2D(0),1:jpkm1) + xdiatnh4(A2D(0),1:jpkm1) + rtrn ) )   )  &
+                &                  * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "TPNEW", zw3d )  
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
+       IF( l_dia_ppbsi ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          !  biogenic silica production
+          zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zysopt(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PBSi", zw3d )  
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
+       IF( l_dia_ppbfe ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          ! biogenic iron production by nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprofen(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PFeN", zw3d )  
+          ! biogenic iron production by diatomes
+          zw3d(A2D(0),1:jpkm1) = zprofed(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "PFeD", zw3d )  
+          ! total biogenic iron production
+          zw3d(A2D(0),1:jpkm1) = ( zprofen(A2D(0),1:jpkm1) +  zprofed(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "TPBFE", zw3d )  
+          DEALLOCATE ( zw3d ) 
        ENDIF
-       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate
-       CALL iom_put( "MuN"     , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto
-       CALL iom_put( "MuD"     , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms
-       CALL iom_put( "LNlight" , zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term
-       CALL iom_put( "LDlight" , zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)   )
-       CALL iom_put( "TPP"     , ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production
-       CALL iom_put( "TPNEW"   , ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production
-       CALL iom_put( "TPBFE"   , ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total biogenic iron production
-       CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
+       !
+       IF( l_dia_mu ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          zw3d(A2D(0),1:jpkm1) = zprmax(A2D(0),1:jpkm1)  * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "Mumax", zw3d )  
+          ! Realized growth rate for nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) * xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "MuN", zw3d )  
+          ! Realized growth rate for diatoms
+          zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) * xlimdia(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "MuD", zw3d )  
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
+       IF( l_dia_light ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          ! light limitation term for nano
+          zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) / ( zprmax(A2D(0),1:jpkm1) + rtrn ) * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "LNlight", zw3d )  
+          ! light limitation term for diatomes
+          zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) / ( zprmax(A2D(0),1:jpkm1) + rtrn ) * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "LDlight", zw3d )  
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
+       IF( l_dia_lprod ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp  
+          zw3d(A2D(0),1:jpkm1) = ( excretd * zprorcad(A2D(0),1:jpkm1) + excretn * zprorcan(A2D(0),1:jpkm1) ) &
+             &                   * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "LPRODP"  , zw3d * ldocp * 1e9 )
+          !
+          zw3d(A2D(0),1:jpkm1) = ( texcretn * zprofen(A2D(0),1:jpkm1) + texcretd * zprofed(A2D(0),1:jpkm1) ) & 
+            &                  * plig(A2D(0),1:jpkm1) / ( rtrn + plig(A2D(0),1:jpkm1) + 75.0 * (1.0 - plig(A2D(0),1:jpkm1) ) )  &
+            &                  * zfact * tmask(A2D(0),1:jpkm1) 
+          CALL iom_put( "LDETP"   , zw3d * lthet * 1e9 )
+          DEALLOCATE ( zw3d ) 
+       ENDIF
+       !
      ENDIF
 
      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -475,12 +562,11 @@ CONTAINS
       !
    END SUBROUTINE p4z_prod_init
 
-
    INTEGER FUNCTION p4z_prod_alloc()
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE p4z_prod_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
+      ALLOCATE( quotan(A2D(0),jpk), quotad(A2D(0),jpk), STAT = p4z_prod_alloc )
       !
       IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zrem.F90 b/src/TOP/PISCES/P4Z/p4zrem.F90
index c63a6e63..e63e5eec 100644
--- a/src/TOP/PISCES/P4Z/p4zrem.F90
+++ b/src/TOP/PISCES/P4Z/p4zrem.F90
@@ -43,6 +43,7 @@ MODULE p4zrem
 
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   denitr   !: denitrification array
 
+   LOGICAL         :: l_dia_remin, l_dia_febact, l_dia_bact, l_dia_denit
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -73,28 +74,45 @@ CONTAINS
       INTEGER  ::   ji, jj, jk
       REAL(wp) ::   zremik, zremikc, zremikn, zremikp, zsiremin, zfact 
       REAL(wp) ::   zsatur, zsatur2, znusil, znusil2, zdep, zdepmin, zfactdep
-      REAL(wp) ::   zbactfer, zonitr, zrfact2
+      REAL(wp) ::   zbactfer, zonitr
       REAL(wp) ::   zammonic, zoxyremc, zosil, ztem, zdenitnh4, zolimic
+      REAL(wp) ::   zfacsi, zdepeff
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdepbac, zolimi, zfacsi, zfacsib, zdepeff, zfebact
-      REAL(wp), DIMENSION(jpi,jpj    ) :: ztempbac
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zdepbac, zfacsib
+      REAL(wp), DIMENSION(A2D(0)    ) :: ztempbac
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zw3d, zolimi, zfebact
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_rem')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_remin  = iom_use( "REMIN" )
+         l_dia_febact = iom_use( "FEBACT" )
+         l_dia_denit  = iom_use( "DENIT" )
+         l_dia_bact   = iom_use( "BACT" )
+      ENDIF
+      IF( l_dia_remin ) THEN
+         ALLOCATE( zolimi(A2D(0),jpk) )    ;   zolimi(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zolimi(ji,jj,jk) = tr(ji,jj,jk,jpoxy,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_febact ) THEN
+         ALLOCATE( zfebact(A2D(0),jpk) )   ;   zfebact(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zfebact(ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs)
+         END_3D
+      ENDIF
       ! Initialisation of arrays
-      zdepeff (:,:,:) = 0.3_wp
       zfacsib(:,:,:)  = xsilab / ( 1.0 - xsilab )
-      zfebact(:,:,:)  = 0._wp
-      zfacsi(:,:,:)   = xsilab
 
       ! Computation of the mean bacterial concentration
       ! this parameterization has been deduced from a model version
-      ! that was modeling explicitely bacteria. This is a very old param 
+      ! that was modeling explicitely bacteria. This is a very old parame
       ! that will be very soon updated based on results from a much more
       ! recent version of PISCES with bacteria.
       ! ----------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zdep = MAX( hmld(ji,jj), heup_01(ji,jj) )
          IF ( gdept(ji,jj,jk,Kmm) < zdep ) THEN
             zdepbac(ji,jj,jk) = 0.6 * ( MAX(0.0, tr(ji,jj,jk,jpzoo,Kbb) + tr(ji,jj,jk,jpmes,Kbb) ) * 1.0E6 )**0.6 * 1.E-6
@@ -102,13 +120,11 @@ CONTAINS
 !         IF( gdept(ji,jj,jk,Kmm) >= zdep ) THEN
          ELSE
             zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) )
-            zdepbac (ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj)
-!            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3
-            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.6
+            zdepbac(ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj)
          ENDIF
       END_3D
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! DOC ammonification. Depends on depth, phytoplankton biomass
          ! and a limitation term which is supposed to be a parameterization of the bacterial activity. 
          ! --------------------------------------------------------------------------
@@ -119,7 +135,6 @@ CONTAINS
          ! -----------------------------------------------------
          zolimic = zremikc * ( 1.- nitrfac(ji,jj,jk) ) * tr(ji,jj,jk,jpdoc,Kbb) 
          zolimic = MAX(0., MIN( ( tr(ji,jj,jk,jpoxy,Kbb) - rtrn ) / o2ut, zolimic ) ) 
-         zolimi(ji,jj,jk) = zolimic
 
          ! Ammonification in suboxic waters with denitrification
          ! -----------------------------------------------------
@@ -152,7 +167,7 @@ CONTAINS
          ENDIF
       END_3D
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! NH4 nitrification to NO3. Ceased for oxygen concentrations
          ! below 2 umol/L. Inhibited at strong light 
          ! ----------------------------------------------------------
@@ -174,14 +189,22 @@ CONTAINS
          CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
       ENDIF
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         zdep = MAX( hmld(ji,jj), heup_01(ji,jj) )
+         IF( gdept(ji,jj,jk,Kmm) >= zdep ) THEN
+            zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) )
+            zdepeff = 0.3_wp * zdepmin**0.6
+!            zdepeff = 0.3_wp * zdepmin**0.3
+         ELSE
+             zdepeff = 0.3_wp
+         ENDIF
 
          ! Bacterial uptake of iron. No iron is available in DOC. So
          ! Bacteries are obliged to take up iron from the water. Some
          ! studies (especially at Papa) have shown this uptake to be significant
          ! ----------------------------------------------------------
          zbactfer = feratb * 0.6_wp * xstep * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) * tr(ji,jj,jk,jpfer,Kbb)    &
-           &       / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) ) * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk)
+           &       / ( xkferb + tr(ji,jj,jk,jpfer,Kbb) ) * zdepeff * zdepbac(ji,jj,jk)
          
          ! Only the transfer of iron from its dissolved form to particles
          ! is treated here. The GGE of bacteria supposed to be equal to 
@@ -189,8 +212,7 @@ CONTAINS
          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.1
          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.08
          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zbactfer*0.02
-         zfebact(ji,jj,jk)   = zbactfer * 0.1
-         blim(ji,jj,jk)      = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6
+         blim(ji,jj,jk)          = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6
       END_3D
 
        IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -202,7 +224,7 @@ CONTAINS
       ! Initialization of the array which contains the labile fraction
       ! of bSi. Set to a constant in the upper ocean
       ! ---------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! Remineralization rate of BSi dependent on T and saturation
          ! The parameterization is taken from Ridgwell et al. (2002) 
          ! ---------------------------------------------------------
@@ -219,13 +241,14 @@ CONTAINS
          ! of bSi. This is computed assuming steady state.
          ! --------------------------------------------------------------
          IF ( gdept(ji,jj,jk,Kmm) > zdep ) THEN
-            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk-1) * EXP( -0.5 * ( xsiremlab - xsirem )  &
-            &                   * znusil * e3t(ji,jj,jk,Kmm) / wsbio4(ji,jj,jk) )
-            zfacsi(ji,jj,jk)  = zfacsib(ji,jj,jk) / ( 1.0 + zfacsib(ji,jj,jk) )
-            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk) * EXP( -0.5 * ( xsiremlab - xsirem )    &
-            &                   * znusil * e3t(ji,jj,jk,Kmm) / wsbio4(ji,jj,jk) )
+            zfactdep = EXP( -0.5 * ( xsiremlab - xsirem ) * znusil * e3t(ji,jj,jk,Kmm) / wsbio4(ji,jj,jk) )
+            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk-1) * zfactdep
+            zfacsi            = zfacsib(ji,jj,jk) / ( 1.0 + zfacsib(ji,jj,jk) )
+            zfacsib(ji,jj,jk) = zfacsib(ji,jj,jk) * zfactdep
+         ELSE
+            zfacsi  = xsilab
          ENDIF
-         zsiremin = ( xsiremlab * zfacsi(ji,jj,jk) + xsirem * ( 1. - zfacsi(ji,jj,jk) ) ) * xstep * znusil
+         zsiremin = ( xsiremlab * zfacsi + xsirem * ( 1. - zfacsi ) ) * xstep * znusil
          zosil    = zsiremin * tr(ji,jj,jk,jpgsi,Kbb)
          !
          tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) - zosil
@@ -236,20 +259,46 @@ CONTAINS
          WRITE(charout, FMT="('rem3')")
          CALL prt_ctl_info( charout, cdcomp = 'top' )
          CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
-       ENDIF
+      ENDIF
 
-      IF( knt == nrdttrc ) THEN
-          zrfact2 = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+      IF( lk_iomput .AND. knt == nrdttrc ) THEN
           !
-          IF( iom_use( "REMIN" ) )  THEN !  Remineralisation rate
-             zolimi(:,:,jpk) = 0. ; CALL iom_put( "REMIN"  , zolimi(:,:,:) * tmask(:,:,:) * zrfact2  )
+          IF( l_dia_febact ) THEN
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zfebact(ji,jj,jk) = ( zfebact(ji,jj,jk) - tr(ji,jj,jk,jpfer,Krhs) ) &
+                   &              * 1e9 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+             END_3D
+             CALL iom_put( "FEBACT", zfebact )
+             DEALLOCATE( zfebact )
           ENDIF
-          CALL iom_put( "DENIT"  , denitr(:,:,:) * rdenit * rno3 * tmask(:,:,:) * zrfact2 ) ! Denitrification 
-          IF( iom_use( "BACT" ) )  THEN ! Bacterial biomass
-             zdepbac(:,:,jpk) = 0.  ;   CALL iom_put( "BACT", zdepbac(:,:,:) * 1.E6 * tmask(:,:,:) )
+          IF( l_dia_remin ) THEN    ! Remineralisation rate
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zolimi(ji,jj,jk) = ( zolimi(ji,jj,jk) - tr(ji,jj,jk,jpoxy,Krhs) ) / o2ut &
+                   &               * rfact2r * tmask(ji,jj,jk) ! 
+             END_3D
+             CALL iom_put( "REMIN", zolimi )
+             DEALLOCATE( zolimi )
           ENDIF
-          CALL iom_put( "FEBACT" , zfebact(:,:,:) * 1E9 * tmask(:,:,:) * zrfact2  )
-       ENDIF
+          !
+          IF( l_dia_bact ) THEN   ! Bacterial biomass
+             ALLOCATE( zw3d(A2D(0),jpk) )    ;    zw3d(A2D(0),jpk) = 0._wp
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zw3d(ji,jj,jk) = zdepbac(ji,jj,jk) * 1.E6 * tmask(ji,jj,jk)
+             END_3D
+             CALL iom_put( "BACT", zw3d )
+             DEALLOCATE( zw3d )
+          ENDIF
+          !
+          IF( l_dia_denit )  THEN ! Denitrification
+             ALLOCATE( zw3d(A2D(0),jpk) )    ;    zw3d(A2D(0),jpk) = 0._wp
+             DO_3D( 0, 0, 0, 0, 1, jpkm1)
+                zw3d(ji,jj,jk) = denitr(ji,jj,jk) * 1E+3 * rfact2r * rno3 * tmask(ji,jj,jk)
+             END_3D
+             CALL iom_put( "DENIT", zw3d )
+             DEALLOCATE( zw3d )
+          ENDIF
+          !
+      ENDIF
       !
       IF( ln_timing )   CALL timing_stop('p4z_rem')
       !
diff --git a/src/TOP/PISCES/P4Z/p4zsed.F90 b/src/TOP/PISCES/P4Z/p4zsed.F90
index ca6bdb28..45d5dafb 100644
--- a/src/TOP/PISCES/P4Z/p4zsed.F90
+++ b/src/TOP/PISCES/P4Z/p4zsed.F90
@@ -15,6 +15,7 @@ MODULE p4zsed
    USE sms_pisces      !  PISCES Source Minus Sink variables
    USE p4zlim          !  Co-limitations of differents nutrients
    USE p4zint          !  interpolation and computation of various fields
+   USE p4zsink         !  Sinking fluxes
    USE sed             !  Sediment module
    USE iom             !  I/O manager
    USE prtctl          !  print control for debugging
@@ -36,6 +37,8 @@ MODULE p4zsed
    REAL(wp), SAVE :: r1_rday          
    REAL(wp), SAVE :: sedsilfrac, sedcalfrac
 
+   LOGICAL  :: l_dia_sdenit, l_dia_nfix, l_dia_sed
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -60,54 +63,41 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt, knt ! ocean time step
       INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs  ! time level indices
       INTEGER  ::  ji, jj, jk, ikt
-      REAL(wp) ::  zrivalk, zrivsil, zrivno3
+      REAL(wp) ::  zbureff, zrivsil
       REAL(wp) ::  zlim, zfact, zfactcal
       REAL(wp) ::  zo2, zno3, zflx, zpdenit, z1pdenit, zolimit
-      REAL(wp) ::  zsiloss, zcaloss, zws3, zws4, zwsc, zdep
+      REAL(wp) ::  zsiloss, zcaloss, zdep
       REAL(wp) ::  zwstpoc, zwstpon, zwstpop
       REAL(wp) ::  ztrfer, ztrpo4s, ztrdp, zwdust, zmudia, ztemp
+      REAL(wp) ::  zsoufer, zlight, ztrpo4, ztrdop
       REAL(wp) ::  xdiano3, xdianh4
       !
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zdenit2d, zbureff, zwork
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zwsbio3, zwsbio4
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zsedcal, zsedsi, zsedc
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zsoufer, zlight
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrpo4, ztrdop, zirondep, zpdep
+      REAL(wp), DIMENSION(A2D(0)) :: zdenit2d, zrivno3, zrivalk
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )  CALL timing_start('p4z_sed')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_nfix   = iom_use( "Nfix" ) 
+         l_dia_sdenit = iom_use( "Sdenit" ) 
+         l_dia_sed    = .NOT.lk_sed .AND. ( iom_use( "SedC" ) .OR. iom_use( "SedCal" ) .OR. iom_use( "SedSi" ) )
+      ENDIF
 
-      ! Allocate temporary workspace
-      ALLOCATE( ztrpo4(jpi,jpj,jpk) )
-      IF( ln_p5z )    ALLOCATE( ztrdop(jpi,jpj,jpk) )
-
+      !
       zdenit2d(:,:) = 0.e0
-      zbureff (:,:) = 0.e0
-      zwork   (:,:) = 0.e0
-      zsedsi  (:,:) = 0.e0
-      zsedcal (:,:) = 0.e0
-      zsedc   (:,:) = 0.e0
-
-      ! OA: Warning, the following part is necessary to avoid CFL problems above the sediments
-      ! --------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ikt  = mbkt(ji,jj)
-         zdep = e3t(ji,jj,ikt,Kmm) / xstep
-         zwsbio4(ji,jj) = MIN( 0.99 * zdep, wsbio4(ji,jj,ikt) )
-         zwsbio3(ji,jj) = MIN( 0.99 * zdep, wsbio3(ji,jj,ikt) )
-      END_2D
-
+      zrivno3 (:,:) = 0.e0
+      zrivalk (:,:) = 0.e0
+      !
       IF( .NOT.lk_sed ) THEN
          ! Computation of the sediment denitrification proportion: The metamodel from midlleburg (2006) is being used
          ! Computation of the fraction of organic matter that is permanently buried from Dunne's model
          ! -------------------------------------------------------
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
            IF( tmask(ji,jj,1) == 1 ) THEN
               ikt = mbkt(ji,jj)
-              zflx = (  tr(ji,jj,ikt,jpgoc,Kbb) * zwsbio4(ji,jj)   &
-                &     + tr(ji,jj,ikt,jppoc,Kbb) * zwsbio3(ji,jj) )  * 1E3 * 1E6 / 1E4
+              zflx = sinkpocb(ji,jj) / xstep  * 1E3 * 1E6 / 1E4
               zflx  = LOG10( MAX( 1E-3, zflx ) )
               zo2   = LOG10( MAX( 10. , tr(ji,jj,ikt,jpoxy,Kbb) * 1E6 ) )
               zno3  = LOG10( MAX( 1.  , tr(ji,jj,ikt,jpno3,Kbb) * 1E6 * rno3 ) )
@@ -116,9 +106,9 @@ CONTAINS
                 &                + 0.4721 * zo2 - 0.0996 * zdep + 0.4256 * zflx * zo2
               zdenit2d(ji,jj) = 10.0**( zdenit2d(ji,jj) )
                 !
-              zflx = (  tr(ji,jj,ikt,jpgoc,Kbb) * zwsbio4(ji,jj)   &
-                &     + tr(ji,jj,ikt,jppoc,Kbb) * zwsbio3(ji,jj) ) * 1E6
-              zbureff(ji,jj) = 0.013 + 0.53 * zflx**2 / ( 7.0 + zflx )**2
+              zflx = sinkpocb(ji,jj) / xstep * 1E6 
+              zbureff = 0.013 + 0.53 * zflx**2 / ( 7.0 + zflx )**2
+              zrivno3(ji,jj) = 1. - zbureff
            ENDIF
          END_2D
          !
@@ -127,74 +117,33 @@ CONTAINS
       ! This loss is scaled at each bottom grid cell for equilibrating the total budget of silica in the ocean.
       ! Thus, the amount of silica lost in the sediments equal the supply at the surface (dust+rivers)
       ! ------------------------------------------------------
-      IF( .NOT.lk_sed )  zrivsil = 1._wp - sedsilfrac
-
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ikt  = mbkt(ji,jj)
-         zdep = xstep / e3t(ji,jj,ikt,Kmm) 
-         zwsc = zwsbio4(ji,jj) * zdep
-         zsiloss = tr(ji,jj,ikt,jpgsi,Kbb) * zwsc
-         zcaloss = tr(ji,jj,ikt,jpcal,Kbb) * zwsc
-         !
-         tr(ji,jj,ikt,jpgsi,Krhs) = tr(ji,jj,ikt,jpgsi,Krhs) - zsiloss
-         tr(ji,jj,ikt,jpcal,Krhs) = tr(ji,jj,ikt,jpcal,Krhs) - zcaloss
-      END_2D
       !
       IF( .NOT.lk_sed ) THEN
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         zrivsil = 1._wp - sedsilfrac
+         DO_2D( 0, 0, 0, 0 )
             ikt  = mbkt(ji,jj)
-            zdep = xstep / e3t(ji,jj,ikt,Kmm) 
-            zwsc = zwsbio4(ji,jj) * zdep
-            zsiloss = tr(ji,jj,ikt,jpgsi,Kbb) * zwsc
-            zcaloss = tr(ji,jj,ikt,jpcal,Kbb) * zwsc
+            zdep = 1._wp / e3t(ji,jj,ikt,Kmm)
+            zsiloss = sinksilb(ji,jj) * zdep
+            zcaloss = sinkcalb(ji,jj) * zdep
             tr(ji,jj,ikt,jpsil,Krhs) = tr(ji,jj,ikt,jpsil,Krhs) + zsiloss * zrivsil 
             !
             zfactcal = MAX(-0.1, MIN( excess(ji,jj,ikt), 0.2 ) )
             zfactcal = 0.3 + 0.7 * MIN( 1., (0.1 + zfactcal) / ( 0.5 - zfactcal ) )
-            zrivalk  = sedcalfrac * zfactcal
-            tr(ji,jj,ikt,jptal,Krhs) =  tr(ji,jj,ikt,jptal,Krhs) + zcaloss * zrivalk * 2.0
-            tr(ji,jj,ikt,jpdic,Krhs) =  tr(ji,jj,ikt,jpdic,Krhs) + zcaloss * zrivalk
-            zsedcal(ji,jj) = (1.0 - zrivalk) * zcaloss * e3t(ji,jj,ikt,Kmm) 
-            zsedsi (ji,jj) = (1.0 - zrivsil) * zsiloss * e3t(ji,jj,ikt,Kmm) 
+            zrivalk(ji,jj) = sedcalfrac * zfactcal
+            tr(ji,jj,ikt,jptal,Krhs) =  tr(ji,jj,ikt,jptal,Krhs) + zcaloss * zrivalk(ji,jj) * 2.0
+            tr(ji,jj,ikt,jpdic,Krhs) =  tr(ji,jj,ikt,jpdic,Krhs) + zcaloss * zrivalk(ji,jj)
          END_2D
       ENDIF
       !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ikt  = mbkt(ji,jj)
-         zdep = xstep / e3t(ji,jj,ikt,Kmm) 
-         zws4 = zwsbio4(ji,jj) * zdep
-         zws3 = zwsbio3(ji,jj) * zdep
-         tr(ji,jj,ikt,jpgoc,Krhs) = tr(ji,jj,ikt,jpgoc,Krhs) - tr(ji,jj,ikt,jpgoc,Kbb) * zws4 
-         tr(ji,jj,ikt,jppoc,Krhs) = tr(ji,jj,ikt,jppoc,Krhs) - tr(ji,jj,ikt,jppoc,Kbb) * zws3
-         tr(ji,jj,ikt,jpbfe,Krhs) = tr(ji,jj,ikt,jpbfe,Krhs) - tr(ji,jj,ikt,jpbfe,Kbb) * zws4
-         tr(ji,jj,ikt,jpsfe,Krhs) = tr(ji,jj,ikt,jpsfe,Krhs) - tr(ji,jj,ikt,jpsfe,Kbb) * zws3
-      END_2D
-      !
-      IF( ln_p5z ) THEN
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            ikt  = mbkt(ji,jj)
-            zdep = xstep / e3t(ji,jj,ikt,Kmm) 
-            zws4 = zwsbio4(ji,jj) * zdep
-            zws3 = zwsbio3(ji,jj) * zdep
-            tr(ji,jj,ikt,jpgon,Krhs) = tr(ji,jj,ikt,jpgon,Krhs) - tr(ji,jj,ikt,jpgon,Kbb) * zws4
-            tr(ji,jj,ikt,jppon,Krhs) = tr(ji,jj,ikt,jppon,Krhs) - tr(ji,jj,ikt,jppon,Kbb) * zws3
-            tr(ji,jj,ikt,jpgop,Krhs) = tr(ji,jj,ikt,jpgop,Krhs) - tr(ji,jj,ikt,jpgop,Kbb) * zws4
-            tr(ji,jj,ikt,jppop,Krhs) = tr(ji,jj,ikt,jppop,Krhs) - tr(ji,jj,ikt,jppop,Kbb) * zws3
-         END_2D
-      ENDIF
 
+      ! The 0.5 factor in zpdenit is to avoid negative NO3 concentration after
+      ! denitrification in the sediments. Not very clever, but simpliest option.
       IF( .NOT.lk_sed ) THEN
-         ! The 0.5 factor in zpdenit is to avoid negative NO3 concentration after
-         ! denitrification in the sediments. Not very clever, but simpliest option.
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             ikt  = mbkt(ji,jj)
-            zdep = xstep / e3t(ji,jj,ikt,Kmm) 
-            zws4 = zwsbio4(ji,jj) * zdep
-            zws3 = zwsbio3(ji,jj) * zdep
-            zrivno3 = 1. - zbureff(ji,jj)
-            zwstpoc = tr(ji,jj,ikt,jpgoc,Kbb) * zws4 + tr(ji,jj,ikt,jppoc,Kbb) * zws3
-            zpdenit  = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3 )
-            z1pdenit = zwstpoc * zrivno3 - zpdenit
+            zwstpoc = sinkpocb(ji,jj) / e3t(ji,jj,ikt,Kmm)
+            zpdenit  = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3(ji,jj) )
+            z1pdenit = zwstpoc * zrivno3(ji,jj) - zpdenit
             zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / o2ut, z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) )
             tr(ji,jj,ikt,jpdoc,Krhs) = tr(ji,jj,ikt,jpdoc,Krhs) + z1pdenit - zolimit
             tr(ji,jj,ikt,jppo4,Krhs) = tr(ji,jj,ikt,jppo4,Krhs) + zpdenit + zolimit
@@ -204,27 +153,34 @@ CONTAINS
             tr(ji,jj,ikt,jptal,Krhs) = tr(ji,jj,ikt,jptal,Krhs) + rno3 * (zolimit + (1.+rdenit) * zpdenit )
             tr(ji,jj,ikt,jpdic,Krhs) = tr(ji,jj,ikt,jpdic,Krhs) + zpdenit + zolimit 
             sdenit(ji,jj) = rdenit * zpdenit * e3t(ji,jj,ikt,Kmm)
-            zsedc(ji,jj)   = (1. - zrivno3) * zwstpoc * e3t(ji,jj,ikt,Kmm)
-            IF( ln_p5z ) THEN
-               zwstpop              = tr(ji,jj,ikt,jpgop,Kbb) * zws4 + tr(ji,jj,ikt,jppop,Kbb) * zws3
-               zwstpon              = tr(ji,jj,ikt,jpgon,Kbb) * zws4 + tr(ji,jj,ikt,jppon,Kbb) * zws3
+         END_2D
+         IF( ln_p5z ) THEN
+            DO_2D( 0, 0, 0, 0 )
+               ikt  = mbkt(ji,jj)
+               zdep = 1._wp / e3t(ji,jj,ikt,Kmm)
+               zwstpoc = sinkpocb(ji,jj) * zdep
+               zwstpop = sinkpopb(ji,jj) * zdep
+               zwstpon = sinkponb(ji,jj) * zdep
+               zpdenit  = MIN( 0.5 * ( tr(ji,jj,ikt,jpno3,Kbb) - rtrn ) / rdenit, zdenit2d(ji,jj) * zwstpoc * zrivno3(ji,jj) )
+               z1pdenit = zwstpoc * zrivno3(ji,jj) - zpdenit
+               zolimit = MIN( ( tr(ji,jj,ikt,jpoxy,Kbb) - rtrn ) / o2ut, z1pdenit * ( 1.- nitrfac(ji,jj,ikt) ) )
                tr(ji,jj,ikt,jpdon,Krhs) = tr(ji,jj,ikt,jpdon,Krhs) + ( z1pdenit - zolimit ) * zwstpon / (zwstpoc + rtrn)
                tr(ji,jj,ikt,jpdop,Krhs) = tr(ji,jj,ikt,jpdop,Krhs) + ( z1pdenit - zolimit ) * zwstpop / (zwstpoc + rtrn)
-            ENDIF
-         END_2D
+            END_2D
+         ENDIF
        ENDIF
 
 
       ! Nitrogen fixation process
       ! Small source iron from particulate inorganic iron
       !-----------------------------------
-      DO jk = 1, jpkm1
-         zlight (:,:,jk) =  ( 1.- EXP( -etot_ndcy(:,:,jk) / diazolight ) ) * ( 1. - fr_i(:,:) ) 
-         zsoufer(:,:,jk) = zlight(:,:,jk) * 2E-11 / ( 2E-11 + biron(:,:,jk) )
-      ENDDO
+      !
       IF( ln_p4z ) THEN
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             !                      ! Potential nitrogen fixation dependant on temperature and iron
+            zlight  =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) ) 
+            zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) )
+            !
             ztemp = ts(ji,jj,jk,jp_tem,Kmm)
             zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) / rno3
             !       Potential nitrogen fixation dependant on temperature and iron
@@ -234,33 +190,11 @@ CONTAINS
             IF( zlim <= 0.1 )   zlim = 0.01
             zfact = zlim * rfact2
             ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) )
-            ztrpo4(ji,jj,jk) = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) )
-            ztrdp = ztrpo4(ji,jj,jk)
-            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrdp ) * zlight(ji,jj,jk)
-         END_3D
-      ELSE       ! p5z
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-            !                      ! Potential nitrogen fixation dependant on temperature and iron
-            ztemp = ts(ji,jj,jk,jp_tem,Kmm)
-            zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) * 7.625
-            !       Potential nitrogen fixation dependant on temperature and iron
-            xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) )
-            xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4)
-            zlim = ( 1.- xdiano3 - xdianh4 )
-            IF( zlim <= 0.1 )   zlim = 0.01
-            zfact = zlim * rfact2
-            ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) )
-            ztrpo4(ji,jj,jk) = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) )
-            ztrdop(ji,jj,jk) = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4(ji,jj,jk))
-            ztrdp = ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk)
-            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrdp ) * zlight(ji,jj,jk)
-         END_3D
-      ENDIF
-
-      ! Nitrogen change due to nitrogen fixation
-      ! ----------------------------------------
-      IF( ln_p4z ) THEN
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+            ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) )
+            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 ) * zlight
+            !
+            ! Nitrogen change due to nitrogen fixation
+            ! ----------------------------------------
             zfact = nitrpot(ji,jj,jk) * nitrfix
             tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0
             tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0
@@ -273,23 +207,41 @@ CONTAINS
             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0
             tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0
             tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0
-            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer(ji,jj,jk) * rfact2 / rday
+            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday
             tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + concdnh4 / ( concdnh4 + tr(ji,jj,jk,jppo4,Kbb) ) &
             &                     * 0.001 * tr(ji,jj,jk,jpdoc,Kbb) * xstep
          END_3D
-      ELSE    ! p5z
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      ELSE       ! p5z
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zlight  =  ( 1.- EXP( -etot_ndcy(ji,jj,jk) / diazolight ) ) * ( 1. - fr_i(ji,jj) ) 
+            zsoufer = zlight * 2E-11 / ( 2E-11 + biron(ji,jj,jk) )
+            !
+            !                      ! Potential nitrogen fixation dependant on temperature and iron
+            ztemp = ts(ji,jj,jk,jp_tem,Kmm)
+            zmudia = MAX( 0.,-0.001096*ztemp**2 + 0.057*ztemp -0.637 ) * 7.625
+            !       Potential nitrogen fixation dependant on temperature and iron
+            xdianh4 = tr(ji,jj,jk,jpnh4,Kbb) / ( concnnh4 + tr(ji,jj,jk,jpnh4,Kbb) )
+            xdiano3 = tr(ji,jj,jk,jpno3,Kbb) / ( concnno3 + tr(ji,jj,jk,jpno3,Kbb) ) * (1. - xdianh4)
+            zlim = ( 1.- xdiano3 - xdianh4 )
+            IF( zlim <= 0.1 )   zlim = 0.01
+            zfact = zlim * rfact2
+            ztrfer = biron(ji,jj,jk) / ( concfediaz + biron(ji,jj,jk) )
+            ztrpo4 = tr(ji,jj,jk,jppo4,Kbb) / ( 1E-6 + tr(ji,jj,jk,jppo4,Kbb) )
+            ztrdop = tr(ji,jj,jk,jpdop,Kbb) / ( 1E-6 + tr(ji,jj,jk,jpdop,Kbb) ) * (1. - ztrpo4)
+            nitrpot(ji,jj,jk) =  zmudia * r1_rday * zfact * MIN( ztrfer, ztrpo4 + ztrdop ) * zlight
+
+            ! Nitrogen change due to nitrogen fixation
+            ! ----------------------------------------
             zfact = nitrpot(ji,jj,jk) * nitrfix
             tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zfact / 3.0
             tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zfact / 3.0
             tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zfact * 2.0 / 3.0            
             tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - 16.0 / 46.0 * zfact * ( 1.0 - 1.0 / 3.0 ) &
-            &                     * ztrpo4(ji,jj,jk) / (ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk) + rtrn)
+            &                     * ztrpo4 / (ztrpo4 + ztrdop + rtrn)
             tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zfact * 1.0 / 3.0
             tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zfact * 1.0 / 3.0
             tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + 16.0 / 46.0 * zfact / 3.0  &
-            &                     - 16.0 / 46.0 * zfact * ztrdop(ji,jj,jk)   &
-            &                     / (ztrpo4(ji,jj,jk) + ztrdop(ji,jj,jk) + rtrn)
+            &                     - 16.0 / 46.0 * zfact * ztrdop / ( ztrpo4 + ztrdop + rtrn)
             tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + zfact * 1.0 / 3.0 * 2.0 / 3.0
             tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + zfact * 1.0 / 3.0 * 2.0 /3.0
             tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + 16.0 / 46.0 * zfact * 1.0 / 3.0 * 2.0 /3.0
@@ -300,18 +252,32 @@ CONTAINS
             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - 30E-6 * zfact * 1.0 / 3.0 
             tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 2.0 / 3.0
             tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + 30E-6 * zfact * 1.0 / 3.0 * 1.0 / 3.0
-            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer(ji,jj,jk) * rfact2 / rday
+            tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + 0.002 * 4E-10 * zsoufer * rfact2 / rday
          END_3D
-         !
       ENDIF
 
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         zfact = 1.e+3 * rfact2r !  conversion from molC/l/kt  to molN/m3/s
-         CALL iom_put( "Nfix", nitrpot(:,:,:) * nitrfix * rno3 * zfact * tmask(:,:,:) )  ! nitrogen fixation 
-         CALL iom_put( "SedCal", zsedcal(:,:) * zfact )
-         CALL iom_put( "SedSi" , zsedsi (:,:) * zfact )
-         CALL iom_put( "SedC"  , zsedc  (:,:) * zfact )
-         CALL iom_put( "Sdenit", sdenit (:,:) * zfact * rno3 )
+          !
+          IF( l_dia_nfix ) THEN   ! nitrogen fixation
+            zfact = rno3 * 1.e+3 * rfact2r !  conversion from molC/l/kt  to molN/m3/s
+            ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+            zw3d(A2D(0),1:jpkm1) = nitrpot(A2D(0),1:jpkm1) * nitrfix * zfact * tmask(A2D(0),1:jpkm1)
+            CALL iom_put( "Nfix", zw3d )
+            DEALLOCATE( zw3d )
+          ENDIF
+          !
+          IF( l_dia_sed ) THEN
+            zfact = 1.e+3 * rfact2r !  conversion from molC/l/kt  to molC/m3/s
+            CALL iom_put( "SedCal", ( 1.0 - zrivalk(:,:) ) * sinkcalb(:,:) * zfact )
+            CALL iom_put( "SedSi" , ( 1.0 - zrivsil      ) * sinksilb(:,:) * zfact )
+            CALL iom_put( "SedC"  , ( 1.0 - zrivno3(:,:) ) * sinkpocb(:,:) * zfact )
+          ENDIF
+          !
+          IF( l_dia_sdenit ) THEN
+            zfact = rno3 * 1.e+3 * rfact2r !  conversion from molC/l/kt  to molN/m3/s
+            CALL iom_put( "Sdenit", sdenit(:,:) * zfact )
+          ENDIF
+          !
       ENDIF
       !
       IF(sn_cfctl%l_prttrc) THEN  ! print mean trneds (USEd for debugging)
@@ -320,8 +286,6 @@ CONTAINS
          CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
       ENDIF
       !
-      IF( ln_p5z )    DEALLOCATE( ztrpo4, ztrdop )
-      !
       IF( ln_timing )  CALL timing_stop('p4z_sed')
       !
    END SUBROUTINE p4z_sed
@@ -367,7 +331,7 @@ CONTAINS
       !
       lk_sed = ln_sediment .AND. ln_sed_2way 
       !
-      nitrpot(:,:,jpk) = 0._wp   ! define last level for iom_put
+!      nitrpot(:,:,jpk) = 0._wp   ! define last level for iom_put
       !
    END SUBROUTINE p4z_sed_init
 
@@ -375,7 +339,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                     ***  ROUTINE p4z_sed_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( nitrpot(jpi,jpj,jpk), sdenit(jpi,jpj), STAT=p4z_sed_alloc )
+      ALLOCATE( nitrpot(A2D(0),jpk), sdenit(A2D(0)), STAT=p4z_sed_alloc )
       !
       IF( p4z_sed_alloc /= 0 )   CALL ctl_stop( 'STOP', 'p4z_sed_alloc: failed to allocate arrays' )
       !
diff --git a/src/TOP/PISCES/P4Z/p4zsink.F90 b/src/TOP/PISCES/P4Z/p4zsink.F90
index 53db2671..e794e8a7 100644
--- a/src/TOP/PISCES/P4Z/p4zsink.F90
+++ b/src/TOP/PISCES/P4Z/p4zsink.F90
@@ -31,15 +31,15 @@ MODULE p4zsink
    PUBLIC   p4z_sink_init    ! called in trcini_pisces.F90
    PUBLIC   p4z_sink_alloc   ! called in trcini_pisces.F90
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinking, sinking2  !: POC sinking fluxes 
-   !                                                          !  (different meanings depending on the parameterization)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingn, sinking2n  !: PON sinking fluxes 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkingp, sinking2p  !: POP sinking fluxes 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkcal, sinksil   !: CaCO3 and BSi sinking fluxes
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkfer            !: Small BFe sinking fluxes
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sinkfer2           !: Big iron sinking fluxes
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sinkpocb  !: POC sinking fluxes at bottom 
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sinkcalb  !: CaCO3 sinking fluxes at bottom
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sinksilb  !: BSi sinking fluxes at bottom
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sinkponb  !: POC sinking fluxes at bottom 
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sinkpopb  !: POC sinking fluxes at bottom 
 
    INTEGER  :: ik100
+   REAL(wp) :: xfact
+   LOGICAL  :: l_dia_sink, l_diag
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -68,10 +68,22 @@ CONTAINS
       INTEGER  ::   ji, jj, jk
       CHARACTER (len=25) :: charout
       REAL(wp) :: zmax, zfact
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zsinking
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p4z_sink')
 
+      IF( kt == nittrc000 )  THEN
+         l_dia_sink = iom_use( "EPC100" ) .OR. iom_use( "EPFE100" ) .OR. iom_use( "EPCAL100" ) .OR. iom_use( "EPSI100" )  &
+           &    .OR.  iom_use( "EXPC"   ) .OR. iom_use( "EXPFE"   ) .OR. iom_use( "EXPCAL"   ) .OR. iom_use( "EXPSI"   )  &
+           &    .OR.  iom_use( "tcexp"  ) 
+         !
+         xfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+      ENDIF
+      l_diag = l_dia_sink .OR. ( ln_check_mass .AND. kt == nitend )
+      l_diag = l_diag .AND. knt == nrdttrc
+
       ! Initialization of some global variables
       ! ---------------------------------------
       prodpoc(:,:,:) = 0.
@@ -86,7 +98,7 @@ CONTAINS
       ! CaCO3 and bSi are supposed to sink at the big particles speed 
       ! due to their high density
       ! ---------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zmax  = MAX( heup_01(ji,jj), hmld(ji,jj) )
          zfact = MAX( 0., gdepw(ji,jj,jk+1,Kmm) - zmax ) / wsbio2scale
          wsbio4(ji,jj,jk) = wsbio2 + MAX(0., ( wsbio2max - wsbio2 )) * zfact
@@ -95,62 +107,92 @@ CONTAINS
       ! Sinking speed of the small particles is always constant
       wsbio3(:,:,:) = wsbio
 
-      ! Initialize to zero all the sinking arrays 
-      ! -----------------------------------------
-      sinking (:,:,:) = 0.e0
-      sinking2(:,:,:) = 0.e0
-      sinkcal (:,:,:) = 0.e0
-      sinkfer (:,:,:) = 0.e0
-      sinksil (:,:,:) = 0.e0
-      sinkfer2(:,:,:) = 0.e0
-
       ! Compute the sedimentation term using trc_sink for all the sinking particles
       ! ---------------------------------------------------------------------------
-      CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinking , jppoc, rfact2 )
-      CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkfer , jpsfe, rfact2 )
-      CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2, jpgoc, rfact2 )
-      CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinkfer2, jpbfe, rfact2 )
-      CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinksil , jpgsi, rfact2 )
-      CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinkcal , jpcal, rfact2 )
-
+      zsinking(:,:,:) = 0.e0
+      !
+      CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking , jppoc, rfact2 )
+      DO_2D( 0, 0, 0, 0 )
+         sinkpocb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1)
+      END_2D
+      IF( l_diag ) THEN
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),:) = 0._wp 
+         zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+      ENDIF
+      !
+      CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgoc, rfact2 )
+      DO_2D( 0, 0, 0, 0 )
+         sinkpocb(ji,jj) = sinkpocb(ji,jj) + zsinking(ji,jj,mbkt(ji,jj)+1)
+      END_2D
+      IF( l_diag ) THEN
+         zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+         t_oce_co2_exp = glob_sum( 'p4zsink', zw3d(A2D(0),ik100) * e1e2t(A2D(0)) * tmask(A2D(0),1) )
+         CALL iom_put( "EPC100",  zw3d(:,:,ik100) )  ! Export of carbon at 100m
+         CALL iom_put( "EXPC"  ,  zw3d )             ! Export of carbon in the water column
+         CALL iom_put( "tcexp", t_oce_co2_exp )      ! Total cabon exort
+      ENDIF
+      !
+      CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgsi, rfact2 )
+      DO_2D( 0, 0, 0, 0 )
+         sinksilb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1)
+      END_2D
+      IF( l_diag ) THEN
+         zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+         CALL iom_put( "EPSI100",  zw3d(:,:,ik100) )  ! Export of Silicate at 100m
+         CALL iom_put( "EXPSI"  ,  zw3d )             ! Export of Silicate in the water column
+      ENDIF
+      !
+      CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpcal, rfact2 )
+      DO_2D( 0, 0, 0, 0 )
+         sinkcalb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1)
+      END_2D
+      IF( l_diag ) THEN
+         zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+         CALL iom_put( "EPCAL100",  zw3d(:,:,ik100) )  ! Export of calcite at 100m
+         CALL iom_put( "EXPCAL"  ,  zw3d )             ! Export of calcite in the water column
+      ENDIF
+      !
+      CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking, jpsfe, rfact2 )
+      IF( l_diag ) THEN
+         zw3d(A2D(0),1:jpkm1) = zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+      ENDIF
+      CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpbfe, rfact2 )
+      IF( l_diag ) THEN
+         zw3d(A2D(0),1:jpkm1) = zw3d(A2D(0),1:jpkm1) + zsinking(A2D(0),1:jpkm1) * xfact * tmask(A2D(0),1:jpkm1)
+         CALL iom_put( "EPFE100",  zw3d(:,:,ik100) )  ! Export of iron at 100m
+         CALL iom_put( "EXPFE"  ,  zw3d )             ! Export of iron in the water column
+      ENDIF
+      !
       ! PISCES-QUOTA part
       IF( ln_p5z ) THEN
-         sinkingn (:,:,:) = 0.e0
-         sinking2n(:,:,:) = 0.e0
-         sinkingp (:,:,:) = 0.e0
-         sinking2p(:,:,:) = 0.e0
-
-         ! Compute the sedimentation term using trc_sink for all the sinking particles
-         ! ---------------------------------------------------------------------------
-         CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingn , jppon, rfact2 )
-         CALL trc_sink( kt, Kbb, Kmm, wsbio3, sinkingp , jppop, rfact2 )
-         CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2n, jpgon, rfact2 )
-         CALL trc_sink( kt, Kbb, Kmm, wsbio4, sinking2p, jpgop, rfact2 )
-      ENDIF
-
-     ! Total carbon export per year
-     IF( iom_use( "tcexp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
-        &   t_oce_co2_exp = glob_sum( 'p4zsink', ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * e1e2t(:,:) * tmask(:,:,1) )
-     !
-     IF( lk_iomput .AND.  knt == nrdttrc ) THEN
-       zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
-       !
-       CALL iom_put( "EPC100"  , ( sinking(:,:,ik100) + sinking2(:,:,ik100) ) * zfact * tmask(:,:,1) ) ! Export of carbon at 100m 
-       CALL iom_put( "EPFE100" , ( sinkfer(:,:,ik100) + sinkfer2(:,:,ik100) ) * zfact * tmask(:,:,1) ) ! Export of iron at 100m 
-       CALL iom_put( "EPCAL100", sinkcal(:,:,ik100) * zfact * tmask(:,:,1) )      ! Export of calcite at 100m 
-       CALL iom_put( "EPSI100" , sinksil(:,:,ik100) * zfact * tmask(:,:,1) )          ! Export of bigenic silica at 100m 
-       CALL iom_put( "EXPC"    , ( sinking(:,:,:) + sinking2(:,:,:) ) * zfact * tmask(:,:,:) ) ! Export of carbon in the water column 
-       CALL iom_put( "EXPFE"   , ( sinkfer(:,:,:) + sinkfer2(:,:,:) ) * zfact * tmask(:,:,:) ) ! Export of iron  
-       CALL iom_put( "EXPCAL"  , sinkcal(:,:,:) * zfact * tmask(:,:,:) )      ! Export of calcite 
-       CALL iom_put( "EXPSI"   , sinksil(:,:,:) * zfact * tmask(:,:,:) )      ! Export of bigenic silica
-       CALL iom_put( "tcexp"   , t_oce_co2_exp * zfact )   ! molC/s
-       ! 
+         !
+         CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking, jppon, rfact2 )
+         DO_2D( 0, 0, 0, 0 )
+            sinkponb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1)
+         END_2D
+         !
+         CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgon, rfact2 )
+         DO_2D( 0, 0, 0, 0 )
+            sinkponb(ji,jj) = sinkponb(ji,jj) + zsinking(ji,jj,mbkt(ji,jj)+1)
+         END_2D
+         !
+         CALL trc_sink( kt, Kbb, Kmm, wsbio3, zsinking, jppop, rfact2 )
+         DO_2D( 0, 0, 0, 0 )
+            sinkpopb(ji,jj) = zsinking(ji,jj,mbkt(ji,jj)+1)
+         END_2D
+         !
+         CALL trc_sink( kt, Kbb, Kmm, wsbio4, zsinking, jpgop, rfact2 )
+         DO_2D( 0, 0, 0, 0 )
+            sinkpopb(ji,jj) = sinkpopb(ji,jj) + zsinking(ji,jj,mbkt(ji,jj)+1)
+         END_2D
       ENDIF
       !
+      IF( l_diag )  DEALLOCATE( zw3d )
+      !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
          WRITE(charout, FMT="('sink')")
          CALL prt_ctl_info( charout, cdcomp = 'top' )
-         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
+         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Kbb), mask1=tmask, clinfo=ctrcnm)
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('p4z_sink')
@@ -179,8 +221,6 @@ CONTAINS
       IF (lwp) WRITE(numout,*) ' Level corresponding to 100m depth ',  ik100 + 1
       IF (lwp) WRITE(numout,*)
       !
-      t_oce_co2_exp = 0._wp
-      !
    END SUBROUTINE p4z_sink_init
 
    INTEGER FUNCTION p4z_sink_alloc()
@@ -192,13 +232,10 @@ CONTAINS
       !
       ierr(:) = 0
       !
-      ALLOCATE( sinking(jpi,jpj,jpk) , sinking2(jpi,jpj,jpk)                    ,     &                
-         &      sinkcal(jpi,jpj,jpk) , sinksil (jpi,jpj,jpk)                    ,     &                
-         &      sinkfer2(jpi,jpj,jpk)                                           ,     &                
-         &      sinkfer(jpi,jpj,jpk)                                            , STAT=ierr(1) )                
-         !
-      IF( ln_p5z    ) ALLOCATE( sinkingn(jpi,jpj,jpk), sinking2n(jpi,jpj,jpk)   ,     &
-         &                      sinkingp(jpi,jpj,jpk), sinking2p(jpi,jpj,jpk)   , STAT=ierr(2) )
+      ALLOCATE( sinkpocb(A2D(0)), sinkcalb(A2D(0)), sinksilb(A2D(0)), STAT=ierr(1) )                
+      !
+      IF( ln_p5z ) ALLOCATE( sinkponb(A2D(0)), sinkpopb(A2D(0)), STAT=ierr(2) )
+
       !
       p4z_sink_alloc = MAXVAL( ierr )
       IF( p4z_sink_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_sink_alloc : failed to allocate arrays.' )
diff --git a/src/TOP/PISCES/P4Z/p4zsms.F90 b/src/TOP/PISCES/P4Z/p4zsms.F90
index 32a3c6fb..000eacc4 100644
--- a/src/TOP/PISCES/P4Z/p4zsms.F90
+++ b/src/TOP/PISCES/P4Z/p4zsms.F90
@@ -116,8 +116,6 @@ CONTAINS
       CALL p4z_che(     Kbb, Kmm       ) ! computation of chemical constants
       CALL p4z_int( kt, Kbb, Kmm       ) ! computation of various rates for biogeochemistry
       !
-      IF( nn_hls > 1 ) CALL lbc_lnk( 'p4zsms', hmld(:,:), 'T', 1._wp )  ! hmld defined only on first halo in zdfmxl
-      !
       DO jnt = 1, nrdttrc          ! Potential time splitting if requested
          !
          CALL p4z_bio( kt, jnt, Kbb, Kmm, Krhs )   ! Biology
@@ -134,7 +132,7 @@ CONTAINS
          ! ------------------------------------------------------------------
          xnegtr(:,:,:) = 1.e0
          DO jn = jp_pcs0, jp_pcs1
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
+            DO_3D( 0, 0, 0, 0, 1, jpk)
                IF( ( tr(ji,jj,jk,jn,Kbb) + tr(ji,jj,jk,jn,Krhs) ) < 0.e0 ) THEN
                   ztra             = ABS( tr(ji,jj,jk,jn,Kbb) ) / ( ABS( tr(ji,jj,jk,jn,Krhs) ) + rtrn )
                   xnegtr(ji,jj,jk) = MIN( xnegtr(ji,jj,jk),  ztra )
@@ -151,45 +149,56 @@ CONTAINS
         IF(  iom_use( 'INTdtAlk' ) .OR. iom_use( 'INTdtDIC' ) .OR. iom_use( 'INTdtFer' ) .OR.  &
           &  iom_use( 'INTdtDIN' ) .OR. iom_use( 'INTdtDIP' ) .OR. iom_use( 'INTdtSil' ) )  THEN
           !
-          ALLOCATE( zw3d(jpi,jpj,jpk), zw2d(jpi,jpj) )
-          zw3d(:,:,jpk) = 0.
-          DO jk = 1, jpkm1
-              zw3d(:,:,jk) = xnegtr(:,:,jk) * xfact * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
-          ENDDO
+          ALLOCATE( zw3d(A2D(0),jpk), zw2d(A2D(0)) )
+          DO_3D( 0, 0, 0, 0, 1, jpkm1)
+             zw3d(ji,jj,jk) = xnegtr(ji,jj,jk) * xfact * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
+          END_3D
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jptal,Krhs)
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) *  tr(ji,jj,jk,jptal,Krhs) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtAlk', zw2d )
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpdic,Krhs)
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) *  tr(ji,jj,jk,jpdic,Krhs) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtDIC', zw2d )
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * rno3 * ( tr(:,:,jk,jpno3,Krhs) + tr(:,:,jk,jpnh4,Krhs) )
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * rno3 * ( tr(ji,jj,jk,jpno3,Krhs) + tr(ji,jj,jk,jpnh4,Krhs) ) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtDIN', zw2d )
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * po4r * tr(:,:,jk,jppo4,Krhs)
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) * po4r * tr(ji,jj,jk,jppo4,Krhs) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtDIP', zw2d )
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpfer,Krhs)
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) *  tr(ji,jj,jk,jpfer,Krhs) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtFer', zw2d )
           !
           zw2d(:,:) = 0.
           DO jk = 1, jpkm1
-             zw2d(:,:) = zw2d(:,:) + zw3d(:,:,jk) * tr(:,:,jk,jpsil,Krhs)
+             DO_2D( 0, 0, 0, 0 )
+                zw2d(ji,jj) = zw2d(ji,jj) + zw3d(ji,jj,jk) *  tr(ji,jj,jk,jpsil,Krhs) 
+             END_2D
           ENDDO
           CALL iom_put( 'INTdtSil', zw2d )
           !
@@ -516,8 +525,9 @@ CONTAINS
       INTEGER, INTENT( in ) ::   Kmm     ! time level indices
       REAL(wp)             ::  zrdenittot, zsdenittot, znitrpottot
       CHARACTER(LEN=100)   ::   cltxt
-      INTEGER :: jk
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwork
+      INTEGER :: ji, jj, jk
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zw2d
       !!----------------------------------------------------------------------
       !
       IF( kt == nittrc000 ) THEN 
@@ -536,82 +546,113 @@ CONTAINS
 
       ! Compute the budget of NO3
       IF( iom_use( "pno3tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
          IF( ln_p4z ) THEN
-            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm)                      &
-               &          +   tr(:,:,:,jpphy,Kmm) + tr(:,:,:,jpdia,Kmm)                      &
-               &          +   tr(:,:,:,jppoc,Kmm) + tr(:,:,:,jpgoc,Kmm)  + tr(:,:,:,jpdoc,Kmm)  &        
-               &          +   tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) 
+            DO_3D( 0, 0, 0, 0, 1, jpk)
+            zw3d(ji,jj,jk)  =  ( tr(ji,jj,jk,jpno3,Kmm) + tr(ji,jj,jk,jpnh4,Kmm)                      &
+               &             +   tr(ji,jj,jk,jpphy,Kmm) + tr(ji,jj,jk,jpdia,Kmm)                      &
+               &             +   tr(ji,jj,jk,jppoc,Kmm) + tr(ji,jj,jk,jpgoc,Kmm)  + tr(ji,jj,jk,jpdoc,Kmm)  &        
+               &             +   tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm)  ) * cvol(ji,jj,jk)
+            END_3D
         ELSE
-            zwork(:,:,:) =    tr(:,:,:,jpno3,Kmm) + tr(:,:,:,jpnh4,Kmm) + tr(:,:,:,jpnph,Kmm)   &
-               &          +   tr(:,:,:,jpndi,Kmm) + tr(:,:,:,jpnpi,Kmm)                      & 
-               &          +   tr(:,:,:,jppon,Kmm) + tr(:,:,:,jpgon,Kmm) + tr(:,:,:,jpdon,Kmm)   &
-               &          + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) ) * no3rat3 
+            DO_3D( 0, 0, 0, 0, 1, jpk)
+            zw3d(ji,jj,jk) =    ( tr(ji,jj,jk,jpno3,Kmm) + tr(ji,jj,jk,jpnh4,Kmm) + tr(ji,jj,jk,jpnph,Kmm)   &
+               &             +   tr(ji,jj,jk,jpndi,Kmm) + tr(ji,jj,jk,jpnpi,Kmm)                      & 
+               &             +   tr(ji,jj,jk,jppon,Kmm) + tr(ji,jj,jk,jpgon,Kmm) + tr(ji,jj,jk,jpdon,Kmm)   &
+               &             + ( tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * no3rat3 ) * cvol(ji,jj,jk)
+            END_3D
         ENDIF
         !
-        no3budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )  
+        no3budget = glob_sum( 'p4zsms', zw3d(:,:,:)  )  
         no3budget = no3budget / areatot
         CALL iom_put( "pno3tot", no3budget )
+        DEALLOCATE( zw3d )
       ENDIF
       !
       ! Compute the budget of PO4
       IF( iom_use( "ppo4tot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
          IF( ln_p4z ) THEN
-            zwork(:,:,:) =    tr(:,:,:,jppo4,Kmm)                                         &
-               &          +   tr(:,:,:,jpphy,Kmm) + tr(:,:,:,jpdia,Kmm)                      &
-               &          +   tr(:,:,:,jppoc,Kmm) + tr(:,:,:,jpgoc,Kmm)  + tr(:,:,:,jpdoc,Kmm)  &        
-               &          +   tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) 
-        ELSE
-            zwork(:,:,:) =    tr(:,:,:,jppo4,Kmm) + tr(:,:,:,jppph,Kmm)                      &
-               &          +   tr(:,:,:,jppdi,Kmm) + tr(:,:,:,jpppi,Kmm)                      & 
-               &          +   tr(:,:,:,jppop,Kmm) + tr(:,:,:,jpgop,Kmm) + tr(:,:,:,jpdop,Kmm)   &
-               &          + ( tr(:,:,:,jpzoo,Kmm) + tr(:,:,:,jpmes,Kmm) ) * po4rat3 
+            DO_3D( 0, 0, 0, 0, 1, jpk)
+               zw3d(ji,jj,jk) =    ( tr(ji,jj,jk,jppo4,Kmm)                                         &
+                  &             +   tr(ji,jj,jk,jpphy,Kmm) + tr(ji,jj,jk,jpdia,Kmm)                      &
+                  &             +   tr(ji,jj,jk,jppoc,Kmm) + tr(ji,jj,jk,jpgoc,Kmm)  + tr(ji,jj,jk,jpdoc,Kmm)  &        
+                  &             +   tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * cvol(ji,jj,jk)
+            END_3D
+         ELSE
+            DO_3D( 0, 0, 0, 0, 1, jpk)
+               zw3d(ji,jj,jk) =    ( tr(ji,jj,jk,jppo4,Kmm) + tr(ji,jj,jk,jppph,Kmm)                      &
+                  &             +   tr(ji,jj,jk,jppdi,Kmm) + tr(ji,jj,jk,jpppi,Kmm)                      & 
+                  &             +   tr(ji,jj,jk,jppop,Kmm) + tr(ji,jj,jk,jpgop,Kmm) + tr(ji,jj,jk,jpdop,Kmm)   &
+                  &             + ( tr(ji,jj,jk,jpzoo,Kmm) + tr(ji,jj,jk,jpmes,Kmm) ) * po4rat3 ) * cvol(ji,jj,jk)
+            END_3D
         ENDIF
         !
-        po4budget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )  
+        po4budget = glob_sum( 'p4zsms', zw3d(:,:,:)  )  
         po4budget = po4budget / areatot
         CALL iom_put( "ppo4tot", po4budget )
+        DEALLOCATE( zw3d )
       ENDIF
       !
       ! Compute the budget of SiO3
       IF( iom_use( "psiltot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
-         zwork(:,:,:) =  tr(:,:,:,jpsil,Kmm) + tr(:,:,:,jpgsi,Kmm) + tr(:,:,:,jpdsi,Kmm) 
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zw3d(ji,jj,jk) =  ( tr(ji,jj,jk,jpsil,Kmm) + tr(ji,jj,jk,jpgsi,Kmm) + tr(ji,jj,jk,jpdsi,Kmm) ) * cvol(ji,jj,jk)
+         END_3D
          !
-         silbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )  
+         silbudget = glob_sum( 'p4zsms', zw3d(:,:,:)  )  
          silbudget = silbudget / areatot
          CALL iom_put( "psiltot", silbudget )
+         DEALLOCATE( zw3d )
       ENDIF
       !
       IF( iom_use( "palktot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
-         zwork(:,:,:) =  tr(:,:,:,jpno3,Kmm) * rno3 + tr(:,:,:,jptal,Kmm) + tr(:,:,:,jpcal,Kmm) * 2.              
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zw3d(ji,jj,jk) =  ( tr(ji,jj,jk,jpno3,Kmm) * rno3 + tr(ji,jj,jk,jptal,Kmm) + tr(ji,jj,jk,jpcal,Kmm) * 2. ) * cvol(ji,jj,jk)             
+         END_3D
          !
-         alkbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )         !
+         alkbudget = glob_sum( 'p4zsms', zw3d(:,:,:)  )         !
          alkbudget = alkbudget / areatot
          CALL iom_put( "palktot", alkbudget )
+         DEALLOCATE( zw3d )
       ENDIF
       !
       ! Compute the budget of Iron
       IF( iom_use( "pfertot" ) .OR. ( ln_check_mass .AND. kt == nitend )  ) THEN
-         zwork(:,:,:) =   tr(:,:,:,jpfer,Kmm) + tr(:,:,:,jpnfe,Kmm) + tr(:,:,:,jpdfe,Kmm)   &
-            &         +   tr(:,:,:,jpbfe,Kmm) + tr(:,:,:,jpsfe,Kmm)                      &
-            &         + ( tr(:,:,:,jpzoo,Kmm) * feratz + tr(:,:,:,jpmes,Kmm) ) * feratm   
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zw3d(ji,jj,jk) =   ( tr(ji,jj,jk,jpfer,Kmm) + tr(ji,jj,jk,jpnfe,Kmm) + tr(ji,jj,jk,jpdfe,Kmm)   &
+               &            +    tr(ji,jj,jk,jpbfe,Kmm) + tr(ji,jj,jk,jpsfe,Kmm)                      &
+               &            +    tr(ji,jj,jk,jpzoo,Kmm) * feratz + tr(ji,jj,jk,jpmes,Kmm) * feratm ) * cvol(ji,jj,jk)  
+         END_3D
          !
-         ferbudget = glob_sum( 'p4zsms', zwork(:,:,:) * cvol(:,:,:)  )  
+         ferbudget = glob_sum( 'p4zsms', zw3d(:,:,:) )  
          ferbudget = ferbudget / areatot
          CALL iom_put( "pfertot", ferbudget )
+         DEALLOCATE( zw3d )
       ENDIF
       !
       ! Global budget of N SMS : denitrification in the water column and in the sediment
       !                          nitrogen fixation by the diazotrophs
       ! --------------------------------------------------------------------------------
       IF( iom_use( "tnfix" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
-         znitrpottot  = glob_sum ( 'p4zsms', nitrpot(:,:,:) * nitrfix * cvol(:,:,:) )
+         ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(:,:,jpk) = 0._wp
+         zw3d(:,:,1:jpkm1) =  nitrpot(A2D(0),1:jpkm1) * nitrfix * cvol(A2D(0),1:jpkm1)
+         znitrpottot  = glob_sum ( 'p4zsms',  zw3d)
          CALL iom_put( "tnfix"  , znitrpottot * xfact3 )  ! Global  nitrogen fixation molC/l  to molN/m3 
+         DEALLOCATE( zw3d )
       ENDIF
       !
       IF( iom_use( "tdenit" ) .OR.  ( ln_check_mass .AND. kt == nitend )  ) THEN
-         zrdenittot = glob_sum ( 'p4zsms', denitr(:,:,:) * rdenit * xnegtr(:,:,:) * cvol(:,:,:) )
-         zsdenittot = glob_sum ( 'p4zsms', sdenit(:,:) * e1e2t(:,:) * tmask(:,:,1) )
+         ALLOCATE( zw3d(A2D(0),jpk), zw2d(A2D(0)) )  ;  zw3d(:,:,jpk) = 0._wp
+         zw3d(:,:,1:jpkm1) =  denitr(A2D(0),1:jpkm1) *  rdenit * xnegtr(A2D(0),1:jpkm1) * cvol(A2D(0),1:jpkm1)
+         zw2d(:,:)         =  sdenit(A2D(0)) *  e1e2t(A2D(0)) * tmask(A2D(0),1)
+         zrdenittot = glob_sum ( 'p4zsms', zw3d )
+         zsdenittot = glob_sum ( 'p4zsms', Zw2d )
          CALL iom_put( "tdenit" , ( zrdenittot + zsdenittot ) * xfact3 )  ! Total denitrification molC/l to molN/m3 
+         DEALLOCATE( zw3d, zw2d )
       ENDIF
       !
       IF( ln_check_mass .AND. kt == nitend ) THEN   ! Compute the budget of NO3, ALK, Si, Fer
diff --git a/src/TOP/PISCES/P4Z/p5zlim.F90 b/src/TOP/PISCES/P4Z/p5zlim.F90
index 91e94183..dfaa8c68 100644
--- a/src/TOP/PISCES/P4Z/p5zlim.F90
+++ b/src/TOP/PISCES/P4Z/p5zlim.F90
@@ -94,6 +94,9 @@ MODULE p5zlim
    REAL(wp) ::  xcoef1   = 0.00167  / 55.85
    REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5
    REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5 
+
+    LOGICAL  :: l_dia_nut_lim, l_dia_iron_lim, l_dia_fracal
+    LOGICAL  :: l_dia_size_lim, l_dia_size_pro
    !! * Substitutions
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -136,15 +139,23 @@ CONTAINS
       REAL(wp) ::   zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl
       REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4, zbiron
       REAL(wp) ::   znutlimtot, zlimno3, zlimnh4, zlim1f, zsizetmp
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrassn, zrassp, zrassd
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p5z_lim')
+
+      IF( kt == nittrc000 )  THEN
+         l_dia_nut_lim  = iom_use( "LNnut"   ) .OR. iom_use( "LDnut" ) .OR. iom_use( "LPnut" )
+         l_dia_iron_lim = iom_use( "LNFe"    ) .OR. iom_use( "LDFe"  ) .OR. iom_use( "LPFe"  )
+         l_dia_size_lim = iom_use( "SIZEN"   ) .OR. iom_use( "SIZED" ) .OR. iom_use( "SIZEP" )
+         l_dia_size_pro = iom_use( "RASSN"   ) .OR. iom_use( "RASSP" ) .OR. iom_use( "RASSP" )
+         l_dia_fracal   = iom_use( "xfracal" )
+      ENDIF
       !
       zratchl = 6.0
       sizena(:,:,:) = 0.0  ;  sizepa(:,:,:) = 0.0  ;  sizeda(:,:,:) = 0.0
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! Computation of the Chl/C ratio of each phytoplankton group
          ! -------------------------------------------------------
          z1_trnphy   = 1. / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn )
@@ -407,7 +418,7 @@ CONTAINS
       ! nutrient uptake pool and assembly machinery. DNA is assumed to represent 1% of the dry mass of 
       ! phytoplankton (see Daines et al., 2013). 
       ! --------------------------------------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! Size estimation of nanophytoplankton based on total biomass
          ! Assumes that larger biomass implies addition of larger cells
          ! ------------------------------------------------------------
@@ -419,7 +430,6 @@ CONTAINS
          ! Computed from Inomura et al. (2020) using Pavlova Lutheri
          zrpho  = 11.55 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn )
          zrass = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) )
-         zrassn(ji,jj,jk) = zrass
          xqpnmin(ji,jj,jk) = ( 0.0 + 0.0078 + 0.62/4. * 0.0783 ) * 16.
          xqpnmax(ji,jj,jk) = ( zrpho * 0.0089 + zrass * 0.0783 ) * 16.
          xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) + (0.033 + 0.0078 ) * 16.
@@ -437,7 +447,6 @@ CONTAINS
          ! Computed from Inomura et al. (2020) using a synechococcus
          zrpho = 13.4 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn )
          zrass = MAX(0.4/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) )
-         zrassp(ji,jj,jk) = zrass
          xqppmin(ji,jj,jk) = ( (0.0 + 0.0078 ) + 0.4/4. * 0.0517 ) * 16.
          xqppmax(ji,jj,jk) = ( zrpho * 0.0076 + zrass * 0.0517 ) * 16.
          xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) +  (0.033 + 0.0078 ) * 16
@@ -454,7 +463,6 @@ CONTAINS
          ! Computed from Inomura et al. (2020) using a synechococcus
          zrpho = 8.08 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * 12. + rtrn )
          zrass = MAX(0.66/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) )
-         zrassd(ji,jj,jk)=zrass
          xqpdmin(ji,jj,jk) = ( ( 0.0 + 0.0078 ) + 0.66/4. * 0.0783 ) * 16.
          xqpdmax(ji,jj,jk) = ( zrpho * 0.0135 + zrass * 0.0783 ) * 16.
          xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) + ( 0.0078 + 0.033 ) * 16.
@@ -465,7 +473,7 @@ CONTAINS
       ! This is a purely adhoc formulation described in Aumont et al. (2015)
       ! This fraction depends on nutrient limitation, light, temperature
       ! --------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zlim1 =  tr(ji,jj,jk,jpnh4,Kbb) / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) + tr(ji,jj,jk,jpno3,Kbb)    &
          &        / ( tr(ji,jj,jk,jpno3,Kbb) + concnno3 ) * ( 1.0 - tr(ji,jj,jk,jpnh4,Kbb)   &
          &        / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) )
@@ -482,7 +490,7 @@ CONTAINS
          xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) )
       END_3D
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ! denitrification factor computed from O2 levels
          nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - tr(ji,jj,jk,jpoxy,Kbb) )    &
             &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  )
@@ -490,19 +498,70 @@ CONTAINS
       END_3D
       !
       IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
-        CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
-        CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
-        CALL iom_put( "LPnut"  , xlimpic(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
-        CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
-        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "LPFe"   , xlimpfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "SIZEN"  , sizen  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "SIZEP"  , sizep  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "RASSN"  , zrassn (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "RASSP"  , zrassp (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
-        CALL iom_put( "RASSD"  , zrassd (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
+        !
+        IF( l_dia_fracal ) THEN   ! fraction of calcifiers
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xfracal(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "xfracal",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_nut_lim ) THEN   ! Nutrient limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LNnut",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimdia(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDnut",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimpic(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LPnut",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_iron_lim ) THEN   ! Iron limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = xlimnfe(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LNFe",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimdfe(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDFe",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = xlimpfe(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LPFe",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_size_lim ) THEN   ! Size limitation term
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = sizen(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "SIZEN",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = sized(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "SIZED",  zw3d)
+          zw3d(A2D(0),1:jpkm1) = sizep(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "SIZEP",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_size_pro ) THEN   ! Size of the protein machinery
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          DO_3D( 0, 0, 0, 0, 1, jpkm1)
+             zfuptk = 0.2 + 0.12 / ( 3.0 * sizen(ji,jj,jk) + rtrn )
+             zrpho  = 11.55 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn )
+             zw3d(ji,jj,jk) = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) ) * tmask(ji,jj,jk)
+          END_3D
+          CALL iom_put( "RASSN",  zw3d)
+          DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zfuptk = 0.2 + 0.12 / ( 3.0 * sizep(ji,jj,jk) + rtrn )
+             zrpho  = 11.55 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) * 12. + rtrn )
+             zw3d(ji,jj,jk) = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) ) * tmask(ji,jj,jk)
+          END_3D
+          CALL iom_put( "RASSP",  zw3d)
+          DO_3D( 0, 0, 0, 0, 1, jpkm1)
+             zfuptk = 0.2 + 0.12 / ( 3.0 * sized(ji,jj,jk) + rtrn )
+             zrpho  = 11.55 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * 12. + rtrn )
+             zw3d(ji,jj,jk) = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) ) * tmask(ji,jj,jk)
+          END_3D
+          CALL iom_put( "RASSD",  zw3d)
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
       ENDIF
       !
       IF( ln_timing )  CALL timing_stop('p5z_lim')
@@ -635,24 +694,24 @@ CONTAINS
       ierr(:) = 0
       !
       !*  Biological arrays for phytoplankton growth
-      ALLOCATE( xpicono3(jpi,jpj,jpk), xpiconh4(jpi,jpj,jpk),       &
-         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       &
-         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       &
-         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       &
-         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       &
-         &      xlimphys(jpi,jpj,jpk), xlimdias(jpi,jpj,jpk),       &
-         &      xlimnpp (jpi,jpj,jpk), xlimnpn (jpi,jpj,jpk),       &
-         &      xlimnpd (jpi,jpj,jpk),                              &
-         &      xlimpics(jpi,jpj,jpk), xqfuncfecp(jpi,jpj,jpk),     &
-         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),    STAT=ierr(1) )
+      ALLOCATE( xpicono3(A2D(0),jpk), xpiconh4(A2D(0),jpk),       &
+         &      xpicopo4(A2D(0),jpk), xpicodop(A2D(0),jpk),       &
+         &      xnanodop(A2D(0),jpk), xdiatdop(A2D(0),jpk),       &
+         &      xpicofer(A2D(0),jpk), xlimpfe (A2D(0),jpk),       &
+         &      fvnuptk (A2D(0),jpk), fvduptk (A2D(0),jpk),       &
+         &      xlimphys(A2D(0),jpk), xlimdias(A2D(0),jpk),       &
+         &      xlimnpp (A2D(0),jpk), xlimnpn (A2D(0),jpk),       &
+         &      xlimnpd (A2D(0),jpk),                              &
+         &      xlimpics(A2D(0),jpk), xqfuncfecp(A2D(0),jpk),     &
+         &      fvpuptk (A2D(0),jpk), xlimpic (A2D(0),jpk),    STAT=ierr(1) )
          !
       !*  Minimum/maximum quotas of phytoplankton
-      ALLOCATE( xqnnmin (jpi,jpj,jpk), xqnnmax(jpi,jpj,jpk),       &
-         &      xqpnmin (jpi,jpj,jpk), xqpnmax(jpi,jpj,jpk),       &
-         &      xqnpmin (jpi,jpj,jpk), xqnpmax(jpi,jpj,jpk),       &
-         &      xqppmin (jpi,jpj,jpk), xqppmax(jpi,jpj,jpk),       &
-         &      xqndmin (jpi,jpj,jpk), xqndmax(jpi,jpj,jpk),       &
-         &      xqpdmin (jpi,jpj,jpk), xqpdmax(jpi,jpj,jpk),     STAT=ierr(2) )
+      ALLOCATE( xqnnmin (A2D(0),jpk), xqnnmax(A2D(0),jpk),       &
+         &      xqpnmin (A2D(0),jpk), xqpnmax(A2D(0),jpk),       &
+         &      xqnpmin (A2D(0),jpk), xqnpmax(A2D(0),jpk),       &
+         &      xqppmin (A2D(0),jpk), xqppmax(A2D(0),jpk),       &
+         &      xqndmin (A2D(0),jpk), xqndmax(A2D(0),jpk),       &
+         &      xqpdmin (A2D(0),jpk), xqpdmax(A2D(0),jpk),     STAT=ierr(2) )
          !
       p5z_lim_alloc = MAXVAL( ierr )
       !
diff --git a/src/TOP/PISCES/P4Z/p5zmeso.F90 b/src/TOP/PISCES/P4Z/p5zmeso.F90
index 24ca0260..9e0bf8a6 100644
--- a/src/TOP/PISCES/P4Z/p5zmeso.F90
+++ b/src/TOP/PISCES/P4Z/p5zmeso.F90
@@ -58,6 +58,7 @@ MODULE p5zmeso
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth
    INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth
 
+   LOGICAL          :: l_dia_fezoo2, l_dia_graz2, l_dia_lprodz2
    !! * Substitutions
 #  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
@@ -103,21 +104,40 @@ CONTAINS
       REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval, zmigthick 
       CHARACTER (len=25) :: charout
       REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarem, zgraref, zgrapoc, zgrapof
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zgrarep, zgraren, zgrapon, zgrapop
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zgradoc, zgradon, zgradop
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrep, zgramigren, zgramigpop, zgramigpon
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigdoc, zgramigdop, zgramigdon
-      
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zgrazing2, zfezoo2, zzligprod2, zw3d
 
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p5z_meso')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_graz2   = iom_use( "GRAZ2" )
+         l_dia_fezoo2  = iom_use( "FEZOO2" )
+         l_dia_lprodz2 = ln_ligand .AND. iom_use( "LPRODZ2" )
+      ENDIF
+      IF( l_dia_lprodz2 ) THEN
+         ALLOCATE( zzligprod2(A2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zzligprod2(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_fezoo2 ) THEN
+         ALLOCATE( zfezoo2(A2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
+            zfezoo2(ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_graz2 ) THEN
+         ALLOCATE( zgrazing2(A2D(0),jpk) )
+      ENDIF
+
       ! Initialization of local arrays
-      zgrazing(:,:,:) = 0._wp  ;  zfezoo2(:,:,:) = 0._wp
       zgrarem (:,:,:) = 0._wp  ;  zgraren(:,:,:) = 0._wp
       zgrarep (:,:,:) = 0._wp  ;  zgraref(:,:,:) = 0._wp
       zgrapoc (:,:,:) = 0._wp  ;  zgrapon(:,:,:) = 0._wp
@@ -136,7 +156,7 @@ CONTAINS
       zmetexcess = 0.0
       IF ( bmetexc2 ) zmetexcess = 1.0
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompam   = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - 1.e-9 ), 0.e0 )
          zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
 
@@ -284,7 +304,7 @@ CONTAINS
          &            + zgrazffpp + zgrazffpg
 
          ! Total grazing ( grazing by microzoo is already computed in p5zmicro )
-         zgrazing(ji,jj,jk) = zgraztotc
+         IF( l_dia_graz2 ) zgrazing2(ji,jj,jk) = zgraztotc
 
          !   Stoichiometruc ratios of the food ingested by zooplanton 
          !   --------------------------------------------------------
@@ -427,7 +447,7 @@ CONTAINS
           ! This fraction is sumed over the euphotic zone and is removed from 
           ! the fluxes driven by mesozooplankton in the euphotic zone.
           ! --------------------------------------------------------------------
-          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+          DO_3D( 0, 0, 0, 0, 1, jpkm1)
              zmigreltime = (1. - strn(ji,jj))
              IF( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN
                 zmigthick  = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * ( 1. - zmigreltime ) 
@@ -460,7 +480,7 @@ CONTAINS
           ! The inorganic and organic fluxes induced by migrating organisms are added at the 
           ! the migration depth (corresponding indice is set by kmig)
           ! --------------------------------------------------------------------------------
-          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+          DO_2D( 0, 0, 0, 0 )
              IF( tmask(ji,jj,1) == 1. ) THEN
                  jkt = kmig(ji,jj)
                  zdep = 1. / e3t(ji,jj,jkt,Kmm)
@@ -490,7 +510,7 @@ CONTAINS
         !   This only concerns the variables which are affected by DVM (inorganic 
         !   nutrients, DOC agands, and particulate organic carbon). 
         !   ---------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep(ji,jj,jk) 
          tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren(ji,jj,jk)
          tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc(ji,jj,jk)
@@ -512,12 +532,47 @@ CONTAINS
          tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk)
       END_3D
       !
+      ! Write the output
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-         CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production 
-         CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo
-         CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         IF( ln_ligand ) &
-           & CALL iom_put( "LPRODZ2", zgradoc(:,:,:) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  )
+        !
+        IF( iom_use ( "PCAL" ) ) THEN   ! Calcite production
+            ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zw3d(ji,jj,jk) = prodcal(ji,jj,jk) * 1.e+3 * rfact2r * tmask(ji,jj,jk)
+            END_3D
+          CALL iom_put( "PCAL", zw3d )
+          DEALLOCATE( zw3d )
+        ENDIF
+        !
+        IF( l_dia_graz2 ) THEN  !   Total grazing of phyto by zooplankton
+            zgrazing2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zgrazing2(ji,jj,jk) =  zgrazing2(ji,jj,jk) *  1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in mol/m2/s
+            END_3D
+            CALL iom_put( "GRAZ2" , zgrazing2 )
+            DEALLOCATE( zgrazing2 )
+        ENDIF
+        !
+        IF( l_dia_fezoo2 ) THEN
+            zfezoo2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfezoo2(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Krhs) - zfezoo2(ji,jj,jk) ) &
+                  &              * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "FEZOO2", zfezoo2 )
+           DEALLOCATE( zfezoo2 )
+        ENDIF
+        !
+        IF( l_dia_lprodz2 ) THEN
+            zzligprod2(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zzligprod2(ji,jj,jk) = ( tr(ji,jj,jk,jplgw,Krhs) - zzligprod2(ji,jj,jk) ) &
+                   &                * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "LPRODZ2", zzligprod2 )
+           DEALLOCATE( zzligprod2 )
+        ENDIF
+        !
       ENDIF
       !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -626,7 +681,7 @@ CONTAINS
       ! Compute the averaged values of oxygen, temperature over the domain 
       ! 150m to 500 m depth.
       ! ------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
+      DO_3D( 0, 0, 0, 0, 1, jpk )
          IF( tmask(ji,jj,jk) == 1.) THEN
             IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN
                oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm)
@@ -639,7 +694,7 @@ CONTAINS
       ! Compute the difference between surface values and the mean values in the mesopelagic
       ! domain
       ! ------------------------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          z1dep = 1. / ( zdepmoy(ji,jj) + rtrn )
          oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep
          tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep
@@ -648,7 +703,7 @@ CONTAINS
       ! Computation of the migration depth based on the parameterization of 
       ! Bianchi et al. (2013)
       ! -------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tmask(ji,jj,1) == 1. ) THEN
             ztotchl = ( tr(ji,jj,1,jppch,Kbb) + tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6
             depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
@@ -657,7 +712,7 @@ CONTAINS
 
             ! Computation of the corresponding jk indice 
       ! ------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN
              kmig(ji,jj) = jk
           ENDIF
@@ -669,7 +724,7 @@ CONTAINS
       ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
       ! that it falls above the OMZ
       ! -----------------------------------------------------------------------
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN
             DO jk = kmig(ji,jj),1,-1
                IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN
@@ -689,7 +744,7 @@ CONTAINS
       !!                     ***  ROUTINE p5z_meso_alloc  ***
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  )
+      ALLOCATE( depmig(A2D(0)), kmig(A2D(0)), STAT= p5z_meso_alloc  )
       !
       IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/PISCES/P4Z/p5zmicro.F90 b/src/TOP/PISCES/P4Z/p5zmicro.F90
index 6edfde55..d70b3ff4 100644
--- a/src/TOP/PISCES/P4Z/p5zmicro.F90
+++ b/src/TOP/PISCES/P4Z/p5zmicro.F90
@@ -53,6 +53,8 @@ MODULE p5zmicro
    REAL(wp), PUBLIC ::  xsigmadel   !: Maximum additional width of the grazing window at low food density
    LOGICAL,  PUBLIC ::  bmetexc     !: Use of excess carbon for respiration
 
+   LOGICAL          :: l_dia_fezoo, l_dia_graz1, l_dia_lprodz
+
    !! * Substitutions
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -88,18 +90,39 @@ CONTAINS
       REAL(wp) :: zgraznc, zgraznn, zgraznp, zgrazpoc, zgrazpon, zgrazpop, zgrazpof
       REAL(wp) :: zgrazdc, zgrazdn, zgrazdp, zgrazdf, zgraznf, zgrazz
       REAL(wp) :: zgrazpc, zgrazpn, zgrazpp, zgrazpf, zbeta, zrfact2, zmetexcess
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo, zzligprod
       REAL(wp) :: zsigma, zdiffdn, zdiffpn, zdiffdp, zproport, zproport2
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zgrazing, zfezoo, zzligprod, zw3d
       CHARACTER (len=25) :: charout
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p5z_micro')
       !
+      IF( kt == nittrc000 )  THEN
+         l_dia_graz1  = iom_use( "GRAZ1" )
+         l_dia_fezoo  = iom_use( "FEZOO" )
+         l_dia_lprodz = ln_ligand .AND. iom_use( "LPRODZ" )
+      ENDIF
+      IF( l_dia_lprodz ) THEN
+         ALLOCATE( zzligprod(A2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zzligprod(ji,jj,jk) = tr(ji,jj,jk,jplgw,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_fezoo ) THEN
+         ALLOCATE( zfezoo(A2D(0),jpk) )
+         DO_3D( 0, 0, 0, 0, 1, jpk)
+            zfezoo(ji,jj,jk) = tr(ji,jj,jk,jpfer,Krhs)
+         END_3D
+      ENDIF
+      IF( l_dia_graz1 ) THEN
+         ALLOCATE( zgrazing(A2D(0),jpk) )
+      ENDIF
+
       ! Use of excess carbon for metabolism
       zmetexcess = 0.0
       IF ( bmetexc ) zmetexcess = 1.0
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 )
          zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz
          ! Proportion of nano and diatoms that are within the size range
@@ -207,14 +230,13 @@ CONTAINS
          zgrazdf   = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn)
          !
                ! Total ingestion rates in C, P, Fe, N
-         zgraztotc = zgraznc + zgrazpoc + zgrazdc + zgrazz + zgrazpc
+         zgraztotc = zgraznc + zgrazpoc + zgrazdc + zgrazz + zgrazpc ! Grazing by microzooplankton
+         IF( l_dia_graz1 ) zgrazing(ji,jj,jk) = zgraztotc
+
          zgraztotn = zgraznn + zgrazpn + zgrazpon + zgrazdn + zgrazz * no3rat3
          zgraztotp = zgraznp + zgrazpp + zgrazpop + zgrazdp + zgrazz * po4rat3
          zgraztotf = zgraznf + zgrazpf + zgrazpof + zgrazdf + zgrazz * feratz
          !
-         ! Grazing by microzooplankton
-         zgrazing(ji,jj,jk) = zgraztotc
-
          !   Stoichiometruc ratios of the food ingested by zooplanton 
          !   --------------------------------------------------------
          zgrasratf =  (zgraztotf + rtrn) / ( zgraztotc + rtrn )
@@ -298,14 +320,12 @@ CONTAINS
          !
          IF( ln_ligand ) THEN 
             tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgradoc * ldocz
-            zzligprod(ji,jj,jk) = zgradoc * ldocz
          ENDIF
          !
          tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon
          tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop
          tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem 
          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref
-         zfezoo(ji,jj,jk)    = zgraref
          tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zepsherv * zgraztotc - zrespirc - ztortz - zgrazz
          tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc
          tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) - zgraznn
@@ -342,15 +362,36 @@ CONTAINS
       END_3D
       !
       IF( lk_iomput .AND. knt == nrdttrc ) THEN
-       IF( iom_use("GRAZ1") ) THEN  !   Total grazing of phyto by zooplankton
-           zgrazing(:,:,jpk) = 0._wp   ; CALL iom_put( "GRAZ1" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) 
-         ENDIF
-         IF( iom_use("FEZOO") ) THEN  
-           zfezoo (:,:,jpk) = 0._wp    ; CALL iom_put( "FEZOO" , zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
-         ENDIF
-         IF( ln_ligand ) THEN
-            zzligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ", zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:))
-         ENDIF
+        !
+        IF( l_dia_graz1 ) THEN  !   Total grazing of phyto by zooplankton
+            zgrazing(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zgrazing(ji,jj,jk) = zgrazing(ji,jj,jk) *  1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in mol/m2/s
+            END_3D
+            CALL iom_put( "GRAZ1" , zgrazing )
+            DEALLOCATE( zgrazing )
+        ENDIF
+        !
+        IF( l_dia_fezoo ) THEN
+            zfezoo(A2D(0),jpk) = 0._wp                
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zfezoo(ji,jj,jk) = ( tr(ji,jj,jk,jpfer,Krhs) - zfezoo(ji,jj,jk) ) &
+                  &              * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "FEZOO", zfezoo )
+           DEALLOCATE( zfezoo )
+        ENDIF
+        !
+        IF( l_dia_lprodz ) THEN
+            zzligprod(A2D(0),jpk) = 0._wp
+            DO_3D( 0, 0, 0, 0, 1, jpkm1)
+               zzligprod(ji,jj,jk) = ( tr(ji,jj,jk,jplgw,Krhs) - zzligprod(ji,jj,jk) ) &
+                   &                * 1e9 * 1.e+3 * rfact2r * tmask(ji,jj,jk) ! conversion in nmol/m2/s
+            END_3D
+           CALL iom_put( "LPRODZ", zzligprod )
+           DEALLOCATE( zzligprod )
+        ENDIF
+        !
       ENDIF
       !
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
diff --git a/src/TOP/PISCES/P4Z/p5zmort.F90 b/src/TOP/PISCES/P4Z/p5zmort.F90
index 396be16f..4fb33dac 100644
--- a/src/TOP/PISCES/P4Z/p5zmort.F90
+++ b/src/TOP/PISCES/P4Z/p5zmort.F90
@@ -80,7 +80,7 @@ CONTAINS
       IF( ln_timing )   CALL timing_start('p5z_mort_nano')
       !
       prodcal(:,:,:) = 0.  !: calcite production variable set to zero
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - 1e-9 ), 0.e0 )
 
          ! Quadratic mortality of nano due to aggregation during
@@ -151,7 +151,7 @@ CONTAINS
       !
       IF( ln_timing )   CALL timing_start('p5z_mort_pico')
       !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zcompaph = MAX( ( tr(ji,jj,jk,jppic,Kbb) - 1e-9 ), 0.e0 )
 
          ! Quadratic mortality of pico due to aggregation during
@@ -215,7 +215,7 @@ CONTAINS
       IF( ln_timing )   CALL timing_start('p5z_mort_diat')
       !
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
 
          zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - 1E-9), 0. )
 
diff --git a/src/TOP/PISCES/P4Z/p5zprod.F90 b/src/TOP/PISCES/P4Z/p5zprod.F90
index 848f8550..0888dfc0 100644
--- a/src/TOP/PISCES/P4Z/p5zprod.F90
+++ b/src/TOP/PISCES/P4Z/p5zprod.F90
@@ -26,7 +26,6 @@ MODULE p5zprod
 
    PUBLIC   p5z_prod         ! called in p5zbio.F90
    PUBLIC   p5z_prod_init    ! called in trcsms_pisces.F90
-   PUBLIC   p5z_prod_alloc
 
    !! * Shared module variables
    REAL(wp), PUBLIC ::  pislopen        !: P-I slope of nanophytoplankton
@@ -43,12 +42,16 @@ MODULE p5zprod
    REAL(wp), PUBLIC ::  chlcmin         !: Minimum Chl/C ratio of phytoplankton
    REAL(wp), PUBLIC ::  grosip          !: Mean Si/C ratio of diatoms
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   zdaylen ! day length
-   
-   REAL(wp) :: r1_rday                !: 1 / rday
-   REAL(wp) :: texcretn               !: 1 - excretn 
-   REAL(wp) :: texcretp               !: 1 - excretp 
-   REAL(wp) :: texcretd               !: 1 - excretd        
+   REAL(wp) :: r1_rday     !: 1 / rday
+   REAL(wp) :: texcretn    !: 1 - excretn 
+   REAL(wp) :: texcretp    !: 1 - excretp 
+   REAL(wp) :: texcretd    !: 1 - excretd        
+   REAL(wp) :: xq10_n      !: q10 coef for nano =  1. + xpsino3 * qnnmax
+   REAL(wp) :: xq10_p      !: q10 coef for pico =  1. + xpsino3 * qnpmax
+   REAL(wp) :: xq10_d      !: q10 coef for diat =  1. + xpsino3 * qndmax
+
+   LOGICAL  :: l_dia_ppphy, l_dia_ppnew, l_dia_ppbfe, l_dia_ppbsi
+   LOGICAL  :: l_dia_mu, l_dia_light, l_dia_lprod
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
@@ -76,51 +79,60 @@ CONTAINS
       INTEGER  ::   ji, jj, jk
       REAL(wp) ::   zsilfac, znanotot, zpicotot, zdiattot, zconctemp, zconctemp2
       REAL(wp) ::   zration, zratiop, zratiof, zmax, ztn, zadap
-      REAL(wp) ::   zpronmax, zpropmax, zprofmax, zratio
+      REAL(wp) ::   zprofmax, zratio
+      REAL(wp) ::   zpronewn, zpronewp, zpronewd
+      REAL(wp) ::   zproregn, zproregp, zproregd
+      REAL(wp) ::   zpropo4n, zpropo4p, zpropo4d
+      REAL(wp) ::   zprodopn, zprodopp, zprodopd
       REAL(wp) ::   zlim, zsilfac2, zsiborn, zprod, zprontot, zproptot, zprodtot
       REAL(wp) ::   zproddoc, zproddon, zproddop, zprodsil, zprodfer, zprodlig, zresptot     
       REAL(wp) ::   zprnutmax, zprochln, zprochld, zprochlp
       REAL(wp) ::   zpislopen, zpislopep, zpisloped
       REAL(wp) ::   zval, zpptot, zpnewtot, zpregtot
+      REAL(wp) ::   zmxl_chl, zmxl_fac
       REAL(wp) ::   zqfpmax, zqfnmax, zqfdmax
       REAL(wp) ::   zfact, zrfact2, zmaxsi, zratiosi, zsizetmp, zlimfac, zsilim
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj    ) :: zmixnano, zmixpico, zmixdiat
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadp, zpislopeadd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprnut, zprmaxp, zprmaxn, zprmaxd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprbio, zprpic, zprdia, zysopt
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprchln, zprchlp, zprchld
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcap, zprorcad 
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprofed, zprofep, zprofen
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewp, zpronewd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zproregn, zproregp, zproregd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpropo4n, zpropo4p, zpropo4d
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprodopn, zprodopp, zprodopd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrespn, zrespp, zrespd
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprorcan, zprorcap, zprorcad
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zpislopeadn, zpislopeadp, zpislopeadd
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprnut, zprbio, zprpic, zprdia, zysopt
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprchln, zprchlp, zprchld
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprofed, zprofep, zprofen
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zpronmaxn, zpronmaxp,zpronmaxd
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zpropmaxn, zpropmaxp,zpropmaxd
+!      REAL(wp), DIMENSION(A2D(0),jpk) :: zrespn, zrespp, zrespd
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zprmaxn, zprmaxd, zprmaxp, zmxl
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('p5z_prod')
+      !
+      IF( kt == nittrc000 ) THEN
+         l_dia_ppphy = iom_use( "PPPHYN" ) .OR. iom_use( "PPPHYD" ) .OR. iom_use( "PPPHYP" ) .OR. iom_use( "TPP"  )
+         l_dia_ppnew = iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) .OR. iom_use( "PPNEWP" ) .OR. iom_use( "TPNEW")
+         l_dia_ppbfe = iom_use( "PFeN"   ) .OR. iom_use( "PFeD"   ) .OR. iom_use( "PFeP"   ) .OR. iom_use( "TPBFE")
+         l_dia_ppbsi = iom_use( "PBSi"   )
+         l_dia_mu    = iom_use( "Mumax"  ) .OR. iom_use( "MuN"    ) .OR. iom_use( "MuD") .OR. iom_use( "MuP")
+         l_dia_light = iom_use( "LNlight") .OR. iom_use( "LDlight") .OR. iom_use( "LPlight")
+         l_dia_lprod = ln_ligand .AND. ( iom_use( "LPRODP") .OR. iom_use( "LDETP") )
+      ENDIF
 
       ! Initialize the local arrays
-      zprorcan(:,:,:) = 0._wp ; zprorcap(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp
-      zprofed (:,:,:) = 0._wp ; zprofep (:,:,:) = 0._wp ; zprofen (:,:,:) = 0._wp
-      zpronewn(:,:,:) = 0._wp ; zpronewp(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp
-      zproregn(:,:,:) = 0._wp ; zproregp(:,:,:) = 0._wp ; zproregd(:,:,:) = 0._wp 
-      zpropo4n(:,:,:) = 0._wp ; zpropo4p(:,:,:) = 0._wp ; zpropo4d(:,:,:) = 0._wp
-      zprdia  (:,:,:) = 0._wp ; zprpic  (:,:,:) = 0._wp ; zprbio  (:,:,:) = 0._wp
-      zprodopn(:,:,:) = 0._wp ; zprodopp(:,:,:) = 0._wp ; zprodopd(:,:,:) = 0._wp
-      zysopt  (:,:,:) = 0._wp 
-      zrespn  (:,:,:) = 0._wp ; zrespp  (:,:,:) = 0._wp ; zrespd  (:,:,:) = 0._wp 
-      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp
+      zprorcan (:,:,:) = 0._wp ; zprorcap (:,:,:) = 0._wp ; zprorcad (:,:,:) = 0._wp
+      zprofen  (:,:,:) = 0._wp ; zprofep  (:,:,:) = 0._wp ; zprofed  (:,:,:) = 0._wp
+      zprbio   (:,:,:) = 0._wp ; zprpic   (:,:,:) = 0._wp ; zprdia   (:,:,:) = 0._wp
+      zpronmaxn(:,:,:) = 0._wp ; zpronmaxp(:,:,:) = 0._wp ; zpronmaxd(:,:,:) = 0._wp
+      zpropmaxn(:,:,:) = 0._wp ; zpropmaxp(:,:,:) = 0._wp ; zpropmaxd(:,:,:) = 0._wp
+      zmxl     (:,:,:) = 0._wp ; zysopt   (:,:,:) = 0._wp 
+      
+!      zrespn  (:,:,:) = 0._wp ; zrespp  (:,:,:) = 0._wp ; zrespd  (:,:,:) = 0._wp 
 
       ! Computation of the optimal production rates and nutrient uptake
       ! rates. Based on a Q10 description of the thermal dependency.
-      zprnut (:,:,:) =  0.8_wp * r1_rday * tgfunc(:,:,:)
-      zprmaxn(:,:,:) =  0.8_wp * (1. + xpsino3 * qnnmax ) * r1_rday * tgfunc(:,:,:)
-      zprmaxd(:,:,:) =  0.8_wp * (1. + xpsino3 * qndmax ) * r1_rday * tgfunc(:,:,:)
-      zprmaxp(:,:,:) =  0.6_wp * (1. + xpsino3 * qnpmax ) * r1_rday * tgfunc(:,:,:)
+       zprnut (:,:,:) =  0.8_wp          * r1_rday * tgfunc(:,:,:)
+       zprmaxn(:,:,:)  = 0.8_wp * xq10_n * r1_rday * tgfunc(:,:,:)
+       zprmaxd(:,:,:)  = 0.8_wp * xq10_d * r1_rday * tgfunc(:,:,:)
+       zprmaxp(:,:,:)  = 0.6_wp * xq10_p * r1_rday * tgfunc(:,:,:)
 
       ! Impact of the day duration and light intermittency on phytoplankton growth
       ! Intermittency is supposed to have a similar effect on production as 
@@ -131,42 +143,39 @@ CONTAINS
       ! ------------------------------------------------------------------------- 
 
       IF ( ln_p4z_dcyc ) THEN    ! Diurnal cycle in PISCES
-
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
                IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
                   zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
                ENDIF
-               zmxl_chl(ji,jj,jk) = zval / 24.
-               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
+               zmxl(ji,jj,jk) = zval 
             ENDIF
          END_3D
-
       ELSE ! No diurnal cycle in PISCES
-
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
             IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
                zval = MAX( 1., strn(ji,jj) )
                IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
                   zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
                ENDIF
-               zmxl_chl(ji,jj,jk) = zval / 24.
-               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
+               zmxl(ji,jj,jk) = zval 
             ENDIF
          END_3D
 
       ENDIF
 
-      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
-      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
-      zprpic(:,:,:) = zprmaxp(:,:,:) * zmxl_fac(:,:,:)
-
-      ! Maximum light intensity
-      zdaylen(:,:) = MAX(1., strn(:,:)) / 24.
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+             zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) )
+            zprbio(ji,jj,jk) = zprmaxn(ji,jj,jk) * zmxl_fac
+            zprdia(ji,jj,jk) = zprmaxd(ji,jj,jk) * zmxl_fac
+            zprpic(ji,jj,jk) = zprmaxp(ji,jj,jk) * zmxl_fac
+         ENDIF
+      END_3D
 
       ! Computation of the P-I slope for nanos, picos and diatoms
       ! The formulation proposed by Geider et al. (1997) has been used.
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
             ! Computation of the P-I slope for nanos and diatoms
             ztn         = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. )
@@ -191,26 +200,31 @@ CONTAINS
             ! Computation of production function for Carbon
             ! Actual light levels are used here 
             !  ---------------------------------------------
-            zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  )
-            zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  )
-            zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) / zmxl_fac(ji,jj,jk) )  )
+            zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) )
+            zmxl_chl = zmxl(ji,jj,jk) / 24.
+            !
+            zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) / zmxl_fac )  )
+            zprpic(ji,jj,jk) = zprpic(ji,jj,jk) * ( 1.- EXP( -zpislopep * epico(ji,jj,jk) / zmxl_fac )  )
+            zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) / zmxl_fac )  )
 
             !  Computation of production function for Chlorophyll
             !  Mean light level in the mixed layer (when appropriate)
             !  is used here (acclimation is in general slower than 
             !  the characteristic time scales of vertical mixing)
             !  ------------------------------------------------------
-            zpislopen = zpislopen * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
-            zpisloped = zpisloped * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
-            zpislopep = zpislopep * zmxl_fac(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
+            zpislopen = zpislopen * zmxl_fac / ( zmxl_chl + rtrn )
+            zpisloped = zpisloped * zmxl_fac / ( zmxl_chl + rtrn )
+            zpislopep = zpislopep * zmxl_fac / ( zmxl_chl + rtrn )
+            !
             zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) )  )
             zprchlp(ji,jj,jk) = zprmaxp(ji,jj,jk) * ( 1.- EXP( -zpislopep * epicom(ji,jj,jk) )  )
             zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) )  )
          ENDIF
       END_3D
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
           IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+            !
             ! Si/C of diatoms
             ! ------------------------
             ! Si/C increases with iron stress and silicate availability (zsilfac)
@@ -242,7 +256,7 @@ CONTAINS
       !  Sea-ice effect on production
       ! No production is assumed below sea ice
       ! -------------------------------------- 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          zprbio(ji,jj,jk)  = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
          zprpic(ji,jj,jk)  = zprpic(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
          zprdia(ji,jj,jk)  = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) ) 
@@ -256,7 +270,7 @@ CONTAINS
       ! quota, uptake is downregulated according to a sigmoidal function 
       ! (power 2), as proposed by Flynn (2003)
       ! ---------------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
             !  production terms for nanophyto.
             zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2
@@ -278,17 +292,13 @@ CONTAINS
             ! Uptake of nitrogen
             zratio = 1.0 - MIN( 1., zration / (xqnnmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) )
-            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpnmin(ji,jj,jk) )   &
+            zpronmaxn(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpnmin(ji,jj,jk) )   &
             &          / ( xqpnmax(ji,jj,jk) - xqpnmin(ji,jj,jk) + rtrn ), xlimnfe(ji,jj,jk) ) )
-            zpronmax = zpronmax * xqnnmin(ji,jj,jk) / qnnmin
-            zpronewn(ji,jj,jk) = zpronmax * xnanono3(ji,jj,jk)
-            zproregn(ji,jj,jk) = zpronmax * xnanonh4(ji,jj,jk)
+            zpronmaxn(ji,jj,jk) = zpronmaxn(ji,jj,jk) * xqnnmin(ji,jj,jk) / qnnmin
             ! Uptake of phosphorus and DOP
             zratio = 1.0 - MIN( 1., zratiop / (xqpnmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) )
-            zpropmax = zprnutmax * zmax * xlimnfe(ji,jj,jk)
-            zpropo4n(ji,jj,jk) = zpropmax * xnanopo4(ji,jj,jk)
-            zprodopn(ji,jj,jk) = zpropmax * xnanodop(ji,jj,jk)
+            zpropmaxn(ji,jj,jk) = zprnutmax * zmax * xlimnfe(ji,jj,jk)
             ! Uptake of iron
             zqfnmax = xqfuncfecn(ji,jj,jk) + ( qfnmax - xqfuncfecn(ji,jj,jk) ) * xlimnpn(ji,jj,jk)
             zratio = 1.0 - MIN( 1., zratiof / zqfnmax )
@@ -307,8 +317,9 @@ CONTAINS
       ! quota, uptake is downregulated according to a sigmoidal function 
       ! (power 2), as proposed by Flynn (2003)
       ! ---------------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+            !
             !  production terms for picophyto.
             zprorcap(ji,jj,jk) = zprpic(ji,jj,jk)  * xlimpic(ji,jj,jk) * tr(ji,jj,jk,jppic,Kbb) * rfact2
             ! Size computation
@@ -328,17 +339,13 @@ CONTAINS
             ! Uptake of nitrogen
             zratio = 1.0 - MIN( 1., zration / (xqnpmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) )
-            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqppmin(ji,jj,jk) )   &
+            zpronmaxp(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqppmin(ji,jj,jk) )   &
             &          / ( xqppmax(ji,jj,jk) - xqppmin(ji,jj,jk) + rtrn ), xlimpfe(ji,jj,jk) ) )
-            zpronmax = zpronmax * xqnpmin(ji,jj,jk) / qnnmin
-            zpronewp(ji,jj,jk) = zpronmax * xpicono3(ji,jj,jk) 
-            zproregp(ji,jj,jk) = zpronmax * xpiconh4(ji,jj,jk)
+            zpronmaxp(ji,jj,jk) = zpronmaxp(ji,jj,jk) * xqnpmin(ji,jj,jk) / qnnmin
             ! Uptake of phosphorus
             zratio = 1.0 - MIN( 1., zratiop / (xqppmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) )
-            zpropmax = zprnutmax * zmax * xlimpfe(ji,jj,jk) 
-            zpropo4p(ji,jj,jk) = zpropmax * xpicopo4(ji,jj,jk)
-            zprodopp(ji,jj,jk) = zpropmax * xpicodop(ji,jj,jk)
+            zpropmaxp(ji,jj,jk) = zprnutmax * zmax * xlimpfe(ji,jj,jk) 
             ! Uptake of iron
             zqfpmax = xqfuncfecp(ji,jj,jk) + ( qfpmax - xqfuncfecp(ji,jj,jk) ) * xlimnpp(ji,jj,jk)
             zratio = 1.0 - MIN( 1., zratiof / zqfpmax )
@@ -357,8 +364,9 @@ CONTAINS
       ! quota, uptake is downregulated according to a sigmoidal function 
       ! (power 2), as proposed by Flynn (2003)
       ! ---------------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
+            !
             !  production terms for diatomees
             zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2
             ! Size computation
@@ -378,17 +386,13 @@ CONTAINS
             ! Uptake of nitrogen
             zratio = 1.0 - MIN( 1., zration / (xqndmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2 / (0.05**2 + zratio**2) ) )
-            zpronmax = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpdmin(ji,jj,jk) )   &
+            zpronmaxd(ji,jj,jk) = zprnutmax * zmax * MAX(0., MIN(1., ( zratiop - xqpdmin(ji,jj,jk) )   &
             &          / ( xqpdmax(ji,jj,jk) - xqpdmin(ji,jj,jk) + rtrn ), xlimdfe(ji,jj,jk) ) )
-            zpronmax = zpronmax * xqndmin(ji,jj,jk) / qnnmin
-            zpronewd(ji,jj,jk) = zpronmax * xdiatno3(ji,jj,jk)
-            zproregd(ji,jj,jk) = zpronmax * xdiatnh4(ji,jj,jk)
+            zpronmaxd(ji,jj,jk) = zpronmaxd(ji,jj,jk) * xqndmin(ji,jj,jk) / qnnmin
             ! Uptake of phosphorus
             zratio = 1.0 - MIN( 1., zratiop / (xqpdmax(ji,jj,jk) + rtrn) )
             zmax = MAX(0., MIN(1., zratio**2/ (0.05**2 + zratio**2) ) )
-            zpropmax = zprnutmax * zmax * xlimdfe(ji,jj,jk)
-            zpropo4d(ji,jj,jk) = zpropmax * xdiatpo4(ji,jj,jk)
-            zprodopd(ji,jj,jk) = zpropmax * xdiatdop(ji,jj,jk)
+            zpropmaxd(ji,jj,jk) = zprnutmax * zmax * xlimdfe(ji,jj,jk)
             ! Uptake of iron
             zqfdmax = xqfuncfecd(ji,jj,jk) + ( qfdmax - xqfuncfecd(ji,jj,jk) ) * xlimnpd(ji,jj,jk)
             zratio = 1.0 - MIN( 1., zratiof / zqfdmax )
@@ -403,21 +407,28 @@ CONTAINS
       ! Production of Chlorophyll. The formulation proposed by Geider et al.
       ! is adopted here.
       ! --------------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
-               !  production terms for nanophyto. ( chlorophyll )
-            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
-            zprod = rday * (zpronewn(ji,jj,jk) + zproregn(ji,jj,jk)) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
+            zmxl_chl = zmxl(ji,jj,jk) / 24.
+            !  production terms for nanophyto. ( chlorophyll )
+            zpronewn = zpronmaxn(ji,jj,jk) * xnanono3(ji,jj,jk)
+            zproregn = zpronmaxn(ji,jj,jk) * xnanonh4(ji,jj,jk)
+            znanotot = enanom(ji,jj,jk) / ( zmxl_chl + rtrn )
+            zprod = rday * (zpronewn + zproregn) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
             zprochln = thetannm * zprod / ( zpislopeadn(ji,jj,jk) * znanotot + rtrn )
             zprochln = MAX(zprochln, chlcmin * 12. * zprorcan (ji,jj,jk) )
-               !  production terms for picophyto. ( chlorophyll )
-            zpicotot = epicom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
-            zprod = rday * (zpronewp(ji,jj,jk) + zproregp(ji,jj,jk)) * zprchlp(ji,jj,jk) * xlimpic(ji,jj,jk)
+            !  production terms for picophyto. ( chlorophyll )
+            zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) 
+            zproregp = zpronmaxp(ji,jj,jk) * xpiconh4(ji,jj,jk)
+            zpicotot = epicom(ji,jj,jk) / ( zmxl_chl + rtrn )
+            zprod = rday * (zpronewp + zproregp) * zprchlp(ji,jj,jk) * xlimpic(ji,jj,jk)
             zprochlp = thetanpm * zprod / ( zpislopeadp(ji,jj,jk) * zpicotot + rtrn )
             zprochlp = MAX(zprochlp, chlcmin * 12. * zprorcap(ji,jj,jk) )
             !  production terms for diatoms ( chlorophyll )
-            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
-            zprod = rday * (zpronewd(ji,jj,jk) + zproregd(ji,jj,jk)) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
+            zpronewd = zpronmaxd(ji,jj,jk) * xdiatno3(ji,jj,jk)
+            zproregd = zpronmaxd(ji,jj,jk) * xdiatnh4(ji,jj,jk)
+            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl + rtrn )
+            zprod = rday * (zpronewd + zproregd) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
             zprochld = thetandm * zprod / ( zpislopeadd(ji,jj,jk) * zdiattot + rtrn )
             zprochld = MAX(zprochld, chlcmin * 12. * zprorcad(ji,jj,jk) )
             !   Update the arrays TRA which contain the Chla sources and sinks
@@ -428,83 +439,104 @@ CONTAINS
       END_3D
 
       !   Update the arrays TRA which contain the biological sources and sinks
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
-        zpptot   = zpropo4n(ji,jj,jk) + zpropo4d(ji,jj,jk) + zpropo4p(ji,jj,jk)
-        zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) + zpronewp(ji,jj,jk)
-        zpregtot = zproregn(ji,jj,jk) + zproregd(ji,jj,jk) + zproregp(ji,jj,jk)
-
-        zprontot = zpronewn(ji,jj,jk) + zproregn(ji,jj,jk)
-        zproptot = zpronewp(ji,jj,jk) + zproregp(ji,jj,jk)
-        zprodtot = zpronewd(ji,jj,jk) + zproregd(ji,jj,jk)
-        !
-        zproddoc = excretd * zprorcad(ji,jj,jk) &
-        &        + excretn * zprorcan(ji,jj,jk) &
-        &        + excretp * zprorcap(ji,jj,jk)
-        !
-        zproddop = excretd * zpropo4d(ji,jj,jk) - texcretd * zprodopd(ji,jj,jk) &
-        &        + excretn * zpropo4n(ji,jj,jk) - texcretn * zprodopn(ji,jj,jk) &
-        &        + excretp * zpropo4p(ji,jj,jk) - texcretp * zprodopp(ji,jj,jk)
-
-        zproddon =  excretd * zprodtot + excretn * zprontot + excretp * zproptot
-
-        zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk)
-        zresptot = zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk) 
-        !
-        tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot
-        tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot
-        tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot  
-        !
-        tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs)         &
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
+         zpronewn = zpronmaxn(ji,jj,jk) * xnanono3(ji,jj,jk)
+         zpronewp = zpronmaxp(ji,jj,jk) * xpicono3(ji,jj,jk) 
+         zpronewd = zpronmaxd(ji,jj,jk) * xdiatno3(ji,jj,jk)
+         !
+         zproregn = zpronmaxn(ji,jj,jk) * xnanonh4(ji,jj,jk)
+         zproregp = zpronmaxp(ji,jj,jk) * xpiconh4(ji,jj,jk)
+         zproregd = zpronmaxd(ji,jj,jk) * xdiatnh4(ji,jj,jk)
+         !
+         zpropo4n = zpropmaxn(ji,jj,jk) * xnanopo4(ji,jj,jk)
+         zpropo4p = zpropmaxp(ji,jj,jk) * xpicopo4(ji,jj,jk)
+         zpropo4d = zpropmaxd(ji,jj,jk) * xdiatpo4(ji,jj,jk)
+         !
+         zprodopn = zpropmaxn(ji,jj,jk) * xnanodop(ji,jj,jk)
+         zprodopp = zpropmaxp(ji,jj,jk) * xpicodop(ji,jj,jk)
+         zprodopd = zpropmaxd(ji,jj,jk) * xdiatdop(ji,jj,jk)
+         !
+         zpptot   = zpropo4n + zpropo4d + zpropo4p
+         zpnewtot = zpronewn + zpronewd + zpronewp
+         zpregtot = zproregn + zproregd + zproregp
+
+         zprontot = zpronewn + zproregn
+         zproptot = zpronewp + zproregp
+         zprodtot = zpronewd + zproregd
+         !
+         zproddoc = excretd * zprorcad(ji,jj,jk) &
+         &        + excretn * zprorcan(ji,jj,jk) &
+         &        + excretp * zprorcap(ji,jj,jk)
+         !
+         zproddop = excretd * zpropo4d - texcretd * zprodopd &
+         &        + excretn * zpropo4n - texcretn * zprodopn &
+         &        + excretp * zpropo4p - texcretp * zprodopp
+
+         zproddon =  excretd * zprodtot + excretn * zprontot + excretp * zproptot
+
+         zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk)
+!  CE : zrespn/d/p ????
+!        zresptot = zrespn(ji,jj,jk) + zrespp(ji,jj,jk) + zrespd(ji,jj,jk) 
+         zresptot = 0._wp
+         !
+         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot
+         tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot
+         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot  
+         !
+         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs)         &
            &                     + zprorcan(ji,jj,jk) * texcretn  &
-           &                     - xpsino3 * zpronewn(ji,jj,jk)   &
-           &                     - xpsinh4 * zproregn(ji,jj,jk)   &
-           &                     - zrespn(ji,jj,jk) 
-
-        tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) + zprontot * texcretn
-        tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n(ji,jj,jk) + zprodopn(ji,jj,jk) ) * texcretn
-        tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn
-
-        !
-        tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs)         &
-           &                     + zprorcap(ji,jj,jk) * texcretp  &
-           &                     - xpsino3 * zpronewp(ji,jj,jk)   &
-           &                     - xpsinh4 * zproregp(ji,jj,jk)   &
-           &                     - zrespp(ji,jj,jk) 
-
-        tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) + zproptot * texcretp
-        tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p(ji,jj,jk) + zprodopp(ji,jj,jk) ) * texcretp
-        tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) + zprofep(ji,jj,jk) * texcretp
-
-        !
-        tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs)         &
-           &                    + zprorcad(ji,jj,jk) * texcretd   &
-           &                    - xpsino3 * zpronewd(ji,jj,jk)    &
-           &                    - xpsinh4 * zproregd(ji,jj,jk)    &
-           &                    - zrespd(ji,jj,jk) 
-
-        tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) + zprodtot * texcretd
-        tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d(ji,jj,jk) + zprodopd(ji,jj,jk) ) * texcretd
-        tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd
-        tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
-        tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc
-        tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon                                        
-        tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop
+           &                     - xpsino3 * zpronewn   &
+           &                     - xpsinh4 * zproregn   
+!           &                     - zrespn(ji,jj,jk) 
+
+         tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) + zprontot * texcretn
+         tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) + ( zpropo4n + zprodopn ) * texcretn
+         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk) * texcretn
+
+         !
+         tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs)         &
+            &                     + zprorcap(ji,jj,jk) * texcretp  &
+            &                     - xpsino3 * zpronewp   &
+            &                     - xpsinh4 * zproregp   
+!           &                     - zrespp(ji,jj,jk) 
+
+         tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) + zproptot * texcretp
+         tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) + ( zpropo4p + zprodopp ) * texcretp
+         tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) + zprofep(ji,jj,jk) * texcretp
+
+         !
+         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs)         &
+            &                    + zprorcad(ji,jj,jk) * texcretd   &
+            &                    - xpsino3 * zpronewd    &
+            &                    - xpsinh4 * zproregd    
+!           &                    - zrespd(ji,jj,jk) 
+
+         !
+         zprodsil = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) 
+         !
+         tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) + zprodtot * texcretd
+         tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) + ( zpropo4d + zprodopd ) * texcretd
+         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk) * texcretd
+         tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil
+         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc
+         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zproddon                                        
+         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zproddop
   
-        tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) &
+         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) &
            &                     + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot - o2ut * zresptot 
 
-        tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer
-        consfe3(ji,jj,jk)       = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   &
-           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2
-        tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) 
+         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer
+         consfe3(ji,jj,jk)       = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   &
+             &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2
+         tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil
 
-        tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot  &
-           &                     + xpsino3 * zpronewn(ji,jj,jk) + xpsinh4 * zproregn(ji,jj,jk)   &
-           &                     + xpsino3 * zpronewp(ji,jj,jk) + xpsinh4 * zproregp(ji,jj,jk)   &
-           &                     + xpsino3 * zpronewd(ji,jj,jk) + xpsinh4 * zproregd(ji,jj,jk)  
+         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot  &
+            &                     + xpsino3 * zpronewn + xpsinh4 * zproregn   &
+            &                     + xpsino3 * zpronewp + xpsinh4 * zproregp   &
+            &                     + xpsino3 * zpronewd + xpsinh4 * zproregd  
 
-        tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot )
-        !
+         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot )
+         !
       END_3D
      
      ! Production and uptake of ligands by phytoplankton. This part is activated 
@@ -513,7 +545,7 @@ CONTAINS
      ! Shaked and Lis (2012)
      ! -------------------------------------------------------------------------
      IF( ln_ligand ) THEN
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
+         DO_3D( 0, 0, 0, 0, 1, jpkm1)
            zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) + excretp * zprorcap(ji,jj,jk)
            zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) + texcretp * zprofep(ji,jj,jk)
            zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet 
@@ -522,47 +554,141 @@ CONTAINS
         END_3D
      ENDIF
 
+    ! Output of the diagnostics
     ! Total primary production per year
-    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
-      & tpp = glob_sum( 'p5zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) + zprorcap(:,:,:) ) * cvol(:,:,:) )
+    IF( l_dia_ppphy .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  THEN
+       ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+       DO_3D( 0, 0, 0, 0, 1, jpkm1)
+          zw3d(ji,jj,jk) = ( zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) + zprorcap(ji,jj,jk) ) * cvol(ji,jj,jk)
+       END_3D
+       tpp = glob_sum( 'p5zprod', zw3d )
+       DEALLOCATE ( zw3d )
+    ENDIF
 
     IF( lk_iomput .AND.  knt == nrdttrc ) THEN
-       zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
        !
-       CALL iom_put( "PPPHYP"  , zprorcap(:,:,:) * zfact * tmask(:,:,:)   ) ! primary production by picophyto
-       CALL iom_put( "PPPHYN"  , zprorcan(:,:,:) * zfact * tmask(:,:,:) )  ! primary production by nanophyto
-       CALL iom_put( "PPPHYD"  , zprorcad(:,:,:) * zfact * tmask(:,:,:)   ) ! primary production by diatomes
-       CALL iom_put( "PPNEWN"  , zpronewp(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by picophyto
-       CALL iom_put( "PPNEWN"  , zpronewn(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by nanophyto
-       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes
-       CALL iom_put( "PBSi"    , zprmaxd (:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production
-       CALL iom_put( "PFeP"    , zprofep (:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by picophyto
-       CALL iom_put( "PFeN"    , zprofen(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto
-       CALL iom_put( "PFeD"    , zprofed(:,:,:) * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes
-       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN
-           ALLOCATE(  zpligprod(jpi,jpj,jpk) )
-           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) + excretp * zprorcap(:,:,:)
-           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) )
-           !
-           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) + texcretp * zprofep(:,:,:) ) & 
-             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) )
-           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) )
-           DEALLOCATE(  zpligprod )
+       IF( l_dia_ppphy ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          ! primary production by nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPPHYN", zw3d )
+          ! primary production by diatomes
+          zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPPHYD", zw3d )
+          ! primary production by pico
+          zw3d(A2D(0),1:jpkm1) = zprorcap(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPPHYP", zw3d )
+          ! total primary production
+          zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) + zprorcad(A2D(0),1:jpkm1) + zprorcap(A2D(0),1:jpkm1) ) &
+              &                 * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "TPP", zw3d )
+          CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
+       IF( l_dia_ppnew ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          ! new primary production by nano
+          zw3d(A2D(0),1:jpkm1) = zpronmaxn(A2D(0),1:jpkm1) * xnanono3(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPNEWN", zw3d )
+          ! new primary production by diatomes
+          zw3d(A2D(0),1:jpkm1) = zpronmaxd(A2D(0),1:jpkm1) * xdiatno3(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPNEWD", zw3d )
+          ! new primary production by pico
+          zw3d(A2D(0),1:jpkm1) = zpronmaxp(A2D(0),1:jpkm1) * xpicono3(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PPNEWP", zw3d )
+          ! total new production
+          zw3d(A2D(0),1:jpkm1) = ( zpronmaxn(A2D(0),1:jpkm1) * xnanono3(A2D(0),1:jpkm1) +  &
+                &                  zpronmaxd(A2D(0),1:jpkm1) * xdiatno3(A2D(0),1:jpkm1) +  &
+                &                  zpronmaxp(A2D(0),1:jpkm1) * xpicono3(A2D(0),1:jpkm1) ) &
+                &                  * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "TPNEW", zw3d )
+          DEALLOCATE ( zw3d )
        ENDIF
-       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate
-       CALL iom_put( "MuP"     , zprpic(:,:,:) * xlimpic(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for picophyto
-       CALL iom_put( "MuN"     , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto
-       CALL iom_put( "MuD"     , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms
-       CALL iom_put( "LPlight" , zprpic(:,:,:) / (zprmaxp(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term
-       CALL iom_put( "LNlight" , zprbio(:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term
-       CALL iom_put( "LDlight" , zprdia(:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)   )
-       CALL iom_put( "MunetP"  , ( tr(:,:,:,jppic,Krhs)/rfact2/(tr(:,:,:,jppic,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto
-       CALL iom_put( "MunetN"  , ( tr(:,:,:,jpphy,Krhs)/rfact2/(tr(:,:,:,jpphy,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto
-       CALL iom_put( "MunetD"  , ( tr(:,:,:,jpdia,Krhs)/rfact2/(tr(:,:,:,jpdia,Kbb)+ rtrn ) * tmask(:,:,:)) ) ! Realized growth rate for picophyto
-       CALL iom_put( "TPP"     , ( zprorcap(:,:,:) + zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production
-       CALL iom_put( "TPNEW"   , ( zpronewp(:,:,:) + zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production
-       CALL iom_put( "TPBFE"   , ( zprofep (:,:,:) + zprofen (:,:,:) + zprofed (:,:,:) ) * zfact * tmask(:,:,:)  )  ! total biogenic iron production
-       CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
+       !
+       IF( l_dia_ppbsi ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          !  biogenic silica production
+          zw3d(A2D(0),1:jpkm1) = zprmaxd(A2D(0),1:jpkm1) * zysopt(A2D(0),1:jpkm1) &
+              &                 * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PBSi", zw3d )
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
+       !
+       IF( l_dia_ppbfe ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          ! biogenic iron production by nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprofen(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PFeN", zw3d )
+          ! biogenic iron production by diatomes
+          zw3d(A2D(0),1:jpkm1) = zprofed(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PFeD", zw3d )
+          ! biogenic iron production by pico
+          zw3d(A2D(0),1:jpkm1) = zprofep(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "PFeP", zw3d )
+          ! total biogenic iron production
+          zw3d(A2D(0),1:jpkm1) = ( zprofen(A2D(0),1:jpkm1) + zprofed(A2D(0),1:jpkm1) + zprofep(A2D(0),1:jpkm1) ) &
+             &                  * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "TPBFE", zw3d )
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
+       IF( l_dia_mu ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = zprmaxn(A2D(0),1:jpkm1)  * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "Mumax", zw3d )
+          ! Realized growth rate for nanophyto
+          zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) * xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "MuN", zw3d )
+          ! Realized growth rate for diatoms
+          zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) * xlimdia(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "MuD", zw3d )
+          ! Realized growth rate for pico
+          zw3d(A2D(0),1:jpkm1) = zprpic(A2D(0),1:jpkm1) * xlimpic(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "MuP", zw3d )
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
+       !
+       IF( l_dia_light ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          ! light limitation term for nano
+          zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) / (zprmaxn(A2D(0),1:jpkm1)+rtrn) &
+              &                  * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LNlight", zw3d )
+          ! light limitation term for diatomes
+          zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) / (zprmaxd(A2D(0),1:jpkm1)+rtrn) &
+              &                  * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDlight", zw3d )
+          ! light limitation term for pico
+          zw3d(A2D(0),1:jpkm1) = zprpic(A2D(0),1:jpkm1) / (zprmaxp(A2D(0),1:jpkm1)+rtrn) &
+              &                  * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LPlight", zw3d )
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
+        IF( l_dia_lprod ) THEN
+          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
+          ALLOCATE( zw3d(A2D(0),jpk) )  ;  zw3d(A2D(0),jpk) = 0._wp
+          zw3d(A2D(0),1:jpkm1) = ( excretd * zprorcad(A2D(0),1:jpkm1) + excretn * zprorcan(A2D(0),1:jpkm1) +  &
+             &                     excretp * zprorcap(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LPRODP"  , zw3d * ldocp * 1e9 )
+          !
+          zw3d(A2D(0),1:jpkm1) = ( texcretn * zprofen(A2D(0),1:jpkm1) + texcretd * zprofed(A2D(0),1:jpkm1) +  &
+            &                      texcretp * zprofep(A2D(0),1:jpkm1) ) * plig(A2D(0),1:jpkm1) &
+            &                     / ( rtrn + plig(A2D(0),1:jpkm1) + 75.0 * (1.0 - plig(A2D(0),1:jpkm1) ) )  &
+            &                  * zfact * tmask(A2D(0),1:jpkm1)
+          CALL iom_put( "LDETP"   , zw3d * lthet * 1e9 )
+          DEALLOCATE ( zw3d )
+       ENDIF
+       !
      ENDIF
 
       IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
@@ -625,17 +751,11 @@ CONTAINS
       texcretd  = 1._wp - excretd
       tpp       = 0._wp
       !
+      xq10_n = 1. + xpsino3 * qnnmax
+      xq10_d = 1. + xpsino3 * qndmax
+      xq10_p = 1. + xpsino3 * qnpmax
+      !
    END SUBROUTINE p5z_prod_init
 
-
-   INTEGER FUNCTION p5z_prod_alloc()
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE p5z_prod_alloc  ***
-      !!----------------------------------------------------------------------
-      ALLOCATE( zdaylen(jpi,jpj), STAT = p5z_prod_alloc )
-      !
-      IF( p5z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_prod_alloc : failed to allocate arrays.' )
-      !
-   END FUNCTION p5z_prod_alloc
    !!======================================================================
 END MODULE p5zprod
diff --git a/src/TOP/PISCES/SED/oce_sed.F90 b/src/TOP/PISCES/SED/oce_sed.F90
index 00b3385f..71754971 100644
--- a/src/TOP/PISCES/SED/oce_sed.F90
+++ b/src/TOP/PISCES/SED/oce_sed.F90
@@ -14,12 +14,15 @@ MODULE oce_sed
    USE dom_oce , ONLY :   glamt     =>   glamt          !: longitude of t-point (degre)
    USE dom_oce , ONLY :   gphit     =>   gphit          !: latitude  of t-point (degre)
  
-#if defined key_qco || defined key_linssh
-#else
-   USE dom_oce , ONLY :   e3t       =>   e3t            !: latitude  of t-point (degre)
-#endif
    USE dom_oce , ONLY :   e3t_1d    =>   e3t_1d         !: reference depth of t-points (m)
-   USE dom_oce , ONLY :   gdepw_0   =>   gdepw_0        !: reference depth of t-points (m)
+   USE dom_oce , ONLY :   gdepw_1d  =>   gdepw_1d       !: reference depth of t-points (m)
+
+#if defined key_vco_1d3d   ||   defined key_vco_3d
+   USE dom_oce , ONLY :   e3t_3d    =>   e3t_3d         !: reference depth of t-points (m)
+# if defined key_vco_3d
+   USE dom_oce , ONLY :   gdepw_3d   =>   gdepw_3d        !: reference depth of t-points (m)
+# endif
+#endif
    USE dom_oce , ONLY :   mbkt      =>   mbkt           !: vertical index of the bottom last T- ocean level
    USE dom_oce , ONLY :   tmask     =>   tmask          !: land/ocean mask at t-points
    USE dom_oce , ONLY :   rn_Dt     =>   rn_Dt          !: time step for the dynamics
diff --git a/src/TOP/PISCES/SED/sedchem.F90 b/src/TOP/PISCES/SED/sedchem.F90
index afdc80a1..8c5d9e50 100644
--- a/src/TOP/PISCES/SED/sedchem.F90
+++ b/src/TOP/PISCES/SED/sedchem.F90
@@ -138,7 +138,7 @@ CONTAINS
       IF (ln_sediment_offline) THEN
          CALL sed_chem_cst
       ELSE
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             ikt = mbkt(ji,jj) 
             IF ( tmask(ji,jj,ikt) == 1 ) THEN
                zchem_data(ji,jj,1) = ak13  (ji,jj,ikt)
diff --git a/src/TOP/PISCES/SED/sedini.F90 b/src/TOP/PISCES/SED/sedini.F90
index 329503ae..fae7793c 100644
--- a/src/TOP/PISCES/SED/sedini.F90
+++ b/src/TOP/PISCES/SED/sedini.F90
@@ -81,6 +81,7 @@ MODULE sedini
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !! $Id: sedini.F90 15450 2021-10-27 14:32:08Z cetlod $
 CONTAINS
 
diff --git a/src/TOP/PISCES/SED/sedsfc.F90 b/src/TOP/PISCES/SED/sedsfc.F90
index 460d760d..9e36c072 100644
--- a/src/TOP/PISCES/SED/sedsfc.F90
+++ b/src/TOP/PISCES/SED/sedsfc.F90
@@ -49,7 +49,7 @@ CONTAINS
       CALL unpack_arr ( jpoce, trc_data(1:jpi,1:jpj,8), iarroce(1:jpoce), pwcp(1:jpoce,1,jwfe2) )
       CALL unpack_arr ( jpoce, trc_data(1:jpi,1:jpj,9), iarroce(1:jpoce), pwcp(1:jpoce,1,jwlgw) )
 
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ikt = mbkt(ji,jj)
          IF ( tmask(ji,jj,ikt) == 1 ) THEN
             tr(ji,jj,ikt,jptal,Kbb) = trc_data(ji,jj,1)
diff --git a/src/TOP/PISCES/SED/trcdmp_sed.F90 b/src/TOP/PISCES/SED/trcdmp_sed.F90
index 190206e5..b17ee20a 100644
--- a/src/TOP/PISCES/SED/trcdmp_sed.F90
+++ b/src/TOP/PISCES/SED/trcdmp_sed.F90
@@ -92,7 +92,7 @@ CONTAINS
                jl = n_trc_index(jn) 
                CALL trc_dta( kt, jl, ztrcdta )   ! read tracer data at nit000
                !
-               DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               DO_2D( 0, 0, 0, 0 )
                   ikt = mbkt(ji,jj)
                   tr(ji,jj,ikt,jn,Kbb) = ztrcdta(ji,jj,ikt) + ( tr(ji,jj,ikt,jn,Kbb) -  ztrcdta(ji,jj,ikt) )     &
                   &                  * exp( -restosed(ji,jj,ikt) * dtsed )
diff --git a/src/TOP/PISCES/sms_pisces.F90 b/src/TOP/PISCES/sms_pisces.F90
index ba890a00..e4862e94 100644
--- a/src/TOP/PISCES/sms_pisces.F90
+++ b/src/TOP/PISCES/sms_pisces.F90
@@ -124,6 +124,8 @@ MODULE sms_pisces
 
    LOGICAL, SAVE :: lk_sed
 
+      !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
    !! $Id: sms_pisces.F90 15459 2021-10-29 08:19:18Z cetlod $ 
@@ -140,52 +142,52 @@ CONTAINS
       !!----------------------------------------------------------------------
       ierr(:) = 0
       !*  Biological fluxes for light : shared variables for pisces & lobster
-      ALLOCATE( xksi(jpi,jpj), strn(jpi,jpj),  STAT=ierr(1) )
+      ALLOCATE( xksi(A2D(0)), strn(A2D(0)),  STAT=ierr(1) )
 
       IF( ln_p4z .OR. ln_p5z ) THEN
 
          !* Optics
-         ALLOCATE(  enano(jpi,jpj,jpk) , ediat(jpi,jpj,jpk) ,   &
-           &        enanom(jpi,jpj,jpk), ediatm(jpi,jpj,jpk),   &
-           &        emoy(jpi,jpj,jpk)  , etotm(jpi,jpj,jpk),   STAT=ierr(2) )
+         ALLOCATE(  enano(A2D(0),jpk) , ediat(A2D(0),jpk) ,   &
+           &        enanom(A2D(0),jpk), ediatm(A2D(0),jpk),   &
+           &        emoy(A2D(0),jpk)  , etotm(A2D(0),jpk),   STAT=ierr(2) )
 
          !* Biological SMS
-         ALLOCATE( xksimax(jpi,jpj)  , biron(jpi,jpj,jpk)      ,  STAT=ierr(3) )
+         ALLOCATE( xksimax(A2D(0))  , biron(A2D(0),jpk)      ,  STAT=ierr(3) )
 
          ! Biological SMS
-         ALLOCATE( xfracal  (jpi,jpj,jpk), orem    (jpi,jpj,jpk),  &
-            &      nitrfac  (jpi,jpj,jpk), nitrfac2(jpi,jpj,jpk),  &
-            &      prodcal  (jpi,jpj,jpk), xdiss   (jpi,jpj,jpk),  &
-            &      prodpoc  (jpi,jpj,jpk), conspoc (jpi,jpj,jpk),  &
-            &      prodgoc  (jpi,jpj,jpk), consgoc (jpi,jpj,jpk),  &
-            &      blim     (jpi,jpj,jpk), consfe3 (jpi,jpj,jpk),  &
-            &      xfecolagg(jpi,jpj,jpk), xcoagfe (jpi,jpj,jpk), STAT=ierr(4) )
+         ALLOCATE( xfracal  (A2D(0),jpk), orem    (A2D(0),jpk),  &
+            &      nitrfac  (A2D(0),jpk), nitrfac2(A2D(0),jpk),  &
+            &      prodcal  (A2D(0),jpk), xdiss   (A2D(0),jpk),  &
+            &      prodpoc  (A2D(0),jpk), conspoc (A2D(0),jpk),  &
+            &      prodgoc  (A2D(0),jpk), consgoc (A2D(0),jpk),  &
+            &      blim     (A2D(0),jpk), consfe3 (A2D(0),jpk),  &
+            &      xfecolagg(A2D(0),jpk), xcoagfe (A2D(0),jpk), STAT=ierr(4) )
 
          !* Carbonate chemistry
-         ALLOCATE( ak13  (jpi,jpj,jpk)  ,                          &
-            &      ak23(jpi,jpj,jpk)    , aksp  (jpi,jpj,jpk) ,    &
-            &      hi  (jpi,jpj,jpk)    , excess(jpi,jpj,jpk) ,    &
-            &      aphscale(jpi,jpj,jpk),                         STAT=ierr(5) )
+         ALLOCATE( ak13(A2D(0),jpk),                          &
+            &      ak23(A2D(0),jpk), aksp  (A2D(0),jpk) ,    &
+            &      hi  (A2D(0),jpk), excess(A2D(0),jpk) ,    &
+            &      aphscale(A2D(0),jpk),                         STAT=ierr(5) )
          !
          !* Temperature dependency of SMS terms
-         ALLOCATE( tgfunc (jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk),   STAT=ierr(6) )
+         ALLOCATE( tgfunc (A2D(0),jpk) , tgfunc2(A2D(0),jpk),   STAT=ierr(6) )
          !
          !* Sinking speed
-         ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk),   STAT=ierr(7) )
+         ALLOCATE( wsbio3 (A2D(0),jpk) , wsbio4 (A2D(0),jpk),   STAT=ierr(7) )
 
          !*  Size of phytoplankton cells
-         ALLOCATE( sizen (jpi,jpj,jpk), sized (jpi,jpj,jpk),        &
-           &       sizena(jpi,jpj,jpk), sizeda(jpi,jpj,jpk),      STAT=ierr(8) )
+         ALLOCATE( sizen (A2D(0),jpk), sized (A2D(0),jpk),        &
+           &       sizena(A2D(0),jpk), sizeda(A2D(0),jpk),      STAT=ierr(8) )
          ! 
-         ALLOCATE( plig(jpi,jpj,jpk)  ,                           STAT=ierr(9) )
+         ALLOCATE( plig(A2D(0),jpk)  ,                           STAT=ierr(9) )
       ENDIF
       !
       IF( ln_p5z ) THEN
          ! PISCES-QUOTA specific part      
-         ALLOCATE( epico(jpi,jpj,jpk)   , epicom(jpi,jpj,jpk) ,   STAT=ierr(10) ) 
+         ALLOCATE( epico(A2D(0),jpk)   , epicom(A2D(0),jpk) ,   STAT=ierr(10) ) 
 
          !*  Size of phytoplankton cells
-         ALLOCATE( sizep(jpi,jpj,jpk), sizepa(jpi,jpj,jpk),       STAT=ierr(11) )
+         ALLOCATE( sizep(A2D(0),jpk), sizepa(A2D(0),jpk),       STAT=ierr(11) )
       ENDIF
       !
       sms_pisces_alloc = MAXVAL( ierr )
diff --git a/src/TOP/PISCES/trcice_pisces.F90 b/src/TOP/PISCES/trcice_pisces.F90
index 8ce76bc7..06e458a5 100644
--- a/src/TOP/PISCES/trcice_pisces.F90
+++ b/src/TOP/PISCES/trcice_pisces.F90
@@ -19,6 +19,8 @@ MODULE trcice_pisces
 
    PUBLIC   trc_ice_ini_pisces ! called by trcini.F90 module
 
+      !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
    !! $Id: trcice_pisces.F90 10794 2019-03-22 09:25:28Z cetlod $ 
@@ -283,15 +285,15 @@ CONTAINS
       ENDIF
 ! 
       DO jn = jp_pcs0, jp_pcs1
-         IF( cn_trc_o(jn) == 'GL ' ) trc_o(:,:,jn) = zpisc(jn,1)  ! Global case
+         IF( cn_trc_o(jn) == 'GL ' ) trc_o(A2D(0),jn) = zpisc(jn,1)  ! Global case
          IF( cn_trc_o(jn) == 'AA ' ) THEN 
-            WHERE( gphit(:,:) >= 0._wp ) ; trc_o(:,:,jn) = zpisc(jn,2) ; END WHERE ! Arctic 
-            WHERE( gphit(:,:) <  0._wp ) ; trc_o(:,:,jn) = zpisc(jn,3) ; END WHERE ! Antarctic 
+            WHERE( gphit(A2D(0)) >= 0._wp ) ; trc_o(A2D(0),jn) = zpisc(jn,2) ; END WHERE ! Arctic 
+            WHERE( gphit(A2D(0)) <  0._wp ) ; trc_o(A2D(0),jn) = zpisc(jn,3) ; END WHERE ! Antarctic 
          ENDIF
          IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN     !  Baltic Sea particular case for ORCA configurations
-             WHERE( 14._wp <= glamt(:,:) .AND. glamt(:,:) <= 32._wp .AND.    &
-                    54._wp <= gphit(:,:) .AND. gphit(:,:) <= 66._wp )
-                    trc_o(:,:,jn) = zpisc(jn,4)
+             WHERE( 14._wp <= glamt(A2D(0)) .AND. glamt(A2D(0)) <= 32._wp .AND.    &
+                    54._wp <= gphit(A2D(0)) .AND. gphit(A2D(0)) <= 66._wp )
+                    trc_o(A2D(0),jn) = zpisc(jn,4)
             END WHERE
          ENDIF 
       ENDDO
@@ -321,16 +323,16 @@ CONTAINS
       DO jn = jp_pcs0, jp_pcs1
          !-- Everywhere but in the Baltic
          IF ( trc_ice_ratio(jn) >= -1._wp ) THEN ! no prescribed conc. ; typically everything but iron) 
-            trc_i(:,:,jn) = zratio(jn,1) * trc_o(:,:,jn) 
+            trc_i(A2D(0),jn) = zratio(jn,1) * trc_o(A2D(0),jn) 
          ELSE                                    ! prescribed concentration
-            trc_i(:,:,jn) = trc_ice_prescr(jn)
+            trc_i(A2D(0),jn) = trc_ice_prescr(jn)
          ENDIF
          !-- Baltic
          IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN     
             IF ( trc_ice_ratio(jn) >= - 1._wp ) THEN ! no prescribed conc. ; typically everything but iron) 
-               WHERE( 14._wp <= glamt(:,:) .AND. glamt(:,:) <= 32._wp .AND.    &
-                      54._wp <= gphit(:,:) .AND. gphit(:,:) <= 66._wp )
-                     trc_i(:,:,jn) = zratio(jn,2) * trc_o(:,:,jn) 
+               WHERE( 14._wp <= glamt(A2D(0)) .AND. glamt(A2D(0)) <= 32._wp .AND.    &
+                      54._wp <= gphit(A2D(0)) .AND. gphit(A2D(0)) <= 66._wp )
+                     trc_i(A2D(0),jn) = zratio(jn,2) * trc_o(A2D(0),jn) 
                END WHERE
             ENDIF
          ENDIF
diff --git a/src/TOP/PISCES/trcini_pisces.F90 b/src/TOP/PISCES/trcini_pisces.F90
index f47975fa..eaaac7e2 100644
--- a/src/TOP/PISCES/trcini_pisces.F90
+++ b/src/TOP/PISCES/trcini_pisces.F90
@@ -123,7 +123,6 @@ CONTAINS
       ELSE
          ! PISCES-QUOTA part
          ierr = ierr +  p5z_lim_alloc()
-         ierr = ierr +  p5z_prod_alloc()
          ierr = ierr +  p5z_meso_alloc()
       ENDIF
       ierr = ierr +  p4z_rem_alloc()
diff --git a/src/TOP/PISCES/trcwri_pisces.F90 b/src/TOP/PISCES/trcwri_pisces.F90
index e5cce04d..d44b7b11 100644
--- a/src/TOP/PISCES/trcwri_pisces.F90
+++ b/src/TOP/PISCES/trcwri_pisces.F90
@@ -38,7 +38,7 @@ CONTAINS
       CHARACTER (len=20)           :: cltra
       REAL(wp)                     :: zfact
       INTEGER                      :: ji, jj, jk, jn
-      REAL(wp), DIMENSION(jpi,jpj) :: zdic, zo2min, zdepo2min
+      REAL(wp), DIMENSION(A2D(0)) :: zdic, zo2min, zdepo2min
       !!---------------------------------------------------------------------
  
       ! write the tracer concentrations in the file
@@ -60,15 +60,19 @@ CONTAINS
          IF( iom_use( "INTDIC" ) ) THEN                     !   DIC content in kg/m2
             zdic(:,:) = 0.
             DO jk = 1, jpkm1
-               zdic(:,:) = zdic(:,:) + tr(:,:,jk,jpdic,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) * 12.
+               DO_2D( 0, 0, 0, 0 )
+                 zdic(ji,jj) = zdic(ji,jj) + tr(ji,jj,jk,jpdic,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * 12.
+               END_2D
             ENDDO
-            CALL iom_put( 'INTDIC', zdic )     
+            CALL iom_put( 'INTDIC', zdic )
          ENDIF
          !
-         IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN  ! Oxygen minimum concentration and depth 
-            zo2min   (:,:) = tr(:,:,1,jpoxy,Kmm) * tmask(:,:,1)
-            zdepo2min(:,:) = gdepw(:,:,1,Kmm)   * tmask(:,:,1)
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) 
+         IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN  ! Oxygen minimum concentration and depth
+            DO_2D( 0, 0, 0, 0 )
+               zo2min   (ji,jj) = tr(ji,jj,1,jpoxy,Kmm) * tmask(ji,jj,1)
+               zdepo2min(ji,jj) = gdepw(ji,jj,1,Kmm)    * tmask(ji,jj,1)
+            END_2D
+            DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                IF( tmask(ji,jj,jk) == 1 ) then
                   IF( tr(ji,jj,jk,jpoxy,Kmm) < zo2min(ji,jj) ) then
                      zo2min   (ji,jj) = tr(ji,jj,jk,jpoxy,Kmm)
diff --git a/src/TOP/TRP/trcadv.F90 b/src/TOP/TRP/trcadv.F90
index 92bee004..24362484 100644
--- a/src/TOP/TRP/trcadv.F90
+++ b/src/TOP/TRP/trcadv.F90
@@ -8,6 +8,7 @@ MODULE trcadv
    !!            3.7  !  2014-05  (G. Madec, C. Ethe)  Add 2nd/4th order cases for CEN and FCT schemes 
    !!            4.0  !  2017-09  (G. Madec)  remove vertical time-splitting option
    !!            4.5  !  2021-08  (G. Madec, S. Techene) add advective velocities as optional arguments
+   !!             -   !  2022-06  (S. Techene, G, Madec) refactorization to reduce local memory usage
    !!----------------------------------------------------------------------
 #if defined key_top
    !!----------------------------------------------------------------------
@@ -123,26 +124,19 @@ CONTAINS
          !
          IF( ln_wave .AND. ln_sdw )  THEN
             DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )                            ! eulerian transport + Stokes Drift
-               zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * ( zptu(ji,jj,jk) + usd(ji,jj,jk) )
-               zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * ( zptv(ji,jj,jk) + vsd(ji,jj,jk) )
+               zuu(ji,jj,jk) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * ( zptu(ji,jj,jk) + usd(ji,jj,jk) )
+               zvv(ji,jj,jk) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * ( zptv(ji,jj,jk) + vsd(ji,jj,jk) )
             END_3D
             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
-               zww(ji,jj,jk) = e1e2t(ji,jj)                     * ( zptw(ji,jj,jk) + wsd(ji,jj,jk) )
+               zww(ji,jj,jk) = e1e2t(ji,jj)                   * ( zptw(ji,jj,jk) + wsd(ji,jj,jk) )
             END_3D
          ELSE
             DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
-               zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * zptu(ji,jj,jk)           ! eulerian transport
-               zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * zptv(ji,jj,jk)
+               zuu(ji,jj,jk) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * zptu(ji,jj,jk)           ! eulerian transport
+               zvv(ji,jj,jk) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * zptv(ji,jj,jk)
             END_3D
             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
-               zww(ji,jj,jk) = e1e2t(ji,jj)                     * zptw(ji,jj,jk)
-            END_3D
-         ENDIF
-         !
-         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN                                          ! add z-tilde and/or vvl corrections
-            DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )
-               zuu(ji,jj,jk) = zuu(ji,jj,jk) + un_td(ji,jj,jk)
-               zvv(ji,jj,jk) = zvv(ji,jj,jk) + vn_td(ji,jj,jk)
+               zww(ji,jj,jk) = e1e2t(ji,jj)                   * zptw(ji,jj,jk)
             END_3D
          ENDIF
          !
@@ -156,15 +150,15 @@ CONTAINS
       SELECT CASE ( nadv )                      !==  compute advection trend and add it to general trend  ==!
       !
       CASE ( np_CEN )                                 ! Centered : 2nd / 4th order
-         CALL tra_adv_cen   ( kt, nittrc000,'TRC',          zuu, zvv, zww,      Kmm, ptr, jptra, Krhs, nn_cen_h, nn_cen_v )
+         CALL tra_adv_cen( kt, nittrc000,'TRC',          zuu, zvv, zww,      Kmm,      ptr, jptra, Krhs, nn_cen_h, nn_cen_v )
       CASE ( np_FCT )                                 ! FCT      : 2nd / 4th order
-            CALL tra_adv_fct( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm, Kaa, ptr, jptra, Krhs, nn_fct_h, nn_fct_v )
+         CALL tra_adv_fct( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm, Kaa, ptr, jptra, Krhs, nn_fct_h, nn_fct_v )
       CASE ( np_MUS )                                 ! MUSCL
-            CALL tra_adv_mus( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm, ptr, jptra, Krhs, ln_mus_ups         )
+         CALL tra_adv_mus( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm,      ptr, jptra, Krhs, ln_mus_ups         )
       CASE ( np_UBS )                                 ! UBS
-         CALL tra_adv_ubs   ( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm, ptr, jptra, Krhs, nn_ubs_v           )
+         CALL tra_adv_ubs( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm,      ptr, jptra, Krhs, nn_ubs_v           )
       CASE ( np_QCK )                                 ! QUICKEST
-         CALL tra_adv_qck   ( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm, ptr, jptra, Krhs                     )
+         CALL tra_adv_qck( kt, nittrc000,'TRC', rDt_trc, zuu, zvv, zww, Kbb, Kmm,      ptr, jptra, Krhs                     )
       !
       END SELECT
       !                  
diff --git a/src/TOP/TRP/trcatf.F90 b/src/TOP/TRP/trcatf.F90
index 9a2f4e2e..5f13e290 100644
--- a/src/TOP/TRP/trcatf.F90
+++ b/src/TOP/TRP/trcatf.F90
@@ -19,6 +19,7 @@ MODULE trcatf
    !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option
    !!            3.3  !  2010-06  (C. Ethe, G. Madec) Merge TRA-TRC
    !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename trcnxt.F90 -> trcatf.F90. Now only does time filtering.
+   !!            4.x  !  2022-12  (S. Techene, G.Madec) remove vvl use qco exclusively 
    !!----------------------------------------------------------------------
 #if defined key_top   &&   ! defined key_RK3
    !!----------------------------------------------------------------------
@@ -33,8 +34,6 @@ MODULE trcatf
    USE trdtra
 # if defined key_qco   ||   defined key_linssh
    USE traatf_qco     ! tracer : Asselin filter (qco)
-# else
-   USE traatf         ! tracer : Asselin filter (vvl)
 # endif
    USE bdy_oce   , ONLY: ln_bdy
    USE trcbdy         ! BDY open boundaries
@@ -156,13 +155,8 @@ CONTAINS
          !
       ELSE     
          IF( .NOT. l_offline ) THEN ! Leap-Frog + Asselin filter time stepping
-# if defined key_qco   ||   defined key_linssh
             IF( ln_linssh ) THEN   ;   CALL tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, nittrc000,        'TRC', ptr, jptra )                     !     linear ssh
             ELSE                   ;   CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nittrc000, rn_Dt, 'TRC', ptr, sbc_trc, sbc_trc_b, jptra ) ! non-linear ssh
-# else
-            IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nittrc000,         'TRC', ptr, jptra )                       !     linear ssh
-            ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nittrc000, rn_Dt, 'TRC', ptr, sbc_trc, sbc_trc_b, jptra )    ! non-linear ssh
-# endif
             ENDIF
          ELSE
                                        CALL trc_atf_off( kt, Kbb, Kmm, Kaa, ptr )       ! offline 
diff --git a/src/TOP/TRP/trcdmp.F90 b/src/TOP/TRP/trcdmp.F90
index 8b2be2d9..03535a63 100644
--- a/src/TOP/TRP/trcdmp.F90
+++ b/src/TOP/TRP/trcdmp.F90
@@ -57,7 +57,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!                   ***  ROUTINE trc_dmp_alloc  ***
       !!----------------------------------------------------------------------
-      ALLOCATE( restotr(jpi,jpj,jpk) , STAT=trc_dmp_alloc )
+      ALLOCATE( restotr(A2D(0),jpk) , STAT=trc_dmp_alloc )
       !
       IF( trc_dmp_alloc /= 0 )   CALL ctl_warn('trc_dmp_alloc: failed to allocate array')
       !
@@ -329,11 +329,11 @@ CONTAINS
          ! convert the position in local domain indices
          ! --------------------------------------------
          DO jc = 1, npncts
-            nctsi1(jc)   = mi0( nctsi1(jc) )
-            nctsj1(jc)   = mj0( nctsj1(jc) )
+            nctsi1(jc)   = mi0( nctsi1(jc), nn_hls )
+            nctsj1(jc)   = mj0( nctsj1(jc), nn_hls )
             !
-            nctsi2(jc)   = mi1( nctsi2(jc) )
-            nctsj2(jc)   = mj1( nctsj2(jc) )
+            nctsi2(jc)   = mi1( nctsi2(jc), nn_hls )
+            nctsj2(jc)   = mj1( nctsj2(jc), nn_hls )
          END DO
          !
       ENDIF
diff --git a/src/TOP/TRP/trcldf.F90 b/src/TOP/TRP/trcldf.F90
index b3344d09..97a1d416 100644
--- a/src/TOP/TRP/trcldf.F90
+++ b/src/TOP/TRP/trcldf.F90
@@ -19,7 +19,8 @@ MODULE trcldf
    USE oce_trc        ! ocean dynamics and active tracers
    USE ldftra         ! lateral diffusion: eddy diffusivity & EIV coeff.
    USE ldfslp         ! Lateral diffusion: slopes of neutral surfaces
-   USE traldf_lap_blp ! lateral diffusion: lap/bilaplacian iso-level      operator  (tra_ldf_lap/_blp   routine)
+   USE traldf_lev     ! lateral diffusion: laplacian iso-level            operator  (traldf_lap/_blp      routines)
+!!st   USE traldf_lap_blp ! lateral diffusion: lap/bilaplacian iso-level      operator  (tra_ldf_lap/_blp   routine)
    USE traldf_iso     ! lateral diffusion: laplacian iso-neutral standard operator  (tra_ldf_iso        routine)
    USE traldf_triad   ! lateral diffusion: laplacian iso-neutral triad    operator  (tra_ldf_     triad routine)
    USE trd_oce        ! trends: ocean variables
@@ -90,19 +91,23 @@ CONTAINS
       END_3D
       !
       SELECT CASE ( nldf_trc )                 !* compute lateral mixing trend and add it to the general trend
-      !
-      CASE ( np_lap   )                                                                                    ! iso-level laplacian
-         CALL tra_ldf_lap  ( kt, Kmm, nittrc000,'TRC', zahu, zahv, gtru, gtrv, gtrui, gtrvi,            &
-           &                     ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Krhs),                   jptra, 1 )
-      CASE ( np_lap_i )                                                                                    ! laplacian : standard iso-neutral operator (Madec)
-         CALL tra_ldf_iso  ( kt, Kmm, nittrc000,'TRC', zahu, zahv, gtru, gtrv, gtrui, gtrvi,            &
-           &                     ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Krhs), jptra, 1 )
-      CASE ( np_lap_it )                                                                                   ! laplacian : triad iso-neutral operator (griffies)
-         CALL tra_ldf_triad( kt, Kmm, nittrc000,'TRC', zahu, zahv, gtru, gtrv, gtrui, gtrvi,            &
-           &                     ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Krhs), jptra, 1 )
-      CASE ( np_blp , np_blp_i , np_blp_it )                                                               ! bilaplacian: all operator (iso-level, -neutral)
-         CALL tra_ldf_blp  ( kt, Kmm, nittrc000,'TRC', zahu, zahv, gtru, gtrv, gtrui, gtrvi,            &
-           &                     ptr(:,:,:,:,Kbb) , ptr(:,:,:,:,Krhs),                 jptra, nldf_trc )
+      !                                !-  laplacian  - !
+      CASE ( np_lap    )                     ! level operator
+         CALL traldf_lev_lap  ( kt, Kbb, Kmm, ptr, Krhs )
+      CASE ( np_lap_i  )                     ! standard iso-neutral operator
+         CALL traldf_iso_lap  ( kt, Kbb, Kmm, ptr, Krhs )
+      CASE ( np_lap_it )                     ! laplacian: triad iso-neutral operator
+         CALL traldf_triad_lap( kt, Kmm, nittrc000,'TRC', zahu, zahv,    &
+            &                       ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Krhs), jptra,  1 )
+      !                                !- bilaplacian - !
+      CASE ( np_blp    )                     ! iso-level operators
+         CALL traldf_lev_blp  ( kt, Kbb, Kmm, ptr, Krhs )
+      CASE ( np_blp_i  )                     ! standard iso-neutral operator
+         CALL traldf_iso_blp  ( kt, Kbb, Kmm, ptr, Krhs )
+      CASE ( np_blp_it )                     ! bilaplacian: iso-level & iso-neutral operators
+         CALL traldf_triad_blp( kt, Kmm, nittrc000,'TRC', zahu, zahv,    &
+              &                     ptr(:,:,:,:,Kbb), ptr(:,:,:,:,Krhs),                   jptra     )
+         !
       END SELECT
       !
       IF( l_trdtrc )   THEN                    ! send the trends for further diagnostics
diff --git a/src/TOP/TRP/trcsbc.F90 b/src/TOP/TRP/trcsbc.F90
index f817b677..42efe65b 100644
--- a/src/TOP/TRP/trcsbc.F90
+++ b/src/TOP/TRP/trcsbc.F90
@@ -51,12 +51,12 @@ CONTAINS
       !!      * concentration/dilution effect:
       !!            The surface freshwater flux modify the ocean volume
       !!         and thus the concentration of a tracer as :
-      !!            tr(Krhs) = tr(Krhs) + emp * tr(Kmm) / e3t_ + fmmflx * tri / e3t   for k=1
+      !!            tr(Krhs) = tr(Krhs) + emp * tr(Kmm) / e3t_ + fwfice * tri / e3t   for k=1
       !!          - tr(Kmm) , the concentration of tracer in the ocean
       !!          - tri, the concentration of tracer in the sea-ice
-      !!          - emp, the surface freshwater budget (evaporation minus precipitation + fmmflx)
+      !!          - emp, the surface freshwater budget (evaporation minus precipitation + fwfice)
       !!            given in kg/m2/s is divided by 1035 kg/m3 (density of ocean water) to obtain m/s.
-      !!          - fmmflx, the flux asscociated to freezing-melting of sea-ice 
+      !!          - fwfice, the flux asscociated to freezing-melting of sea-ice 
       !!            In linear free surface case (ln_linssh=T), the volume of the
       !!            ocean does not change with the water exchanges at the (air+ice)-sea
       !!
@@ -115,14 +115,14 @@ CONTAINS
       CASE ( -1 ) ! ! No tracers in sea ice ( trc_i = 0 )
          !
          DO jn = 1, jptra
-            DO_2D( 0, 0, 0, 1 )
+            DO_2D( 0, 0, 0, 0 )
                sbc_trc(ji,jj,jn) = 0._wp
             END_2D
          END DO
          !
          IF( ln_linssh ) THEN  !* linear free surface  
             DO jn = 1, jptra
-               DO_2D( 0, 0, 0, 1 )
+               DO_2D( 0, 0, 0, 0 )
                   sbc_trc(ji,jj,jn) = sbc_trc(ji,jj,jn) + r1_rho0 * emp(ji,jj) * ptr(ji,jj,1,jn,Kmm) !==>> add concentration/dilution effect due to constant volume cell
                END_2D
             END DO
@@ -131,14 +131,14 @@ CONTAINS
       CASE ( 0 )  ! Same concentration in sea ice and in the ocean ( trc_i = ptr(...,Kmm)  )
          !
          DO jn = 1, jptra
-            DO_2D( 0, 0, 0, 1 )
-               sbc_trc(ji,jj,jn) = - fmmflx(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
+            DO_2D( 0, 0, 0, 0 )
+               sbc_trc(ji,jj,jn) = fwfice(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
             END_2D
          END DO
          !
          IF( ln_linssh ) THEN  !* linear free surface  
             DO jn = 1, jptra
-               DO_2D( 0, 0, 0, 1 )
+               DO_2D( 0, 0, 0, 0 )
                   sbc_trc(ji,jj,jn) = sbc_trc(ji,jj,jn) + r1_rho0 * emp(ji,jj) * ptr(ji,jj,1,jn,Kmm) !==>> add concentration/dilution effect due to constant volume cell
                END_2D
             END DO
@@ -147,21 +147,21 @@ CONTAINS
       CASE ( 1 )  ! Specific treatment of sea ice fluxes with an imposed concentration in sea ice 
          !
          DO jn = 1, jptra
-            DO_2D( 0, 0, 0, 1 )
-               sbc_trc(ji,jj,jn) = - fmmflx(ji,jj) * r1_rho0 * trc_i(ji,jj,jn)
+            DO_2D( 0, 0, 0, 0 )
+               sbc_trc(ji,jj,jn) = fwfice(ji,jj) * r1_rho0 * trc_i(ji,jj,jn)
             END_2D
          END DO
          !
          IF( ln_linssh ) THEN  !* linear free surface  
             DO jn = 1, jptra
-               DO_2D( 0, 0, 0, 1 )
+               DO_2D( 0, 0, 0, 0 )
                   sbc_trc(ji,jj,jn) = sbc_trc(ji,jj,jn) + r1_rho0 * emp(ji,jj) * ptr(ji,jj,1,jn,Kmm) !==>> add concentration/dilution effect due to constant volume cell
                END_2D
             END DO
          ENDIF
          !
          DO jn = 1, jptra
-            DO_2D( 0, 0, 0, 1 )
+            DO_2D( 0, 0, 0, 0 )
                zse3t = rDt_trc / e3t(ji,jj,1,Kmm)
                zdtra = ptr(ji,jj,1,jn,Kmm) + sbc_trc(ji,jj,jn) * zse3t 
                IF( zdtra < 0. ) sbc_trc(ji,jj,jn) = MAX( zdtra, -ptr(ji,jj,1,jn,Kmm) / zse3t  ) ! avoid negative concentration that can occurs if trc_i > ptr 
@@ -176,7 +176,7 @@ CONTAINS
          !
          IF( l_trdtrc )   ztrtrd(:,:,:) = ptr(:,:,:,jn,Krhs)  ! save trends
          !
-         DO_2D( 0, 0, 0, 1 )
+         DO_2D( 0, 0, 0, 0 )
             zse3t = zfact / e3t(ji,jj,1,Kmm)
             ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + ( sbc_trc_b(ji,jj,jn) + sbc_trc(ji,jj,jn) ) * zse3t
          END_2D
@@ -259,7 +259,7 @@ CONTAINS
          !
          IF( .NOT.ln_linssh ) THEN           !* only passive tracer fluxes associated with mass fluxes
             !                                        ! no passive tracer concentration modification due to ssh variation
-!!st emp includes fmm see iceupdate.F90
+!!st emp includes fwfice see iceupdate.F90
 !!not sure about trc_i case... (1)
             DO jn = 1, jptra
                DO_2D( 0, 0, 0, 0 )              !!st WHY 1 : exterior here ? 
@@ -292,12 +292,12 @@ CONTAINS
                   END_2D
                END DO
                !
-            CASE ( 0 )  ! Same concentration in sea ice and in the ocean fmm contribution to concentration/dilution effect has to be removed
+            CASE ( 0 )  ! Same concentration in sea ice and in the ocean fwfice contribution to concentration/dilution effect has to be removed
                !
                DO jn = 1, jptra
-                  DO_2D( 0, 0, 0, 1 )
+                  DO_2D( 0, 0, 0, 0 )
                      z1_rho0_e3t = r1_rho0  / e3t(ji,jj,1,Kmm)
-                     ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + ( emp(ji,jj) - fmmflx(ji,jj) ) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
+                     ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + ( emp(ji,jj) + fwfice(ji,jj) ) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
                   END_2D
                END DO
                !
@@ -307,13 +307,13 @@ CONTAINS
                   DO_2D( 0, 0, 0, 0 )
                      z1_rho0_e3t = r1_rho0  / e3t(ji,jj,1,Kmm)
                      ! tracer flux at the ice/ocean interface (tracer/m2/s)
-                     zftra = - trc_i(ji,jj,jn) * fmmflx(ji,jj) ! uptake of tracer in the sea ice
-                     !                                         ! only used in the levitating sea ice case
+                     zftra = trc_i(ji,jj,jn) * fwfice(ji,jj) ! uptake of tracer in the sea ice
+                     !                                       ! only used in the levitating sea ice case
                      ! tracer flux only       : add concentration dilution term in net tracer flux, no F-M in volume flux
                      ! tracer and mass fluxes : no concentration dilution term in net tracer flux, F-M term in volume flux
                      ztfx  = zftra                        ! net tracer flux
                      !
-                     zdtra = r1_rho0 * ( ztfx +  ( emp(ji,jj) - fmmflx(ji,jj) ) * ptr(ji,jj,1,jn,Kmm) ) 
+                     zdtra = r1_rho0 * ( ztfx +  ( emp(ji,jj) + fwfice(ji,jj) ) * ptr(ji,jj,1,jn,Kmm) ) 
                      IF ( zdtra < 0. ) THEN
                         zdtra  = MAX(zdtra, -ptr(ji,jj,1,jn,Kmm) * e3t(ji,jj,1,Kmm) / rDt_trc )   ! avoid negative concentrations to arise
                      ENDIF
@@ -331,9 +331,9 @@ CONTAINS
             CASE ( 0 )  ! Same concentration in sea ice and in the ocean : correct concentration/dilution effect due to "freezing - melting"
                !
                DO jn = 1, jptra
-                  DO_2D( 0, 0, 0, 1 )
+                  DO_2D( 0, 0, 0, 0 )
                      z1_rho0_e3t = r1_rho0  / e3t(ji,jj,1,Kmm)
-                     ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) - fmmflx(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
+                     ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + fwfice(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm)
                   END_2D
                END DO
                !
@@ -342,13 +342,13 @@ CONTAINS
                DO jn = 1, jptra
                   DO_2D( 0, 0, 0, 0 )
                      ! tracer flux at the ice/ocean interface (tracer/m2/s)
-                     zftra = - trc_i(ji,jj,jn) * fmmflx(ji,jj) ! uptake of tracer in the sea ice
-                     !                                         ! only used in the levitating sea ice case
+                     zftra = trc_i(ji,jj,jn) * fwfice(ji,jj) ! uptake of tracer in the sea ice
+                     !                                       ! only used in the levitating sea ice case
                      ! tracer flux only       : add concentration dilution term in net tracer flux, no F-M in volume flux
                      ! tracer and mass fluxes : no concentration dilution term in net tracer flux, F-M term in volume flux
                      ztfx  = zftra                        ! net tracer flux
                      !
-                     zdtra = r1_rho0 * ( ztfx -  fmmflx(ji,jj) * ptr(ji,jj,1,jn,Kmm) ) 
+                     zdtra = r1_rho0 * ( ztfx + fwfice(ji,jj) * ptr(ji,jj,1,jn,Kmm) ) 
                      IF ( zdtra < 0. ) THEN
                         zdtra  = MAX(zdtra, -ptr(ji,jj,1,jn,Kmm) * e3t(ji,jj,1,Kmm) / rDt_trc )   ! avoid negative concentrations to arise
                      ENDIF
diff --git a/src/TOP/TRP/trcsink.F90 b/src/TOP/TRP/trcsink.F90
index 5cee9b0b..d7735a8e 100644
--- a/src/TOP/TRP/trcsink.F90
+++ b/src/TOP/TRP/trcsink.F90
@@ -50,12 +50,12 @@ CONTAINS
       INTEGER , INTENT(in)  :: Kbb, Kmm
       INTEGER , INTENT(in)  :: jp_tra    ! tracer index index      
       REAL(wp), INTENT(in)  :: rsfact    ! time step duration
-      REAL(wp), INTENT(in)   , DIMENSION(jpi,jpj,jpk) :: pwsink
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: psinkflx
+      REAL(wp), INTENT(in)   , DIMENSION(A2D(0),jpk) :: pwsink
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0),jpk) :: psinkflx
       INTEGER  ::   ji, jj, jk
-      INTEGER, DIMENSION(jpi, jpj) ::   iiter
+      INTEGER, DIMENSION(A2D(0)) ::   iiter
       REAL(wp) ::   zfact, zwsmax, zmax
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwsink
+      REAL(wp), DIMENSION(A2D(0),jpk) :: zwsink
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('trc_sink')
@@ -73,7 +73,7 @@ CONTAINS
       IF( nitermax == 1 ) THEN
          iiter(:,:) = 1
       ELSE
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+         DO_2D( 0, 0, 0, 0 )
             iiter(ji,jj) = 1
             DO jk = 1, jpkm1
                IF( tmask(ji,jj,jk) == 1.0 ) THEN
@@ -85,14 +85,9 @@ CONTAINS
          iiter(:,:) = MIN( iiter(:,:), nitermax )
       ENDIF
 
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-         IF( tmask(ji,jj,jk) == 1.0 ) THEN
-           zwsmax = 0.5 * e3t(ji,jj,jk,Kmm) * rday / rsfact
-           zwsink(ji,jj,jk) = MIN( pwsink(ji,jj,jk), zwsmax * REAL( iiter(ji,jj), wp ) )
-         ELSE
-           ! provide a default value so there is no use of undefinite value in trc_sink2 for zwsink2 initialization
-           zwsink(ji,jj,jk) = 0.
-         ENDIF
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
+         zwsmax = 0.5 * e3t(ji,jj,jk,Kmm) * rday / rsfact
+         zwsink(ji,jj,jk+1) = -MIN( pwsink(ji,jj,jk), zwsmax * REAL( iiter(ji,jj), wp ) ) / rday
       END_3D
 
       !  Initializa to zero all the sinking arrays 
@@ -121,23 +116,18 @@ CONTAINS
       INTEGER,  INTENT(in   )                         ::   Kbb, Kmm  ! time level indices
       INTEGER,  INTENT(in   )                         ::   jp_tra    ! tracer index index      
       REAL(wp), INTENT(in   )                         ::   rsfact    ! duration of time step
-      INTEGER,  INTENT(in   ), DIMENSION(jpi,jpj)     ::   kiter     ! number of iterations for time-splitting 
-      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj,jpk) ::   pwsink    ! sinking speed
-      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   psinkflx  ! sinking fluxe
+      INTEGER,  INTENT(in   ), DIMENSION(A2D(0))     ::   kiter     ! number of iterations for time-splitting 
+      REAL(wp), INTENT(in   ), DIMENSION(A2D(0),jpk) ::   pwsink    ! sinking speed
+      REAL(wp), INTENT(inout), DIMENSION(A2D(0),jpk) ::   psinkflx  ! sinking fluxe
       !
       INTEGER  ::   ji, jj, jk, jn, jt
-      REAL(wp) ::   zigma,zew,zign, zflx, zstep
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztraz, zakz, zwsink2, ztrb, psinking 
+      REAL(wp) ::   zigma,z0w,zign, zflx, zstep, zzwx, zzwy, zalpha
+      REAL(wp), DIMENSION(A2D(0),jpk) :: ztraz, zakz, ztrb, zsinking 
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('trc_sink2')
       !
-      DO jk = 1, jpkm1
-         zwsink2(:,:,jk+1) = -pwsink(:,:,jk) / rday * tmask(:,:,jk+1) 
-      END DO
-      zwsink2(:,:,1) = 0.e0
-
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+      DO_2D( 0, 0, 0, 0 )
          ! Vertical advective flux
          zstep = rsfact / REAL( kiter(ji,jj), wp ) / 2.
          DO jt = 1, kiter(ji,jj)
@@ -166,27 +156,28 @@ CONTAINS
       
                ! vertical advective flux
                DO jk = 1, jpkm1
-                  zigma = zwsink2(ji,jj,jk+1) * zstep / e3w(ji,jj,jk+1,Kmm)
-                  zew   = zwsink2(ji,jj,jk+1)
-                  psinking(ji,jj,jk+1) = -zew * ( tr(ji,jj,jk,jp_tra,Kbb) - 0.5 * ( 1 + zigma ) * zakz(ji,jj,jk) ) * zstep
+                  z0w    = SIGN( 0.5_wp, pwsink(ji,jj,jk+1) )
+                  zalpha = 0.5 + z0w 
+                  zigma  = z0w - 0.5 * pwsink(ji,jj,jk+1) * zstep / e3w(ji,jj,jk+1,Kmm)
+                  zzwx   = tr(ji,jj,jk+1,jp_tra,Kbb) + zigma * zakz(ji,jj,jk+1)
+                  zzwy   = tr(ji,jj,jk,jp_tra,Kbb) + zigma * zakz(ji,jj,jk)
+                  zsinking(ji,jj,jk+1) = -pwsink(ji,jj,jk+1) * ( zalpha * zzwx + (1.0 - zalpha) * zzwy ) * zstep
                END DO
                !
                ! Boundary conditions
-               psinking(ji,jj,1  ) = 0.e0
-               psinking(ji,jj,jpk) = 0.e0
-      
+               zsinking(ji,jj,1  ) = 0.e0
                DO jk = 1, jpkm1
-                  zflx = ( psinking(ji,jj,jk) - psinking(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
-                  tr(ji,jj,jk,jp_tra,Kbb) = tr(ji,jj,jk,jp_tra,Kbb) + zflx
+                  zflx = ( zsinking(ji,jj,jk) - zsinking(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
+                  tr(ji,jj,jk,jp_tra,Kbb) = tr(ji,jj,jk,jp_tra,Kbb) + zflx * tmask(ji,jj,jk)
                END DO
             END DO
             DO jk = 1, jpkm1
-               zflx = ( psinking(ji,jj,jk) - psinking(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
-               ztrb(ji,jj,jk) = ztrb(ji,jj,jk) + 2. * zflx
+               zflx = ( zsinking(ji,jj,jk) - zsinking(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
+               ztrb(ji,jj,jk) = ztrb(ji,jj,jk) + 2. * zflx * tmask(ji,jj,jk)
             END DO
 
             tr(ji,jj,:,jp_tra,Kbb) = ztrb(ji,jj,:)
-            psinkflx(ji,jj,:)   = psinkflx(ji,jj,:) + 2. * psinking(ji,jj,:)
+            psinkflx(ji,jj,:)   = psinkflx(ji,jj,:) + 2. * zsinking(ji,jj,:)
          END DO
       END_2D
       !
diff --git a/src/TOP/TRP/trctrp.F90 b/src/TOP/TRP/trctrp.F90
index 6996ccaa..c14f052f 100644
--- a/src/TOP/TRP/trctrp.F90
+++ b/src/TOP/TRP/trctrp.F90
@@ -26,7 +26,6 @@ MODULE trctrp
    USE trcsbc          ! surface boundary condition          (trc_sbc routine)
    USE trcbc           ! Tracers boundary condtions          ( trc_bc routine)
    USE trcais          ! Antarctic Ice Sheet tracers         (trc_ais routine)
-   USE zpshde          ! partial step: hor. derivative       (zps_hde routine)
    USE bdy_oce   , ONLY: ln_bdy
    USE trcbdy          ! BDY open boundaries
    USE in_out_manager
@@ -68,13 +67,6 @@ CONTAINS
       !
       IF( .NOT. ln_c1d ) THEN
          !
-         !                                                         ! Partial top/bottom cell: GRADh( trb )  
-         IF( ln_zps ) THEN
-            IF( ln_isfcav ) THEN ; CALL zps_hde_isf( kt, jptra, tr(:,:,:,:,Kbb), pgtu=gtru, pgtv=gtrv, pgtui=gtrui, pgtvi=gtrvi )  ! both top & bottom
-            ELSE                 ; CALL zps_hde    ( kt, jptra, tr(:,:,:,:,Kbb), gtru, gtrv )                                      !  only bottom
-            ENDIF
-         ENDIF
-         !
 #if ! defined key_RK3                                
                                 CALL trc_sbc    ( kt,      Kmm, tr, Krhs )      ! surface boundary condition
 #endif
diff --git a/src/TOP/TRP/trczdf.F90 b/src/TOP/TRP/trczdf.F90
index 2f0b5a8f..b5a9dd4c 100644
--- a/src/TOP/TRP/trczdf.F90
+++ b/src/TOP/TRP/trczdf.F90
@@ -53,7 +53,7 @@ CONTAINS
       !
       IF( l_trdtrc )   ztrtrd(:,:,:,:)  = ptr(:,:,:,:,Krhs)
       !
-      CALL tra_zdf_imp( kt, nittrc000, 'TRC', rDt_trc, Kbb, Kmm, Krhs, ptr, Kaa, jptra )    !   implicit scheme          
+      CALL tra_zdf_imp( 'TRC', Kbb, Kmm, Krhs, ptr, Kaa, jptra )    !   implicit scheme          
       !
       IF( l_trdtrc )   THEN                      ! save the vertical diffusive trends for further diagnostics
          DO jn = 1, jptra
diff --git a/src/TOP/TRP/trdmxl_trc.F90 b/src/TOP/TRP/trdmxl_trc.F90
index 1525d1d7..1d13a2e8 100644
--- a/src/TOP/TRP/trdmxl_trc.F90
+++ b/src/TOP/TRP/trdmxl_trc.F90
@@ -112,7 +112,13 @@ CONTAINS
          SELECT CASE ( nn_ctls_trc )                                ! choice of the control surface
             CASE ( -2  )   ;   CALL ctl_stop( 'STOP', 'trdmxl_trc : not ready ' )     !     -> isopycnal surface (see ???)
             CASE ( -1  )   ;   nmld_trc(:,:) = neln(:,:)          !     -> euphotic layer with light criterion
-            CASE (  0  )   ;   nmld_trc(:,:) = nmln(:,:)          !     -> ML with density criterion (see zdfmxl)
+            CASE (  0  )
+               ! nmln calculation in zdfmxl is only on internal points
+               DO_2D( 0, 0, 0, 0 )
+                  zvlmsk(ji,jj) = REAL( nmln(ji,jj), wp )
+               END_2D
+               CALL lbc_lnk( 'trdmxl_trc', zvlmsk, 'T', 1.0_wp, kfillmode=jpfillcopy )  ! No 0 over closed boundaries
+               nmld_trc(:,:) = NINT( zvlmsk(:,:) )                    !     -> ML with density criterion (see zdfmxl)
             CASE (  1  )   ;   nmld_trc(:,:) = nbol_trc(:,:)          !     -> read index from file
             CASE (  2: )   ;   nn_ctls_trc = MIN( nn_ctls_trc, jpktrd_trc - 1 )
                                nmld_trc(:,:) = nn_ctls_trc + 1      !     -> model level
@@ -258,7 +264,7 @@ CONTAINS
       IF( ln_trcldf_iso ) THEN
          !
          DO jn = 1, jptra
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )                    ! description ???
+            DO_2D( 0, 0, 0, 0 )                    ! description ???
                ik = nmld_trc(ji,jj)
                IF( ln_trdtrc(jn) )    &
                tmltrd_trc(ji,jj,jpmxl_trc_zdf,jn) = - avs(ji,jj,ik) / e3w(ji,jj,ik,Kmm) * tmask(ji,jj,ik)  &
diff --git a/src/TOP/oce_trc.F90 b/src/TOP/oce_trc.F90
index 7745fc71..f7c3b550 100644
--- a/src/TOP/oce_trc.F90
+++ b/src/TOP/oce_trc.F90
@@ -33,10 +33,6 @@ MODULE oce_trc
 
    USE dom_oce                                  !* model domain *
 
-   USE domvvl, ONLY : un_td, vn_td          !: thickness diffusion transport
-   USE domvvl, ONLY : ln_vvl_ztilde         !: ztilde vertical coordinate
-   USE domvvl, ONLY : ln_vvl_layer          !: level  vertical coordinate
-
    !* ocean fields: here now and after fields *
    USE oce , ONLY :   uu     =>    uu     !: i-horizontal velocity (m s-1) 
    USE oce , ONLY :   vv     =>    vv     !: j-horizontal velocity (m s-1)
@@ -54,7 +50,7 @@ MODULE oce_trc
    USE sbc_oce , ONLY :   qsr        =>    qsr        !: penetrative solar radiation (w m-2)
    USE sbc_oce , ONLY :   emp        =>    emp        !: freshwater budget: volume flux               [Kg/m2/s]
    USE sbc_oce , ONLY :   emp_b      =>    emp_b      !: freshwater budget: volume flux               [Kg/m2/s]
-   USE sbc_oce , ONLY :   fmmflx     =>    fmmflx     !: freshwater budget: volume flux               [Kg/m2/s]
+   USE sbc_oce , ONLY :   fwfice     =>    fwfice     !: freshwater budget: volume flux               [Kg/m2/s]
    USE sbc_oce , ONLY :   rnf        =>    rnf        !: river runoff   [Kg/m2/s]
    USE sbc_oce , ONLY :   rnf_b      =>    rnf_b      !: river runoff at previus step   [Kg/m2/s]
    USE sbc_oce , ONLY :   ln_dm2dc   =>    ln_dm2dc   !: Diurnal Cycle 
@@ -96,7 +92,6 @@ MODULE oce_trc
    USE zdfmxl , ONLY :   nmln        =>   nmln        !: number of level in the mixed layer
    USE zdfmxl , ONLY :   hmld        =>   hmld        !: mixing layer depth (turbocline)
    USE zdfmxl , ONLY :   hmlp        =>   hmlp        !: mixed layer depth  (rho=rho0+zdcrit) (m)
-   USE zdfmxl , ONLY :   hmlpt       =>   hmlpt       !: mixed layer depth at t-points (m)
    USE zdfmxl , ONLY :   avt_c       =>   avt_c       !: Kz criterion for the turbocline depth
 
 END MODULE oce_trc
diff --git a/src/TOP/trc.F90 b/src/TOP/trc.F90
index d5b85e04..4836efb7 100644
--- a/src/TOP/trc.F90
+++ b/src/TOP/trc.F90
@@ -158,19 +158,19 @@ CONTAINS
       !!-------------------------------------------------------------------
       ierr(:) = 0
       !
-      ALLOCATE( tr(jpi,jpj,jpk,jptra,jpt)                                             ,       &  
-         &      trc_i(jpi,jpj,jptra)  , trc_o(jpi,jpj,jptra)                          ,       &
-         &      gtru (jpi,jpj,jptra)  , gtrv (jpi,jpj,jptra)                          ,       &
-         &      gtrui(jpi,jpj,jptra)  , gtrvi(jpi,jpj,jptra)                          ,       &
-         &      trc_ice_ratio(jptra)  , trc_ice_prescr(jptra) , cn_trc_o(jptra)       ,       &
-         &      neln(jpi,jpj)         , heup(jpi,jpj)         , heup_01(jpi,jpj)      ,       &
-         &      etot(jpi,jpj,jpk)     , etot_ndcy(jpi,jpj,jpk)                        ,       &
-         &      sbc_trc_b(jpi,jpj,jptra), sbc_trc(jpi,jpj,jptra)                      ,       &  
-         &      cvol(jpi,jpj,jpk)     , trai(jptra)                                   ,       &
-         &      ctrcnm(jptra)         , ctrcln(jptra)         , ctrcun(jptra)         ,       &
-         &      ln_trc_ini(jptra)     ,                                                       &
-         &      ln_trc_sbc(jptra)     , ln_trc_cbc(jptra)     , ln_trc_obc(jptra)     ,       &
-         &      ln_trc_ais(jptra)     ,                                                       &
+      ALLOCATE( tr(jpi,jpj,jpk,jptra,jpt)                                         ,       &  
+         &      gtru (jpi,jpj,jptra) , gtrv (jpi,jpj,jptra)                       ,       &
+         &      gtrui(jpi,jpj,jptra) , gtrvi(jpi,jpj,jptra)                       ,       &
+         &      trc_i(A2D(0),jptra)  , trc_o(A2D(0),jptra)                        ,       &
+         &      trc_ice_ratio(jptra) , trc_ice_prescr(jptra) , cn_trc_o(jptra)    ,       &
+         &      neln(A2D(0))         , heup(A2D(0))         , heup_01(A2D(0))     ,       &
+         &      etot(A2D(0),jpk)     , etot_ndcy(A2D(0),jpk)                      ,       &
+         &      sbc_trc_b(A2D(0),jptra), sbc_trc(A2D(0),jptra)                    ,       &  
+         &      cvol(jpi,jpj,jpk)    , trai(jptra)                                ,       &
+         &      ctrcnm(jptra)        , ctrcln(jptra)         , ctrcun(jptra)      ,       &
+         &      ln_trc_ini(jptra)    ,                                                    &
+         &      ln_trc_sbc(jptra)    , ln_trc_cbc(jptra)     , ln_trc_obc(jptra)  ,       &
+         &      ln_trc_ais(jptra)    ,                                                    &
          &      STAT = ierr(1)  )
       !
       IF( ln_bdy       )   ALLOCATE( trcdta_bdy(jptra, jp_bdy)  , STAT = ierr(2) )
diff --git a/src/TOP/trcais.F90 b/src/TOP/trcais.F90
index 5bd05138..010e9fce 100644
--- a/src/TOP/trcais.F90
+++ b/src/TOP/trcais.F90
@@ -169,7 +169,7 @@ CONTAINS
             DO jn = 1, jptra
                IF( ln_trc_ais(jn) ) THEN
                   jl = n_trc_indais(jn)
-                  DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                  DO_2D( 0, 0, 0, 0 )
                      zfact = 1. / e3t(ji,jj,1,Kmm)
                      ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + fwficb(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm) * zfact
                   END_2D
@@ -181,7 +181,7 @@ CONTAINS
             DO jn = 1, jptra
                IF( ln_trc_ais(jn) ) THEN
                   jl = n_trc_indais(jn)
-                  DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                  DO_2D( 0, 0, 0, 0 )
                      IF( ln_isfpar_mlt ) THEN
                         zcalv = fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
                         ikt = misfkt_par(ji,jj)
@@ -213,7 +213,7 @@ CONTAINS
             DO jn = 1, jptra
                IF( ln_trc_ais(jn) ) THEN
                   jl = n_trc_indais(jn)
-                  DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                  DO_2D( 0, 0, 0, 0 )
                      DO jk = 1, icblev
                         zcalv  =  fwficb(ji,jj) * r1_rho0 
                         ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trafac(jl) * zcalv / gdepw(ji,jj,icblev+1,Kmm)
@@ -228,7 +228,7 @@ CONTAINS
             DO jn = 1, jptra
                IF( ln_trc_ais(jn) ) THEN
                   jl = n_trc_indais(jn)
-                  DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+                  DO_2D( 0, 0, 0, 0 )
                      IF( ln_isfpar_mlt ) THEN
                         zcalv = - fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
                         ikt = misfkt_par(ji,jj)
diff --git a/src/TOP/trcbc.F90 b/src/TOP/trcbc.F90
index fc829d8d..141ecf03 100644
--- a/src/TOP/trcbc.F90
+++ b/src/TOP/trcbc.F90
@@ -414,7 +414,7 @@ CONTAINS
          !
          ! Remove river dilution for tracers with absent river load
          IF( ln_rnf_ctl .AND. .NOT.ln_trc_cbc(jn) ) THEN
-            DO_2D( 0, 0, 0, 1 )
+            DO_2D( 0, 0, 0, 0 )
                DO jk = 1, nk_rnf(ji,jj)
 #if defined key_RK3
                   zrnf =  rnf(ji,jj) * r1_rho0 / h_rnf(ji,jj)
@@ -432,7 +432,7 @@ CONTAINS
          IF( ln_trc_sbc(jn) ) THEN
             jl = n_trc_indsbc(jn)
             sf_trcsbc(jl)%fnow(:,:,1) = MAX( rtrn, sf_trcsbc(jl)%fnow(:,:,1) ) ! avoid nedgative value due to interpolation
-            DO_2D( 0, 0, 0, 1 )
+            DO_2D( 0, 0, 0, 0 )
                zfact = 1. / ( e3t(ji,jj,1,Kmm) * rn_sbc_time )
                ptr(ji,jj,1,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + rf_trsfac(jl) * sf_trcsbc(jl)%fnow(ji,jj,1) * zfact
             END_2D
@@ -443,7 +443,7 @@ CONTAINS
             IF( l_offline )   rn_rfact = 1._wp
             jl = n_trc_indcbc(jn)
             sf_trccbc(jl)%fnow(:,:,1) = MAX( rtrn, sf_trccbc(jl)%fnow(:,:,1) ) ! avoid nedgative value due to interpolation
-            DO_2D( 0, 0, 0, 1 )
+            DO_2D( 0, 0, 0, 0 )
                DO jk = 1, nk_rnf(ji,jj)
                   zfact = rn_rfact / ( e1e2t(ji,jj) * h_rnf(ji,jj) * rn_cbc_time ) 
                   ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trcfac(jl) * sf_trccbc(jl)%fnow(ji,jj,1) * zfact
diff --git a/src/TOP/trcdta.F90 b/src/TOP/trcdta.F90
index ec3a47d2..7a95df42 100644
--- a/src/TOP/trcdta.F90
+++ b/src/TOP/trcdta.F90
@@ -189,7 +189,7 @@ CONTAINS
          ptrcdta(:,:,:) = sf_trcdta(kjl)%fnow(:,:,:) * tmask(:,:,:)
          ! 
 #if ! defined key_sed_off
-         IF( ln_sco ) THEN                !== s- or mixed s-zps-coordinate  ==!
+         IF( l_sco ) THEN                !== s- or mixed s-zps-coordinate  ==!
             !
             IF( kt == nit000 .AND. lwp )THEN
                WRITE(numout,*)
@@ -217,23 +217,6 @@ CONTAINS
                ptrcdta(ji,jj,jpk) = 0._wp
             END_2D
             ! 
-         ELSE                                !==   z- or zps- coordinate   ==!
-            ! zps-coordinate (partial steps) interpolation at the last ocean level
-            IF( ln_zps ) THEN
-                DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-                   ik = mbkt(ji,jj)
-                   IF( ik > 1 .AND. gdept_0(ji,jj,ik) < gdept_1d(ik) ) THEN
-                      zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
-                      ptrcdta(ji,jj,ik) = (1.-zl) * ptrcdta(ji,jj,ik) + zl * ptrcdta(ji,jj,ik-1)
-                   ENDIF
-                   ik = mikt(ji,jj)
-                   IF( ik > 1 ) THEN
-                      zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) )
-                      ptrcdta(ji,jj,ik) = (1.-zl) * ptrcdta(ji,jj,ik) + zl * ptrcdta(ji,jj,ik+1)
-                   ENDIF
-                 END_2D
-            ENDIF
-            !
          ENDIF
 #endif
          ! Scale by multiplicative factor
diff --git a/src/TOP/trcini.F90 b/src/TOP/trcini.F90
index 394f1cd1..f5275ead 100644
--- a/src/TOP/trcini.F90
+++ b/src/TOP/trcini.F90
@@ -32,6 +32,8 @@ MODULE trcini
    
    PUBLIC   trc_init   ! called by opa
 
+      !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
@@ -93,9 +95,8 @@ CONTAINS
       !! ** Purpose :      passive tracers inventories at initialsation phase
       !!----------------------------------------------------------------------
       INTEGER, INTENT(in) ::   Kmm    ! time level index
-      INTEGER             ::  jk, jn  ! dummy loop indices
+      INTEGER             ::  ji, jj, jk, jn  ! dummy loop indices
       CHARACTER (len=25) :: charout
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: zzmsk
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
diff --git a/src/TOP/trcnam.F90 b/src/TOP/trcnam.F90
index cacbe617..80a181e0 100644
--- a/src/TOP/trcnam.F90
+++ b/src/TOP/trcnam.F90
@@ -254,7 +254,12 @@ CONTAINS
          WRITE(numout,*) '   Namelist : namtrc_dcy                    '
          WRITE(numout,*) '      Diurnal cycle for TOP ln_trcdc2dm    = ', ln_trcdc2dm
       ENDIF
-
+      !      ! Define logical parameter ton control dirunal cycle in TOP
+      l_trcdm2dc = ( ln_trcdc2dm .AND. .NOT. ln_dm2dc  ) 
+      !
+      IF( l_trcdm2dc .AND. lwp )   CALL ctl_warn( 'Coupling with passive tracers and used of diurnal cycle.',   &
+         &                           'Computation of a daily mean shortwave for some biogeochemical models ' )
+      !
    END SUBROUTINE trc_nam_dcy
 
    SUBROUTINE trc_nam_trd
diff --git a/src/TOP/trcopt.F90 b/src/TOP/trcopt.F90
index 7620a4c0..c7a01316 100644
--- a/src/TOP/trcopt.F90
+++ b/src/TOP/trcopt.F90
@@ -58,12 +58,14 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt, knt   ! ocean time step
       INTEGER, INTENT(in) ::   Kbb, Kmm  ! time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   zchl  ! chlorophyll field
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(out) :: ze1, ze2, ze3 ! PAR for individual wavelength
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(out) :: ze1, ze2, ze3 ! PAR for individual wavelength
       !
       INTEGER  ::   ji, jj, jk, irgb
       REAL(wp) ::   ztmp
-      REAL(wp), DIMENSION(jpi,jpj    ) :: parsw, zqsr100, zqsr_corr
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze0
+      REAL(wp), DIMENSION(A2D(0)    ) :: parsw, zqsr100, zqsr_corr
+      REAL(wp), DIMENSION(A2D(0),jpk) :: ze0
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zw2d
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('trc_opt')
@@ -85,7 +87,7 @@ CONTAINS
 
       !     Attenuation coef. function of Chlorophyll and wavelength (RGB)
       !     --------------------------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1)
          ztmp = ( zchl(ji,jj,jk) + rtrn ) * 1.e6
          ztmp = MIN(  10. , MAX( 0.05, ztmp )  )
          irgb = NINT( 41 + 20.* LOG10( ztmp ) + rtrn )
@@ -99,54 +101,63 @@ CONTAINS
       !     -----------------------------------------------
       IF( ln_qsr_bio ) THEN
          !
-         zqsr_corr(:,:) = parsw(:,:) * qsr(:,:)
+         DO_2D( 0, 0, 0, 0 )
+            zqsr_corr(ji,jj) = parsw(ji,jj) * qsr(ji,jj)
+         END_2D
          !
-         ze0(:,:,1) = (1._wp - 3._wp * parsw(:,:)) * qsr(:,:)  !  ( 1 - 3 * alpha ) * q
+         DO_2D( 0, 0, 0, 0 )
+            ze0(ji,jj,1) = (1._wp - 3._wp * parsw(ji,jj)) * qsr(ji,jj)  !  ( 1 - 3 * alpha ) * q
+         END_2D
          ze1(:,:,1) = zqsr_corr(:,:)
          ze2(:,:,1) = zqsr_corr(:,:)
          ze3(:,:,1) = zqsr_corr(:,:)
          !
-         DO jk = 2, nksrp + 1
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-                  ze0(ji,jj,jk) = ze0(ji,jj,jk-1) * EXP( -e3t(ji,jj,jk-1,Kmm) * (1. / rn_si0) )
-                  ze1(ji,jj,jk) = ze1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        )
-                  ze2(ji,jj,jk) = ze2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        )
-                  ze3(ji,jj,jk) = ze3(ji,jj,jk-1) * EXP( -ekr  (ji,jj,jk-1 )        )
-            END_2D
-         END DO
+         DO_3D( 0, 0, 0, 0, 2, nksrp + 1 )
+            ze0(ji,jj,jk) = ze0(ji,jj,jk-1) * EXP( -e3t(ji,jj,jk-1,Kmm) * (1. / rn_si0) )
+            ze1(ji,jj,jk) = ze1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        )
+            ze2(ji,jj,jk) = ze2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        )
+            ze3(ji,jj,jk) = ze3(ji,jj,jk-1) * EXP( -ekr  (ji,jj,jk-1 )        )
+         END_3D
          !
-         etot3(:,:,1) = qsr(:,:) * tmask(:,:,1)
-         DO jk = 2, nksrp + 1
-            etot3(:,:,jk) =  ( ze0(:,:,jk) + ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) ) * tmask(:,:,jk)
-         END DO
+         DO_2D( 0, 0, 0, 0 )
+            etot3(ji,jj,1) =  qsr(ji,jj) * tmask(ji,jj,1)
+         END_2D
+         DO_3D( 0, 0, 0, 0, 2, nksrp+1 )
+            etot3(ji,jj,jk) =  ( ze0(ji,jj,jk) + ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk) ) * tmask(ji,jj,jk)
+         END_3D
          !                                     !  ------------------------
       ENDIF
 
       !     Photosynthetically Available Radiation (PAR)
       !     --------------------------------------------
-      zqsr_corr(:,:) = parsw(:,:) * qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
+      DO_2D( 0, 0, 0, 0 )
+         zqsr_corr(ji,jj) = parsw(ji,jj) * qsr(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+      END_2D
       !
       CALL trc_opt_par( kt, zqsr_corr, ze1, ze2, ze3 )
       !
-      DO jk = 1, nksrp
-         etot (:,:,jk) = ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
-      ENDDO
+      DO_3D( 0, 0, 0, 0, 1, nksr )
+         etot(ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk)
+      END_3D
 
       ! No Diurnal cycle PAR
       IF( l_trcdm2dc ) THEN
-         zqsr_corr(:,:) = parsw(:,:) * qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn )
+         DO_2D( 0, 0, 0, 0 )
+            zqsr_corr(ji,jj) = parsw(ji,jj) * qsr_mean(ji,jj) / ( 1.-fr_i(ji,jj) + rtrn )
+         END_2D
          !
          CALL trc_opt_par( kt, zqsr_corr, ze1, ze2, ze3 )
-         DO jk = 1, nksrp
-            etot_ndcy(:,:,jk) = ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
-         END DO
+         !
+         DO_3D( 0, 0, 0, 0, 1, nksr )
+            etot_ndcy(ji,jj,jk) = ze1(ji,jj,jk) + ze2(ji,jj,jk) + ze3(ji,jj,jk)
+         END_3D
       ELSE
          etot_ndcy(:,:,:) = etot(:,:,:)
       ENDIF
 
       !     Weighted broadband attenuation coefficient
       !     ------------------------------------------
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+      DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          ztmp = ze1(ji,jj,jk)* ekb(ji,jj,jk) + ze2(ji,jj,jk) * ekg(ji,jj,jk) + ze3(ji,jj,jk) * ekr(ji,jj,jk)
          zeps(ji,jj,jk) = ztmp / e3t(ji,jj,jk,Kmm) / (etot(ji,jj,jk) + rtrn)
       END_3D
@@ -154,26 +165,24 @@ CONTAINS
 
       !     Light at the euphotic depth
       !     ---------------------------
-      zqsr100 = 0.01 * 3. * zqsr_corr(:,:)
+      zqsr100(:,:) = 0.01 * 3. * zqsr_corr(:,:)
 
       !     Euphotic depth and level
       !     ------------------------
-      neln   (:,:) = 1
-      heup   (:,:) = gdepw(:,:,2,Kmm)
-      heup_01(:,:) = gdepw(:,:,2,Kmm)
-      !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksrp )
+      DO_2D( 0, 0, 0, 0 )
+         neln   (ji,jj) = 1
+         heup   (ji,jj) = gdepw(ji,jj,2,Kmm)
+         heup_01(ji,jj) = gdepw(ji,jj,2,Kmm)
+      END_2D
+
+      DO_3D( 0, 0, 0, 0, 2, nksr)
         IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >=  zqsr100(ji,jj) )  THEN
-           ! Euphotic level (1st T-level strictly below Euphotic layer)
-           ! NOTE: ensure compatibility with nmld_trc definition in trdmxl_trc
-           neln(ji,jj) = jk+1
-           !
-           ! Euphotic layer depth
-           heup(ji,jj) = gdepw(ji,jj,jk+1,Kmm)
+           neln(ji,jj) = jk+1                    ! Euphotic level : 1rst T-level strictly below Euphotic layer
+           !                                     ! nb: ensure the compatibility with nmld_trc definition in trd_mld_trc_zint
+           heup(ji,jj) = gdepw(ji,jj,jk+1,Kmm)     ! Euphotic layer depth
         ENDIF
-        ! Euphotic layer depth (light level definition)
-        IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.50 )  THEN
-           heup_01(ji,jj) = gdepw(ji,jj,jk+1,Kmm)
+        IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.10 )  THEN
+           heup_01(ji,jj) = gdepw(ji,jj,jk+1,Kmm)  ! Euphotic layer depth (light level definition)
         ENDIF
       END_3D
       !
@@ -181,8 +190,18 @@ CONTAINS
       heup_01(:,:) = MIN( 300., heup_01(:,:) )
       !
       IF( lk_iomput ) THEN
-         CALL iom_put( "xbla" , zeps(:,:,:) * tmask(:,:,:) )
-         CALL iom_put( "Heup" , heup(:,:  ) * tmask(:,:,1) )
+        IF( iom_use( "Heup" ) ) THEN
+           ALLOCATE( zw2d(A2D(0)) )
+           zw2d(A2D(0)) = heup(A2D(0)) * tmask(A2D(0),1)
+           CALL iom_put( "Heup", zw2d )  ! Euphotic layer depth
+           DEALLOCATE( zw2d )
+        ENDIF
+        IF( iom_use( "xbla" ) ) THEN
+           ALLOCATE( zw3d(A2D(0),jpk))   ;    zw3d(A2D(0),jpk) = 0._wp
+           zw3d(A2D(0),1:jpkm1) = zeps(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
+           CALL iom_put( "xbla", zw3d )  ! Euphotic layer depth
+           DEALLOCATE( zw3d )
+        ENDIF
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('trc_opt')
@@ -199,11 +218,11 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in)      ::   kt                ! ocean time-step
-      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in)      ::   zqsr              ! real shortwave
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(out)     ::   pe1 , pe2 , pe3   ! PAR (R-G-B)
+      REAL(wp), DIMENSION(A2D(0))    , INTENT(in)      ::   zqsr              ! real shortwave
+      REAL(wp), DIMENSION(A2D(0),jpk), INTENT(out)     ::   pe1 , pe2 , pe3   ! PAR (R-G-B)
       !
       INTEGER                       ::   ji, jj, jk        ! dummy loop indices
-      REAL(wp), DIMENSION(jpi,jpj)  ::   we1, we2, we3     ! PAR (R-G-B) at w-level
+      REAL(wp), DIMENSION(A2D(0))  ::   we1, we2, we3     ! PAR (R-G-B) at w-level
       !!----------------------------------------------------------------------
       pe1(:,:,:) = 0. ; pe2(:,:,:) = 0. ; pe3(:,:,:) = 0.
       !
@@ -213,7 +232,7 @@ CONTAINS
          pe2(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekg(:,:,1) )
          pe3(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekr(:,:,1) )
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksrp )
+         DO_3D( 0, 0, 0, 0, 2, nksrp )
             pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -0.5 * ( ekb(ji,jj,jk-1) + ekb(ji,jj,jk) ) )
             pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -0.5 * ( ekg(ji,jj,jk-1) + ekg(ji,jj,jk) ) )
             pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -0.5 * ( ekr(ji,jj,jk-1) + ekr(ji,jj,jk) ) )
@@ -225,7 +244,7 @@ CONTAINS
          we2(:,:) = zqsr(:,:)
          we3(:,:) = zqsr(:,:)
          !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksrp )
+         DO_3D( 0, 0, 0, 0, 1, nksrp )
             ! integrate PAR over current t-level
             pe1(ji,jj,jk) = we1(ji,jj) / (ekb(ji,jj,jk) + rtrn) * (1. - EXP( -ekb(ji,jj,jk) ))
             pe2(ji,jj,jk) = we2(ji,jj) / (ekg(ji,jj,jk) + rtrn) * (1. - EXP( -ekg(ji,jj,jk) ))
@@ -266,7 +285,9 @@ CONTAINS
       IF( ln_varpar ) THEN
          IF( kt == nittrc000 .OR. ( kt /= nittrc000 .AND. ntimes_par > 1 ) ) THEN
             CALL fld_read( kt, 1, sf_par )
-            par_varsw(:,:) = ( sf_par(1)%fnow(:,:,1) ) / 3.0
+            DO_2D( 0, 0, 0, 0 )
+               par_varsw(ji,jj) = ( sf_par(1)%fnow(ji,jj,1) ) / 3.0
+            END_2D
          ENDIF
       ENDIF
       !
@@ -348,8 +369,8 @@ CONTAINS
       !!                     ***  ROUTINE trc_opt_alloc  ***
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( ekb(jpi,jpj,jpk), ekr(jpi,jpj,jpk),  &
-                ekg(jpi,jpj,jpk),zeps(jpi,jpj,jpk),  STAT= trc_opt_alloc  ) 
+      ALLOCATE( ekb(A2D(0),jpk),ekr(A2D(0),jpk),  &
+                ekg(A2D(0),jpk),zeps(A2D(0),jpk),  STAT= trc_opt_alloc  ) 
       !
       IF( trc_opt_alloc /= 0 ) CALL ctl_stop( 'STOP', 'trc_opt_alloc : failed to allocate arrays.' )
       !
diff --git a/src/TOP/trcstp.F90 b/src/TOP/trcstp.F90
index e016e27c..5e98d3c3 100644
--- a/src/TOP/trcstp.F90
+++ b/src/TOP/trcstp.F90
@@ -37,6 +37,8 @@ MODULE trcstp
    REAL(wp) ::   rsecfst, rseclast       ! ???
    REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   qsr_arr   ! save qsr during TOP time-step
 
+      !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
@@ -74,17 +76,13 @@ CONTAINS
       ll_trcstat  = ( sn_cfctl%l_trcstat ) .AND. &
      &              ( ( MOD( kt, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) )
 
-      IF( kt == nittrc000 )                      CALL trc_stp_ctl   ! control 
       IF( kt == nittrc000 .AND. lk_trdmxl_trc )  CALL trd_mxl_trc_init    ! trends: Mixed-layer
       !
       IF( .NOT.ln_linssh ) THEN                                           ! update ocean volume due to ssh temporal evolution
          DO jk = 1, jpk
             cvol(:,:,jk) = e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
          END DO
-         IF ( ll_trcstat .OR. kt == nitrst .OR. ( ln_check_mass .AND. kt == nitend )   &
-            & .OR. iom_use( "pno3tot" ) .OR. iom_use( "ppo4tot" ) .OR. iom_use( "psiltot" )   &
-            & .OR. iom_use( "palktot" ) .OR. iom_use( "pfertot" ) )                           &
-            &     areatot = glob_sum( 'trcstp', cvol(:,:,:) )
+         IF ( ll_trcstat .OR. kt == nitrst )  areatot = glob_sum( 'trcstp', cvol(:,:,:) )
       ENDIF
       !
       IF( l_trcdm2dc )   CALL trc_mean_qsr( kt )
@@ -142,20 +140,6 @@ CONTAINS
    END SUBROUTINE trc_stp
 
 
-   SUBROUTINE trc_stp_ctl
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE trc_stp_ctl  ***
-      !!----------------------------------------------------------------------
-      !
-      ! Define logical parameter ton control dirunal cycle in TOP
-      l_trcdm2dc = ( ln_trcdc2dm .AND. .NOT. ln_dm2dc  ) 
-      !
-      IF( l_trcdm2dc .AND. lwp )   CALL ctl_warn( 'Coupling with passive tracers and used of diurnal cycle.',   &
-         &                           'Computation of a daily mean shortwave for some biogeochemical models ' )
-      !
-   END SUBROUTINE trc_stp_ctl
-
-
    SUBROUTINE trc_mean_qsr( kt )
       !!----------------------------------------------------------------------
       !!             ***  ROUTINE trc_mean_qsr  ***
@@ -170,7 +154,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
       !
-      INTEGER  ::   jn   ! dummy loop indices
+      INTEGER  ::   ji,jj,jn   ! dummy loop indices
       REAL(wp) ::   zkt, zrec     ! local scalars
       CHARACTER(len=1) ::   cl1   ! 1 character
       CHARACTER(len=2) ::   cl2   ! 2 characters
@@ -189,7 +173,7 @@ CONTAINS
             WRITE(numout,*) 
          ENDIF
          !
-         ALLOCATE( qsr_arr(jpi,jpj,nb_rec_per_day ) )
+         ALLOCATE( qsr_arr(A2D(0),nb_rec_per_day ) )
          !
          !                                            !* Restart: read in restart file
          IF( ln_rsttr .AND. nn_rsttr /= 0 .AND. iom_varid( numrtr, 'qsr_mean' , ldstop = .FALSE. ) > 0  &
@@ -220,7 +204,9 @@ CONTAINS
             IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean set to nit000 values'
             rsecfst  = kt * rn_Dt
             !
-            qsr_mean(:,:) = qsr(:,:)
+            DO_2D( 0, 0, 0, 0 )
+               qsr_mean(ji,jj) = qsr(ji,jj)
+            END_2D
             DO jn = 1, nb_rec_per_day
                qsr_arr(:,:,jn) = qsr_mean(:,:)
             END DO
@@ -240,7 +226,7 @@ CONTAINS
              qsr_arr(:,:,jn) = qsr_arr(:,:,jn+1)
           ENDDO
           qsr_arr (:,:,nb_rec_per_day) = qsr(:,:)
-          qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day
+          qsr_mean(:,:) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day
       ENDIF
       !
       IF( lrst_trc ) THEN    !* Write the mean of qsr in restart file 
diff --git a/src/TOP/trcstp_rk3.F90 b/src/TOP/trcstp_rk3.F90
index 450d4b5e..e42148d8 100644
--- a/src/TOP/trcstp_rk3.F90
+++ b/src/TOP/trcstp_rk3.F90
@@ -41,6 +41,8 @@ MODULE trcstp_rk3
    REAL(wp) ::   rsecfst, rseclast       ! ???
    REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   qsr_arr   ! save qsr during TOP time-step
 
+      !! * Substitutions
+#  include "do_loop_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/TOP 4.0 , NEMO Consortium (2018)
@@ -71,15 +73,14 @@ CONTAINS
       l_trcstat  = ( sn_cfctl%l_trcstat ) .AND. &
            &       ( ( MOD( kt, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) )
       !
-      IF( kt == nittrc000 )                      CALL trc_stp_ctl   ! control 
+      IF( kt == nittrc000 )                      CALL trc_stpsctl   ! control 
       IF( kt == nittrc000 .AND. lk_trdmxl_trc )  CALL trd_mxl_trc_init    ! trends: Mixed-layer
       !
       IF( .NOT.ln_linssh ) THEN                                           ! update ocean volume due to ssh temporal evolution
          DO jk = 1, jpk
             cvol(:,:,jk) = e1e2t(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)
          END DO
-         IF( l_trcstat .OR. kt == nitrst .OR. ( ln_check_mass .AND. kt == nitend ) )   &
-            &     areatot = glob_sum( 'trcstp', cvol(:,:,:) )
+         IF( l_trcstat .OR. kt == nitrst ) areatot = glob_sum( 'trcstp', cvol(:,:,:) )
       ENDIF
       !
       IF( l_trcdm2dc )   CALL trc_mean_qsr( kt )
@@ -146,22 +147,6 @@ CONTAINS
    END SUBROUTINE trc_stp_end
 
 
-   SUBROUTINE trc_stp_ctl
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE trc_stp_ctl  ***
-      !! ** Purpose :        Control  + ocean volume
-      !!----------------------------------------------------------------------
-      !
-      ! Define logical parameter ton control dirunal cycle in TOP
-      l_trcdm2dc = ln_dm2dc .OR. ( ln_cpl .AND. ncpl_qsr_freq /= 1 .AND. ncpl_qsr_freq /= 0 )
-      l_trcdm2dc = l_trcdm2dc .AND. .NOT. l_offline
-      !
-      IF( l_trcdm2dc .AND. lwp )   CALL ctl_warn( 'Coupling with passive tracers and used of diurnal cycle.',   &
-         &                           'Computation of a daily mean shortwave for some biogeochemical models ' )
-      !
-   END SUBROUTINE trc_stp_ctl
-
-
    SUBROUTINE trc_mean_qsr( kt )
       !!----------------------------------------------------------------------
       !!             ***  ROUTINE trc_mean_qsr  ***
@@ -176,7 +161,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
       !
-      INTEGER  ::   jn   ! dummy loop indices
+      INTEGER  ::   ji,jj,jn   ! dummy loop indices
       REAL(wp) ::   zkt, zrec     ! local scalars
       CHARACTER(len=1) ::   cl1   ! 1 character
       CHARACTER(len=2) ::   cl2   ! 2 characters
@@ -185,13 +170,9 @@ CONTAINS
       IF( ln_timing )   CALL timing_start('trc_mean_qsr')
       !
       IF( kt == nittrc000 ) THEN
-         IF( ln_cpl )  THEN  
-            rdt_sampl = rday / ncpl_qsr_freq
-            nb_rec_per_day = ncpl_qsr_freq
-         ELSE  
-            rdt_sampl = MAX( 3600., rn_Dt )
-            nb_rec_per_day = INT( rday / rdt_sampl )
-         ENDIF
+         !
+         rdt_sampl = REAL( ncpl_qsr_freq )
+         nb_rec_per_day = INT( rday / ncpl_qsr_freq )
          !
          IF(lwp) THEN
             WRITE(numout,*) 
@@ -199,7 +180,7 @@ CONTAINS
             WRITE(numout,*) 
          ENDIF
          !
-         ALLOCATE( qsr_arr(jpi,jpj,nb_rec_per_day ) )
+         ALLOCATE( qsr_arr(A2D(0),nb_rec_per_day ) )
          !
          !                                            !* Restart: read in restart file
          IF( ln_rsttr .AND. nn_rsttr /= 0 .AND. iom_varid( numrtr, 'qsr_mean' , ldstop = .FALSE. ) > 0  &
@@ -230,7 +211,9 @@ CONTAINS
             IF(lwp) WRITE(numout,*) 'trc_qsr_mean:   qsr_mean set to nit000 values'
             rsecfst  = kt * rn_Dt
             !
-            qsr_mean(:,:) = qsr(:,:)
+            DO_2D( 0, 0, 0, 0 )
+               qsr_mean(ji,jj) = qsr(ji,jj)
+            END_2D
             DO jn = 1, nb_rec_per_day
                qsr_arr(:,:,jn) = qsr_mean(:,:)
             END DO
@@ -250,7 +233,7 @@ CONTAINS
              qsr_arr(:,:,jn) = qsr_arr(:,:,jn+1)
           END DO
           qsr_arr (:,:,nb_rec_per_day) = qsr(:,:)
-          qsr_mean(:,:                ) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day
+          qsr_mean(:,:) = SUM( qsr_arr(:,:,:), 3 ) / nb_rec_per_day
       ENDIF
       !
       IF( lrst_trc ) THEN    !* Write the mean of qsr in restart file 
diff --git a/src/TOP/trcwri.F90 b/src/TOP/trcwri.F90
index 39e3123f..bdfc3512 100644
--- a/src/TOP/trcwri.F90
+++ b/src/TOP/trcwri.F90
@@ -42,12 +42,12 @@ CONTAINS
       INTEGER, INTENT( in )     :: kt
       INTEGER, INTENT( in )     :: Kmm  ! time level indices
       !
-      INTEGER                   :: jk, jn
+      INTEGER                   :: ji,jj,jk,jn
       CHARACTER (len=20)        :: cltra
       CHARACTER (len=40)        :: clhstnam
       INTEGER ::   inum = 11            ! temporary logical unit
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z3d   ! 3D workspace
-      !!---------------------------------------------------------------------
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3d, z3d0   ! 3D workspace
+      !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('trc_wri')
       !
@@ -59,32 +59,55 @@ CONTAINS
            CLOSE(inum)
          ENDIF
 
+         ALLOCATE( z3d(jpi,jpj,jpk) )  ;   z3d(:,:,:) = 0._wp
+         ALLOCATE( z3d0(A2D(0),jpk) )  ;  z3d0(:,:,:) = 0._wp
+
          ! Output of initial vertical scale factor
-         CALL iom_put( "e3t_0", e3t_0(:,:,:) )
-         CALL iom_put( "e3u_0", e3u_0(:,:,:) )
-         CALL iom_put( "e3v_0", e3v_0(:,:,:) )
+         IF( lk_vco_1d ) THEN
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3t_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3t_0", z3d )
+            !
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3u_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3u_0", z3d )
+            !
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d(ji,jj,jk) =  e3v_0(ji,jj,jk)
+            END_3D
+            CALL iom_put( "e3v_0", z3d )
+         ELSE
+            CALL iom_put( "e3t_0", e3t_0(:,:,:) )
+            CALL iom_put( "e3u_0", e3u_0(:,:,:) )
+            CALL iom_put( "e3v_0", e3v_0(:,:,:) )
+         ENDIF
          !
          IF( .NOT.ln_linssh )  CALL iom_put( "ssh" , ssh(:,:,Kmm) )              ! sea surface height
          !
-         IF ( iom_use("e3t") ) THEN  ! time-varying e3t
-            DO jk = 1, jpk
-               z3d(:,:,jk) =  e3t(:,:,jk,Kmm)
-            END DO
-            CALL iom_put( "e3t", z3d(:,:,:) )
+         ! --- vertical scale factors --- !
+         IF( iom_use("e3t") ) THEN  ! time-varying e3t
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d0(ji,jj,jk) =  e3t(ji,jj,jk,Kmm)
+            END_3D
+            CALL iom_put( "e3t", z3d0 )
          ENDIF
          IF ( iom_use("e3u") ) THEN                         ! time-varying e3u
-            DO jk = 1, jpk
-               z3d(:,:,jk) =  e3u(:,:,jk,Kmm)
-            END DO
-            CALL iom_put( "e3u", z3d(:,:,:) )
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d0(ji,jj,jk) =  e3u(ji,jj,jk,Kmm)
+            END_3D 
+            CALL iom_put( "e3u" , z3d0 )
          ENDIF
          IF ( iom_use("e3v") ) THEN                         ! time-varying e3v
-            DO jk = 1, jpk
-               z3d(:,:,jk) =  e3v(:,:,jk,Kmm)
-            END DO
-            CALL iom_put( "e3v", z3d(:,:,:) )
+            DO_3D( 0, 0, 0, 0, 1, jpk )
+               z3d0(ji,jj,jk) =  e3v(ji,jj,jk,Kmm)
+            END_3D
+            CALL iom_put( "e3v" , z3d0 )
          ENDIF
          !
+         DEALLOCATE( z3d )
+         DEALLOCATE( z3d0 )
       ENDIF
       !
       ! write the tracer concentrations in the file
diff --git a/tests/ADIAB_WAVE/MY_SRC/sbcwave.F90 b/tests/ADIAB_WAVE/MY_SRC/sbcwave.F90
index 070d0470..7d549532 100644
--- a/tests/ADIAB_WAVE/MY_SRC/sbcwave.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/sbcwave.F90
@@ -245,11 +245,11 @@ CONTAINS
       !                       !==  vertical Stokes Drift 3D velocity  ==!
       !
       DO_3D( 0, 1, 0, 1, 1, jpkm1 )    ! Horizontal e3*divergence
-         ze3divh(ji,jj,jk) = (  e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * usd(ji  ,jj,jk)    &
-            &                 - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * usd(ji-1,jj,jk)    &
-            &                 + e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vsd(ji,jj  ,jk)    &
-            &                 - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vsd(ji,jj-1,jk)  ) &
-            &                * r1_e1e2t(ji,jj)
+         ze3divh(ji,jj,jk) = (  ( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * usd(ji  ,jj,jk)     &   ! add () for NP repro
+            &                   - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * usd(ji-1,jj,jk) )   &
+            &                 + ( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vsd(ji,jj  ,jk)     &
+            &                   - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vsd(ji,jj-1,jk) )   &
+            &                ) * r1_e1e2t(ji,jj)
       END_3D
       !
       CALL lbc_lnk( 'sbcwave', ze3divh, 'T', 1.0_wp )
diff --git a/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90 b/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
index 12f778f5..ac53839a 100644
--- a/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
@@ -80,14 +80,14 @@ CONTAINS
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
 !      DO_2D( 1, 1, 1, 1 )
          !                       ! longitude
-         plamt(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
-         plamu(ji,jj) = zfact * (    0.5 + REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
+         plamu(ji,jj) = zfact * (    0.5 + REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude
-         pphit(ji,jj) = zfact2 * (          REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact2 * (          REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact2 * (    0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact2 * (    0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90 b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
index 5c7fac83..ed83f79c 100644
--- a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1   ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -105,10 +104,10 @@ CONTAINS
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
+      DO ji = mi0(1,nn_hls), mi1(1,nn_hls)              ! first row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
+       DO ji = mi0(jpiglo,nn_hls), mi1(jpiglo,nn_hls)   ! last  row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
       zhu(:,1) = zhu(:,2)
diff --git a/tests/BENCH/MY_SRC/usrdef_hgr.F90 b/tests/BENCH/MY_SRC/usrdef_hgr.F90
index bc6b282c..ec715f29 100644
--- a/tests/BENCH/MY_SRC/usrdef_hgr.F90
+++ b/tests/BENCH/MY_SRC/usrdef_hgr.F90
@@ -75,15 +75,15 @@ CONTAINS
       ! define unique value on each point of the inner global domain. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )   !  +/- 0.5
-         z2d(ji,jj) = 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp )
+         z2d(ji,jj) = 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp )
       END_2D
       !
       ! Position coordinates (in grid points)
       !                          ==========
       DO_2D( 0, 0, 0, 0 )
          
-         zti = REAL( mig0(ji), wp ) - 0.5_wp   ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp   ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp   ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp   ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) =   zti            * (1. + 1.0e-5 * z2d(ji,jj) )
          plamu(ji,jj) = ( zti + 0.5_wp ) * (1. + 2.0e-5 * z2d(ji,jj) )
diff --git a/tests/BENCH/MY_SRC/usrdef_istate.F90 b/tests/BENCH/MY_SRC/usrdef_istate.F90
index 69da90f1..bb35d784 100644
--- a/tests/BENCH/MY_SRC/usrdef_istate.F90
+++ b/tests/BENCH/MY_SRC/usrdef_istate.F90
@@ -65,7 +65,7 @@ CONTAINS
       ! define unique value on each point of the inner global domain. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )   !  +/- 0.05
-         z2d(ji,jj) = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         z2d(ji,jj) = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
       END_2D
       !
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
@@ -108,7 +108,7 @@ CONTAINS
       IF(lwp) WRITE(numout,*) 'usr_def_istate_ssh : BENCH configuration, analytical definition of initial ssh'
       !
       DO_2D( 0, 0, 0, 0 )                              ! sea level:  +/- 0.05 m
-         pssh(ji,jj) = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         pssh(ji,jj) = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
       END_2D
       !
       CALL lbc_lnk('usrdef_istate', pssh, 'T',  1. )   ! apply boundary conditions
diff --git a/tests/BENCH/MY_SRC/usrdef_sbc.F90 b/tests/BENCH/MY_SRC/usrdef_sbc.F90
index e9ac757b..fb690fe8 100644
--- a/tests/BENCH/MY_SRC/usrdef_sbc.F90
+++ b/tests/BENCH/MY_SRC/usrdef_sbc.F90
@@ -104,12 +104,19 @@ CONTAINS
       ! define unique value on each point. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )
-         zztmp = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         zztmp = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
          utau_ice(ji,jj) = 0.1_wp + zztmp
          vtau_ice(ji,jj) = 0.1_wp + zztmp
       END_2D
 
-      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'U', -1., vtau_ice, 'V', -1. )
+      IF( l_NFold .AND. c_NFtype == 'T' ) THEN   ! force 0 at the folding points
+         utau_ice(mi0(jpiglo/2+1,nn_hls):mi1(jpiglo/2+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+         vtau_ice(mi0(jpiglo/2+1,nn_hls):mi1(jpiglo/2+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+         utau_ice(mi0(  nn_hls+1,nn_hls):mi1(  nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+         vtau_ice(mi0(  nn_hls+1,nn_hls):mi1(  nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+      ENDIF
+
+      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. )
 #endif
       !
    END SUBROUTINE usrdef_sbc_ice_tau
@@ -125,7 +132,7 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phs    ! snow thickness
       REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phi    ! ice thickness
       !!
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsnw   ! snw distribution after wind blowing
+      REAL(wp), DIMENSION(A2D(0)) ::   zsnw   ! snw distribution after wind blowing
       !!---------------------------------------------------------------------
 #if defined key_si3
       !
@@ -150,9 +157,9 @@ CONTAINS
       emp_ice  (:,:)   = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw(:,:)
       emp_oce  (:,:)   = emp_oce(:,:) - sprecip(:,:) * (1._wp - zsnw(:,:) )
       qevap_ice(:,:,:) =   0._wp
-      qprec_ice(:,:)   =   rhos * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) !  in J/m3
-      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(:,:) * rcp
-      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) ! solid precip (only)
+      qprec_ice(:,:)   =   rhos * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) !  in J/m3
+      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(A2D(0)) * rcp
+      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) ! solid precip (only)
 
       ! total fluxes
       emp_tot (:,:) = emp_ice  + emp_oce
diff --git a/tests/BENCH/MY_SRC/usrdef_zgr.F90 b/tests/BENCH/MY_SRC/usrdef_zgr.F90
index b5474800..1f601c21 100644
--- a/tests/BENCH/MY_SRC/usrdef_zgr.F90
+++ b/tests/BENCH/MY_SRC/usrdef_zgr.F90
@@ -37,11 +37,11 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
-      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
       &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -50,16 +50,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
-      !
-      INTEGER  ::   inum   ! local logical unit
-      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
-      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -81,15 +77,16 @@ CONTAINS
       !
       CALL zgr_msk_top_bot( k_top , k_bot )                 ! masked top and bottom ocean t-level indices
       !
-      !                                                     ! z-coordinate (3D arrays) from the 1D z-coord.
-      CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
-         &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
-         &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
-         &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      IF( PRESENT( pe3t ) ) THEN                            ! z-coordinate (3D arrays) from the 1D z-coord.
+         CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
+            &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
+            &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
+            &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
-
+   
    SUBROUTINE zgr_z( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! 1D reference vertical coordinate
       !!----------------------------------------------------------------------
       !!                   ***  ROUTINE zgr_z  ***
@@ -197,15 +194,15 @@ CONTAINS
       !
       
 !!$      IF( c_NFtype == 'T' ) THEN   ! add a small island in the upper corners to avoid model instabilities...
-!!$         z2d(mi0(       nn_hls):mi1(                  nn_hls+2 ),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
-!!$         z2d(mi0(jpiglo-nn_hls):mi1(MIN(jpiglo,jpiglo-nn_hls+2)),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
-!!$         z2d(mi0(jpiglo/2     ):mi1(           jpiglo/2     +2 ),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
+!!$         z2d(mi0(       nn_hls,nn_hls):mi1(                  nn_hls+2 ,nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
+!!$         z2d(mi0(jpiglo-nn_hls,nn_hls):mi1(MIN(jpiglo,jpiglo-nn_hls+2),nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
+!!$         z2d(mi0(jpiglo/2     ,nn_hls):mi1(           jpiglo/2     +2 ,nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
 !!$      ENDIF
 !!$      !
-      IF( c_NFtype == 'F' ) THEN   ! Must mask the 2 pivot-points 
-         z2d(mi0(nn_hls+1):mi1(nn_hls+1),mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)) = 0._wp
-         z2d(mi0(jpiglo/2):mi1(jpiglo/2),mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)) = 0._wp
-      ENDIF
+!!$      IF( c_NFtype == 'F' ) THEN   ! Must mask the 2 pivot-points 
+!!$         z2d(mi0(nn_hls+1,nn_hls):mi1(nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+!!$         z2d(mi0(jpiglo/2,nn_hls):mi1(jpiglo/2,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+!!$      ENDIF
       !
       CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )           ! set surrounding land to zero (closed boundaries)
       !
diff --git a/tests/BENCH/cpp_BENCH.fcm b/tests/BENCH/cpp_BENCH.fcm
index cd3173f5..c09e39ca 100644
--- a/tests/BENCH/cpp_BENCH.fcm
+++ b/tests/BENCH/cpp_BENCH.fcm
@@ -1 +1 @@
- bld::tool::fppkeys key_si3 key_top key_qco
+ bld::tool::fppkeys key_si3 key_top key_qco key_vco_1d
diff --git a/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90 b/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
index 538d753c..c1d0b976 100644
--- a/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
+++ b/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
@@ -13,7 +13,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp             ! ocean space and time domain
    USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/CANAL/EXPREF/file_def_nemo-oce.xml b/tests/CANAL/EXPREF/file_def_nemo-oce.xml
index 689b95dd..45712ad6 100644
--- a/tests/CANAL/EXPREF/file_def_nemo-oce.xml
+++ b/tests/CANAL/EXPREF/file_def_nemo-oce.xml
@@ -20,15 +20,15 @@
 	  <field field_ref="ssrelpotvor"  />
 	  <field field_ref="saltc"  />
 	  <field field_ref="salt2c"  />
+	  <field field_ref="utau"  />
+	  <field field_ref="vtau"  />
 	</file>
 
 	<file id="file3" name_suffix="_grid_U" description="ocean U grid variables" >
-	  <field field_ref="utau"  />
 	  <field field_ref="uoce" />
 	</file>
 	
 	<file id="file4" name_suffix="_grid_V" description="ocean V grid variables" >
-	  <field field_ref="vtau"  />
 	  <field field_ref="voce" />
 	</file>
 	
diff --git a/tests/CANAL/MY_SRC/usrdef_hgr.F90 b/tests/CANAL/MY_SRC/usrdef_hgr.F90
index 8cb9d5bd..c7b469cf 100644
--- a/tests/CANAL/MY_SRC/usrdef_hgr.F90
+++ b/tests/CANAL/MY_SRC/usrdef_hgr.F90
@@ -88,8 +88,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )         
-         zti = REAL( mig0(ji)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
+         zti = REAL( mig(ji,0)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
          
          plamt(ji,jj) = rn_dx *   zti
          plamu(ji,jj) = rn_dx * ( zti + 0.5_wp ) 
diff --git a/tests/CANAL/MY_SRC/usrdef_zgr.F90 b/tests/CANAL/MY_SRC/usrdef_zgr.F90
index 1f9da256..e6438852 100644
--- a/tests/CANAL/MY_SRC/usrdef_zgr.F90
+++ b/tests/CANAL/MY_SRC/usrdef_zgr.F90
@@ -38,11 +38,11 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
-      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
       &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -51,16 +51,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
-      !
-      INTEGER  ::   inum   ! local logical unit
-      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
-      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -82,11 +78,13 @@ CONTAINS
       !
       CALL zgr_msk_top_bot( k_top , k_bot )                 ! masked top and bottom ocean t-level indices
       !
-      !                                                     ! z-coordinate (3D arrays) from the 1D z-coord.
-      CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
-         &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
-         &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
-         &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      !
+      IF( PRESENT( pe3t ) ) THEN                            ! z-coordinate (3D arrays) from the 1D z-coord.
+         CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
+            &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
+            &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
+            &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
diff --git a/tests/CANAL/cpp_CANAL.fcm b/tests/CANAL/cpp_CANAL.fcm
index 49e75303..65263b4e 100644
--- a/tests/CANAL/cpp_CANAL.fcm
+++ b/tests/CANAL/cpp_CANAL.fcm
@@ -1 +1 @@
- bld::tool::fppkeys key_xios key_qco 
+ bld::tool::fppkeys key_xios key_qco key_vco_1d
diff --git a/tests/DIA_GPU/EXPREF/file_def_nemo-oce.xml b/tests/DIA_GPU/EXPREF/file_def_nemo-oce.xml
index c043f56f..04590b55 100644
--- a/tests/DIA_GPU/EXPREF/file_def_nemo-oce.xml
+++ b/tests/DIA_GPU/EXPREF/file_def_nemo-oce.xml
@@ -34,6 +34,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	  <!-- ice and snow -->
@@ -44,7 +46,6 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="5d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
           <field field_ref="uocetr_eff"   name="uocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="u_masstr"     name="vozomatr" />
@@ -56,7 +57,6 @@
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="5d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
           <field field_ref="vocetr_eff"   name="vocetr_eff"  />
           <!-- available with diaar5 -->
 	  <field field_ref="v_masstr"     name="vomematr" />
diff --git a/tests/DIA_GPU/MY_SRC/stpctl.F90 b/tests/DIA_GPU/MY_SRC/stpctl.F90
index acf18640..cf7cd09c 100644
--- a/tests/DIA_GPU/MY_SRC/stpctl.F90
+++ b/tests/DIA_GPU/MY_SRC/stpctl.F90
@@ -232,7 +232,7 @@ CONTAINS
             iloc(1:3,3) = MINLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             iloc(1:3,4) = MAXLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/tests/DOME/MY_SRC/usrdef_hgr.F90 b/tests/DOME/MY_SRC/usrdef_hgr.F90
index e135d867..3717ef1c 100644
--- a/tests/DOME/MY_SRC/usrdef_hgr.F90
+++ b/tests/DOME/MY_SRC/usrdef_hgr.F90
@@ -93,8 +93,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji) - 1, wp )   ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj) - 1, wp )   ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0) - 1, wp )   ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0) - 1, wp )   ! start at j=0 in the global grid without halos
          
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti 
diff --git a/tests/DOME/MY_SRC/usrdef_istate.F90 b/tests/DOME/MY_SRC/usrdef_istate.F90
index e41bad22..782e164e 100644
--- a/tests/DOME/MY_SRC/usrdef_istate.F90
+++ b/tests/DOME/MY_SRC/usrdef_istate.F90
@@ -105,10 +105,10 @@ CONTAINS
 !            ztd = 15._wp*gdepw_0(ji,jj,jk+1)-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk+1)**2
 !            ztu = 15._wp*gdepw_0(ji,jj,jk  )-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk  )**2
 !            pts(ji,jj,jk,jp_tem) = (ztd - ztu)/e3t_0(ji,jj,jk) * ptmask(ji,jj,jk)
-            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-2 ) )  THEN
+            IF (Agrif_root().AND.(  mjg(jj,0) == Nj0glo-2 ) )  THEN
                pv(ji,jj,jk) = -sqrt(zdb*zh0)*exp(-zxw/zro)*(1._wp-zf) * ptmask(ji,jj,jk)
             ENDIF
-            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-1 ) )  THEN
+            IF (Agrif_root().AND.(  mjg(jj,0) == Nj0glo-1 ) )  THEN
                pts(ji,jj,jk,jp_tem) = MIN(pts(ji,jj,jk,jp_tem), 15._wp - zdb*rho0/grav/rn_a0*(1._wp-zf)) * ptmask(ji,jj,jk) 
                pts(ji,jj,jk,jp_sal) = 1._wp * ptmask(ji,jj,jk) 
             ENDIF
diff --git a/tests/DOME/MY_SRC/usrdef_zgr.F90 b/tests/DOME/MY_SRC/usrdef_zgr.F90
index 797006a7..0fb7ecd0 100644
--- a/tests/DOME/MY_SRC/usrdef_zgr.F90
+++ b/tests/DOME/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1          ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt, gphit      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
diff --git a/tests/DONUT/EXPREF/file_def_nemo-oce.xml b/tests/DONUT/EXPREF/file_def_nemo-oce.xml
index 40a640ff..0f5dc0b4 100644
--- a/tests/DONUT/EXPREF/file_def_nemo-oce.xml
+++ b/tests/DONUT/EXPREF/file_def_nemo-oce.xml
@@ -28,6 +28,8 @@
 	  <field field_ref="qt_oce"       name="qt_oce"   />
 	  <field field_ref="saltflx"      name="sfx"      />
 	  <field field_ref="taum"         name="taum"     />
+	  <field field_ref="utau"         name="tauuo"    />
+	  <field field_ref="vtau"         name="tauvo"    />
 	  <field field_ref="wspd"         name="windsp"   />
 	  <field field_ref="precip"       name="precip"   />
 	</file>
@@ -36,14 +38,12 @@
 	  <field field_ref="e3u" />
 	  <field field_ref="ssu"          name="uos"      />
 	  <field field_ref="uoce"         name="uo"       operation="instant" freq_op="1d" > @uoce_e3u / @e3u </field>
-	  <field field_ref="utau"         name="tauuo"    />
 	</file>
 	
 	<file id="file13" name_suffix="_grid_V" description="ocean V grid variables" >
 	  <field field_ref="e3v" />
 	  <field field_ref="ssv"          name="vos"      />
 	  <field field_ref="voce"         name="vo"       operation="instant" freq_op="1d" > @voce_e3v / @e3v </field>
-	  <field field_ref="vtau"         name="tauvo"    />
 	</file>
 	
       </file_group> 
diff --git a/tests/DONUT/cpp_DONUT.fcm b/tests/DONUT/cpp_DONUT.fcm
index b2a45480..647c4d5f 100644
--- a/tests/DONUT/cpp_DONUT.fcm
+++ b/tests/DONUT/cpp_DONUT.fcm
@@ -1 +1 @@
- bld::tool::fppkeys key_si3 key_qco key_xios
+ bld::tool::fppkeys key_si3 key_qco key_xios key_zco
diff --git a/tests/ICB/MY_SRC/usrdef_nam.F90 b/tests/ICB/MY_SRC/usrdef_nam.F90
index e850ce89..a9e54010 100644
--- a/tests/ICB/MY_SRC/usrdef_nam.F90
+++ b/tests/ICB/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp , njmpp            ! i- & j-indices of the local domain
    USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/ICE_ADV1D/EXPREF/file_def_nemo-ice.xml b/tests/ICE_ADV1D/EXPREF/file_def_nemo-ice.xml
index 712929ba..7c5c6d53 100644
--- a/tests/ICE_ADV1D/EXPREF/file_def_nemo-ice.xml
+++ b/tests/ICE_ADV1D/EXPREF/file_def_nemo-ice.xml
@@ -22,8 +22,6 @@
         <field field_ref="icethic"          name="sithic" />
         <field field_ref="icethic"          name="sithic_max" operation="maximum" />
         <field field_ref="icethic"          name="sithic_min" operation="minimum" />
-        <field field_ref="iceneg_pres"      name="sineg_pres" />
-        <field field_ref="iceneg_volu"      name="sineg_volu" />
         <field field_ref="fasticepres"      name="fasticepres" />
         <field field_ref="icevolu"          name="sivolu" />
         <field field_ref="iceconc"          name="siconc" />
diff --git a/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90 b/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
index 507212b6..92abf49f 100644
--- a/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
@@ -78,8 +78,8 @@ CONTAINS
       zphi0 = -REAL(Nj0glo, wp) * 0.5 * 1.e-3 * rn_dy
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) = zlam0 + rn_dx * 1.e-3 *   zti
          plamu(ji,jj) = zlam0 + rn_dx * 1.e-3 * ( zti + 0.5_wp )
diff --git a/tests/ICE_ADV1D/MY_SRC/usrdef_sbc.F90 b/tests/ICE_ADV1D/MY_SRC/usrdef_sbc.F90
index 6b65db27..f242e5a3 100644
--- a/tests/ICE_ADV1D/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_ADV1D/MY_SRC/usrdef_sbc.F90
@@ -16,17 +16,15 @@ MODULE usrdef_sbc
    USE dom_oce         ! ocean space and time domain
    USE sbc_oce         ! Surface boundary condition: ocean fields
    USE sbc_ice         ! Surface boundary condition: ice fields
+   USE sbc_phy, ONLY   : pp_cldf
    USE phycst          ! physical constants
-   USE ice, ONLY       : at_i_b, a_i_b
-   USE icethd_dh       ! for CALL ice_thd_snwblow
-   USE sbc_phy, ONLY : pp_cldf
+   USE ice, ONLY       : jpl, at_i_b, a_i_b
    !
    USE in_out_manager  ! I/O manager
    USE lib_mpp         ! distribued memory computing library
    USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
 
-   
    IMPLICIT NONE
    PRIVATE
 
@@ -34,6 +32,8 @@ MODULE usrdef_sbc
    PUBLIC   usrdef_sbc_ice_tau  ! routine called by icestp.F90 for ice dynamics
    PUBLIC   usrdef_sbc_ice_flx  ! routine called by icestp.F90 for ice thermo
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: usrdef_sbc.F90 10074 2018-08-28 16:15:49Z nicolasmartin $
@@ -105,13 +105,13 @@ CONTAINS
       !! ** Purpose :   provide the surface boundary (flux) condition over sea-ice
       !!---------------------------------------------------------------------
       INTEGER, INTENT(in) ::   kt   ! ocean time step
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phs    ! snow thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phi    ! ice thickness
+      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   phs    ! snow thickness
+      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   phi    ! ice thickness
       !!
       INTEGER  ::   jl
-      REAL(wp) ::   zfr1, zfr2                 ! local variables
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsnw   ! snw distribution after wind blowing
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztri
+      REAL(wp) ::   zfr1, zfr2                ! local variables
+      REAL(wp), DIMENSION(A2D(0)) ::   zsnw   ! snw distribution after wind blowing
+      REAL(wp), DIMENSION(A2D(0)) ::   ztri
       !!---------------------------------------------------------------------
       !
       IF( kt==nit000 .AND. lwp)   WRITE(numout,*)' usrdef_sbc_ice : ICE_ADV1D case: NO flux forcing'
@@ -135,9 +135,9 @@ CONTAINS
       emp_ice  (:,:)   = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw(:,:)
       emp_oce  (:,:)   = emp_oce(:,:) - sprecip(:,:) * (1._wp - zsnw(:,:) )
       qevap_ice(:,:,:) =   0._wp
-      qprec_ice(:,:)   =   rhos * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) !  in J/m3
-      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(:,:) * rcp
-      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) ! solid precip (only)
+      qprec_ice(:,:)   =   rhos * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) !  in J/m3
+      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(A2D(0)) * rcp
+      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) ! solid precip (only)
 
       ! total fluxes
       emp_tot (:,:) = emp_ice  + emp_oce
@@ -149,9 +149,9 @@ CONTAINS
       ztri(:,:) = 0.18 * ( 1.0 - cloud_fra(:,:) ) + 0.35 * cloud_fra(:,:)  ! surface transmission when hi>10cm
       !
       DO jl = 1, jpl
-         WHERE    ( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
-            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(:,:,jl) * 10._wp ) )
-         ELSEWHERE( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
+         WHERE    ( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
+            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(A2D(0),jl) * 10._wp ) )
+         ELSEWHERE( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
             qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ztri(:,:)
          ELSEWHERE                                                         ! zero when hs>0
             qtr_ice_top(:,:,jl) = 0._wp
diff --git a/tests/ICE_ADV1D/MY_SRC/usrdef_zgr.F90 b/tests/ICE_ADV1D/MY_SRC/usrdef_zgr.F90
index 5e2735f7..e9e25e4a 100644
--- a/tests/ICE_ADV1D/MY_SRC/usrdef_zgr.F90
+++ b/tests/ICE_ADV1D/MY_SRC/usrdef_zgr.F90
@@ -88,7 +88,7 @@ CONTAINS
       !
       !                       !==  z-coordinate  ==!   (step-like topography)
       !                                !* bottom ocean compute from the depth of grid-points
-      jpkm1 = jpk
+      !!jpkm1 = jpk
       k_bot(:,:) = 1    ! here use k_top as a land mask
       !                                !* horizontally uniform coordinate (reference z-co everywhere)
       DO jk = 1, jpk
diff --git a/tests/ICE_ADV2D/EXPREF/file_def_nemo-ice.xml b/tests/ICE_ADV2D/EXPREF/file_def_nemo-ice.xml
index 1213d194..7b1acad6 100644
--- a/tests/ICE_ADV2D/EXPREF/file_def_nemo-ice.xml
+++ b/tests/ICE_ADV2D/EXPREF/file_def_nemo-ice.xml
@@ -22,8 +22,6 @@
         <field field_ref="icethic"          name="sithic" />
         <field field_ref="icethic"          name="sithic_max" operation="maximum" />
         <field field_ref="icethic"          name="sithic_min" operation="minimum" />
-        <field field_ref="iceneg_pres"      name="sineg_pres" />
-        <field field_ref="iceneg_volu"      name="sineg_volu" />
         <field field_ref="fasticepres"      name="fasticepres" />
         <field field_ref="icevolu"          name="sivolu" />
         <field field_ref="iceconc"          name="siconc" />
diff --git a/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90 b/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
index b2b645b8..0c554f80 100644
--- a/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
@@ -90,8 +90,8 @@ CONTAINS
 #endif         
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) = zlam0 + rn_dx * 1.e-3 *   zti
          plamu(ji,jj) = zlam0 + rn_dx * 1.e-3 * ( zti + 0.5_wp )
@@ -110,19 +110,19 @@ CONTAINS
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO jj = 1, jpj
 !!            DO ji = 1, jpi
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!            END DO
 !!         END DO
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO jj = 1, jpj
 !!               DO ji = 1, jpi
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!               END DO
 !!            END DO
diff --git a/tests/ICE_ADV2D/MY_SRC/usrdef_sbc.F90 b/tests/ICE_ADV2D/MY_SRC/usrdef_sbc.F90
index 32df85c4..508e0eb4 100644
--- a/tests/ICE_ADV2D/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_ADV2D/MY_SRC/usrdef_sbc.F90
@@ -16,9 +16,9 @@ MODULE usrdef_sbc
    USE dom_oce         ! ocean space and time domain
    USE sbc_oce         ! Surface boundary condition: ocean fields
    USE sbc_ice         ! Surface boundary condition: ice fields
+   USE sbc_phy, ONLY   : pp_cldf
    USE phycst          ! physical constants
    USE ice, ONLY       : jpl, at_i_b, a_i_b
-   USE icethd_dh       ! for CALL ice_thd_snwblow
    !
    USE in_out_manager  ! I/O manager
    USE lib_mpp         ! distribued memory computing library
@@ -32,6 +32,8 @@ MODULE usrdef_sbc
    PUBLIC   usrdef_sbc_ice_tau  ! routine called by icestp.F90 for ice dynamics
    PUBLIC   usrdef_sbc_ice_flx  ! routine called by icestp.F90 for ice thermo
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: usrdef_sbc.F90 10074 2018-08-28 16:15:49Z nicolasmartin $
@@ -107,9 +109,9 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   phi    ! ice thickness
       !!
       INTEGER  ::   jl
-      REAL(wp) ::   zfr1, zfr2                 ! local variables
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsnw   ! snw distribution after wind blowing
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztri
+      REAL(wp) ::   zfr1, zfr2                ! local variables
+      REAL(wp), DIMENSION(A2D(0)) ::   zsnw   ! snw distribution after wind blowing
+      REAL(wp), DIMENSION(A2D(0)) ::   ztri
       !!---------------------------------------------------------------------
       !
       IF( kt==nit000 .AND. lwp)   WRITE(numout,*)' usrdef_sbc_ice : ICE_ADV2D case: NO flux forcing'
@@ -133,9 +135,9 @@ CONTAINS
       emp_ice  (:,:)   = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw(:,:)
       emp_oce  (:,:)   = emp_oce(:,:) - sprecip(:,:) * (1._wp - zsnw(:,:) )
       qevap_ice(:,:,:) =   0._wp
-      qprec_ice(:,:)   =   rhos * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) !  in J/m3
-      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(:,:) * rcp
-      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) ! solid precip (only)
+      qprec_ice(:,:)   =   rhos * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) !  in J/m3
+      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(A2D(0)) * rcp
+      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) ! solid precip (only)
 
       ! total fluxes
       emp_tot (:,:) = emp_ice  + emp_oce
@@ -147,9 +149,9 @@ CONTAINS
       ztri(:,:) = 0.18 * ( 1.0 - cloud_fra(:,:) ) + 0.35 * cloud_fra(:,:)  ! surface transmission when hi>10cm
       !
       DO jl = 1, jpl
-         WHERE    ( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
-            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(:,:,jl) * 10._wp ) )
-         ELSEWHERE( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
+         WHERE    ( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
+            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(A2D(0),jl) * 10._wp ) )
+         ELSEWHERE( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
             qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ztri(:,:)
          ELSEWHERE                                                         ! zero when hs>0
             qtr_ice_top(:,:,jl) = 0._wp
diff --git a/tests/ICE_ADV2D/MY_SRC/usrdef_zgr.F90 b/tests/ICE_ADV2D/MY_SRC/usrdef_zgr.F90
index 38db0bd1..a4ce102a 100644
--- a/tests/ICE_ADV2D/MY_SRC/usrdef_zgr.F90
+++ b/tests/ICE_ADV2D/MY_SRC/usrdef_zgr.F90
@@ -88,7 +88,7 @@ CONTAINS
       !
       !                       !==  z-coordinate  ==!   (step-like topography)
       !                                !* bottom ocean compute from the depth of grid-points
-      jpkm1 = jpk
+      !!clem jpkm1 = jpk
       k_bot(:,:) = 1    ! here use k_top as a land mask
       !                                !* horizontally uniform coordinate (reference z-co everywhere)
       DO jk = 1, jpk
diff --git a/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90 b/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
index 9ac18267..c087ceeb 100644
--- a/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
@@ -96,8 +96,8 @@ CONTAINS
       ENDIF
 #endif
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji)-1, wp )  ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-1, wp )  ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0)-1, wp )  ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-1, wp )  ! start at j=0 in the global grid without halos
 
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti
@@ -116,19 +116,19 @@ CONTAINS
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO jj = 1, jpj
 !!            DO ji = 1, jpi
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!            END DO
 !!         END DO
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO jj = 1, jpj
 !!               DO ji = 1, jpi
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!               END DO
 !!            END DO
diff --git a/tests/ICE_AGRIF/MY_SRC/usrdef_sbc.F90 b/tests/ICE_AGRIF/MY_SRC/usrdef_sbc.F90
index 6e7c527b..5ba2758f 100644
--- a/tests/ICE_AGRIF/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_AGRIF/MY_SRC/usrdef_sbc.F90
@@ -18,7 +18,7 @@ MODULE usrdef_sbc
    USE sbc_ice         ! Surface boundary condition: ice fields
    USE phycst          ! physical constants
    USE ice, ONLY       : at_i_b, a_i_b
-   USE icethd_dh       ! for CALL ice_thd_snwblow
+!!   USE icethd_dh       ! for CALL ice_thd_snwblow
    USE sbc_phy, ONLY : pp_cldf
    !
    USE in_out_manager  ! I/O manager
@@ -33,6 +33,8 @@ MODULE usrdef_sbc
    PUBLIC   usrdef_sbc_ice_tau  ! routine called by icestp.F90 for ice dynamics
    PUBLIC   usrdef_sbc_ice_flx  ! routine called by icestp.F90 for ice thermo
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: usrdef_sbc.F90 14273 2021-01-06 10:57:45Z smasson $
@@ -109,8 +111,8 @@ CONTAINS
       !!
       INTEGER  ::   jl
       REAL(wp) ::   zfr1, zfr2                 ! local variables
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsnw   ! snw distribution after wind blowing
-      REAL(wp), DIMENSION(jpi,jpj) ::   ztri
+      REAL(wp), DIMENSION(A2D(0)) ::   zsnw   ! snw distribution after wind blowing
+      REAL(wp), DIMENSION(A2D(0)) ::   ztri
       !!---------------------------------------------------------------------
       !
       IF( kt==nit000 .AND. lwp)   WRITE(numout,*)' usrdef_sbc_ice : ICE_AGRIF case: NO flux forcing'
@@ -134,9 +136,9 @@ CONTAINS
       emp_ice  (:,:)   = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw(:,:)
       emp_oce  (:,:)   = emp_oce(:,:) - sprecip(:,:) * (1._wp - zsnw(:,:) )
       qevap_ice(:,:,:) =   0._wp
-      qprec_ice(:,:)   =   rhos * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) !  in J/m3
-      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(:,:) * rcp
-      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) ! solid precip (only)
+      qprec_ice(:,:)   =   rhos * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) !  in J/m3
+      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(A2D(0)) * rcp
+      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) ! solid precip (only)
 
       ! total fluxes
       emp_tot (:,:) = emp_ice  + emp_oce
@@ -148,11 +150,11 @@ CONTAINS
       ztri(:,:) = 0.18 * ( 1.0 - cloud_fra(:,:) ) + 0.35 * cloud_fra(:,:)  ! surface transmission when hi>10cm
       !
       DO jl = 1, jpl
-         WHERE    ( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
-            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(:,:,jl) * 10._wp ) )
-         ELSEWHERE( phs(:,:,jl) <= 0._wp .AND. phi(:,:,jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
+         WHERE    ( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) <  0.1_wp )     ! linear decrease from hi=0 to 10cm  
+            qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ( ztri(:,:) + ( 1._wp - ztri(:,:) ) * ( 1._wp - phi(A2D(0),jl) * 10._wp ) )
+         ELSEWHERE( phs(A2D(0),jl) <= 0._wp .AND. phi(A2D(0),jl) >= 0.1_wp )     ! constant (ztri) when hi>10cm
             qtr_ice_top(:,:,jl) = qsr_ice(:,:,jl) * ztri(:,:)
-         ELSEWHERE                                                         ! zero when hs>0
+         ELSEWHERE                                                               ! zero when hs>0
             qtr_ice_top(:,:,jl) = 0._wp
          END WHERE
       ENDDO
diff --git a/tests/ICE_AGRIF/MY_SRC/usrdef_zgr.F90 b/tests/ICE_AGRIF/MY_SRC/usrdef_zgr.F90
index 1ae48cb5..770cc8b8 100644
--- a/tests/ICE_AGRIF/MY_SRC/usrdef_zgr.F90
+++ b/tests/ICE_AGRIF/MY_SRC/usrdef_zgr.F90
@@ -13,6 +13,7 @@ MODULE usrdef_zgr
    !!   usr_def_zgr   : user defined vertical coordinate system (required)
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
+   USE dom_oce        ! lk_vco_.
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -32,11 +33,11 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
+      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
       &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
-      &                    pe3t  , pe3u  , pe3v , pe3f ,               &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw,                      &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -45,12 +46,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !
       INTEGER  ::   jk, k_dz  ! dummy indices
       !!----------------------------------------------------------------------
@@ -90,18 +91,19 @@ CONTAINS
       !                                !* bottom ocean compute from the depth of grid-points
       jpkm1 = jpk-1
       k_bot(:,:) = 1    ! here use k_top as a land mask
-      !                                !* horizontally uniform coordinate (reference z-co everywhere)
-      DO jk = 1, jpk
-         pdept(:,:,jk) = pdept_1d(jk)
-         pdepw(:,:,jk) = pdepw_1d(jk)
-         pe3t (:,:,jk) = pe3t_1d (jk)
-         pe3u (:,:,jk) = pe3t_1d (jk)
-         pe3v (:,:,jk) = pe3t_1d (jk)
-         pe3f (:,:,jk) = pe3t_1d (jk)
-         pe3w (:,:,jk) = pe3w_1d (jk)
-         pe3uw(:,:,jk) = pe3w_1d (jk)
-         pe3vw(:,:,jk) = pe3w_1d (jk)
-      END DO
+      IF( lk_vco_3d ) THEN          !* horizontally uniform coordinate (reference z-co everywhere)
+         DO jk = 1, jpk
+            pdept(:,:,jk) = pdept_1d(jk)
+            pdepw(:,:,jk) = pdepw_1d(jk)
+            pe3t (:,:,jk) = pe3t_1d (jk)
+            pe3u (:,:,jk) = pe3t_1d (jk)
+            pe3v (:,:,jk) = pe3t_1d (jk)
+            pe3f (:,:,jk) = pe3t_1d (jk)
+            pe3w (:,:,jk) = pe3w_1d (jk)
+            pe3uw(:,:,jk) = pe3w_1d (jk)
+            pe3vw(:,:,jk) = pe3w_1d (jk)
+         END DO
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
diff --git a/tests/ICE_AGRIF/cpp_ICE_AGRIF.fcm b/tests/ICE_AGRIF/cpp_ICE_AGRIF.fcm
index 8262d471..30ded882 100644
--- a/tests/ICE_AGRIF/cpp_ICE_AGRIF.fcm
+++ b/tests/ICE_AGRIF/cpp_ICE_AGRIF.fcm
@@ -1 +1 @@
-bld::tool::fppkeys key_agrif key_si3 key_linssh key_xios
+bld::tool::fppkeys key_agrif key_si3 key_linssh key_vco_1d key_xios
diff --git a/tests/ICE_RHEO/EXPREF/file_def_nemo-oce.xml b/tests/ICE_RHEO/EXPREF/file_def_nemo-oce.xml
index 0dbbd214..b307458f 100644
--- a/tests/ICE_RHEO/EXPREF/file_def_nemo-oce.xml
+++ b/tests/ICE_RHEO/EXPREF/file_def_nemo-oce.xml
@@ -13,14 +13,17 @@
 
       <file_group id="1ts" output_freq="1ts"  output_level="10" enabled=".TRUE."/> <!-- 1 time step files -->
       <file_group id="1h" output_freq="1h"  output_level="10" enabled=".TRUE."> <!-- 1h files -->
+        <file id="file1" name_suffix="_grid_T" description="ocean T grid variables" >
+          <field field_ref="utau"         name="sozotaux"  />
+          <field field_ref="vtau"         name="sometauy"  />
+        </file>
+
         <file id="file2" name_suffix="_grid_U" description="ocean U grid variables" >
           <field field_ref="uoce"         name="vozocrtx"  />
-          <field field_ref="utau"         name="sozotaux"  />
         </file>
 
         <file id="file3" name_suffix="_grid_V" description="ocean V grid variables" >
           <field field_ref="voce"         name="vomecrty"  />
-          <field field_ref="vtau"         name="sometauy"  />
         </file>
       </file_group>
 
diff --git a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90 b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
index 2c5e4348..6db0b111 100644
--- a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
+++ b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
@@ -573,7 +573,7 @@ CONTAINS
                      &            )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
 
@@ -630,7 +630,7 @@ CONTAINS
                      &            )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
 
@@ -689,7 +689,7 @@ CONTAINS
                      &            )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -745,7 +745,7 @@ CONTAINS
                      &            )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -1048,7 +1048,7 @@ CONTAINS
          zresm = 0._wp
          DO_2D( 0, 0, 0, 0 )
             ! cut of the boundary of the box (forced velocities)
-            IF (mjg0(jj)>30 .AND. mjg0(jj)<=970 .AND. mig0(ji)>30 .AND. mig0(ji)<=970) THEN
+            IF (mjg(jj,0)>30 .AND. mjg(jj,0)<=970 .AND. mig(ji,0)>30 .AND. mig(ji,0)<=970) THEN
                zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
                   &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
             ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90 b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
index e2df97c7..8f691d6c 100644
--- a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
+++ b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
@@ -525,7 +525,7 @@ CONTAINS
                      &            )  * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -581,7 +581,7 @@ CONTAINS
                      &           )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -639,7 +639,7 @@ CONTAINS
                      &           )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -695,7 +695,7 @@ CONTAINS
                      &           )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -978,7 +978,7 @@ CONTAINS
          zresm = 0._wp
          DO_2D( 0, 0, 0, 0 )
             ! cut of the boundary of the box (forced velocities)
-            IF (mjg0(jj)>30 .AND. mjg0(jj)<=970 .AND. mig0(ji)>30 .AND. mig0(ji)<=970) THEN
+            IF (mjg(jj,0)>30 .AND. mjg(jj,0)<=970 .AND. mig(ji,0)>30 .AND. mig(ji,0)<=970) THEN
                zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
                   &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
             ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
index e585820e..679c2153 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
@@ -98,17 +98,17 @@ CONTAINS
 !! ==> EITHER 1) variable scale factors
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO_2D( 1, 1, 1, 1 )
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!         END_2D
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO_2D( 1, 1, 1, 1 )
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!            END_2D
 !!         ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
index 0f92fbee..df8898d9 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
@@ -13,7 +13,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp , njmpp , Agrif_Root           ! i- & j-indices of the local domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
index 8d5fe4eb..0b4f020a 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
@@ -71,8 +71,8 @@ CONTAINS
 
          !ij0 = 1   ;   ij1 = 25                       ! set boundary condition
          !ii0 = 975   ;   ii1 = 1000
-         !DO jj = mj0(ij0), mj1(ij1)
-         !   DO ji = mi0(ii0), mi1(ii1)
+         !DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+         !   DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
          !      utau(ji,jj) = -utau_ice(ji,jj) 
          !      vtau(ji,jj) = -vtau_ice(ji,jj)
          !   END DO
@@ -108,7 +108,7 @@ CONTAINS
 
       REAL(wp) ::   zwndi_f , zwndj_f, zwnorm_f       ! relative wind module and components at F-point
       REAL(wp) ::   zwndi_t , zwndj_t                 ! relative wind components at T-point
-      REAL(wp), DIMENSION(jpi,jpj) ::   windu, windv  ! wind components (idealised forcing)
+      REAL(wp), DIMENSION(A2D(0)) ::   windu, windv   ! wind components (idealised forcing)
       REAL(wp), PARAMETER ::   r_vfac = 1._wp         ! relative velocity (make 0 for absolute velocity) 
       REAL(wp), PARAMETER ::   Rwind = -0.8_wp        ! ratio of wind components
       REAL(wp), PARAMETER ::   Umax = 15._wp          ! maximum wind speed (m/s)
@@ -122,40 +122,26 @@ CONTAINS
 
       DO_2D( 0, 0, 0, 0 )
          ! wind spins up over 6 hours, factor 1000 to balance the units
-         windu(ji,jj) = Umax/sqrt(d*1000)*(d-2*mig(ji)*res)/((d-2*mig(ji)*res)**2+(d-2*mjg(jj)*res)**2*Rwind**2)**(1/4)*min(kt*30./21600,1.)
-         windv(ji,jj) = Umax/sqrt(d*1000)*(d-2*mjg(jj)*res)/((d-2*mig(ji)*res)**2+(d-2*mjg(jj)*res)**2*Rwind**2)**(1/4)*Rwind*min(kt*30./21600,1.)
+         windu(ji,jj) = Umax/SQRT(d*1000)*(d-2*mig(ji,nn_hls)*res) /   &
+            &           ((d-2*mig(ji,nn_hls)*res)**2+(d-2*mjg(jj,nn_hls)*res)**2*Rwind**2)**(1/4)*MIN(kt*30./21600,1.)
+         windv(ji,jj) = Umax/SQRT(d*1000)*(d-2*mjg(jj,nn_hls)*res) /   &
+            &           ((d-2*mig(ji,nn_hls)*res)**2+(d-2*mjg(jj,nn_hls)*res)**2*Rwind**2)**(1/4)*Rwind*MIN(kt*30./21600,1.)
       END_2D
-      CALL lbc_lnk( 'usrdef_sbc', windu, 'U', -1., windv, 'V', -1. )
-
-      wndm_ice(:,:) = 0._wp      !!gm brutal....
 
       ! ------------------------------------------------------------ !
-      !    Wind module relative to the moving ice ( U10m - U_ice )   !
+      !    Wind module and stress relative to the moving ice ( U10m - U_ice )   !
       ! ------------------------------------------------------------ !
-      ! C-grid ice dynamics :   U & V-points (same as ocean)
       DO_2D( 0, 0, 0, 0 )
-         zwndi_t = (  windu(ji,jj) - r_vfac * 0.5 * ( u_ice(ji-1,jj  ) + u_ice(ji,jj) )  )
+         zwndi_t = (  windu(ji,jj) - r_vfac * 0.5 * ( u_ice(ji-1,jj) + u_ice(ji,jj) )  )
          zwndj_t = (  windv(ji,jj) - r_vfac * 0.5 * ( v_ice(ji,jj-1) + v_ice(ji,jj) )  )
+         !
          wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1)
+         !
+         utau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndi_t
+         vtau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndj_t
       END_2D
-      CALL lbc_lnk( 'usrdef_sbc', wndm_ice, 'T',  1. )
-
-      !!gm brutal....
-      utau_ice  (:,:) = 0._wp
-      vtau_ice  (:,:) = 0._wp
-      !!gm end
+      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. )
 
-      ! ------------------------------------------------------------ !
-      !    Wind stress relative to the moving ice ( U10m - U_ice )   !
-      ! ------------------------------------------------------------ !
-      ! C-grid ice dynamics :   U & V-points (same as ocean)
-      DO_2D( 0, 0, 0, 0 )
-         utau_ice(ji,jj) = 0.5 * zrhoa * Cd_atm * ( wndm_ice(ji+1,jj  ) + wndm_ice(ji,jj) )            &
-            &          * ( 0.5 * (windu(ji+1,jj) + windu(ji,jj) ) - r_vfac * u_ice(ji,jj) )
-         vtau_ice(ji,jj) = 0.5 * zrhoa * Cd_atm * ( wndm_ice(ji,jj+1  ) + wndm_ice(ji,jj) )            &
-            &          * ( 0.5 * (windv(ji,jj+1) + windv(ji,jj) ) - r_vfac * v_ice(ji,jj) )
-      END_2D
-      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'U', -1., vtau_ice, 'V', -1. )
       !
    END SUBROUTINE usrdef_sbc_ice_tau
 
@@ -170,7 +156,7 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   phi    ! ice thickness
       !!
       REAL(wp) ::   zfr1, zfr2                 ! local variables
-      REAL(wp), DIMENSION(jpi,jpj) ::   zsnw   ! snw distribution after wind blowing
+      REAL(wp), DIMENSION(A2D(0)) ::   zsnw   ! snw distribution after wind blowing
       !!---------------------------------------------------------------------
       !
       IF( kt==nit000 .AND. lwp)   WRITE(numout,*)' usrdef_sbc_ice : ICE_RHEO case: NO flux forcing'
@@ -194,9 +180,9 @@ CONTAINS
       emp_ice  (:,:)   = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw(:,:)
       emp_oce  (:,:)   = emp_oce(:,:) - sprecip(:,:) * (1._wp - zsnw(:,:) )
       qevap_ice(:,:,:) =   0._wp
-      qprec_ice(:,:)   =   rhos * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) !  in J/m3
-      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(:,:) * rcp
-      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(:,:) * rcpi - rLfus ) * tmask(:,:,1) ! solid precip (only)
+      qprec_ice(:,:)   =   rhos * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) !  in J/m3
+      qemp_oce (:,:)   = - emp_oce(:,:) * sst_m(A2D(0)) * rcp
+      qemp_ice (:,:)   =   sprecip(:,:) * zsnw * ( sst_m(A2D(0)) * rcpi - rLfus ) * smask0(:,:) ! solid precip (only)
 
       ! total fluxes
       emp_tot (:,:) = emp_ice  + emp_oce
@@ -207,11 +193,11 @@ CONTAINS
       zfr1 = ( 0.18 * ( 1.0 - pp_cldf ) + 0.35 * pp_cldf )            ! transmission when hi>10cm
       zfr2 = ( 0.82 * ( 1.0 - pp_cldf ) + 0.65 * pp_cldf )            ! zfr2 such that zfr1 + zfr2 to equal 1
       !
-      WHERE    ( phs(:,:,:) <= 0._wp .AND. phi(:,:,:) <  0.1_wp )       ! linear decrease from hi=0 to 10cm  
-         qtr_ice_top(:,:,:) = qsr_ice(:,:,:) * ( zfr1 + zfr2 * ( 1._wp - phi(:,:,:) * 10._wp ) )
-      ELSEWHERE( phs(:,:,:) <= 0._wp .AND. phi(:,:,:) >= 0.1_wp )       ! constant (zfr1) when hi>10cm
+      WHERE    ( phs(A2D(0),:) <= 0._wp .AND. phi(A2D(0),:) <  0.1_wp )       ! linear decrease from hi=0 to 10cm  
+         qtr_ice_top(:,:,:) = qsr_ice(:,:,:) * ( zfr1 + zfr2 * ( 1._wp - phi(A2D(0),:) * 10._wp ) )
+      ELSEWHERE( phs(A2D(0),:) <= 0._wp .AND. phi(A2D(0),:) >= 0.1_wp )       ! constant (zfr1) when hi>10cm
          qtr_ice_top(:,:,:) = qsr_ice(:,:,:) * zfr1
-      ELSEWHERE                                                         ! zero when hs>0
+      ELSEWHERE                                                               ! zero when hs>0
          qtr_ice_top(:,:,:) = 0._wp 
       END WHERE
           
diff --git a/tests/ISOMIP+/EXPREF/namelist_cfg b/tests/ISOMIP+/EXPREF/namelist_cfg
index 0b8ae4c9..4f520bed 100644
--- a/tests/ISOMIP+/EXPREF/namelist_cfg
+++ b/tests/ISOMIP+/EXPREF/namelist_cfg
@@ -310,14 +310,19 @@ rn_Dt = 720.
 !-----------------------------------------------------------------------
 &nameos        !   ocean Equation Of Seawater                           (default: NO selection)
 !-----------------------------------------------------------------------
-   ln_leos     = .true.          !  = Use L-EOS (linear Eq.)
-                                 !
+   ln_seos     = .true.          !  = Use S-EOS (simplified Eq.)
    !                     ! S-EOS coefficients (ln_seos=T):
    !                             !  rd(T,S,Z)*rho0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS
-   !                     ! L-EOS coefficients (ln_seos=T):
-   !                             !  rd(T,S,Z)*rho0 = rho0*(-a0*dT+b0*dS)
+   !                             !    dT = T-rn_T0 ; dS = S-rn_S0
+   rn_T0       = -1.             !  reference temperature
+   rn_S0       = 34.2            !  reference salinity
    rn_a0       =  3.7330e-5      !  thermal expension coefficient
    rn_b0       =  7.8430e-4      !  saline  expension coefficient
+   rn_lambda1  =  0.             !  cabbeling coeff in T^2  (=0 for linear eos)
+   rn_lambda2  =  0.             !  cabbeling coeff in S^2  (=0 for linear eos)
+   rn_mu1      =  0.             !  thermobaric coeff. in T (=0 for linear eos)
+   rn_mu2      =  0.             !  thermobaric coeff. in S (=0 for linear eos)
+   rn_nu       =  0.             !  cabbeling coeff in T*S  (=0 for linear eos)
 /
 !-----------------------------------------------------------------------
 &namtra_adv    !   advection scheme for tracer                          (default: NO selection)
diff --git a/tests/ISOMIP+/MY_SRC/dtatsd.F90 b/tests/ISOMIP+/MY_SRC/dtatsd.F90
index cdee4ac5..27e99a3d 100644
--- a/tests/ISOMIP+/MY_SRC/dtatsd.F90
+++ b/tests/ISOMIP+/MY_SRC/dtatsd.F90
@@ -33,11 +33,12 @@ MODULE dtatsd
    LOGICAL , PUBLIC ::   ln_tsd_init   !: T & S data flag
    LOGICAL , PUBLIC ::   ln_tsd_dmp    !: internal damping toward input data flag
 
+   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsd   ! structure of input SST (file informations, fields read)
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsdini ! structure of input SST (file informations, fields read)
-   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsddmp ! structure of input SST (file informations, fields read)
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: dtatsd.F90 10213 2018-10-23 14:40:09Z aumont $ 
@@ -121,16 +122,16 @@ CONTAINS
 
       IF( ln_tsd_dmp ) THEN
          !
-         ALLOCATE( sf_tsddmp(jpts), STAT=ierr0 )
+         ALLOCATE( sf_tsd(jpts), STAT=ierr0 )
          IF( ierr0 > 0 ) THEN
-            CALL ctl_stop( 'dta_tsd_init: unable to allocate sf_tsddmp structure' )   ;   RETURN
+            CALL ctl_stop( 'dta_tsd_init: unable to allocate sf_tsd structure' )   ;   RETURN
          ENDIF
          !
          ! dmp file
-                                 ALLOCATE( sf_tsddmp(jp_tem)%fnow(jpi,jpj,jpk)   , STAT=ierr0 )
-         IF( sn_dmpt%ln_tint )   ALLOCATE( sf_tsddmp(jp_tem)%fdta(jpi,jpj,jpk,2) , STAT=ierr1 )
-                                 ALLOCATE( sf_tsddmp(jp_sal)%fnow(jpi,jpj,jpk)   , STAT=ierr2 )
-         IF( sn_dmps%ln_tint )   ALLOCATE( sf_tsddmp(jp_sal)%fdta(jpi,jpj,jpk,2) , STAT=ierr3 )
+                                 ALLOCATE( sf_tsd(jp_tem)%fnow(jpi,jpj,jpk)   , STAT=ierr0 )
+         IF( sn_dmpt%ln_tint )   ALLOCATE( sf_tsd(jp_tem)%fdta(jpi,jpj,jpk,2) , STAT=ierr1 )
+                                 ALLOCATE( sf_tsd(jp_sal)%fnow(jpi,jpj,jpk)   , STAT=ierr2 )
+         IF( sn_dmps%ln_tint )   ALLOCATE( sf_tsd(jp_sal)%fdta(jpi,jpj,jpk,2) , STAT=ierr3 )
          !
          IF( ierr0 + ierr1 + ierr2 + ierr3 > 0 ) THEN
             CALL ctl_stop( 'dta_tsd : unable to allocate T & S dmp data arrays' )   ;   RETURN
@@ -138,14 +139,14 @@ CONTAINS
          !
          !                         ! fill sf_tsd with sn_tem & sn_sal and control print
          slf_i(jp_tem) = sn_dmpt   ;   slf_i(jp_sal) = sn_dmps
-         CALL fld_fill( sf_tsddmp, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity dmp data', 'namtsd', no_print )
+         CALL fld_fill( sf_tsd, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity dmp data', 'namtsd', no_print )
          !
       ENDIF
       !
    END SUBROUTINE dta_tsd_init
 
 
-   SUBROUTINE dta_tsd( kt, cddta, ptsd )
+   SUBROUTINE dta_tsd( kt, ptsd, cddta )
       !!----------------------------------------------------------------------
       !!                   ***  ROUTINE dta_tsd  ***
       !!
@@ -159,47 +160,45 @@ CONTAINS
       !!
       !! ** Action  :   ptsd   T-S data on medl mesh and interpolated at time-step kt
       !!----------------------------------------------------------------------
-      INTEGER                          , INTENT(in   ) ::   kt     ! ocean time-step
-      CHARACTER(LEN=3)                 , INTENT(in   ) ::   cddta  ! dmp or ini
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
+      INTEGER                                  , INTENT(in   ) ::   kt      ! ocean time-step
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd    ! T & S data
+      CHARACTER(len=*), OPTIONAL               , INTENT(in   ) ::   cddta   ! force the initialization when tradmp is used
       !
       INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
       INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1   ! local integers
       REAL(wp)::   zl, zi                             ! local scalars
+      LOGICAL ::   ll_tsdini
       REAL(wp), DIMENSION(jpk) ::  ztp, zsp   ! 1D workspace
       !!----------------------------------------------------------------------
       !
+      ll_tsdini = .FALSE.
+      IF( PRESENT(cddta) )   ll_tsdini = .TRUE.
+
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                                         ! Do only for the full domain
          IF( ln_tile ) CALL dom_tile_stop( ldhold=.TRUE. )             ! Use full domain
 
-         SELECT CASE(cddta)
-         CASE('ini')
+         IF( ll_tsdini ) THEN
             CALL fld_read( kt, 1, sf_tsdini ) !==   read T & S data at kt time step   ==!
-         CASE('dmp')
-            CALL fld_read( kt, 1, sf_tsddmp ) !==   read T & S data at kt time step   ==!
-         CASE DEFAULT
-            CALL ctl_stop('STOP', 'dta_tsd: cddta case unknown')
-         END SELECT
+         ELSE
+            CALL fld_read( kt, 1, sf_tsd    ) !==   read T & S data at kt time step   ==!
+         ENDIF
 
          IF( ln_tile ) CALL dom_tile_start( ldhold=.TRUE. )            ! Revert to tile domain
       ENDIF
       !
-      SELECT CASE(cddta)
-      CASE('ini')
+      IF( ll_tsdini ) THEN
          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
             ptsd(ji,jj,jk,jp_tem) = sf_tsdini(jp_tem)%fnow(ji,jj,jk)    ! NO mask
             ptsd(ji,jj,jk,jp_sal) = sf_tsdini(jp_sal)%fnow(ji,jj,jk)
          END_3D
-      CASE('dmp')
+      ELSE
          DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
-            ptsd(ji,jj,jk,jp_tem) = sf_tsddmp(jp_tem)%fnow(ji,jj,jk)    ! NO mask
-            ptsd(ji,jj,jk,jp_sal) = sf_tsddmp(jp_sal)%fnow(ji,jj,jk)
+            ptsd(ji,jj,jk,jp_tem) = sf_tsd(jp_tem)%fnow(ji,jj,jk)       ! NO mask
+            ptsd(ji,jj,jk,jp_sal) = sf_tsd(jp_sal)%fnow(ji,jj,jk)
          END_3D
-      CASE DEFAULT
-         CALL ctl_stop('STOP', 'dta_tsd: cddta case unknown')
-      END SELECT
+      ENDIF
       !
-      IF( ln_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
+      IF( l_sco ) THEN                   !==   s- or mixed s-zps-coordinate   ==!
          !
          IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
             IF( kt == nit000 .AND. lwp )THEN
@@ -218,7 +217,7 @@ CONTAINS
                   ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem)
                   zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal)
                ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1
-                  DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1)
+                  DO jkk = 1, jpkm1                                  ! when  gdept_jkk < zl < gdept_jkk+1
                      IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN
                         zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk))
                         ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi
@@ -242,27 +241,9 @@ CONTAINS
             ptsd(ji,jj,jk,jp_sal) = ptsd(ji,jj,jk,jp_sal) * tmask(ji,jj,jk)
          END_3D
          !
-         IF( ln_zps ) THEN                      ! zps-coordinate (partial steps) interpolation at the last ocean level
-            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-               ik = mbkt(ji,jj)
-               IF( ik > 1 ) THEN
-                  zl = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) )
-                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik-1,jp_tem)
-                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal)
-               ENDIF
-               ik = mikt(ji,jj)
-               IF( ik > 1 ) THEN
-                  zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) )
-                  ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem)
-                  ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal)
-               END IF
-            END_2D
-         ENDIF
-         !
       ENDIF
       !
-      SELECT CASE(cddta)
-      CASE('ini') 
+      IF( ll_tsdini ) THEN
          !                        !==   deallocate T & S structure   ==! 
          !                                              (data used only for initialisation)
          IF(lwp) WRITE(numout,*) 'dta_tsd: deallocte T & S arrays as they are only use to initialize the run'
@@ -272,7 +253,7 @@ CONTAINS
          IF( sf_tsdini(jp_sal)%ln_tint )   DEALLOCATE( sf_tsdini(jp_sal)%fdta )
                                         DEALLOCATE( sf_tsdini              )     ! the structure itself
          !
-      END SELECT
+      ENDIF
       !
    END SUBROUTINE dta_tsd
 
diff --git a/tests/ISOMIP+/MY_SRC/eosbn2.F90 b/tests/ISOMIP+/MY_SRC/eosbn2.F90
deleted file mode 100644
index d2da8cfd..00000000
--- a/tests/ISOMIP+/MY_SRC/eosbn2.F90
+++ /dev/null
@@ -1,2078 +0,0 @@
-MODULE eosbn2
-   !!==============================================================================
-   !!                       ***  MODULE  eosbn2  ***
-   !! Equation Of Seawater : in situ density - Brunt-Vaisala frequency
-   !!==============================================================================
-   !! History :  OPA  ! 1989-03  (O. Marti)  Original code
-   !!            6.0  ! 1994-07  (G. Madec, M. Imbard)  add bn2
-   !!            6.0  ! 1994-08  (G. Madec)  Add Jackett & McDougall eos
-   !!            7.0  ! 1996-01  (G. Madec)  statement function for e3
-   !!            8.1  ! 1997-07  (G. Madec)  density instead of volumic mass
-   !!             -   ! 1999-02  (G. Madec, N. Grima) semi-implicit pressure gradient
-   !!            8.2  ! 2001-09  (M. Ben Jelloul)  bugfix on linear eos
-   !!   NEMO     1.0  ! 2002-10  (G. Madec)  add eos_init
-   !!             -   ! 2002-11  (G. Madec, A. Bozec)  partial step, eos_insitu_2d
-   !!             -   ! 2003-08  (G. Madec)  F90, free form
-   !!            3.0  ! 2006-08  (G. Madec)  add tfreez function (now eos_fzp function)
-   !!            3.3  ! 2010-05  (C. Ethe, G. Madec)  merge TRC-TRA
-   !!             -   ! 2010-10  (G. Nurser, G. Madec)  add alpha/beta used in ldfslp
-   !!            3.7  ! 2012-03  (F. Roquet, G. Madec)  add primitive of alpha and beta used in PE computation
-   !!             -   ! 2012-05  (F. Roquet)  add Vallis and original JM95 equation of state
-   !!             -   ! 2013-04  (F. Roquet, G. Madec)  add eos_rab, change bn2 computation and reorganize the module
-   !!             -   ! 2014-09  (F. Roquet)  add TEOS-10, S-EOS, and modify EOS-80
-   !!             -   ! 2015-06  (P.A. Bouttier) eos_fzp functions changed to subroutines for AGRIF
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   eos           : generic interface of the equation of state
-   !!   eos_insitu    : Compute the in situ density
-   !!   eos_insitu_pot: Compute the insitu and surface referenced potential volumic mass
-   !!   eos_insitu_2d : Compute the in situ density for 2d fields
-   !!   bn2           : compute the Brunt-Vaisala frequency
-   !!   eos_pt_from_ct: compute the potential temperature from the Conservative Temperature
-   !!   eos_rab       : generic interface of in situ thermal/haline expansion ratio
-   !!   eos_rab_3d    : compute in situ thermal/haline expansion ratio
-   !!   eos_rab_2d    : compute in situ thermal/haline expansion ratio for 2d fields
-   !!   eos_fzp_2d    : freezing temperature for 2d fields
-   !!   eos_fzp_0d    : freezing temperature for scalar
-   !!   eos_init      : set eos parameters (namelist)
-   !!----------------------------------------------------------------------
-   USE dom_oce        ! ocean space and time domain
-   USE domutl, ONLY : is_tile
-   USE phycst         ! physical constants
-   USE stopar         ! Stochastic T/S fluctuations
-   USE stopts         ! Stochastic T/S fluctuations
-   !
-   USE in_out_manager ! I/O manager
-   USE lib_mpp        ! MPP library
-   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
-   USE prtctl         ! Print control
-   USE lbclnk         ! ocean lateral boundary conditions
-   USE timing         ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   !                  !! * Interface
-   INTERFACE eos
-      MODULE PROCEDURE eos_insitu_New, eos_insitu, eos_insitu_pot, eos_insitu_2d, eos_insitu_pot_2d
-   END INTERFACE
-   !
-   INTERFACE eos_rab
-      MODULE PROCEDURE rab_3d, rab_2d, rab_0d
-   END INTERFACE
-   !
-   INTERFACE eos_fzp
-      MODULE PROCEDURE eos_fzp_2d, eos_fzp_0d
-   END INTERFACE
-   !
-   PUBLIC   eos            ! called by step, istate, tranpc and zpsgrd modules
-   PUBLIC   bn2            ! called by step module
-   PUBLIC   eos_rab        ! called by ldfslp, zdfddm, trabbl
-   PUBLIC   eos_pt_from_ct ! called by sbcssm
-   PUBLIC   eos_fzp        ! called by traadv_cen2 and sbcice_... modules
-   PUBLIC   eos_pen        ! used for pe diagnostics in trdpen module
-   PUBLIC   eos_init       ! called by istate module
-
-   !                               !!** Namelist nameos **
-   LOGICAL , PUBLIC ::   ln_TEOS10
-   LOGICAL , PUBLIC ::   ln_EOS80
-   LOGICAL , PUBLIC ::   ln_SEOS
-   LOGICAL , PUBLIC ::   ln_LEOS   ! determine if linear eos is used 
-
-   ! Parameters
-   LOGICAL , PUBLIC    ::   l_useCT         ! =T in ln_TEOS10=T (i.e. use eos_pt_from_ct to compute sst_m), =F otherwise
-   INTEGER , PUBLIC    ::   neos            ! Identifier for equation of state used
-
-   INTEGER , PARAMETER ::   np_teos10 = -1  ! parameter for using TEOS10
-   INTEGER , PARAMETER ::   np_eos80  =  0  ! parameter for using EOS80
-   INTEGER , PARAMETER ::   np_seos   = 1   ! parameter for using Simplified Equation of state
-   INTEGER , PARAMETER ::   np_leos   =  2  ! parameter for using linear equation of state (ISOMIP+)
-
-   !                               !!!  simplified eos coefficients (default value: Vallis 2006)
-   REAL(wp), PUBLIC ::   rn_a0      = 1.6550e-1_wp     ! thermal expansion coeff.
-   REAL(wp), PUBLIC ::   rn_b0      = 7.6554e-1_wp     ! saline  expansion coeff.
-   REAL(wp) ::   rn_lambda1 = 5.9520e-2_wp     ! cabbeling coeff. in T^2
-   REAL(wp) ::   rn_lambda2 = 5.4914e-4_wp     ! cabbeling coeff. in S^2
-   REAL(wp) ::   rn_mu1     = 1.4970e-4_wp     ! thermobaric coeff. in T
-   REAL(wp) ::   rn_mu2     = 1.1090e-5_wp     ! thermobaric coeff. in S
-   REAL(wp) ::   rn_nu      = 2.4341e-3_wp     ! cabbeling coeff. in theta*salt
-
-   ! TEOS10/EOS80 parameters
-   REAL(wp) ::   r1_S0, r1_T0, r1_Z0, rdeltaS
-
-   ! EOS parameters
-   REAL(wp) ::   EOS000 , EOS100 , EOS200 , EOS300 , EOS400 , EOS500 , EOS600
-   REAL(wp) ::   EOS010 , EOS110 , EOS210 , EOS310 , EOS410 , EOS510
-   REAL(wp) ::   EOS020 , EOS120 , EOS220 , EOS320 , EOS420
-   REAL(wp) ::   EOS030 , EOS130 , EOS230 , EOS330
-   REAL(wp) ::   EOS040 , EOS140 , EOS240
-   REAL(wp) ::   EOS050 , EOS150
-   REAL(wp) ::   EOS060
-   REAL(wp) ::   EOS001 , EOS101 , EOS201 , EOS301 , EOS401
-   REAL(wp) ::   EOS011 , EOS111 , EOS211 , EOS311
-   REAL(wp) ::   EOS021 , EOS121 , EOS221
-   REAL(wp) ::   EOS031 , EOS131
-   REAL(wp) ::   EOS041
-   REAL(wp) ::   EOS002 , EOS102 , EOS202
-   REAL(wp) ::   EOS012 , EOS112
-   REAL(wp) ::   EOS022
-   REAL(wp) ::   EOS003 , EOS103
-   REAL(wp) ::   EOS013
-
-   ! ALPHA parameters
-   REAL(wp) ::   ALP000 , ALP100 , ALP200 , ALP300 , ALP400 , ALP500
-   REAL(wp) ::   ALP010 , ALP110 , ALP210 , ALP310 , ALP410
-   REAL(wp) ::   ALP020 , ALP120 , ALP220 , ALP320
-   REAL(wp) ::   ALP030 , ALP130 , ALP230
-   REAL(wp) ::   ALP040 , ALP140
-   REAL(wp) ::   ALP050
-   REAL(wp) ::   ALP001 , ALP101 , ALP201 , ALP301
-   REAL(wp) ::   ALP011 , ALP111 , ALP211
-   REAL(wp) ::   ALP021 , ALP121
-   REAL(wp) ::   ALP031
-   REAL(wp) ::   ALP002 , ALP102
-   REAL(wp) ::   ALP012
-   REAL(wp) ::   ALP003
-
-   ! BETA parameters
-   REAL(wp) ::   BET000 , BET100 , BET200 , BET300 , BET400 , BET500
-   REAL(wp) ::   BET010 , BET110 , BET210 , BET310 , BET410
-   REAL(wp) ::   BET020 , BET120 , BET220 , BET320
-   REAL(wp) ::   BET030 , BET130 , BET230
-   REAL(wp) ::   BET040 , BET140
-   REAL(wp) ::   BET050
-   REAL(wp) ::   BET001 , BET101 , BET201 , BET301
-   REAL(wp) ::   BET011 , BET111 , BET211
-   REAL(wp) ::   BET021 , BET121
-   REAL(wp) ::   BET031
-   REAL(wp) ::   BET002 , BET102
-   REAL(wp) ::   BET012
-   REAL(wp) ::   BET003
-
-   ! PEN parameters
-   REAL(wp) ::   PEN000 , PEN100 , PEN200 , PEN300 , PEN400
-   REAL(wp) ::   PEN010 , PEN110 , PEN210 , PEN310
-   REAL(wp) ::   PEN020 , PEN120 , PEN220
-   REAL(wp) ::   PEN030 , PEN130
-   REAL(wp) ::   PEN040
-   REAL(wp) ::   PEN001 , PEN101 , PEN201
-   REAL(wp) ::   PEN011 , PEN111
-   REAL(wp) ::   PEN021
-   REAL(wp) ::   PEN002 , PEN102
-   REAL(wp) ::   PEN012
-
-   ! ALPHA_PEN parameters
-   REAL(wp) ::   APE000 , APE100 , APE200 , APE300
-   REAL(wp) ::   APE010 , APE110 , APE210
-   REAL(wp) ::   APE020 , APE120
-   REAL(wp) ::   APE030
-   REAL(wp) ::   APE001 , APE101
-   REAL(wp) ::   APE011
-   REAL(wp) ::   APE002
-
-   ! BETA_PEN parameters
-   REAL(wp) ::   BPE000 , BPE100 , BPE200 , BPE300
-   REAL(wp) ::   BPE010 , BPE110 , BPE210
-   REAL(wp) ::   BPE020 , BPE120
-   REAL(wp) ::   BPE030
-   REAL(wp) ::   BPE001 , BPE101
-   REAL(wp) ::   BPE011
-   REAL(wp) ::   BPE002
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: eosbn2.F90 10425 2018-12-19 21:54:16Z smasson $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE eos_insitu_New( pts, Knn, prd )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE eos_insitu_New  ***
-      !!
-      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) from
-      !!       potential temperature and salinity using an equation of state
-      !!       selected in the nameos namelist
-      !!
-      !! ** Method  :   prd(t,s,z) = ( rho(t,s,z) - rho0 ) / rho0
-      !!         with   prd    in situ density anomaly      no units
-      !!                t      TEOS10: CT or EOS80: PT      Celsius
-      !!                s      TEOS10: SA or EOS80: SP      TEOS10: g/kg or EOS80: psu
-      !!                z      depth                        meters
-      !!                rho    in situ density              kg/m^3
-      !!                rho0   reference density            kg/m^3
-      !!
-      !!     ln_teos10 : polynomial TEOS-10 equation of state is used for rho(t,s,z).
-      !!         Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celsius, sa=35.5 g/kg
-      !!
-      !!     ln_eos80 : polynomial EOS-80 equation of state is used for rho(t,s,z).
-      !!         Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celsius, sp=35.5 psu
-      !!
-      !!     ln_seos : simplified equation of state
-      !!              prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / rho0
-      !!              linear case function of T only: rn_alpha<>0, other coefficients = 0
-      !!              linear eos function of T and S: rn_alpha and rn_beta<>0, other coefficients=0
-      !!              Vallis like equation: use default values of coefficients
-      !!
-      !!     ln_leos : linear ISOMIP equation of state
-      !!              prd(t,s,z) = ( -a0*(T-T0) + b0*(S-S0) ) / rho0
-      !!              setup for ISOMIP linear eos
-      !!
-      !! ** Action  :   compute prd , the in situ density (no units)
-      !!
-      !! References :   Roquet et al, Ocean Modelling, in preparation (2014)
-      !!                Vallis, Atmospheric and Oceanic Fluid Dynamics, 2006
-      !!                TEOS-10 Manual, 2010
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:,:,:), INTENT(in   ) ::   pts   ! T-S
-      INTEGER                     , INTENT(in   ) ::   Knn   ! time-level
-      REAL(wp), DIMENSION(:,:,:  ), INTENT(  out) ::   prd   ! in situ density
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos-insitu')
-      !
-      SELECT CASE( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_3D(nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            !
-            zh  = gdept(ji,jj,jk,Knn) * r1_Z0                                 ! depth
-            zt  = pts (ji,jj,jk,jp_tem,Knn) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal,Knn) + rdeltaS ) * r1_S0 )   ! square root salinity
-            ztm = tmask(ji,jj,jk)                                             ! tmask
-            !
-            zn3 = EOS013*zt   &
-               &   + EOS103*zs+EOS003
-               !
-            zn2 = (EOS022*zt   &
-               &   + EOS112*zs+EOS012)*zt   &
-               &   + (EOS202*zs+EOS102)*zs+EOS002
-               !
-            zn1 = (((EOS041*zt   &
-               &   + EOS131*zs+EOS031)*zt   &
-               &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
-               &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
-               &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
-               !
-            zn0 = (((((EOS060*zt   &
-               &   + EOS150*zs+EOS050)*zt   &
-               &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-               &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-               &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-               &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-               &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            prd(ji,jj,jk) = (  zn * r1_rho0 - 1._wp  ) * ztm  ! density anomaly (masked)
-            !
-         END_3D
-         !
-      CASE( np_seos )                !==  simplified EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem,Knn) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal,Knn) - 35._wp
-            zh  = gdept(ji,jj,jk,Knn)
-            ztm = tmask(ji,jj,jk)
-            !
-            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt + rn_mu1*zh ) * zt   &
-               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs - rn_mu2*zh ) * zs   &
-               &  - rn_nu * zt * zs
-               !
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm                ! density anomaly (masked)
-         END_3D
-         !
-      CASE( np_leos )                !==  linear ISOMIP EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem,Knn) - (-1._wp)
-            zs  = pts  (ji,jj,jk,jp_sal,Knn) - 34.2_wp
-            zh  = gdept(ji,jj,jk,       Knn)
-            ztm = tmask(ji,jj,jk)
-            !
-            zn =  rho0 * ( - rn_a0 * zt + rn_b0 * zs )
-            !                                 
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm                ! density anomaly (masked)
-         END_3D
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-insitu  : ', kdim=jpk )
-      !
-      IF( ln_timing )   CALL timing_stop('eos-insitu')
-      !
-   END SUBROUTINE eos_insitu_New
-
-
-   SUBROUTINE eos_insitu( pts, prd, pdep )
-      !!
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                      ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd   ! in situ density            [-]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m]
-      !!
-      CALL eos_insitu_t( pts, is_tile(pts), prd, is_tile(prd), pdep, is_tile(pdep) )
-   END SUBROUTINE eos_insitu
-
-   SUBROUTINE eos_insitu_t( pts, ktts, prd, ktrd, pdep, ktdep )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE eos_insitu  ***
-      !!
-      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) from
-      !!       potential temperature and salinity using an equation of state
-      !!       selected in the nameos namelist
-      !!
-      !! ** Method  :   prd(t,s,z) = ( rho(t,s,z) - rho0 ) / rho0
-      !!         with   prd    in situ density anomaly      no units
-      !!                t      TEOS10: CT or EOS80: PT      Celsius
-      !!                s      TEOS10: SA or EOS80: SP      TEOS10: g/kg or EOS80: psu
-      !!                z      depth                        meters
-      !!                rho    in situ density              kg/m^3
-      !!                rho0   reference density            kg/m^3
-      !!
-      !!     ln_teos10 : polynomial TEOS-10 equation of state is used for rho(t,s,z).
-      !!         Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celsius, sa=35.5 g/kg
-      !!
-      !!     ln_eos80 : polynomial EOS-80 equation of state is used for rho(t,s,z).
-      !!         Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celsius, sp=35.5 psu
-      !!
-      !!     ln_seos : simplified equation of state
-      !!              prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / rho0
-      !!              linear case function of T only: rn_alpha<>0, other coefficients = 0
-      !!              linear eos function of T and S: rn_alpha and rn_beta<>0, other coefficients=0
-      !!              Vallis like equation: use default values of coefficients
-      !!
-      !!     ln_leos : linear ISOMIP equation of state
-      !!              prd(t,s,z) = ( -a0*(T-T0) + b0*(S-S0) ) / rho0
-      !!              setup for ISOMIP linear eos
-      !!
-      !! ** Action  :   compute prd , the in situ density (no units)
-      !!
-      !! References :   Roquet et al, Ocean Modelling, in preparation (2014)
-      !!                Vallis, Atmospheric and Oceanic Fluid Dynamics, 2006
-      !!                TEOS-10 Manual, 2010
-      !!----------------------------------------------------------------------
-      INTEGER                                 , INTENT(in   ) ::   ktts, ktrd, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                                  ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrd) ,JPK     ), INTENT(  out) ::   prd   ! in situ density            [-]
-      REAL(wp), DIMENSION(A2D_T(ktdep),JPK     ), INTENT(in   ) ::   pdep  ! depth                      [m]
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos-insitu')
-      !
-      SELECT CASE( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            !
-            zh  = pdep(ji,jj,jk) * r1_Z0                                  ! depth
-            zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            ztm = tmask(ji,jj,jk)                                         ! tmask
-            !
-            zn3 = EOS013*zt   &
-               &   + EOS103*zs+EOS003
-               !
-            zn2 = (EOS022*zt   &
-               &   + EOS112*zs+EOS012)*zt   &
-               &   + (EOS202*zs+EOS102)*zs+EOS002
-               !
-            zn1 = (((EOS041*zt   &
-               &   + EOS131*zs+EOS031)*zt   &
-               &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
-               &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
-               &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
-               !
-            zn0 = (((((EOS060*zt   &
-               &   + EOS150*zs+EOS050)*zt   &
-               &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-               &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-               &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-               &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-               &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            prd(ji,jj,jk) = (  zn * r1_rho0 - 1._wp  ) * ztm  ! density anomaly (masked)
-            !
-         END_3D
-         !
-      CASE( np_seos )                !==  simplified EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal) - 35._wp
-            zh  = pdep (ji,jj,jk)
-            ztm = tmask(ji,jj,jk)
-            !
-            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt + rn_mu1*zh ) * zt   &
-               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs - rn_mu2*zh ) * zs   &
-               &  - rn_nu * zt * zs
-               !
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm                ! density anomaly (masked)
-         END_3D
-         !
-      CASE( np_leos )                !==  linear ISOMIP EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - (-1._wp)
-            zs  = pts  (ji,jj,jk,jp_sal) - 34.2_wp
-            zh  = pdep (ji,jj,jk)
-            ztm = tmask(ji,jj,jk)
-            !
-            zn =  rho0 * ( - rn_a0 * zt + rn_b0 * zs )
-            !                                 
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm                ! density anomaly (masked)
-         END_3D
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-insitu  : ', kdim=jpk )
-      !
-      IF( ln_timing )   CALL timing_stop('eos-insitu')
-      !
-   END SUBROUTINE eos_insitu_t
-
-
-   SUBROUTINE eos_insitu_pot( pts, prd, prhop, pdep )
-      !!
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
-      !                                                       ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd    ! in situ density            [-]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep   ! depth                      [m]
-      !!
-      CALL eos_insitu_pot_t( pts, is_tile(pts), prd, is_tile(prd), prhop, is_tile(prhop), pdep, is_tile(pdep) )
-   END SUBROUTINE eos_insitu_pot
-
-
-   SUBROUTINE eos_insitu_pot_t( pts, ktts, prd, ktrd, prhop, ktrhop, pdep, ktdep )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE eos_insitu_pot  ***
-      !!
-      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) and the
-      !!      potential volumic mass (Kg/m3) from potential temperature and
-      !!      salinity fields using an equation of state selected in the
-      !!     namelist.
-      !!
-      !! ** Action  : - prd  , the in situ density (no units)
-      !!              - prhop, the potential volumic mass (Kg/m3)
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER                                  , INTENT(in   ) ::   ktts, ktrd, ktrhop, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts)  ,JPK,JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
-      !                                                                    ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrd)  ,JPK     ), INTENT(  out) ::   prd    ! in situ density            [-]
-      REAL(wp), DIMENSION(A2D_T(ktrhop),JPK     ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
-      REAL(wp), DIMENSION(A2D_T(ktdep) ,JPK     ), INTENT(in   ) ::   pdep   ! depth                      [m]
-      !
-      INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
-      INTEGER  ::   jdof
-      REAL(wp) ::   zt , zh , zstemp, zs , ztm   ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3      !   -      -
-      REAL(wp), DIMENSION(:), ALLOCATABLE :: zn0_sto, zn_sto, zsign    ! local vectors
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos-pot')
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         ! Stochastic equation of state
-         IF ( ln_sto_eos ) THEN
-            ALLOCATE(zn0_sto(1:2*nn_sto_eos))
-            ALLOCATE(zn_sto(1:2*nn_sto_eos))
-            ALLOCATE(zsign(1:2*nn_sto_eos))
-            DO jsmp = 1, 2*nn_sto_eos, 2
-              zsign(jsmp)   = 1._wp
-              zsign(jsmp+1) = -1._wp
-            END DO
-            !
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-               !
-               ! compute density (2*nn_sto_eos) times:
-               ! (1) for t+dt, s+ds (with the random TS fluctutation computed in sto_pts)
-               ! (2) for t-dt, s-ds (with the opposite fluctuation)
-               DO jsmp = 1, nn_sto_eos*2
-                  jdof   = (jsmp + 1) / 2
-                  zh     = pdep(ji,jj,jk) * r1_Z0                                  ! depth
-                  zt     = (pts (ji,jj,jk,jp_tem) + pts_ran(ji,jj,jk,jp_tem,jdof) * zsign(jsmp)) * r1_T0    ! temperature
-                  zstemp = pts  (ji,jj,jk,jp_sal) + pts_ran(ji,jj,jk,jp_sal,jdof) * zsign(jsmp)
-                  zs     = SQRT( ABS( zstemp + rdeltaS ) * r1_S0 )   ! square root salinity
-                  ztm    = tmask(ji,jj,jk)                                         ! tmask
-                  !
-                  zn3 = EOS013*zt   &
-                     &   + EOS103*zs+EOS003
-                     !
-                  zn2 = (EOS022*zt   &
-                     &   + EOS112*zs+EOS012)*zt   &
-                     &   + (EOS202*zs+EOS102)*zs+EOS002
-                     !
-                  zn1 = (((EOS041*zt   &
-                     &   + EOS131*zs+EOS031)*zt   &
-                     &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
-                     &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
-                     &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
-                     !
-                  zn0_sto(jsmp) = (((((EOS060*zt   &
-                     &   + EOS150*zs+EOS050)*zt   &
-                     &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-                     &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-                     &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-                     &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-                     &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-                     !
-                  zn_sto(jsmp)  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0_sto(jsmp)
-               END DO
-               !
-               ! compute stochastic density as the mean of the (2*nn_sto_eos) densities
-               prhop(ji,jj,jk) = 0._wp ; prd(ji,jj,jk) = 0._wp
-               DO jsmp = 1, nn_sto_eos*2
-                  prhop(ji,jj,jk) = prhop(ji,jj,jk) + zn0_sto(jsmp)                      ! potential density referenced at the surface
-                  !
-                  prd(ji,jj,jk) = prd(ji,jj,jk) + (  zn_sto(jsmp) * r1_rho0 - 1._wp  )   ! density anomaly (masked)
-               END DO
-               prhop(ji,jj,jk) = 0.5_wp * prhop(ji,jj,jk) * ztm / nn_sto_eos
-               prd  (ji,jj,jk) = 0.5_wp * prd  (ji,jj,jk) * ztm / nn_sto_eos
-            END_3D
-            DEALLOCATE(zn0_sto,zn_sto,zsign)
-         ! Non-stochastic equation of state
-         ELSE
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-               !
-               zh  = pdep(ji,jj,jk) * r1_Z0                                  ! depth
-               zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
-               zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-               ztm = tmask(ji,jj,jk)                                         ! tmask
-               !
-               zn3 = EOS013*zt   &
-                  &   + EOS103*zs+EOS003
-                  !
-               zn2 = (EOS022*zt   &
-                  &   + EOS112*zs+EOS012)*zt   &
-                  &   + (EOS202*zs+EOS102)*zs+EOS002
-                  !
-               zn1 = (((EOS041*zt   &
-                  &   + EOS131*zs+EOS031)*zt   &
-                  &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
-                  &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
-                  &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
-                  !
-               zn0 = (((((EOS060*zt   &
-                  &   + EOS150*zs+EOS050)*zt   &
-                  &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-                  &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-                  &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-                  &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-                  &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-                  !
-               zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-               !
-               prhop(ji,jj,jk) = zn0 * ztm                           ! potential density referenced at the surface
-               !
-               prd(ji,jj,jk) = (  zn * r1_rho0 - 1._wp  ) * ztm      ! density anomaly (masked)
-            END_3D
-         ENDIF
-
-      CASE( np_seos )                !==  simplified EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jk,jp_sal) - 35._wp
-            zh  = pdep (ji,jj,jk)
-            ztm = tmask(ji,jj,jk)
-            !                                                     ! potential density referenced at the surface
-            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt ) * zt   &
-               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs ) * zs   &
-               &  - rn_nu * zt * zs
-            prhop(ji,jj,jk) = ( rho0 + zn ) * ztm
-            !                                                     ! density anomaly (masked)
-            zn = zn - ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zh
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm
-            !
-         END_3D
-         !
-      CASE( np_leos )                !==  linear ISOMIP EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts  (ji,jj,jk,jp_tem) - (-1._wp)
-            zs  = pts  (ji,jj,jk,jp_sal) - 34.2_wp
-            zh  = pdep (ji,jj,jk)
-            ztm = tmask(ji,jj,jk)
-            !                                                     ! potential density referenced at the surface
-            zn =  rho0 * ( - rn_a0 * zt + rn_b0 * zs )
-            prhop(ji,jj,jk) = ( rho0 + zn ) * ztm
-            !                                                     ! density anomaly (masked)
-            prd(ji,jj,jk) = zn * r1_rho0 * ztm
-            !
-         END_3D
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', &
-         &                                  tab3d_2=prhop, clinfo2=' pot : ', kdim=jpk )
-      !
-      IF( ln_timing )   CALL timing_stop('eos-pot')
-      !
-   END SUBROUTINE eos_insitu_pot_t
-
-
-   SUBROUTINE eos_insitu_2d( pts, pdep, prd )
-      !!
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                    ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m]
-      REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   prd   ! in situ density
-      !!
-      CALL eos_insitu_2d_t( pts, is_tile(pts), pdep, is_tile(pdep), prd, is_tile(prd) )
-   END SUBROUTINE eos_insitu_2d
-
-
-   SUBROUTINE eos_insitu_2d_t( pts, ktts, pdep, ktdep, prd, ktrd )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE eos_insitu_2d  ***
-      !!
-      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) from
-      !!      potential temperature and salinity using an equation of state
-      !!      selected in the nameos namelist. * 2D field case
-      !!
-      !! ** Action  : - prd , the in situ density (no units) (unmasked)
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER                            , INTENT(in   ) ::   ktts, ktdep, ktrd
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
-      !                                                             ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktdep)    ), INTENT(in   ) ::   pdep  ! depth                      [m]
-      REAL(wp), DIMENSION(A2D_T(ktrd)     ), INTENT(  out) ::   prd   ! in situ density
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs              ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos2d')
-      !
-      prd(:,:) = 0._wp
-      !
-      SELECT CASE( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zh  = pdep(ji,jj) * r1_Z0                                  ! depth
-            zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            !
-            zn3 = EOS013*zt   &
-               &   + EOS103*zs+EOS003
-               !
-            zn2 = (EOS022*zt   &
-               &   + EOS112*zs+EOS012)*zt   &
-               &   + (EOS202*zs+EOS102)*zs+EOS002
-               !
-            zn1 = (((EOS041*zt   &
-               &   + EOS131*zs+EOS031)*zt   &
-               &   + (EOS221*zs+EOS121)*zs+EOS021)*zt   &
-               &   + ((EOS311*zs+EOS211)*zs+EOS111)*zs+EOS011)*zt   &
-               &   + (((EOS401*zs+EOS301)*zs+EOS201)*zs+EOS101)*zs+EOS001
-               !
-            zn0 = (((((EOS060*zt   &
-               &   + EOS150*zs+EOS050)*zt   &
-               &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-               &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-               &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-               &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-               &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            prd(ji,jj) = zn * r1_rho0 - 1._wp               ! unmasked in situ density anomaly
-            !
-         END_2D
-         !
-      CASE( np_seos )                !==  simplified EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt    = pts  (ji,jj,jp_tem)  - 10._wp
-            zs    = pts  (ji,jj,jp_sal)  - 35._wp
-            zh    = pdep (ji,jj)                         ! depth at the partial step level
-            !
-            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt + rn_mu1*zh ) * zt   &
-               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs - rn_mu2*zh ) * zs   &
-               &  - rn_nu * zt * zs
-               !
-            prd(ji,jj) = zn * r1_rho0               ! unmasked in situ density anomaly
-            !
-         END_2D
-         !
-      CASE( np_leos )                !==  ISOMIP EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt    = pts  (ji,jj,jp_tem)  - (-1._wp)
-            zs    = pts  (ji,jj,jp_sal)  - 34.2_wp
-            zh    = pdep (ji,jj)                         ! depth at the partial step level
-            !
-            zn =  rho0 * ( - rn_a0 * zt + rn_b0 * zs )
-            !
-            prd(ji,jj) = zn * r1_rho0               ! unmasked in situ density anomaly
-            !
-         END_2D
-         !
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prd, clinfo1=' eos2d: ' )
-      !
-      IF( ln_timing )   CALL timing_stop('eos2d')
-      !
-   END SUBROUTINE eos_insitu_2d_t
-
-
-   SUBROUTINE eos_insitu_pot_2d( pts, prhop )
-      !!
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
-      !                                                     ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
-      !!
-      CALL eos_insitu_pot_2d_t( pts, is_tile(pts), prhop, is_tile(prhop) )
-   END SUBROUTINE eos_insitu_pot_2d
-
-
-   SUBROUTINE eos_insitu_pot_2d_t( pts, ktts, prhop, ktrhop )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE eos_insitu_pot  ***
-      !!
-      !! ** Purpose :   Compute the in situ density (ratio rho/rho0) and the
-      !!      potential volumic mass (Kg/m3) from potential temperature and
-      !!      salinity fields using an equation of state selected in the
-      !!     namelist.
-      !!
-      !! ** Action  :
-      !!              - prhop, the potential volumic mass (Kg/m3)
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   ktts, ktrhop
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
-      !                                                                ! 2 : salinity               [psu]
-      REAL(wp), DIMENSION(A2D_T(ktrhop)   ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
-      !
-      INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
-      INTEGER  ::   jdof
-      REAL(wp) ::   zt , zh , zstemp, zs , ztm   ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3      !   -      -
-      REAL(wp), DIMENSION(:), ALLOCATABLE :: zn0_sto, zn_sto, zsign    ! local vectors
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos-pot')
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            ztm = tmask(ji,jj,1)                                         ! tmask
-            !
-            zn0 = (((((EOS060*zt   &
-               &   + EOS150*zs+EOS050)*zt   &
-               &   + (EOS240*zs+EOS140)*zs+EOS040)*zt   &
-               &   + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt   &
-               &   + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt   &
-               &   + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt   &
-               &   + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000
-               !
-            !
-            prhop(ji,jj) = zn0 * ztm                           ! potential density referenced at the surface
-            !
-         END_2D
-
-      CASE( np_seos )                !==  simplified EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zt  = pts  (ji,jj,jp_tem) - 10._wp
-            zs  = pts  (ji,jj,jp_sal) - 35._wp
-            ztm = tmask(ji,jj,1)
-            !                                                     ! potential density referenced at the surface
-            zn =  - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt ) * zt   &
-               &  + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs ) * zs   &
-               &  - rn_nu * zt * zs
-            prhop(ji,jj) = ( rho0 + zn ) * ztm
-            !
-         END_2D
-         !
-      CASE( np_leos )                !==  ISOMIP EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt    = pts  (ji,jj,jp_tem)  - (-1._wp)
-            zs    = pts  (ji,jj,jp_sal)  - 34.2_wp
-            !zh    = pdep (ji,jj)                         ! depth at the partial step level
-            !
-            zn =  rho0 * ( - rn_a0 * zt + rn_b0 * zs )
-            !
-            prhop(ji,jj) = zn * r1_rho0               ! unmasked in situ density anomaly
-            !
-         END_2D
-         !
-      END SELECT
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prhop, clinfo1=' pot: ', kdim=1 )
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prhop, clinfo1=' eos-pot: ' )
-      !
-      IF( ln_timing )   CALL timing_stop('eos-pot')
-      !
-   END SUBROUTINE eos_insitu_pot_2d_t
-
-
-   SUBROUTINE rab_3d( pts, pab, Kmm )
-      !!
-      INTEGER                     , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! pot. temperature & salinity
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
-      !!
-      CALL rab_3d_t( pts, is_tile(pts), pab, is_tile(pab), Kmm )
-   END SUBROUTINE rab_3d
-
-
-   SUBROUTINE rab_3d_t( pts, ktts, pab, ktab, Kmm )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE rab_3d  ***
-      !!
-      !! ** Purpose :   Calculates thermal/haline expansion ratio at T-points
-      !!
-      !! ** Method  :   calculates alpha / beta at T-points
-      !!
-      !! ** Action  : - pab     : thermal/haline expansion ratio at T-points
-      !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   ) ::   Kmm   ! time level index
-      INTEGER                                , INTENT(in   ) ::   ktts, ktab
-      REAL(wp), DIMENSION(A2D_T(ktts),JPK,JPTS), INTENT(in   ) ::   pts   ! pot. temperature & salinity
-      REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('rab_3d')
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            !
-            zh  = gdept(ji,jj,jk,Kmm) * r1_Z0                                ! depth
-            zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            ztm = tmask(ji,jj,jk)                                         ! tmask
-            !
-            ! alpha
-            zn3 = ALP003
-            !
-            zn2 = ALP012*zt + ALP102*zs+ALP002
-            !
-            zn1 = ((ALP031*zt   &
-               &   + ALP121*zs+ALP021)*zt   &
-               &   + (ALP211*zs+ALP111)*zs+ALP011)*zt   &
-               &   + ((ALP301*zs+ALP201)*zs+ALP101)*zs+ALP001
-               !
-            zn0 = ((((ALP050*zt   &
-               &   + ALP140*zs+ALP040)*zt   &
-               &   + (ALP230*zs+ALP130)*zs+ALP030)*zt   &
-               &   + ((ALP320*zs+ALP220)*zs+ALP120)*zs+ALP020)*zt   &
-               &   + (((ALP410*zs+ALP310)*zs+ALP210)*zs+ALP110)*zs+ALP010)*zt   &
-               &   + ((((ALP500*zs+ALP400)*zs+ALP300)*zs+ALP200)*zs+ALP100)*zs+ALP000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            pab(ji,jj,jk,jp_tem) = zn * r1_rho0 * ztm
-            !
-            ! beta
-            zn3 = BET003
-            !
-            zn2 = BET012*zt + BET102*zs+BET002
-            !
-            zn1 = ((BET031*zt   &
-               &   + BET121*zs+BET021)*zt   &
-               &   + (BET211*zs+BET111)*zs+BET011)*zt   &
-               &   + ((BET301*zs+BET201)*zs+BET101)*zs+BET001
-               !
-            zn0 = ((((BET050*zt   &
-               &   + BET140*zs+BET040)*zt   &
-               &   + (BET230*zs+BET130)*zs+BET030)*zt   &
-               &   + ((BET320*zs+BET220)*zs+BET120)*zs+BET020)*zt   &
-               &   + (((BET410*zs+BET310)*zs+BET210)*zs+BET110)*zs+BET010)*zt   &
-               &   + ((((BET500*zs+BET400)*zs+BET300)*zs+BET200)*zs+BET100)*zs+BET000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            pab(ji,jj,jk,jp_sal) = zn / zs * r1_rho0 * ztm
-            !
-         END_3D
-         !
-      CASE( np_seos )                  !==  simplified EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts (ji,jj,jk,jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-            zs  = pts (ji,jj,jk,jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
-            zh  = gdept(ji,jj,jk,Kmm)                ! depth in meters at t-point
-            ztm = tmask(ji,jj,jk)                  ! land/sea bottom mask = surf. mask
-            !
-            zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs
-            pab(ji,jj,jk,jp_tem) = zn * r1_rho0 * ztm   ! alpha
-            !
-            zn  = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt
-            pab(ji,jj,jk,jp_sal) = zn * r1_rho0 * ztm   ! beta
-            !
-         END_3D
-         !
-      CASE( np_leos )                  !==  linear ISOMIP EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts (ji,jj,jk,jp_tem) - (-1._wp)
-            zs  = pts (ji,jj,jk,jp_sal) - 34.2_wp   ! abs. salinity anomaly (s-S0)
-            zh  = gdept(ji,jj,jk,Kmm)                 ! depth in meters at t-point
-            ztm = tmask(ji,jj,jk)                   ! land/sea bottom mask = surf. mask
-            !
-            zn  = rn_a0 * rho0
-            pab(ji,jj,jk,jp_tem) = zn * r1_rho0 * ztm   ! alpha
-            !
-            zn  = rn_b0 * rho0
-            pab(ji,jj,jk,jp_sal) = zn * r1_rho0 * ztm   ! beta
-            !
-         END_3D
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'rab_3d:', ctmp1 )
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pab(:,:,:,jp_tem), clinfo1=' rab_3d_t: ', &
-         &                                  tab3d_2=pab(:,:,:,jp_sal), clinfo2=' rab_3d_s : ', kdim=jpk )
-      !
-      IF( ln_timing )   CALL timing_stop('rab_3d')
-      !
-   END SUBROUTINE rab_3d_t
-
-
-   SUBROUTINE rab_2d( pts, pdep, pab, Kmm )
-      !!
-      INTEGER                   , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pts    ! pot. temperature & salinity
-      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pdep   ! depth                  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pab    ! thermal/haline expansion ratio
-      !!
-      CALL rab_2d_t(pts, is_tile(pts), pdep, is_tile(pdep), pab, is_tile(pab), Kmm)
-   END SUBROUTINE rab_2d
-
-
-   SUBROUTINE rab_2d_t( pts, ktts, pdep, ktdep, pab, ktab, Kmm )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE rab_2d  ***
-      !!
-      !! ** Purpose :   Calculates thermal/haline expansion ratio for a 2d field (unmasked)
-      !!
-      !! ** Action  : - pab     : thermal/haline expansion ratio at T-points
-      !!----------------------------------------------------------------------
-      INTEGER                            , INTENT(in   ) ::   Kmm   ! time level index
-      INTEGER                            , INTENT(in   ) ::   ktts, ktdep, ktab
-      REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in   ) ::   pts    ! pot. temperature & salinity
-      REAL(wp), DIMENSION(A2D_T(ktdep)    ), INTENT(in   ) ::   pdep   ! depth                  [m]
-      REAL(wp), DIMENSION(A2D_T(ktab),JPTS), INTENT(  out) ::   pab    ! thermal/haline expansion ratio
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs              ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('rab_2d')
-      !
-      pab(:,:,:) = 0._wp
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zh  = pdep(ji,jj) * r1_Z0                                  ! depth
-            zt  = pts (ji,jj,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            !
-            ! alpha
-            zn3 = ALP003
-            !
-            zn2 = ALP012*zt + ALP102*zs+ALP002
-            !
-            zn1 = ((ALP031*zt   &
-               &   + ALP121*zs+ALP021)*zt   &
-               &   + (ALP211*zs+ALP111)*zs+ALP011)*zt   &
-               &   + ((ALP301*zs+ALP201)*zs+ALP101)*zs+ALP001
-               !
-            zn0 = ((((ALP050*zt   &
-               &   + ALP140*zs+ALP040)*zt   &
-               &   + (ALP230*zs+ALP130)*zs+ALP030)*zt   &
-               &   + ((ALP320*zs+ALP220)*zs+ALP120)*zs+ALP020)*zt   &
-               &   + (((ALP410*zs+ALP310)*zs+ALP210)*zs+ALP110)*zs+ALP010)*zt   &
-               &   + ((((ALP500*zs+ALP400)*zs+ALP300)*zs+ALP200)*zs+ALP100)*zs+ALP000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            pab(ji,jj,jp_tem) = zn * r1_rho0
-            !
-            ! beta
-            zn3 = BET003
-            !
-            zn2 = BET012*zt + BET102*zs+BET002
-            !
-            zn1 = ((BET031*zt   &
-               &   + BET121*zs+BET021)*zt   &
-               &   + (BET211*zs+BET111)*zs+BET011)*zt   &
-               &   + ((BET301*zs+BET201)*zs+BET101)*zs+BET001
-               !
-            zn0 = ((((BET050*zt   &
-               &   + BET140*zs+BET040)*zt   &
-               &   + (BET230*zs+BET130)*zs+BET030)*zt   &
-               &   + ((BET320*zs+BET220)*zs+BET120)*zs+BET020)*zt   &
-               &   + (((BET410*zs+BET310)*zs+BET210)*zs+BET110)*zs+BET010)*zt   &
-               &   + ((((BET500*zs+BET400)*zs+BET300)*zs+BET200)*zs+BET100)*zs+BET000
-               !
-            zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-            !
-            pab(ji,jj,jp_sal) = zn / zs * r1_rho0
-            !
-            !
-         END_2D
-         !
-      CASE( np_seos )                  !==  simplified EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt    = pts  (ji,jj,jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-            zs    = pts  (ji,jj,jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
-            zh    = pdep (ji,jj)                   ! depth at the partial step level
-            !
-            zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs
-            pab(ji,jj,jp_tem) = zn * r1_rho0   ! alpha
-            !
-            zn  = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt
-            pab(ji,jj,jp_sal) = zn * r1_rho0   ! beta
-            !
-         END_2D
-         !
-      CASE( np_leos )                  !==  linear ISOMIP EOS  ==!
-         !
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            !
-            zt    = pts  (ji,jj,jp_tem) - (-1._wp)   ! pot. temperature anomaly (t-T0)
-            zs    = pts  (ji,jj,jp_sal) - 34.2_wp   ! abs. salinity anomaly (s-S0)
-            zh    = pdep (ji,jj)                   ! depth at the partial step level
-            !
-            zn  = rn_a0 * rho0
-            pab(ji,jj,jp_tem) = zn * r1_rho0   ! alpha
-            !
-            zn  = rn_b0 * rho0
-            pab(ji,jj,jp_sal) = zn * r1_rho0   ! beta
-            !
-         END_2D
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'rab_2d:', ctmp1 )
-         !
-      END SELECT
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pab(:,:,jp_tem), clinfo1=' rab_2d_t: ', &
-         &                                  tab2d_2=pab(:,:,jp_sal), clinfo2=' rab_2d_s : ' )
-      !
-      IF( ln_timing )   CALL timing_stop('rab_2d')
-      !
-   END SUBROUTINE rab_2d_t
-
-
-   SUBROUTINE rab_0d( pts, pdep, pab, Kmm )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE rab_0d  ***
-      !!
-      !! ** Purpose :   Calculates thermal/haline expansion ratio for a 2d field (unmasked)
-      !!
-      !! ** Action  : - pab     : thermal/haline expansion ratio at T-points
-      !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(jpts)    , INTENT(in   ) ::   pts    ! pot. temperature & salinity
-      REAL(wp),                      INTENT(in   ) ::   pdep   ! depth                  [m]
-      REAL(wp), DIMENSION(jpts)    , INTENT(  out) ::   pab    ! thermal/haline expansion ratio
-      !
-      REAL(wp) ::   zt , zh , zs              ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('rab_0d')
-      !
-      pab(:) = 0._wp
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )      !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         !
-         zh  = pdep * r1_Z0                                  ! depth
-         zt  = pts (jp_tem) * r1_T0                           ! temperature
-         zs  = SQRT( ABS( pts(jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-         !
-         ! alpha
-         zn3 = ALP003
-         !
-         zn2 = ALP012*zt + ALP102*zs+ALP002
-         !
-         zn1 = ((ALP031*zt   &
-            &   + ALP121*zs+ALP021)*zt   &
-            &   + (ALP211*zs+ALP111)*zs+ALP011)*zt   &
-            &   + ((ALP301*zs+ALP201)*zs+ALP101)*zs+ALP001
-            !
-         zn0 = ((((ALP050*zt   &
-            &   + ALP140*zs+ALP040)*zt   &
-            &   + (ALP230*zs+ALP130)*zs+ALP030)*zt   &
-            &   + ((ALP320*zs+ALP220)*zs+ALP120)*zs+ALP020)*zt   &
-            &   + (((ALP410*zs+ALP310)*zs+ALP210)*zs+ALP110)*zs+ALP010)*zt   &
-            &   + ((((ALP500*zs+ALP400)*zs+ALP300)*zs+ALP200)*zs+ALP100)*zs+ALP000
-            !
-         zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-         !
-         pab(jp_tem) = zn * r1_rho0
-         !
-         ! beta
-         zn3 = BET003
-         !
-         zn2 = BET012*zt + BET102*zs+BET002
-         !
-         zn1 = ((BET031*zt   &
-            &   + BET121*zs+BET021)*zt   &
-            &   + (BET211*zs+BET111)*zs+BET011)*zt   &
-            &   + ((BET301*zs+BET201)*zs+BET101)*zs+BET001
-            !
-         zn0 = ((((BET050*zt   &
-            &   + BET140*zs+BET040)*zt   &
-            &   + (BET230*zs+BET130)*zs+BET030)*zt   &
-            &   + ((BET320*zs+BET220)*zs+BET120)*zs+BET020)*zt   &
-            &   + (((BET410*zs+BET310)*zs+BET210)*zs+BET110)*zs+BET010)*zt   &
-            &   + ((((BET500*zs+BET400)*zs+BET300)*zs+BET200)*zs+BET100)*zs+BET000
-            !
-         zn  = ( ( zn3 * zh + zn2 ) * zh + zn1 ) * zh + zn0
-         !
-         pab(jp_sal) = zn / zs * r1_rho0
-         !
-         !
-         !
-      CASE( np_seos )                  !==  simplified EOS  ==!
-         !
-         zt    = pts(jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0)
-         zs    = pts(jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0)
-         zh    = pdep                   ! depth at the partial step level
-         !
-         zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs
-         pab(jp_tem) = zn * r1_rho0   ! alpha
-         !
-         zn  = rn_b0 * ( 1._wp - rn_lambda2*zs - rn_mu2*zh ) - rn_nu*zt
-         pab(jp_sal) = zn * r1_rho0   ! beta
-         !
-      CASE( np_leos )                  !==  linear ISOMIP EOS  ==!
-         !
-         zt    = pts(jp_tem) - (-1._wp)   ! pot. temperature anomaly (t-T0)
-         zs    = pts(jp_sal) - 34.2_wp   ! abs. salinity anomaly (s-S0)
-         zh    = pdep                    ! depth at the partial step level
-         !
-         zn  = rn_a0 * rho0
-         pab(jp_tem) = zn * r1_rho0   ! alpha
-         !
-         zn  = rn_b0 * rho0
-         pab(jp_sal) = zn * r1_rho0   ! beta
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'rab_0d:', ctmp1 )
-         !
-      END SELECT
-      !
-      IF( ln_timing )   CALL timing_stop('rab_0d')
-      !
-   END SUBROUTINE rab_0d
-
-
-   SUBROUTINE bn2( pts, pab, pn2, Kmm )
-      !!
-      INTEGER                              , INTENT(in   ) ::  Kmm   ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
-      REAL(wp), DIMENSION(:,:,:,:)         , INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
-      REAL(wp), DIMENSION(:,:,:)           , INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
-      !!
-      CALL bn2_t( pts, pab, is_tile(pab), pn2, is_tile(pn2), Kmm )
-   END SUBROUTINE bn2
-
-
-   SUBROUTINE bn2_t( pts, pab, ktab, pn2, ktn2, Kmm )
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE bn2  ***
-      !!
-      !! ** Purpose :   Compute the local Brunt-Vaisala frequency at the
-      !!                time-step of the input arguments
-      !!
-      !! ** Method  :   pn2 = grav * (alpha dk[T] + beta dk[S] ) / e3w
-      !!      where alpha and beta are given in pab, and computed on T-points.
-      !!      N.B. N^2 is set one for all to zero at jk=1 in istate module.
-      !!
-      !! ** Action  :   pn2 : square of the brunt-vaisala frequency at w-point
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER                                , INTENT(in   ) ::  Kmm   ! time level index
-      INTEGER                                , INTENT(in   ) ::  ktab, ktn2
-      REAL(wp), DIMENSION(jpi,jpj,  jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
-      REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
-      REAL(wp), DIMENSION(A2D_T(ktn2),JPK     ), INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
-      !
-      INTEGER  ::   ji, jj, jk      ! dummy loop indices
-      REAL(wp) ::   zaw, zbw, zrw   ! local scalars
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('bn2')
-      !
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 )      ! interior points only (2=< jk =< jpkm1 ); surface and bottom value set to zero one for all in istate.F90
-         zrw =   ( gdepw(ji,jj,jk  ,Kmm) - gdept(ji,jj,jk,Kmm) )   &
-            &  / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) )
-            !
-         zaw = pab(ji,jj,jk,jp_tem) * (1. - zrw) + pab(ji,jj,jk-1,jp_tem) * zrw
-         zbw = pab(ji,jj,jk,jp_sal) * (1. - zrw) + pab(ji,jj,jk-1,jp_sal) * zrw
-         !
-         pn2(ji,jj,jk) = grav * (  zaw * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) )     &
-            &                    - zbw * ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) )  )  &
-            &            / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)
-      END_3D
-      !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pn2, clinfo1=' bn2  : ', kdim=jpk )
-      !
-      IF( ln_timing )   CALL timing_stop('bn2')
-      !
-   END SUBROUTINE bn2_t
-
-
-   FUNCTION eos_pt_from_ct( ctmp, psal ) RESULT( ptmp )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE eos_pt_from_ct  ***
-      !!
-      !! ** Purpose :   Compute pot.temp. from cons. temp. [Celsius]
-      !!
-      !! ** Method  :   rational approximation (5/3th order) of TEOS-10 algorithm
-      !!       checkvalue: pt=20.02391895 Celsius for sa=35.7g/kg, ct=20degC
-      !!
-      !! Reference  :   TEOS-10, UNESCO
-      !!                Rational approximation to TEOS10 algorithm (rms error on WOA13 values: 4.0e-5 degC)
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ctmp   ! Cons. Temp   [Celsius]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   psal   ! salinity     [psu]
-      ! Leave result array automatic rather than making explicitly allocated
-      REAL(wp), DIMENSION(jpi,jpj) ::   ptmp   ! potential temperature [Celsius]
-      !
-      INTEGER  ::   ji, jj               ! dummy loop indices
-      REAL(wp) ::   zt , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zd              ! local scalars
-      REAL(wp) ::   zdeltaS , z1_S0 , z1_T0
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos_pt_from_ct')
-      !
-      zdeltaS = 5._wp
-      z1_S0   = 0.875_wp/35.16504_wp
-      z1_T0   = 1._wp/40._wp
-      !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         !
-         zt  = ctmp   (ji,jj) * z1_T0
-         zs  = SQRT( ABS( psal(ji,jj) + zdeltaS ) * z1_S0 )
-         ztm = tmask(ji,jj,1)
-         !
-         zn = ((((-2.1385727895e-01_wp*zt   &
-            &   - 2.7674419971e-01_wp*zs+1.0728094330_wp)*zt   &
-            &   + (2.6366564313_wp*zs+3.3546960647_wp)*zs-7.8012209473_wp)*zt   &
-            &   + ((1.8835586562_wp*zs+7.3949191679_wp)*zs-3.3937395875_wp)*zs-5.6414948432_wp)*zt   &
-            &   + (((3.5737370589_wp*zs-1.5512427389e+01_wp)*zs+2.4625741105e+01_wp)*zs   &
-            &      +1.9912291000e+01_wp)*zs-3.2191146312e+01_wp)*zt   &
-            &   + ((((5.7153204649e-01_wp*zs-3.0943149543_wp)*zs+9.3052495181_wp)*zs   &
-            &      -9.4528934807_wp)*zs+3.1066408996_wp)*zs-4.3504021262e-01_wp
-            !
-         zd = (2.0035003456_wp*zt   &
-            &   -3.4570358592e-01_wp*zs+5.6471810638_wp)*zt   &
-            &   + (1.5393993508_wp*zs-6.9394762624_wp)*zs+1.2750522650e+01_wp
-            !
-         ptmp(ji,jj) = ( zt / z1_T0 + zn / zd ) * ztm
-            !
-      END_2D
-      !
-      IF( ln_timing )   CALL timing_stop('eos_pt_from_ct')
-      !
-   END FUNCTION eos_pt_from_ct
-
-
-   SUBROUTINE eos_fzp_2d( psal, ptf, pdep )
-      !!
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
-      REAL(wp), DIMENSION(:,:)    , INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
-      !!
-      CALL eos_fzp_2d_t( psal, ptf, is_tile(ptf), pdep )
-   END SUBROUTINE eos_fzp_2d
-
-
-   SUBROUTINE  eos_fzp_2d_t( psal, ptf, kttf, pdep )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE eos_fzp  ***
-      !!
-      !! ** Purpose :   Compute the freezing point temperature [Celsius]
-      !!
-      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by
-      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z
-      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m
-      !!
-      !! Reference  :   UNESCO tech. papers in the marine science no. 28. 1978
-      !!----------------------------------------------------------------------
-      INTEGER                       , INTENT(in   )           ::   kttf
-      REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
-      REAL(wp), DIMENSION(A2D_T(kttf)), INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
-      !
-      INTEGER  ::   ji, jj          ! dummy loop indices
-      REAL(wp) ::   zt, zs, z1_S0   ! local scalars
-      !!----------------------------------------------------------------------
-      !
-      SELECT CASE ( neos )
-      !
-      CASE ( np_teos10, np_seos )      !==  CT,SA (TEOS-10 and S-EOS formulations) ==!
-         !
-         z1_S0 = 1._wp / 35.16504_wp
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            zs= SQRT( ABS( psal(ji,jj) ) * z1_S0 )           ! square root salinity
-            ptf(ji,jj) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs &
-               &          - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp
-         END_2D
-         ptf(:,:) = ptf(:,:) * psal(:,:)
-         !
-         IF( PRESENT( pdep ) )   ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:)
-         !
-      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==!
-         !
-         ptf(:,:) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(:,:) )   &
-            &                     - 2.154996e-4_wp *       psal(:,:)   ) * psal(:,:)
-            !
-         IF( PRESENT( pdep ) )   ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:)
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'eos_fzp_2d:', ctmp1 )
-         !
-      END SELECT
-      !
-  END SUBROUTINE eos_fzp_2d_t
-
-
-  SUBROUTINE eos_fzp_0d( psal, ptf, pdep )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE eos_fzp  ***
-      !!
-      !! ** Purpose :   Compute the freezing point temperature [Celsius]
-      !!
-      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by
-      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z
-      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m
-      !!
-      !! Reference  :   UNESCO tech. papers in the marine science no. 28. 1978
-      !!----------------------------------------------------------------------
-      REAL(wp), INTENT(in )           ::   psal         ! salinity   [psu]
-      REAL(wp), INTENT(in ), OPTIONAL ::   pdep         ! depth      [m]
-      REAL(wp), INTENT(out)           ::   ptf          ! freezing temperature [Celsius]
-      !
-      REAL(wp) :: zs   ! local scalars
-      !!----------------------------------------------------------------------
-      !
-      SELECT CASE ( neos )
-      !
-      CASE ( np_teos10, np_seos )      !==  CT,SA (TEOS-10 and S-EOS formulations) ==!
-         !
-         zs  = SQRT( ABS( psal ) / 35.16504_wp )           ! square root salinity
-         ptf = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs &
-                  &          - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp
-         ptf = ptf * psal
-         !
-         IF( PRESENT( pdep ) )   ptf = ptf - 7.53e-4 * pdep
-         !
-      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==!
-         !
-         ptf = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal )   &
-            &                - 2.154996e-4_wp *       psal   ) * psal
-            !
-         IF( PRESENT( pdep ) )   ptf = ptf - 7.53e-4 * pdep
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'eos_fzp_0d:', ctmp1 )
-         !
-      END SELECT
-      !
-   END SUBROUTINE eos_fzp_0d
-
-
-   SUBROUTINE eos_pen( pts, pab_pe, ppen, Kmm )
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE eos_pen  ***
-      !!
-      !! ** Purpose :   Calculates nonlinear anomalies of alpha_PE, beta_PE and PE at T-points
-      !!
-      !! ** Method  :   PE is defined analytically as the vertical
-      !!                   primitive of EOS times -g integrated between 0 and z>0.
-      !!                pen is the nonlinear bsq-PE anomaly: pen = ( PE - rho0 gz ) / rho0 gz - rd
-      !!                                                      = 1/z * /int_0^z rd dz - rd
-      !!                                where rd is the density anomaly (see eos_rhd function)
-      !!                ab_pe are partial derivatives of PE anomaly with respect to T and S:
-      !!                    ab_pe(1) = - 1/(rho0 gz) * dPE/dT + drd/dT = - d(pen)/dT
-      !!                    ab_pe(2) =   1/(rho0 gz) * dPE/dS + drd/dS =   d(pen)/dS
-      !!
-      !! ** Action  : - pen         : PE anomaly given at T-points
-      !!            : - pab_pe  : given at T-points
-      !!                    pab_pe(:,:,:,jp_tem) is alpha_pe
-      !!                    pab_pe(:,:,:,jp_sal) is beta_pe
-      !!----------------------------------------------------------------------
-      INTEGER                              , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts     ! pot. temperature & salinity
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pab_pe  ! alpha_pe and beta_pe
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   ppen     ! potential energy anomaly
-      !
-      INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2        !   -      -
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('eos_pen')
-      !
-      SELECT CASE ( neos )
-      !
-      CASE( np_teos10, np_eos80 )                !==  polynomial TEOS-10 / EOS-80 ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            !
-            zh  = gdept(ji,jj,jk,Kmm) * r1_Z0                                ! depth
-            zt  = pts (ji,jj,jk,jp_tem) * r1_T0                           ! temperature
-            zs  = SQRT( ABS( pts(ji,jj,jk,jp_sal) + rdeltaS ) * r1_S0 )   ! square root salinity
-            ztm = tmask(ji,jj,jk)                                         ! tmask
-            !
-            ! potential energy non-linear anomaly
-            zn2 = (PEN012)*zt   &
-               &   + PEN102*zs+PEN002
-               !
-            zn1 = ((PEN021)*zt   &
-               &   + PEN111*zs+PEN011)*zt   &
-               &   + (PEN201*zs+PEN101)*zs+PEN001
-               !
-            zn0 = ((((PEN040)*zt   &
-               &   + PEN130*zs+PEN030)*zt   &
-               &   + (PEN220*zs+PEN120)*zs+PEN020)*zt   &
-               &   + ((PEN310*zs+PEN210)*zs+PEN110)*zs+PEN010)*zt   &
-               &   + (((PEN400*zs+PEN300)*zs+PEN200)*zs+PEN100)*zs+PEN000
-               !
-            zn  = ( zn2 * zh + zn1 ) * zh + zn0
-            !
-            ppen(ji,jj,jk)  = zn * zh * r1_rho0 * ztm
-            !
-            ! alphaPE non-linear anomaly
-            zn2 = APE002
-            !
-            zn1 = (APE011)*zt   &
-               &   + APE101*zs+APE001
-               !
-            zn0 = (((APE030)*zt   &
-               &   + APE120*zs+APE020)*zt   &
-               &   + (APE210*zs+APE110)*zs+APE010)*zt   &
-               &   + ((APE300*zs+APE200)*zs+APE100)*zs+APE000
-               !
-            zn  = ( zn2 * zh + zn1 ) * zh + zn0
-            !
-            pab_pe(ji,jj,jk,jp_tem) = zn * zh * r1_rho0 * ztm
-            !
-            ! betaPE non-linear anomaly
-            zn2 = BPE002
-            !
-            zn1 = (BPE011)*zt   &
-               &   + BPE101*zs+BPE001
-               !
-            zn0 = (((BPE030)*zt   &
-               &   + BPE120*zs+BPE020)*zt   &
-               &   + (BPE210*zs+BPE110)*zs+BPE010)*zt   &
-               &   + ((BPE300*zs+BPE200)*zs+BPE100)*zs+BPE000
-               !
-            zn  = ( zn2 * zh + zn1 ) * zh + zn0
-            !
-            pab_pe(ji,jj,jk,jp_sal) = zn / zs * zh * r1_rho0 * ztm
-            !
-         END_3D
-         !
-      CASE( np_seos )                !==  Vallis (2006) simplified EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts(ji,jj,jk,jp_tem) - 10._wp  ! temperature anomaly (t-T0)
-            zs = pts (ji,jj,jk,jp_sal) - 35._wp  ! abs. salinity anomaly (s-S0)
-            zh  = gdept(ji,jj,jk,Kmm)              ! depth in meters  at t-point
-            ztm = tmask(ji,jj,jk)                ! tmask
-            zn  = 0.5_wp * zh * r1_rho0 * ztm
-            !                                    ! Potential Energy
-            ppen(ji,jj,jk) = ( rn_a0 * rn_mu1 * zt + rn_b0 * rn_mu2 * zs ) * zn
-            !                                    ! alphaPE
-            pab_pe(ji,jj,jk,jp_tem) = - rn_a0 * rn_mu1 * zn
-            pab_pe(ji,jj,jk,jp_sal) =   rn_b0 * rn_mu2 * zn
-            !
-         END_3D
-         !
-      CASE( np_leos )                !==  linear ISOMIP EOS  ==!
-         !
-         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-            zt  = pts(ji,jj,jk,jp_tem) - (-1._wp)  ! temperature anomaly (t-T0)
-            zs = pts (ji,jj,jk,jp_sal) - 34.2_wp   ! abs. salinity anomaly (s-S0)
-            zh  = gdept(ji,jj,jk,Kmm)                ! depth in meters  at t-point
-            ztm = tmask(ji,jj,jk)                  ! tmask
-            zn  = 0.5_wp * zh * r1_rho0 * ztm
-            !                                    ! Potential Energy
-            ppen(ji,jj,jk) = 0.
-            !                                    ! alphaPE
-            pab_pe(ji,jj,jk,jp_tem) = 0.
-            pab_pe(ji,jj,jk,jp_sal) = 0.
-            !
-         END_3D
-         !
-      CASE DEFAULT
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos
-         CALL ctl_stop( 'eos_pen:', ctmp1 )
-         !
-      END SELECT
-      !
-      IF( ln_timing )   CALL timing_stop('eos_pen')
-      !
-   END SUBROUTINE eos_pen
-
-
-   SUBROUTINE eos_init
-      !!----------------------------------------------------------------------
-      !!                 ***  ROUTINE eos_init  ***
-      !!
-      !! ** Purpose :   initializations for the equation of state
-      !!
-      !! ** Method  :   Read the namelist nameos and control the parameters
-      !!----------------------------------------------------------------------
-      INTEGER  ::   ios   ! local integer
-      INTEGER  ::   ioptio   ! local integer
-      !!
-      NAMELIST/nameos/ ln_TEOS10, ln_EOS80, ln_SEOS, ln_LEOS, rn_a0, rn_b0, &
-         &             rn_lambda1, rn_mu1, rn_lambda2, rn_mu2, rn_nu
-      !!----------------------------------------------------------------------
-      !
-      READ  ( numnam_ref, nameos, IOSTAT = ios, ERR = 901 )
-901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nameos in reference namelist' )
-      !
-      READ  ( numnam_cfg, nameos, IOSTAT = ios, ERR = 902 )
-902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nameos in configuration namelist' )
-      IF(lwm) WRITE( numond, nameos )
-      !
-      rho0        = 1027.51_wp     !: volumic mass of reference     [kg/m3]
-      rcp         = 3974.00_wp     !: heat capacity     [J/K]
-      !
-      IF(lwp) THEN                ! Control print
-         WRITE(numout,*)
-         WRITE(numout,*) 'eos_init : equation of state'
-         WRITE(numout,*) '~~~~~~~~'
-         WRITE(numout,*) '   Namelist nameos : Chosen the Equation Of Seawater (EOS)'
-         WRITE(numout,*) '      TEOS-10 : rho=F(Conservative Temperature, Absolute  Salinity, depth)   ln_TEOS10 = ', ln_TEOS10
-         WRITE(numout,*) '      EOS-80  : rho=F(Potential    Temperature, Practical Salinity, depth)   ln_EOS80  = ', ln_EOS80
-         WRITE(numout,*) '      S-EOS   : rho=F(Conservative Temperature, Absolute  Salinity, depth)   ln_SEOS   = ', ln_SEOS
-         WRITE(numout,*) '      L-EOS   : rho=F(Potential    Temperature, Practical Salinity, depth)   ln_LEOS   = ', ln_LEOS
-      ENDIF
-
-      ! Check options for equation of state & set neos based on logical flags
-      ioptio = 0
-      IF( ln_TEOS10 ) THEN   ;   ioptio = ioptio+1   ;   neos = np_teos10   ;   ENDIF
-      IF( ln_EOS80  ) THEN   ;   ioptio = ioptio+1   ;   neos = np_eos80    ;   ENDIF
-      IF( ln_SEOS   ) THEN   ;   ioptio = ioptio+1   ;   neos = np_seos     ;   ENDIF
-      IF( ln_LEOS   ) THEN   ;   ioptio = ioptio+1   ;   neos = np_leos     ;   ENDIF
-      IF( ioptio /= 1 )   CALL ctl_stop("Exactly one equation of state option must be selected")
-      !
-      SELECT CASE( neos )         ! check option
-      !
-      CASE( np_teos10 )                       !==  polynomial TEOS-10  ==!
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) '   ==>>>   use of TEOS-10 equation of state (cons. temp. and abs. salinity)'
-         !
-         l_useCT = .TRUE.                          ! model temperature is Conservative temperature
-         !
-         rdeltaS = 32._wp
-         r1_S0  = 0.875_wp/35.16504_wp
-         r1_T0  = 1._wp/40._wp
-         r1_Z0  = 1.e-4_wp
-         !
-         EOS000 = 8.0189615746e+02_wp
-         EOS100 = 8.6672408165e+02_wp
-         EOS200 = -1.7864682637e+03_wp
-         EOS300 = 2.0375295546e+03_wp
-         EOS400 = -1.2849161071e+03_wp
-         EOS500 = 4.3227585684e+02_wp
-         EOS600 = -6.0579916612e+01_wp
-         EOS010 = 2.6010145068e+01_wp
-         EOS110 = -6.5281885265e+01_wp
-         EOS210 = 8.1770425108e+01_wp
-         EOS310 = -5.6888046321e+01_wp
-         EOS410 = 1.7681814114e+01_wp
-         EOS510 = -1.9193502195_wp
-         EOS020 = -3.7074170417e+01_wp
-         EOS120 = 6.1548258127e+01_wp
-         EOS220 = -6.0362551501e+01_wp
-         EOS320 = 2.9130021253e+01_wp
-         EOS420 = -5.4723692739_wp
-         EOS030 = 2.1661789529e+01_wp
-         EOS130 = -3.3449108469e+01_wp
-         EOS230 = 1.9717078466e+01_wp
-         EOS330 = -3.1742946532_wp
-         EOS040 = -8.3627885467_wp
-         EOS140 = 1.1311538584e+01_wp
-         EOS240 = -5.3563304045_wp
-         EOS050 = 5.4048723791e-01_wp
-         EOS150 = 4.8169980163e-01_wp
-         EOS060 = -1.9083568888e-01_wp
-         EOS001 = 1.9681925209e+01_wp
-         EOS101 = -4.2549998214e+01_wp
-         EOS201 = 5.0774768218e+01_wp
-         EOS301 = -3.0938076334e+01_wp
-         EOS401 = 6.6051753097_wp
-         EOS011 = -1.3336301113e+01_wp
-         EOS111 = -4.4870114575_wp
-         EOS211 = 5.0042598061_wp
-         EOS311 = -6.5399043664e-01_wp
-         EOS021 = 6.7080479603_wp
-         EOS121 = 3.5063081279_wp
-         EOS221 = -1.8795372996_wp
-         EOS031 = -2.4649669534_wp
-         EOS131 = -5.5077101279e-01_wp
-         EOS041 = 5.5927935970e-01_wp
-         EOS002 = 2.0660924175_wp
-         EOS102 = -4.9527603989_wp
-         EOS202 = 2.5019633244_wp
-         EOS012 = 2.0564311499_wp
-         EOS112 = -2.1311365518e-01_wp
-         EOS022 = -1.2419983026_wp
-         EOS003 = -2.3342758797e-02_wp
-         EOS103 = -1.8507636718e-02_wp
-         EOS013 = 3.7969820455e-01_wp
-         !
-         ALP000 = -6.5025362670e-01_wp
-         ALP100 = 1.6320471316_wp
-         ALP200 = -2.0442606277_wp
-         ALP300 = 1.4222011580_wp
-         ALP400 = -4.4204535284e-01_wp
-         ALP500 = 4.7983755487e-02_wp
-         ALP010 = 1.8537085209_wp
-         ALP110 = -3.0774129064_wp
-         ALP210 = 3.0181275751_wp
-         ALP310 = -1.4565010626_wp
-         ALP410 = 2.7361846370e-01_wp
-         ALP020 = -1.6246342147_wp
-         ALP120 = 2.5086831352_wp
-         ALP220 = -1.4787808849_wp
-         ALP320 = 2.3807209899e-01_wp
-         ALP030 = 8.3627885467e-01_wp
-         ALP130 = -1.1311538584_wp
-         ALP230 = 5.3563304045e-01_wp
-         ALP040 = -6.7560904739e-02_wp
-         ALP140 = -6.0212475204e-02_wp
-         ALP050 = 2.8625353333e-02_wp
-         ALP001 = 3.3340752782e-01_wp
-         ALP101 = 1.1217528644e-01_wp
-         ALP201 = -1.2510649515e-01_wp
-         ALP301 = 1.6349760916e-02_wp
-         ALP011 = -3.3540239802e-01_wp
-         ALP111 = -1.7531540640e-01_wp
-         ALP211 = 9.3976864981e-02_wp
-         ALP021 = 1.8487252150e-01_wp
-         ALP121 = 4.1307825959e-02_wp
-         ALP031 = -5.5927935970e-02_wp
-         ALP002 = -5.1410778748e-02_wp
-         ALP102 = 5.3278413794e-03_wp
-         ALP012 = 6.2099915132e-02_wp
-         ALP003 = -9.4924551138e-03_wp
-         !
-         BET000 = 1.0783203594e+01_wp
-         BET100 = -4.4452095908e+01_wp
-         BET200 = 7.6048755820e+01_wp
-         BET300 = -6.3944280668e+01_wp
-         BET400 = 2.6890441098e+01_wp
-         BET500 = -4.5221697773_wp
-         BET010 = -8.1219372432e-01_wp
-         BET110 = 2.0346663041_wp
-         BET210 = -2.1232895170_wp
-         BET310 = 8.7994140485e-01_wp
-         BET410 = -1.1939638360e-01_wp
-         BET020 = 7.6574242289e-01_wp
-         BET120 = -1.5019813020_wp
-         BET220 = 1.0872489522_wp
-         BET320 = -2.7233429080e-01_wp
-         BET030 = -4.1615152308e-01_wp
-         BET130 = 4.9061350869e-01_wp
-         BET230 = -1.1847737788e-01_wp
-         BET040 = 1.4073062708e-01_wp
-         BET140 = -1.3327978879e-01_wp
-         BET050 = 5.9929880134e-03_wp
-         BET001 = -5.2937873009e-01_wp
-         BET101 = 1.2634116779_wp
-         BET201 = -1.1547328025_wp
-         BET301 = 3.2870876279e-01_wp
-         BET011 = -5.5824407214e-02_wp
-         BET111 = 1.2451933313e-01_wp
-         BET211 = -2.4409539932e-02_wp
-         BET021 = 4.3623149752e-02_wp
-         BET121 = -4.6767901790e-02_wp
-         BET031 = -6.8523260060e-03_wp
-         BET002 = -6.1618945251e-02_wp
-         BET102 = 6.2255521644e-02_wp
-         BET012 = -2.6514181169e-03_wp
-         BET003 = -2.3025968587e-04_wp
-         !
-         PEN000 = -9.8409626043_wp
-         PEN100 = 2.1274999107e+01_wp
-         PEN200 = -2.5387384109e+01_wp
-         PEN300 = 1.5469038167e+01_wp
-         PEN400 = -3.3025876549_wp
-         PEN010 = 6.6681505563_wp
-         PEN110 = 2.2435057288_wp
-         PEN210 = -2.5021299030_wp
-         PEN310 = 3.2699521832e-01_wp
-         PEN020 = -3.3540239802_wp
-         PEN120 = -1.7531540640_wp
-         PEN220 = 9.3976864981e-01_wp
-         PEN030 = 1.2324834767_wp
-         PEN130 = 2.7538550639e-01_wp
-         PEN040 = -2.7963967985e-01_wp
-         PEN001 = -1.3773949450_wp
-         PEN101 = 3.3018402659_wp
-         PEN201 = -1.6679755496_wp
-         PEN011 = -1.3709540999_wp
-         PEN111 = 1.4207577012e-01_wp
-         PEN021 = 8.2799886843e-01_wp
-         PEN002 = 1.7507069098e-02_wp
-         PEN102 = 1.3880727538e-02_wp
-         PEN012 = -2.8477365341e-01_wp
-         !
-         APE000 = -1.6670376391e-01_wp
-         APE100 = -5.6087643219e-02_wp
-         APE200 = 6.2553247576e-02_wp
-         APE300 = -8.1748804580e-03_wp
-         APE010 = 1.6770119901e-01_wp
-         APE110 = 8.7657703198e-02_wp
-         APE210 = -4.6988432490e-02_wp
-         APE020 = -9.2436260751e-02_wp
-         APE120 = -2.0653912979e-02_wp
-         APE030 = 2.7963967985e-02_wp
-         APE001 = 3.4273852498e-02_wp
-         APE101 = -3.5518942529e-03_wp
-         APE011 = -4.1399943421e-02_wp
-         APE002 = 7.1193413354e-03_wp
-         !
-         BPE000 = 2.6468936504e-01_wp
-         BPE100 = -6.3170583896e-01_wp
-         BPE200 = 5.7736640125e-01_wp
-         BPE300 = -1.6435438140e-01_wp
-         BPE010 = 2.7912203607e-02_wp
-         BPE110 = -6.2259666565e-02_wp
-         BPE210 = 1.2204769966e-02_wp
-         BPE020 = -2.1811574876e-02_wp
-         BPE120 = 2.3383950895e-02_wp
-         BPE030 = 3.4261630030e-03_wp
-         BPE001 = 4.1079296834e-02_wp
-         BPE101 = -4.1503681096e-02_wp
-         BPE011 = 1.7676120780e-03_wp
-         BPE002 = 1.7269476440e-04_wp
-         !
-      CASE( np_eos80 )                        !==  polynomial EOS-80 formulation  ==!
-         !
-         IF(lwp) WRITE(numout,*)
-         IF(lwp) WRITE(numout,*) '   ==>>>   use of EOS-80 equation of state (pot. temp. and pract. salinity)'
-         !
-         l_useCT = .FALSE.                         ! model temperature is Potential temperature
-         rdeltaS = 20._wp
-         r1_S0  = 1._wp/40._wp
-         r1_T0  = 1._wp/40._wp
-         r1_Z0  = 1.e-4_wp
-         !
-         EOS000 = 9.5356891948e+02_wp
-         EOS100 = 1.7136499189e+02_wp
-         EOS200 = -3.7501039454e+02_wp
-         EOS300 = 5.1856810420e+02_wp
-         EOS400 = -3.7264470465e+02_wp
-         EOS500 = 1.4302533998e+02_wp
-         EOS600 = -2.2856621162e+01_wp
-         EOS010 = 1.0087518651e+01_wp
-         EOS110 = -1.3647741861e+01_wp
-         EOS210 = 8.8478359933_wp
-         EOS310 = -7.2329388377_wp
-         EOS410 = 1.4774410611_wp
-         EOS510 = 2.0036720553e-01_wp
-         EOS020 = -2.5579830599e+01_wp
-         EOS120 = 2.4043512327e+01_wp
-         EOS220 = -1.6807503990e+01_wp
-         EOS320 = 8.3811577084_wp
-         EOS420 = -1.9771060192_wp
-         EOS030 = 1.6846451198e+01_wp
-         EOS130 = -2.1482926901e+01_wp
-         EOS230 = 1.0108954054e+01_wp
-         EOS330 = -6.2675951440e-01_wp
-         EOS040 = -8.0812310102_wp
-         EOS140 = 1.0102374985e+01_wp
-         EOS240 = -4.8340368631_wp
-         EOS050 = 1.2079167803_wp
-         EOS150 = 1.1515380987e-01_wp
-         EOS060 = -2.4520288837e-01_wp
-         EOS001 = 1.0748601068e+01_wp
-         EOS101 = -1.7817043500e+01_wp
-         EOS201 = 2.2181366768e+01_wp
-         EOS301 = -1.6750916338e+01_wp
-         EOS401 = 4.1202230403_wp
-         EOS011 = -1.5852644587e+01_wp
-         EOS111 = -7.6639383522e-01_wp
-         EOS211 = 4.1144627302_wp
-         EOS311 = -6.6955877448e-01_wp
-         EOS021 = 9.9994861860_wp
-         EOS121 = -1.9467067787e-01_wp
-         EOS221 = -1.2177554330_wp
-         EOS031 = -3.4866102017_wp
-         EOS131 = 2.2229155620e-01_wp
-         EOS041 = 5.9503008642e-01_wp
-         EOS002 = 1.0375676547_wp
-         EOS102 = -3.4249470629_wp
-         EOS202 = 2.0542026429_wp
-         EOS012 = 2.1836324814_wp
-         EOS112 = -3.4453674320e-01_wp
-         EOS022 = -1.2548163097_wp
-         EOS003 = 1.8729078427e-02_wp
-         EOS103 = -5.7238495240e-02_wp
-         EOS013 = 3.8306136687e-01_wp
-         !
-         ALP000 = -2.5218796628e-01_wp
-         ALP100 = 3.4119354654e-01_wp
-         ALP200 = -2.2119589983e-01_wp
-         ALP300 = 1.8082347094e-01_wp
-         ALP400 = -3.6936026529e-02_wp
-         ALP500 = -5.0091801383e-03_wp
-         ALP010 = 1.2789915300_wp
-         ALP110 = -1.2021756164_wp
-         ALP210 = 8.4037519952e-01_wp
-         ALP310 = -4.1905788542e-01_wp
-         ALP410 = 9.8855300959e-02_wp
-         ALP020 = -1.2634838399_wp
-         ALP120 = 1.6112195176_wp
-         ALP220 = -7.5817155402e-01_wp
-         ALP320 = 4.7006963580e-02_wp
-         ALP030 = 8.0812310102e-01_wp
-         ALP130 = -1.0102374985_wp
-         ALP230 = 4.8340368631e-01_wp
-         ALP040 = -1.5098959754e-01_wp
-         ALP140 = -1.4394226233e-02_wp
-         ALP050 = 3.6780433255e-02_wp
-         ALP001 = 3.9631611467e-01_wp
-         ALP101 = 1.9159845880e-02_wp
-         ALP201 = -1.0286156825e-01_wp
-         ALP301 = 1.6738969362e-02_wp
-         ALP011 = -4.9997430930e-01_wp
-         ALP111 = 9.7335338937e-03_wp
-         ALP211 = 6.0887771651e-02_wp
-         ALP021 = 2.6149576513e-01_wp
-         ALP121 = -1.6671866715e-02_wp
-         ALP031 = -5.9503008642e-02_wp
-         ALP002 = -5.4590812035e-02_wp
-         ALP102 = 8.6134185799e-03_wp
-         ALP012 = 6.2740815484e-02_wp
-         ALP003 = -9.5765341718e-03_wp
-         !
-         BET000 = 2.1420623987_wp
-         BET100 = -9.3752598635_wp
-         BET200 = 1.9446303907e+01_wp
-         BET300 = -1.8632235232e+01_wp
-         BET400 = 8.9390837485_wp
-         BET500 = -1.7142465871_wp
-         BET010 = -1.7059677327e-01_wp
-         BET110 = 2.2119589983e-01_wp
-         BET210 = -2.7123520642e-01_wp
-         BET310 = 7.3872053057e-02_wp
-         BET410 = 1.2522950346e-02_wp
-         BET020 = 3.0054390409e-01_wp
-         BET120 = -4.2018759976e-01_wp
-         BET220 = 3.1429341406e-01_wp
-         BET320 = -9.8855300959e-02_wp
-         BET030 = -2.6853658626e-01_wp
-         BET130 = 2.5272385134e-01_wp
-         BET230 = -2.3503481790e-02_wp
-         BET040 = 1.2627968731e-01_wp
-         BET140 = -1.2085092158e-01_wp
-         BET050 = 1.4394226233e-03_wp
-         BET001 = -2.2271304375e-01_wp
-         BET101 = 5.5453416919e-01_wp
-         BET201 = -6.2815936268e-01_wp
-         BET301 = 2.0601115202e-01_wp
-         BET011 = -9.5799229402e-03_wp
-         BET111 = 1.0286156825e-01_wp
-         BET211 = -2.5108454043e-02_wp
-         BET021 = -2.4333834734e-03_wp
-         BET121 = -3.0443885826e-02_wp
-         BET031 = 2.7786444526e-03_wp
-         BET002 = -4.2811838287e-02_wp
-         BET102 = 5.1355066072e-02_wp
-         BET012 = -4.3067092900e-03_wp
-         BET003 = -7.1548119050e-04_wp
-         !
-         PEN000 = -5.3743005340_wp
-         PEN100 = 8.9085217499_wp
-         PEN200 = -1.1090683384e+01_wp
-         PEN300 = 8.3754581690_wp
-         PEN400 = -2.0601115202_wp
-         PEN010 = 7.9263222935_wp
-         PEN110 = 3.8319691761e-01_wp
-         PEN210 = -2.0572313651_wp
-         PEN310 = 3.3477938724e-01_wp
-         PEN020 = -4.9997430930_wp
-         PEN120 = 9.7335338937e-02_wp
-         PEN220 = 6.0887771651e-01_wp
-         PEN030 = 1.7433051009_wp
-         PEN130 = -1.1114577810e-01_wp
-         PEN040 = -2.9751504321e-01_wp
-         PEN001 = -6.9171176978e-01_wp
-         PEN101 = 2.2832980419_wp
-         PEN201 = -1.3694684286_wp
-         PEN011 = -1.4557549876_wp
-         PEN111 = 2.2969116213e-01_wp
-         PEN021 = 8.3654420645e-01_wp
-         PEN002 = -1.4046808820e-02_wp
-         PEN102 = 4.2928871430e-02_wp
-         PEN012 = -2.8729602515e-01_wp
-         !
-         APE000 = -1.9815805734e-01_wp
-         APE100 = -9.5799229402e-03_wp
-         APE200 = 5.1430784127e-02_wp
-         APE300 = -8.3694846809e-03_wp
-         APE010 = 2.4998715465e-01_wp
-         APE110 = -4.8667669469e-03_wp
-         APE210 = -3.0443885826e-02_wp
-         APE020 = -1.3074788257e-01_wp
-         APE120 = 8.3359333577e-03_wp
-         APE030 = 2.9751504321e-02_wp
-         APE001 = 3.6393874690e-02_wp
-         APE101 = -5.7422790533e-03_wp
-         APE011 = -4.1827210323e-02_wp
-         APE002 = 7.1824006288e-03_wp
-         !
-         BPE000 = 1.1135652187e-01_wp
-         BPE100 = -2.7726708459e-01_wp
-         BPE200 = 3.1407968134e-01_wp
-         BPE300 = -1.0300557601e-01_wp
-         BPE010 = 4.7899614701e-03_wp
-         BPE110 = -5.1430784127e-02_wp
-         BPE210 = 1.2554227021e-02_wp
-         BPE020 = 1.2166917367e-03_wp
-         BPE120 = 1.5221942913e-02_wp
-         BPE030 = -1.3893222263e-03_wp
-         BPE001 = 2.8541225524e-02_wp
-         BPE101 = -3.4236710714e-02_wp
-         BPE011 = 2.8711395266e-03_wp
-         BPE002 = 5.3661089288e-04_wp
-         !
-      CASE( np_seos )                        !==  Simplified EOS     ==!
-
-         r1_S0  = 0.875_wp/35.16504_wp   ! Used to convert CT in potential temperature when using bulk formulae (eos_pt_from_ct)
-
-         IF(lwp) THEN
-            WRITE(numout,*)
-            WRITE(numout,*) '   ==>>>   use of simplified eos:    '
-            WRITE(numout,*) '              rhd(dT=T-10,dS=S-35,Z) = [-a0*(1+lambda1/2*dT+mu1*Z)*dT '
-            WRITE(numout,*) '                                       + b0*(1+lambda2/2*dT+mu2*Z)*dS - nu*dT*dS] / rho0'
-            WRITE(numout,*) '              with the following coefficients :'
-            WRITE(numout,*) '                 thermal exp. coef.    rn_a0      = ', rn_a0
-            WRITE(numout,*) '                 saline  cont. coef.   rn_b0      = ', rn_b0
-            WRITE(numout,*) '                 cabbeling coef.       rn_lambda1 = ', rn_lambda1
-            WRITE(numout,*) '                 cabbeling coef.       rn_lambda2 = ', rn_lambda2
-            WRITE(numout,*) '                 thermobar. coef.      rn_mu1     = ', rn_mu1
-            WRITE(numout,*) '                 thermobar. coef.      rn_mu2     = ', rn_mu2
-            WRITE(numout,*) '                 2nd cabbel. coef.     rn_nu      = ', rn_nu
-            WRITE(numout,*) '              Caution: rn_beta0=0 incompatible with ddm parameterization '
-         ENDIF
-         l_useCT = .TRUE.          ! Use conservative temperature
-         !
-      CASE( np_leos )                        !==  Linear ISOMIP EOS     ==!
-
-         r1_S0  = 0.875_wp/35.16504_wp   ! Used to convert CT in potential temperature when using bulk formulae (eos_pt_from_ct)
-         
-         IF(lwp) THEN
-            WRITE(numout,*)
-            WRITE(numout,*) '          use of linear ISOMIP eos:    rhd(dT=T-(-1),dS=S-(34.2),Z) = '
-            WRITE(numout,*) '             [ -a0*dT + b0*dS ]/rho0'
-            WRITE(numout,*)
-            WRITE(numout,*) '             thermal exp. coef.    rn_a0      = ', rn_a0
-            WRITE(numout,*) '             saline  cont. coef.   rn_b0      = ', rn_b0
-         ENDIF
-         l_useCT = .TRUE.          ! Use conservative temperature
-         !
-      CASE DEFAULT                     !==  ERROR in neos  ==!
-         WRITE(ctmp1,*) '          bad flag value for neos = ', neos, '. You should never see this error'
-         CALL ctl_stop( ctmp1 )
-         !
-      END SELECT
-      !
-      rho0_rcp    = rho0 * rcp
-      r1_rho0     = 1._wp / rho0
-      r1_rcp      = 1._wp / rcp
-      r1_rho0_rcp = 1._wp / rho0_rcp
-      !
-      IF(lwp) THEN
-         IF( l_useCT )   THEN
-            WRITE(numout,*)
-            WRITE(numout,*) '   ==>>>   model uses Conservative Temperature'
-            WRITE(numout,*) '           Important: model must be initialized with CT and SA fields'
-         ELSE
-            WRITE(numout,*)
-            WRITE(numout,*) '   ==>>>   model does not use Conservative Temperature'
-         ENDIF
-      ENDIF
-      !
-      IF(lwp) WRITE(numout,*)
-      IF(lwp) WRITE(numout,*) '   Associated physical constant'
-      IF(lwp) WRITE(numout,*) '      volumic mass of reference           rho0  = ', rho0   , ' kg/m^3'
-      IF(lwp) WRITE(numout,*) '      1. / rho0                        r1_rho0  = ', r1_rho0, ' m^3/kg'
-      IF(lwp) WRITE(numout,*) '      ocean specific heat                 rcp   = ', rcp    , ' J/Kelvin'
-      IF(lwp) WRITE(numout,*) '      rho0 * rcp                       rho0_rcp = ', rho0_rcp
-      IF(lwp) WRITE(numout,*) '      1. / ( rho0 * rcp )           r1_rho0_rcp = ', r1_rho0_rcp
-      !
-   END SUBROUTINE eos_init
-
-   !!======================================================================
-END MODULE eosbn2
diff --git a/tests/ISOMIP+/MY_SRC/isf_oce.F90 b/tests/ISOMIP+/MY_SRC/isf_oce.F90
index 3bf1b30d..e013cddb 100644
--- a/tests/ISOMIP+/MY_SRC/isf_oce.F90
+++ b/tests/ISOMIP+/MY_SRC/isf_oce.F90
@@ -13,8 +13,7 @@ MODULE isf_oce
    !!   isf          : define and allocate ice shelf variables
    !!----------------------------------------------------------------------
 
-   USE par_oce       , ONLY: jpi, jpj, jpk
-   USE in_out_manager, ONLY: wp, jpts ! I/O manager
+   USE par_oce
    USE lib_mpp       , ONLY: ctl_stop, mpp_sum      ! MPP library
    USE fldread        ! read input fields
 
@@ -22,7 +21,7 @@ MODULE isf_oce
 
    PRIVATE
 
-   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl, isf_dealloc_cpl
+   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl
    !
    !-------------------------------------------------------
    ! 0 :              namelist parameter
@@ -65,7 +64,7 @@ MODULE isf_oce
    !
    REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp    !: latent heat of fusion of ice shelf     [J/kg]
    REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp       !: specific heat of ice shelf             [J/kg/K]
-   REAL(wp), PARAMETER, PUBLIC :: rkappa = 0.0_wp          !: ISOMIP+ no heat diffusivity through the ice-shelf [m2/s]
+   REAL(wp), PARAMETER, PUBLIC :: rkappa =   0._wp         !: ISOMIP: no heat diffusivity through the ice-shelf [m2/s]
    REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp        !: volumic mass of ice shelf              [kg/m3]
    REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0           !: surface temperature                    [C]
    !
@@ -79,33 +78,35 @@ MODULE isf_oce
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   fwfisf_oasis
    !
    ! 2.2 -------- ice shelf cavity melt namelist parameter -------------
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_cav                    !:
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_cav   , misfkb_cav     !: 
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_cav, rfrac_tbl_cav  !: 
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
-   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfcav_fwf                 !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_cav                    !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_cav   , misfkb_cav     !: shallowest and deepest level of the ice shelf
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_cav, rfrac_tbl_cav  !: thickness and fraction of deepest cell affected by the ice shelf
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
+   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     ::   sf_isfcav_fwf                 !:
    !
-   REAL(wp) , PUBLIC                                      :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient
+   REAL(wp) , PUBLIC                                      ::   risf_lamb1, risf_lamb2, risf_lamb3  !: freezing point linearization coeficient
    !
    ! 2.3 -------- ice shelf param. melt namelist parameter -------------
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_par                    !:
-   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_par   , misfkb_par     !:
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_par, rfrac_tbl_par  !: 
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
-   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfpar_fwf                 !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_par                    !:
+   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_par   , misfkb_par     !:
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_par, rfrac_tbl_par  !: 
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]  
+   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     ::   sf_isfpar_fwf                 !:
    !
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf0_tbl_par                !: thickness of tbl (initial value)  [m]
-   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: risfLeff                      !:
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf0_tbl_par                !: thickness of tbl (initial value)  [m]
+   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfLeff                      !:
    !
    ! 2.4 -------- coupling namelist parameter -------------
    INTEGER , PUBLIC                                        ::   nstp_iscpl   !:
    REAL(wp), PUBLIC                                        ::   rdt_iscpl    !: 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_ssh, risfcpl_cons_ssh, risfcpl_cons_ssh_b               !:
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b  !:
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_ssh, risfcpl_cons_ssh  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol  !:
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc  !:
    !
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
@@ -125,20 +126,12 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0       ! set to zero if no array to be allocated
-      !
-      ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( misfkt_par  (A2D(0)) , misfkb_par    (A2D(0)) , rfrac_tbl_par(A2D(0)) , &
+         &     rhisf_tbl_par(A2D(0)) , rhisf0_tbl_par(A2D(0)) , &
+         &     risfLeff     (A2D(0)) , mskisf_par    (A2D(0)) , STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
@@ -159,14 +152,10 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0       ! set to zero if no array to be allocated
-      !
-      ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( misfkt_cav(A2D(0)), misfkb_cav(A2D(0)), rfrac_tbl_cav(A2D(0)) , rhisf_tbl_cav(A2D(0)) , STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
@@ -185,46 +174,25 @@ CONTAINS
       INTEGER :: ierr, ialloc
       !!----------------------------------------------------------------------
       ierr = 0
-      !
-      ALLOCATE( risfcpl_ssh(jpi,jpj) , risfcpl_tsc(jpi,jpj,jpk,jpts) , risfcpl_vol(jpi,jpj,jpk) , STAT=ialloc )
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ALLOCATE( risfcpl_ssh     (jpi,jpj) , risfcpl_vol     (jpi,jpj,jpk) , &
+         &      risfcpl_cons_ssh(jpi,jpj) , risfcpl_cons_vol(jpi,jpj,jpk) , STAT=ialloc )
+      ierr = ierr + ialloc
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( risfcpl_tsc     (A2D(0),jpk,jpts) , &
+         &      risfcpl_cons_tsc(A2D(0),jpk,jpts) , STAT=ialloc )
       ierr = ierr + ialloc
-      !
-      risfcpl_tsc(:,:,:,:) = 0._wp ; risfcpl_vol(:,:,:) = 0._wp ; risfcpl_ssh(:,:) = 0._wp
-
-      IF ( ln_isfcpl_cons ) THEN
-         ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) , risfcpl_cons_ssh(jpi,jpj) , STAT=ialloc )
-         ierr = ierr + ialloc
-         !
-         risfcpl_cons_tsc(:,:,:,:) = 0._wp ; risfcpl_cons_vol(:,:,:) = 0._wp ; risfcpl_cons_ssh(:,:) = 0._wp
-         !
-      END IF
       !
       CALL mpp_sum ( 'isf', ierr )
       IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to allocate arrays.')
       !
    END SUBROUTINE isf_alloc_cpl
 
-   
-   SUBROUTINE isf_dealloc_cpl()
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_dealloc_cpl  ***
-      !!
-      !! ** Purpose : de-allocate useless public 3d array used for ice sheet coupling
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER :: ierr, ialloc
-      !!----------------------------------------------------------------------
-      ierr = 0
-      !
-      DEALLOCATE( risfcpl_ssh , risfcpl_tsc , risfcpl_vol , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      CALL mpp_sum ( 'isf', ierr )
-      IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to deallocate arrays.')
-      !
-   END SUBROUTINE isf_dealloc_cpl
-
-   
+     
    SUBROUTINE isf_alloc()
       !!---------------------------------------------------------------------
       !!                  ***  ROUTINE isf_alloc  ***
@@ -237,34 +205,29 @@ CONTAINS
       !
       ierr = 0       ! set to zero if no array to be allocated
       !
-      ALLOCATE( fwfisf_par  (jpi,jpj) , fwfisf_par_b(jpi,jpj) ,     &
-         &      fwfisf_cav  (jpi,jpj) , fwfisf_cav_b(jpi,jpj) ,     &
-         &      fwfisf_oasis(jpi,jpj)                         , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risf_par_tsc(jpi,jpj,jpts) , risf_par_tsc_b(jpi,jpj,jpts) , STAT=ialloc )
+      ! ----------------- !
+      ! == FULL ARRAYS == !
+      ! ----------------- !
+      ALLOCATE( fwfisf_par  (jpi,jpj) , fwfisf_cav  (jpi,jpj) , risfload(jpi,jpj) , &
+#if ! defined key_RK3
+         &      fwfisf_par_b(jpi,jpj) , fwfisf_cav_b(jpi,jpj) , &   ! MLF : need to allocate before arrays
+#endif
+         &                                                      STAT=ialloc )
       ierr = ierr + ialloc
       !
-      ALLOCATE( risf_cav_tsc(jpi,jpj,jpts) , risf_cav_tsc_b(jpi,jpj,jpts) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( risfload(jpi,jpj) , STAT=ialloc )
-      ierr = ierr + ialloc
-      !
-      ALLOCATE( mskisf_cav(jpi,jpj) , STAT=ialloc )
+      ! -------------------- !
+      ! == REDUCED ARRAYS == !
+      ! -------------------- !
+      ALLOCATE( fwfisf_oasis(A2D(0)) , risf_par_tsc  (A2D(0),jpts) , risf_cav_tsc  (A2D(0),jpts) , mskisf_cav(A2D(0)) , &
+#if ! defined key_RK3
+         &                             risf_par_tsc_b(A2D(0),jpts) , risf_cav_tsc_b(A2D(0),jpts) , &  ! MLF : need to allocate before arrays
+#endif
+         &                                                                  STAT=ialloc )
       ierr = ierr + ialloc
       !
       CALL mpp_sum ( 'isf', ierr )
       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
       !
-      ! initalisation of fwf and tsc array to 0
-      risfload    (:,:)   = 0._wp
-      fwfisf_oasis(:,:)   = 0._wp
-      fwfisf_par  (:,:)   = 0._wp   ;   fwfisf_par_b  (:,:)   = 0._wp
-      fwfisf_cav  (:,:)   = 0._wp   ;   fwfisf_cav_b  (:,:)   = 0._wp
-      risf_cav_tsc(:,:,:) = 0._wp   ;   risf_cav_tsc_b(:,:,:) = 0._wp
-      risf_par_tsc(:,:,:) = 0._wp   ;   risf_par_tsc_b(:,:,:) = 0._wp
-      !
    END SUBROUTINE isf_alloc
    
    !!======================================================================
diff --git a/tests/ISOMIP+/MY_SRC/isfcavgam.F90 b/tests/ISOMIP+/MY_SRC/isfcavgam.F90
deleted file mode 100644
index 6c0ac2a4..00000000
--- a/tests/ISOMIP+/MY_SRC/isfcavgam.F90
+++ /dev/null
@@ -1,253 +0,0 @@
-MODULE isfcavgam
-   !!======================================================================
-   !!                       ***  MODULE  isfgammats  ***
-   !! Ice shelf gamma module :  compute exchange coeficient at the ice/ocean interface
-   !!======================================================================
-   !! History :  4.1  !  (P. Mathiot) original
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   isfcav_gammats       : compute exchange coeficient gamma 
-   !!----------------------------------------------------------------------
-   USE isf_oce
-   USE isfutils, ONLY: debug
-   USE isftbl  , ONLY: isf_tbl
-
-   USE oce     , ONLY: uu, vv              ! ocean dynamics
-   USE phycst  , ONLY: grav, vkarmn        ! physical constant
-   USE eosbn2  , ONLY: eos_rab             ! equation of state
-   USE zdfdrg  , ONLY: rCd0_top, r_ke0_top ! vertical physics: top/bottom drag coef.
-   USE iom     , ONLY: iom_put             !
-   USE lib_mpp , ONLY: ctl_stop
-
-   USE dom_oce        ! ocean space and time domain
-   USE in_out_manager ! I/O manager
-   !
-   IMPLICIT NONE
-   !
-   PRIVATE
-   !
-   PUBLIC   isfcav_gammats
-
-   !! * Substitutions   
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-   !
-   !!-----------------------------------------------------------------------------------------------------
-   !!                              PUBLIC SUBROUTINES 
-   !!-----------------------------------------------------------------------------------------------------
-   !
-   SUBROUTINE isfcav_gammats( Kmm, pttbl, pstbl, pqoce, pqfwf, pRc, pgt, pgs )
-      !!----------------------------------------------------------------------
-      !! ** Purpose    : compute the coefficient echange for heat and fwf flux
-      !!
-      !! ** Method     : select the gamma formulation
-      !!                 3 method available (cst, vel and vel_stab)
-      !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt  , pgs      ! gamma t and gamma s 
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                                     :: Kmm             ! ocean time level index
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pqoce, pqfwf    ! isf heat and fwf
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl    ! top boundary layer tracer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pRc             ! Richardson number
-      !!---------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj)                :: zutbl, zvtbl    ! top boundary layer velocity
-      !!---------------------------------------------------------------------
-      !
-      !==========================================
-      ! 1.: compute velocity in the tbl if needed
-      !==========================================
-      !
-      SELECT CASE ( cn_gammablk )
-      CASE ( 'spe'  ) 
-         ! gamma is constant (specified in namelist)
-         ! nothing to do
-      CASE ('vel', 'vel_stab')
-         ! compute velocity in tbl
-         CALL isf_tbl(Kmm, uu(:,:,:,Kmm) ,zutbl(:,:),'U', miku, rhisf_tbl_cav)
-         CALL isf_tbl(Kmm, vv(:,:,:,Kmm) ,zvtbl(:,:),'V', mikv, rhisf_tbl_cav)
-         !
-         ! mask velocity in tbl with ice shelf mask
-         zutbl(:,:) = zutbl(:,:) * mskisf_cav(:,:)
-         zvtbl(:,:) = zvtbl(:,:) * mskisf_cav(:,:)
-         !
-         ! output
-         CALL iom_put('utbl',zutbl(:,:))
-         CALL iom_put('vtbl',zvtbl(:,:))
-      CASE DEFAULT
-         CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
-      END SELECT
-      ! 
-      !==========================================
-      ! 2.: compute gamma
-      !==========================================
-      !
-      SELECT CASE ( cn_gammablk )
-      CASE ( 'spe'  ) ! gamma is constant (specified in namelist)
-         pgt(:,:) = rn_gammat0
-         pgs(:,:) = rn_gammas0
-      CASE ( 'vel' ) ! gamma is proportional to u*
-         CALL gammats_vel      (                   zutbl, zvtbl, rCd0_top, r_ke0_top,                    pgt, pgs )
-      CASE ( 'vel_stab' ) ! gamma depends of stability of boundary layer and u*
-         CALL gammats_vel_stab (Kmm, pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pRc, pgt, pgs )
-      CASE DEFAULT
-         CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
-      END SELECT
-      !
-      !==========================================
-      ! 3.: output and debug
-      !==========================================
-      !
-      CALL iom_put('isfgammat', pgt(:,:))
-      CALL iom_put('isfgammas', pgs(:,:))
-      !
-      IF (ln_isfdebug) THEN
-         CALL debug( 'isfcav_gam pgt:', pgt(:,:) )
-         CALL debug( 'isfcav_gam pgs:', pgs(:,:) )
-      END IF
-      !
-   END SUBROUTINE isfcav_gammats
-   !
-   !!-----------------------------------------------------------------------------------------------------
-   !!                              PRIVATE SUBROUTINES 
-   !!-----------------------------------------------------------------------------------------------------
-   !
-   SUBROUTINE gammats_vel( putbl, pvtbl, pCd, pke2, &   ! <<== in
-      &                                  pgt, pgs   )   ! ==>> out gammats [m/s]
-      !!----------------------------------------------------------------------
-      !! ** Purpose    : compute the coefficient echange coefficient 
-      !!
-      !! ** Method     : gamma is velocity dependent ( gt= gt0 * Ustar )
-      !!
-      !! ** Reference  : Asay-Davis et al., Geosci. Model Dev., 9, 2471-2497, 2016
-      !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt, pgs     ! gammat and gammas [m/s]
-      !!-------------------------- IN  -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: putbl, pvtbl ! velocity in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pCd          ! drag coefficient
-      REAL(wp),                     INTENT(in   ) :: pke2         ! background velocity
-      !!---------------------------------------------------------------------
-      INTEGER  :: ji, jj                     ! loop index
-      REAL(wp), DIMENSION(jpi,jpj) :: zustar
-      !!---------------------------------------------------------------------
-      !
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         ! compute ustar (AD15 eq. 27)
-         zustar(ji,jj) = SQRT( pCd(ji,jj) * ( putbl(ji,jj) * putbl(ji,jj) + pvtbl(ji,jj) * pvtbl(ji,jj) + pke2 ) ) * mskisf_cav(ji,jj)
-         !
-         ! Compute gammats
-         pgt(ji,jj) = zustar(ji,jj) * rn_gammat0
-         pgs(ji,jj) = zustar(ji,jj) * rn_gammas0
-      END_2D
-      !
-      ! output ustar
-      CALL iom_put('isfustar',zustar(:,:))
-      !
-   END SUBROUTINE gammats_vel
-
-   SUBROUTINE gammats_vel_stab( Kmm, pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, pRc, &  ! <<== in
-      &                                                                     pgt  , pgs         )  ! ==>> out gammats [m/s]
-      !!----------------------------------------------------------------------
-      !! ** Purpose    : compute the coefficient echange coefficient 
-      !!
-      !! ** Method     : gamma is velocity dependent and stability dependent
-      !!
-      !! ** Reference  : Holland and Jenkins, 1999, JPO, p1787-1800
-      !!---------------------------------------------------------------------
-      !!-------------------------- OUT -------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pgt, pgs     ! gammat and gammas
-      !!-------------------------- IN  -------------------------------------
-      INTEGER                                     :: Kmm            ! ocean time level index
-      REAL(wp),                     INTENT(in   ) :: pke2           ! background velocity squared
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pqoce, pqfwf   ! surface heat flux and fwf flux
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pCd            ! drag coeficient
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: putbl, pvtbl   ! velocity in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pttbl, pstbl   ! tracer   in the losch top boundary layer
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pRc            ! Richardson number
-      !!---------------------------------------------------------------------
-      INTEGER  :: ji, jj                     ! loop index
-      INTEGER  :: ikt                        ! local integer
-      REAL(wp) :: zdku, zdkv                 ! U, V shear 
-      REAL(wp) :: zPr, zSc                   ! Prandtl and Scmidth number 
-      REAL(wp) :: zmob, zmols                ! Monin Obukov length, coriolis factor at T point
-      REAL(wp) :: zbuofdep, zhnu             ! Bouyancy length scale, sublayer tickness
-      REAL(wp) :: zhmax                      ! limitation of mol
-      REAL(wp) :: zetastar                   ! stability parameter
-      REAL(wp) :: zgmolet, zgmoles, zgturb   ! contribution of modelecular sublayer and turbulence 
-      REAL(wp) :: zcoef                      ! temporary coef
-      REAL(wp) :: zdep
-      REAL(wp) :: zeps = 1.0e-20_wp    
-      REAL(wp), PARAMETER :: zxsiN = 0.052_wp   ! dimensionless constant
-      REAL(wp), PARAMETER :: znu   = 1.95e-6_wp ! kinamatic viscosity of sea water (m2.s-1)
-      REAL(wp), DIMENSION(2) :: zts, zab
-      REAL(wp), DIMENSION(jpi,jpj) :: zustar    ! friction velocity
-      !!---------------------------------------------------------------------
-      !
-      ! compute Pr and Sc number (eq ??)
-      zPr =   13.8_wp
-      zSc = 2432.0_wp
-      !
-      ! compute gamma mole (eq ??)
-      zgmolet = 12.5_wp * zPr ** (2.0/3.0) - 6.0_wp
-      zgmoles = 12.5_wp * zSc ** (2.0/3.0) - 6.0_wp
-      !
-      ! compute gamma
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-
-         ikt = mikt(ji,jj)
-
-         ! compute ustar
-         zustar(ji,jj) = SQRT( pCd(ji,jj) * ( putbl(ji,jj) * putbl(ji,jj) + pvtbl(ji,jj) * pvtbl(ji,jj) + pke2 ) )
-
-         IF( zustar(ji,jj) == 0._wp ) THEN           ! only for kt = 1 I think
-            pgt(ji,jj) = rn_gammat0
-            pgs(ji,jj) = rn_gammas0
-         ELSE
-            ! compute bouyancy 
-            zts(jp_tem) = pttbl(ji,jj)
-            zts(jp_sal) = pstbl(ji,jj)
-            zdep        = gdepw(ji,jj,ikt,Kmm)
-            !
-            CALL eos_rab( zts, zdep, zab, Kmm )
-            !
-            ! compute length scale (Eq ??)
-            zbuofdep = grav * ( zab(jp_tem) * pqoce(ji,jj) - zab(jp_sal) * pqfwf(ji,jj) )
-            !
-            ! compute Monin Obukov Length
-            ! Maximum boundary layer depth (Eq ??)
-            zhmax = gdept(ji,jj,mbkt(ji,jj),Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm) -0.001_wp
-            !
-            ! Compute Monin obukhov length scale at the surface and Ekman depth: (Eq ??)
-            zmob   = zustar(ji,jj) ** 3 / (vkarmn * (zbuofdep + zeps))
-            zmols  = SIGN(1._wp, zmob) * MIN(ABS(zmob), zhmax) * tmask(ji,jj,ikt)
-            !
-            ! compute eta* (stability parameter) (Eq ??)
-            zetastar = 1._wp / ( SQRT(1._wp + MAX( 0._wp, zxsiN * zustar(ji,jj) &
-               &                                        / MAX( 1.e-20, ABS(ff_t(ji,jj)) * zmols * pRc(ji,jj) ) )))
-            !
-            ! compute the sublayer thickness (Eq ??)
-            zhnu = 5 * znu / MAX( 1.e-20, zustar(ji,jj) )
-            !
-            ! compute gamma turb (Eq ??)
-            zgturb = 1._wp / vkarmn * LOG(zustar(ji,jj) * zxsiN * zetastar * zetastar / MAX( 1.e-10, ABS(ff_t(ji,jj)) * zhnu )) &
-               &      + 1._wp / ( 2 * zxsiN * zetastar ) - 1._wp / vkarmn
-            !
-            ! compute gammats
-            pgt(ji,jj) = zustar(ji,jj) / (zgturb + zgmolet)
-            pgs(ji,jj) = zustar(ji,jj) / (zgturb + zgmoles)
-         END IF
-      END_2D
-      ! output ustar
-      CALL iom_put('isfustar',zustar(:,:))
-
-   END SUBROUTINE gammats_vel_stab
-
-END MODULE isfcavgam
diff --git a/tests/ISOMIP+/MY_SRC/isfstp.F90 b/tests/ISOMIP+/MY_SRC/isfstp.F90
deleted file mode 100644
index 2ab92084..00000000
--- a/tests/ISOMIP+/MY_SRC/isfstp.F90
+++ /dev/null
@@ -1,322 +0,0 @@
-MODULE isfstp
-   !!======================================================================
-   !!                       ***  MODULE  isfstp  ***
-   !! Ice Shelves :  compute iceshelf load, melt and heat flux
-   !!======================================================================
-   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav
-   !!            X.X  !  2006-02  (C. Wang   ) Original code bg03
-   !!            3.4  !  2013-03  (P. Mathiot) Merging + parametrization
-   !!            4.1  !  2019-09  (P. Mathiot) Split param/explicit ice shelf and re-organisation
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   isfstp       : compute iceshelf melt and heat flux
-   !!----------------------------------------------------------------------
-   USE isf_oce                                      ! isf variables
-   USE isfload, ONLY: isf_load                      ! ice shelf load
-   USE isftbl , ONLY: isf_tbl_lvl                   ! ice shelf boundary layer
-   USE isfpar , ONLY: isf_par, isf_par_init         ! ice shelf parametrisation
-   USE isfcav , ONLY: isf_cav, isf_cav_init         ! ice shelf cavity
-   USE isfcpl , ONLY: isfcpl_rst_write, isfcpl_init ! isf variables
-
-   USE dom_oce        ! ocean space and time domain
-   USE oce      , ONLY: ssh                           ! sea surface height
-   USE domvvl,  ONLY: ln_vvl_zstar                      ! zstar logical
-   USE zdfdrg,  ONLY: r_Cdmin_top, r_ke0_top            ! vertical physics: top/bottom drag coef.
-   !
-   USE lib_mpp, ONLY: ctl_stop, ctl_nam
-   USE fldread, ONLY: FLD, FLD_N
-   USE in_out_manager ! I/O manager
-   USE timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   isf_stp, isf_init, isf_nam  ! routine called in sbcmod and divhor
-
-   !! * Substitutions
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: isfstp.F90 15574 2021-12-03 19:32:50Z techene $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
- 
-   SUBROUTINE isf_stp( kt, Kmm )
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_stp  ***
-      !!
-      !! ** Purpose : compute total heat flux and total fwf due to ice shelf melt
-      !!
-      !! ** Method  : For each case (parametrisation or explicity cavity) :
-      !!              - define the before fields
-      !!              - compute top boundary layer properties
-      !!                (in case of parametrisation, this is the 
-      !!                 depth range model array used to compute mean far fields properties)
-      !!              - compute fluxes
-      !!              - write restart variables
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) ::   kt    ! ocean time step
-      INTEGER, INTENT(in) ::   Kmm   ! ocean time level index
-      !
-      INTEGER :: jk                              ! loop index
-#if defined key_qco
-      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t   ! 3D workspace
-#endif
-      !!---------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('isf')
-      !
-      !=======================================================================
-      ! 1.: compute melt and associated heat fluxes in the ice shelf cavities
-      !=======================================================================
-      !
-      IF ( ln_isfcav_mlt ) THEN
-         !
-         ! 1.1: before time step 
-         IF ( kt /= nit000 ) THEN 
-            risf_cav_tsc_b (:,:,:) = risf_cav_tsc (:,:,:)
-            fwfisf_cav_b(:,:)      = fwfisf_cav(:,:)
-         END IF
-         !
-         ! 1.2: compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
-         rhisf_tbl_cav(:,:) = rn_htbl * mskisf_cav(:,:)
-#if defined key_qco
-         DO jk = 1, jpk
-            ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         END DO 
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
-#else
-         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
-#endif
-         !
-         ! 1.3: compute ice shelf melt
-         CALL isf_cav( kt, Kmm, risf_cav_tsc, fwfisf_cav )
-         !
-      END IF
-      ! 
-      !=================================================================================
-      ! 2.: compute melt and associated heat fluxes for not resolved ice shelf cavities
-      !=================================================================================
-      !
-      IF ( ln_isfpar_mlt ) THEN
-         !
-         ! 2.1: before time step 
-         IF ( kt /= nit000 ) THEN 
-            risf_par_tsc_b(:,:,:) = risf_par_tsc(:,:,:)
-            fwfisf_par_b  (:,:)   = fwfisf_par  (:,:)
-         END IF
-         !
-         ! 2.2: compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
-         ! by simplicity, we assume the top level where param applied do not change with time (done in init part)
-         rhisf_tbl_par(:,:) = rhisf0_tbl_par(:,:)
-#if defined key_qco
-         DO jk = 1, jpk
-            ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
-         END DO
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
-#else
-         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
-#endif
-         !
-         ! 2.3: compute ice shelf melt
-         CALL isf_par( kt, Kmm, risf_par_tsc, fwfisf_par )
-         !
-      END IF
-      !
-      !==================================================================================
-      ! 3.: output specific restart variable in case of coupling with an ice sheet model
-      !==================================================================================
-      !
-      IF ( ln_isfcpl .AND. lrst_oce ) CALL isfcpl_rst_write(kt, Kmm)
-      !
-      IF( ln_timing )   CALL timing_stop('isf')
-      !
-   END SUBROUTINE isf_stp
-
-   
-   SUBROUTINE isf_init( Kbb, Kmm, Kaa )
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isfstp_init  ***
-      !!
-      !! ** Purpose :   Initialisation of the ice shelf public variables
-      !!
-      !! ** Method  :   Read the namisf namelist, check option compatibility and set derived parameters
-      !!
-      !! ** Action  : - read namisf parameters
-      !!              - allocate memory
-      !!              - output print
-      !!              - ckeck option compatibility
-      !!              - call cav/param/isfcpl init routine
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) ::   Kbb, Kmm, Kaa   ! ocean time level indices
-      !!----------------------------------------------------------------------
-      !
-      ! constrain: l_isfoasis need to be known
-      !
-      CALL isf_nam()                                              ! Read namelist
-      !
-      CALL isf_alloc()                                            ! Allocate public array
-      !
-      CALL isf_ctl()                                              ! check option compatibility
-      !
-      IF( ln_isfcav ) CALL isf_load( Kmm, risfload )              ! compute ice shelf load
-      !
-      ! terminate routine now if no ice shelf melt formulation specify
-      IF( ln_isf ) THEN
-         !
-         IF( ln_isfcav_mlt )   CALL isf_cav_init()                ! initialisation melt in the cavity
-         !
-         IF( ln_isfpar_mlt )   CALL isf_par_init()                ! initialisation parametrised melt
-         !
-         IF( ln_isfcpl     )   CALL isfcpl_init( Kbb, Kmm, Kaa )  ! initialisation ice sheet coupling
-         !
-      END IF
-         
-  END SUBROUTINE isf_init
-
-  
-  SUBROUTINE isf_ctl()
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_ctl  ***
-      !!
-      !! ** Purpose :   output print and option compatibility check
-      !!
-      !!----------------------------------------------------------------------
-      IF (lwp) THEN
-         WRITE(numout,*)
-         WRITE(numout,*) 'isf_init : ice shelf initialisation'
-         WRITE(numout,*) '~~~~~~~~~~~~'
-         WRITE(numout,*) '   Namelist namisf :'
-         !
-         WRITE(numout,*) '   ice shelf cavity (open or parametrised)  ln_isf = ', ln_isf
-         WRITE(numout,*)
-         !
-         IF ( ln_isf ) THEN
-#if key_qco 
-# if ! defined key_isf 
-            CALL ctl_stop( 'STOP', 'isf_ctl: ice shelf requires both ln_isf=T AND key_isf activated' ) 
-# endif 
-#endif
-            WRITE(numout,*) '      Add debug print in isf module           ln_isfdebug     = ', ln_isfdebug
-            WRITE(numout,*)
-            WRITE(numout,*) '      melt inside the cavity                  ln_isfcav_mlt   = ', ln_isfcav_mlt
-            IF ( ln_isfcav_mlt) THEN
-               WRITE(numout,*) '         melt formulation                         cn_isfcav_mlt= ', TRIM(cn_isfcav_mlt)
-               WRITE(numout,*) '         thickness of the top boundary layer      rn_htbl      = ', rn_htbl
-               WRITE(numout,*) '         gamma formulation                        cn_gammablk  = ', TRIM(cn_gammablk) 
-               IF ( TRIM(cn_gammablk) .NE. 'spe' ) THEN 
-                  WRITE(numout,*) '         gammat coefficient                       rn_gammat0   = ', rn_gammat0  
-                  WRITE(numout,*) '         gammas coefficient                       rn_gammas0   = ', rn_gammas0  
-                  WRITE(numout,*) '         top background ke used (from namdrg_top) rn_ke0       = ', r_ke0_top
-                  WRITE(numout,*) '         top drag coef.    used (from namdrg_top) rn_Cd0       = ', r_Cdmin_top
-               END IF
-            END IF
-            WRITE(numout,*) ''
-            !
-            WRITE(numout,*) '      ice shelf melt parametrisation          ln_isfpar_mlt   = ', ln_isfpar_mlt
-            IF ( ln_isfpar_mlt ) THEN
-               WRITE(numout,*) '         isf parametrisation formulation         cn_isfpar_mlt   = ', TRIM(cn_isfpar_mlt)
-            END IF
-            WRITE(numout,*) ''
-            !
-            WRITE(numout,*) '      Coupling to an ice sheet model          ln_isfcpl       = ', ln_isfcpl
-            IF ( ln_isfcpl ) THEN
-               WRITE(numout,*) '         conservation activated ln_isfcpl_cons     = ', ln_isfcpl_cons
-               WRITE(numout,*) '         number of call of the extrapolation loop  = ', nn_drown
-            ENDIF
-            WRITE(numout,*) ''
-            !
-         ELSE
-            !
-            IF ( ln_isfcav ) THEN
-               WRITE(numout,*) ''
-               WRITE(numout,*) '   W A R N I N G: ice shelf cavities are open BUT no melt will be computed or read from file !'
-               WRITE(numout,*) ''
-            END IF
-            !
-         END IF
-
-         IF (ln_isfcav) THEN
-            WRITE(numout,*) '      Ice shelf load method                   cn_isfload        = ', TRIM(cn_isfload)
-            WRITE(numout,*) '         Temperature used to compute the ice shelf load            = ', rn_isfload_T
-            WRITE(numout,*) '         Salinity    used to compute the ice shelf load            = ', rn_isfload_S
-         END IF
-         WRITE(numout,*) ''
-         FLUSH(numout)
-
-      END IF
-      !
-
-      !---------------------------------------------------------------------------------------------------------------------
-      ! sanity check  ! issue ln_isfcav not yet known as well as l_isfoasis  => move this call in isf_stp ?
-      ! melt in the cavity without cavity
-      IF ( ln_isfcav_mlt .AND. (.NOT. ln_isfcav) ) &
-          &   CALL ctl_stop('ice shelf melt in the cavity activated (ln_isfcav_mlt) but no cavity detected in domcfg (ln_isfcav), STOP' )
-      !
-      ! ice sheet coupling without cavity
-      IF ( ln_isfcpl .AND. (.NOT. ln_isfcav) ) &
-         &   CALL ctl_stop('coupling with an ice sheet model detected (ln_isfcpl) but no cavity detected in domcfg (ln_isfcav), STOP' )
-      !
-      IF ( ln_isfcpl .AND. ln_isfcpl_cons .AND. ln_linssh ) &
-         &   CALL ctl_stop( 'The coupling between NEMO and an ice sheet model with the conservation option does not work with the linssh option' )
-      !
-      IF ( l_isfoasis .AND. .NOT. ln_isf ) CALL ctl_stop( ' OASIS send ice shelf fluxes to NEMO but NEMO does not have the isf module activated' )
-      !
-      IF ( l_isfoasis .AND. ln_isf ) THEN
-         !
-         CALL ctl_stop( 'namelist combination ln_cpl and ln_isf not tested' )
-         !
-         ! NEMO coupled to ATMO model with isf cavity need oasis method for melt computation 
-         IF ( ln_isfcav_mlt .AND. TRIM(cn_isfcav_mlt) /= 'oasis' ) CALL ctl_stop( 'cn_isfcav_mlt = oasis is the only option availble if fwf send by oasis' )
-         IF ( ln_isfpar_mlt .AND. TRIM(cn_isfpar_mlt) /= 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis is the only option availble if fwf send by oasis' )
-         !
-         ! oasis melt computation not tested (coded but not tested)
-         IF ( ln_isfcav_mlt .OR. ln_isfpar_mlt ) THEN
-            IF ( TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfcav_mlt = oasis not tested' )
-            IF ( TRIM(cn_isfpar_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis not tested' )
-         END IF
-         !
-         ! oasis melt computation with cavity open and cavity parametrised (not coded)
-         IF ( ln_isfcav_mlt .AND. ln_isfpar_mlt ) THEN
-            IF ( TRIM(cn_isfpar_mlt) == 'oasis' .AND. TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis and cn_isfcav_mlt = oasis not coded' )
-         END IF
-         !
-         ! compatibility ice shelf and vvl
-         IF( .NOT. ln_vvl_zstar .AND. ln_isf ) CALL ctl_stop( 'Only vvl_zstar has been tested with ice shelf cavity' )
-         !
-      END IF
-   END SUBROUTINE isf_ctl
-
-   
-   SUBROUTINE isf_nam
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE isf_nam  ***
-      !!
-      !! ** Purpose :   Read ice shelf namelist cfg and ref
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER               :: ios                  ! Local integer output status for namelist read
-      !!----------------------------------------------------------------------
-      NAMELIST/namisf/ ln_isf        ,                                                           & 
-         &             cn_gammablk   , rn_gammat0    , rn_gammas0    , rn_htbl, sn_isfcav_fwf,   &
-         &             ln_isfcav_mlt , cn_isfcav_mlt , sn_isfcav_fwf ,                           &
-         &             ln_isfpar_mlt , cn_isfpar_mlt , sn_isfpar_fwf ,                           &
-         &             sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff,                           &
-         &             ln_isfcpl     , nn_drown      , ln_isfcpl_cons, ln_isfdebug,              &
-         &             cn_isfload    , rn_isfload_T  , rn_isfload_S  , cn_isfdir  ,              &
-         &             rn_isfpar_bg03_gt0
-      !!----------------------------------------------------------------------
-      !
-      READ  ( numnam_ref, namisf, IOSTAT = ios, ERR = 901)
-901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namisf in reference namelist' )
-      !
-      READ  ( numnam_cfg, namisf, IOSTAT = ios, ERR = 902 )
-902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namisf in configuration namelist' )
-      IF(lwm) WRITE ( numond, namisf )
-
-   END SUBROUTINE isf_nam
-   !!
-   !!======================================================================
-END MODULE isfstp
diff --git a/tests/ISOMIP+/MY_SRC/istate.F90 b/tests/ISOMIP+/MY_SRC/istate.F90
index 0f32b25a..b85ac87d 100644
--- a/tests/ISOMIP+/MY_SRC/istate.F90
+++ b/tests/ISOMIP+/MY_SRC/istate.F90
@@ -25,7 +25,6 @@ MODULE istate
    USE daymod         ! calendar
    USE dtatsd         ! data temperature and salinity   (dta_tsd routine)
    USE dtauvd         ! data: U & V current             (dta_uvd routine)
-   USE domvvl          ! varying vertical mesh
    USE wet_dry         ! wetting and drying (needed for wad_istate)
    USE usrdef_istate   ! User defined initial state
    !
@@ -50,7 +49,7 @@ MODULE istate
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: istate.F90 15581 2021-12-07 13:08:22Z techene $
+   !! $Id: istate.F90 14991 2021-06-14 19:52:31Z techene $
    !! Software governed by the CeCILL license (see ./LICENSE)
    !!----------------------------------------------------------------------
 CONTAINS
@@ -79,10 +78,12 @@ CONTAINS
       CALL dta_tsd_init                 ! Initialisation of T & S input data
       IF( ln_c1d) CALL dta_uvd_init     ! Initialisation of U & V input data (c1d only)
 
-      rhd  (:,:,:      ) = 0._wp   ;   rhop (:,:,:  ) = 0._wp      ! set one for all to 0 at level jpk
-      rn2b (:,:,:      ) = 0._wp   ;   rn2  (:,:,:  ) = 0._wp      ! set one for all to 0 at levels 1 and jpk
-      ts   (:,:,:,:,Kaa) = 0._wp                                   ! set one for all to 0 at level jpk
-      rab_b(:,:,:,:    ) = 0._wp   ;   rab_n(:,:,:,:) = 0._wp      ! set one for all to 0 at level jpk
+      ts   (:,:,:,:,Kaa) = 0._wp   ;   rn2  (:,:,:  ) = 0._wp         ! set one for all to 0 at levels 1 and jpk
+      IF ( ALLOCATED( rhd ) ) THEN                                    ! SWE, for example, will not have allocated these
+         rhd  (:,:,:      ) = 0._wp   ;   rhop (:,:,:  ) = 0._wp      ! set one for all to 0 at level jpk
+         rn2b (:,:,:      ) = 0._wp                                   ! set one for all to 0 at level jpk
+         rab_b(:,:,:,:    ) = 0._wp   ;   rab_n(:,:,:,:) = 0._wp      ! set one for all to 0 at level jpk
+      ENDIF
 #if defined key_agrif
       uu   (:,:,:  ,Kaa) = 0._wp   ! used in agrif_oce_sponge at initialization
       vv   (:,:,:  ,Kaa) = 0._wp   ! used in agrif_oce_sponge at initialization    
@@ -113,7 +114,7 @@ CONTAINS
             !                                    ! Initialization of ocean to zero
             !
             IF( ln_tsd_init ) THEN               
-               CALL dta_tsd( nit000, 'ini', ts(:,:,:,:,Kbb) )       ! read 3D T and S data at nit000
+               CALL dta_tsd( nit000, ts(:,:,:,:,Kbb), 'ini' )                     ! read 3D T and S data at nit000
             ENDIF
             !
             IF( ln_uvd_init .AND. ln_c1d ) THEN               
@@ -141,20 +142,6 @@ CONTAINS
       ENDIF
 #endif
       ! 
-      ! Initialize "now" barotropic velocities:
-      ! Do it whatever the free surface method, these arrays being used eventually 
-      !
-!!gm  the use of umask & vmask is not necessary below as uu(:,:,:,Kmm), vv(:,:,:,Kmm), uu(:,:,:,Kbb), vv(:,:,:,Kbb) are always masked
-#if ! defined key_RK3
-      uu_b(:,:,Kmm) = 0._wp   ;   vv_b(:,:,Kmm) = 0._wp
-      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
-         uu_b(ji,jj,Kmm) = uu_b(ji,jj,Kmm) + e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm) * umask(ji,jj,jk)
-         vv_b(ji,jj,Kmm) = vv_b(ji,jj,Kmm) + e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) * vmask(ji,jj,jk)
-      END_3D
-      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * r1_hu(:,:,Kmm)
-      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * r1_hv(:,:,Kmm)
-#endif
-      !
 #if defined key_RK3
       IF( .NOT. ln_rstart ) THEN
 #endif
@@ -171,6 +158,25 @@ CONTAINS
          ! 
 #if defined key_RK3
       ENDIF
+#endif
+      !
+      ! Initialize "now" barotropic velocities:
+      ! Do it whatever the free surface method, these arrays being used eventually 
+      !
+#if  defined key_RK3
+      IF( .NOT. ln_rstart ) THEN
+         uu_b(:,:,Kmm)   = uu_b(:,:,Kbb)   ! Kmm value set to Kbb for initialisation in Agrif_Regrid in namo_gcm
+         vv_b(:,:,Kmm)   = vv_b(:,:,Kbb)
+      ENDIF
+#else
+!!gm  the use of umask & vmask is not necessary below as uu(:,:,:,Kmm), vv(:,:,:,Kmm), uu(:,:,:,Kbb), vv(:,:,:,Kbb) are always masked
+      uu_b(:,:,Kmm) = 0._wp   ;   vv_b(:,:,Kmm) = 0._wp
+      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )
+         uu_b(ji,jj,Kmm) = uu_b(ji,jj,Kmm) + e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm) * umask(ji,jj,jk)
+         vv_b(ji,jj,Kmm) = vv_b(ji,jj,Kmm) + e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) * vmask(ji,jj,jk)
+      END_3D
+      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * r1_hu(:,:,Kmm)
+      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * r1_hv(:,:,Kmm)
 #endif
       !
    END SUBROUTINE istate_init
diff --git a/tests/ISOMIP+/MY_SRC/sbcfwb.F90 b/tests/ISOMIP+/MY_SRC/sbcfwb.F90
deleted file mode 100644
index 0102aa12..00000000
--- a/tests/ISOMIP+/MY_SRC/sbcfwb.F90
+++ /dev/null
@@ -1,277 +0,0 @@
-MODULE sbcfwb
-   !!======================================================================
-   !!                       ***  MODULE  sbcfwb  ***
-   !! Ocean fluxes   : domain averaged freshwater budget
-   !!======================================================================
-   !! History :  OPA  ! 2001-02  (E. Durand)  Original code
-   !!   NEMO     1.0  ! 2002-06  (G. Madec)  F90: Free form and module
-   !!            3.0  ! 2006-08  (G. Madec)  Surface module
-   !!            3.2  ! 2009-07  (C. Talandier) emp mean s spread over erp area 
-   !!            3.6  ! 2014-11  (P. Mathiot  ) add ice shelf melting
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   sbc_fwb       : freshwater budget for global ocean configurations (free surface & forced mode)
-   !!----------------------------------------------------------------------
-   USE oce            ! ocean dynamics and tracers
-   USE dom_oce        ! ocean space and time domain
-   USE sbc_oce        ! surface ocean boundary condition
-   USE isf_oce , ONLY : fwfisf_cav, fwfisf_par, ln_isfcpl, ln_isfcpl_cons, risfcpl_cons_ssh ! ice shelf melting contribution
-   USE sbc_ice , ONLY : snwice_mass, snwice_mass_b, snwice_fmass
-   USE phycst         ! physical constants
-   USE sbcrnf         ! ocean runoffs
-   USE sbcssr         ! Sea-Surface damping terms
-   !
-   USE in_out_manager ! I/O manager
-   USE iom            ! IOM
-   USE lib_mpp        ! distribued memory computing library
-   USE timing         ! Timing
-   USE lbclnk         ! ocean lateral boundary conditions
-   USE lib_fortran    ! 
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   sbc_fwb    ! routine called by step
-
-   REAL(wp) ::   rn_fwb0   ! initial freshwater adjustment flux [kg/m2/s] (nn_fwb = 2 only)
-   REAL(wp) ::   a_fwb     ! annual domain averaged freshwater budget from the previous year
-   REAL(wp) ::   a_fwb_b   ! annual domain averaged freshwater budget from the year before or at initial state
-   REAL(wp) ::   a_fwb_ini ! initial domain averaged freshwater budget
-   REAL(wp) ::   area      ! global mean ocean surface (interior domain)
-
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: sbcfwb.F90 11395 2019-08-02 14:19:00Z mathiot $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE sbc_fwb( kt, kn_fwb, kn_fsbc, Kmm )
-      !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE sbc_fwb  ***
-      !!
-      !! ** Purpose :   Control the mean sea surface drift
-      !!
-      !! ** Method  :   several ways  depending on kn_fwb
-      !!                =0 no control 
-      !!                =1 global mean of emp set to zero at each nn_fsbc time step
-      !!                =2 annual global mean corrected from previous year
-      !!                =3 global mean of emp set to zero at each nn_fsbc time step
-      !!                   & spread out over erp area depending its sign
-      !! Note: if sea ice is embedded it is taken into account when computing the budget 
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
-      INTEGER, INTENT( in ) ::   kn_fsbc  ! 
-      INTEGER, INTENT( in ) ::   kn_fwb   ! ocean time-step index
-      INTEGER, INTENT( in ) ::   Kmm      ! ocean time level index
-      !
-      INTEGER  ::   ios, inum, ikty       ! local integers
-      REAL(wp) ::   z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp                ! local scalars
-      REAL(wp) ::   zsurf_neg, zsurf_pos, zsurf_tospread, zcoef          !   -      -
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   ztmsk_neg, ztmsk_pos, z_wgt ! 2D workspaces
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   ztmsk_tospread, zerp_cor    !   -      -
-      REAL(wp)   ,DIMENSION(1) ::   z_fwfprv  
-      COMPLEX(dp),DIMENSION(1) ::   y_fwfnow  
-      !
-      NAMELIST/namsbc_fwb/rn_fwb0
-      !!----------------------------------------------------------------------
-      !
-      IF( kt == nit000 ) THEN
-         READ( numnam_ref, namsbc_fwb, IOSTAT = ios, ERR = 901 )
-901      IF( ios /= 0 ) CALL ctl_nam( ios, 'namsbc_fwb in reference namelist'     )
-         READ( numnam_cfg, namsbc_fwb, IOSTAT = ios, ERR = 902 )
-902      IF( ios >  0 ) CALL ctl_nam( ios, 'namsbc_fwb in configuration namelist' )
-         IF(lwm) WRITE( numond, namsbc_fwb )
-         IF(lwp) THEN
-            WRITE(numout,*)
-            WRITE(numout,*) 'sbc_fwb : FreshWater Budget correction'
-            WRITE(numout,*) '~~~~~~~'
-            IF( kn_fwb == 1 )   WRITE(numout,*) '          instantaneously set to zero'
-            IF( kn_fwb == 4 )   WRITE(numout,*) '          instantaneously set to zero with heat and salt flux correction (ISOMIP+)'
-            IF( kn_fwb == 3 )   WRITE(numout,*) '          fwf set to zero and spread out over erp area'
-            IF( kn_fwb == 2 ) THEN
-               WRITE(numout,*) '          adjusted from previous year budget'
-               WRITE(numout,*)
-               WRITE(numout,*) '   Namelist namsbc_fwb'
-               WRITE(numout,*) '      Initial freshwater adjustment flux [kg/m2/s] = ', rn_fwb0
-            END IF
-         ENDIF
-         !
-         IF( kn_fwb == 3 .AND. nn_sssr /= 2 )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 requires nn_sssr = 2, we stop ' )
-         IF( kn_fwb == 3 .AND. ln_isfcav    )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 with ln_isfcav = .TRUE. not working, we stop ' )
-         !
-         area = glob_sum( 'sbcfwb', e1e2t(:,:) * tmask(:,:,1))           ! interior global domain surface
-         ! isf cavities are excluded because it can feedback to the melting with generation of inhibition of plumes
-         ! and in case of no melt, it can generate HSSW.
-         !
-#if ! defined key_si3 && ! defined key_cice
-         snwice_mass_b(:,:) = 0.e0               ! no sea-ice model is being used : no snow+ice mass
-         snwice_mass  (:,:) = 0.e0
-         snwice_fmass (:,:) = 0.e0
-#endif
-         !
-      ENDIF
-
-      SELECT CASE ( kn_fwb )
-      !
-      CASE ( 1 )                             !==  global mean fwf set to zero  ==!
-         !
-         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
-            y_fwfnow(1) = local_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) - snwice_fmass(:,:) ) )
-            CALL mpp_delay_sum( 'sbcfwb', 'fwb', y_fwfnow(:), z_fwfprv(:), kt == nitend - nn_fsbc + 1 )
-            z_fwfprv(1) = z_fwfprv(1) / area
-            zcoef = z_fwfprv(1) * rcp
-            emp(:,:) = emp(:,:) - z_fwfprv(1)        * tmask(:,:,1)
-            qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction
-            ! outputs
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', zcoef * sst_m(:,:) * tmask(:,:,1) )
-            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', z_fwfprv(1)        * tmask(:,:,1) )
-         ENDIF
-         !
-      CASE ( 2 )                             !==  fw adjustment based on fw budget at the end of the previous year  ==!
-         !                                                simulation is supposed to start 1st of January
-         IF( kt == nit000 ) THEN                                                                 ! initialisation
-            !                                                                                    ! set the fw adjustment (a_fwb)
-            IF ( ln_rstart .AND. iom_varid( numror, 'a_fwb_b', ldstop = .FALSE. ) > 0     &      !    as read from restart file
-               &           .AND. iom_varid( numror, 'a_fwb',   ldstop = .FALSE. ) > 0 ) THEN
-               IF(lwp)   WRITE(numout,*) 'sbc_fwb : reading freshwater-budget from restart file'
-               CALL iom_get( numror, 'a_fwb_b', a_fwb_b )
-               CALL iom_get( numror, 'a_fwb'  , a_fwb )
-               !
-               a_fwb_ini = a_fwb_b
-            ELSE                                                                                 !    as specified in namelist
-               IF(lwp)   WRITE(numout,*) 'sbc_fwb : setting freshwater-budget from namelist rn_fwb0'
-               a_fwb   = rn_fwb0
-               a_fwb_b = 0._wp   ! used only the first year then it is replaced by a_fwb_ini
-               !
-               a_fwb_ini = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass(:,:) * r1_rho0 ) ) &
-                  &      * rho0 / ( area * rday * REAL(nyear_len(1), wp) )
-            END IF
-            !
-            IF(lwp)   WRITE(numout,*)
-            IF(lwp)   WRITE(numout,*)'sbc_fwb : freshwater-budget at the end of previous year = ', a_fwb    , 'kg/m2/s'
-            IF(lwp)   WRITE(numout,*)'          freshwater-budget at initial state            = ', a_fwb_ini, 'kg/m2/s'
-            !
-         ELSE
-            ! at the end of year n:
-            ikty = nyear_len(1) * 86400 / NINT(rn_Dt)
-            IF( MOD( kt, ikty ) == 0 ) THEN   ! Update a_fwb at the last time step of a year
-               !                                It should be the first time step of a year MOD(kt-1,ikty) but then the restart would be wrong
-               !                                Hence, we make a small error here but the code is restartable
-               a_fwb_b = a_fwb_ini
-               ! mean sea level taking into account ice+snow
-               a_fwb   = glob_sum( 'sbcfwb', e1e2t(:,:) * ( ssh(:,:,Kmm) + snwice_mass(:,:) * r1_rho0 ) )
-               a_fwb   = a_fwb * rho0 / ( area * rday * REAL(nyear_len(1), wp) )   ! convert in kg/m2/s
-            ENDIF
-            !
-         ENDIF
-         !
-         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN         ! correct the freshwater fluxes using previous year budget minus initial state
-            zcoef = ( a_fwb - a_fwb_b )
-            emp(:,:) = emp(:,:) + zcoef * tmask(:,:,1)
-            qns(:,:) = qns(:,:) - zcoef * rcp * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction
-            ! outputs
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -zcoef * rcp * sst_m(:,:) * tmask(:,:,1) )
-            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -zcoef * tmask(:,:,1) )
-         ENDIF
-         ! Output restart information
-         IF( lrst_oce ) THEN
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout,*) 'sbc_fwb : writing FW-budget adjustment to ocean restart file at it = ', kt
-            IF(lwp) WRITE(numout,*) '~~~~'
-            CALL iom_rstput( kt, nitrst, numrow, 'a_fwb_b', a_fwb_b )
-            CALL iom_rstput( kt, nitrst, numrow, 'a_fwb',   a_fwb   )
-         END IF
-         !
-         IF( kt == nitend .AND. lwp ) THEN
-            WRITE(numout,*) 'sbc_fwb : freshwater-budget at the end of simulation (year now) = ', a_fwb  , 'kg/m2/s'
-            WRITE(numout,*) '          freshwater-budget at initial state                    = ', a_fwb_b, 'kg/m2/s'
-         ENDIF
-         !
-      CASE ( 3 )                             !==  global fwf set to zero and spread out over erp area  ==!
-         !
-         ALLOCATE( ztmsk_neg(jpi,jpj) , ztmsk_pos(jpi,jpj) , ztmsk_tospread(jpi,jpj) , z_wgt(jpi,jpj) , zerp_cor(jpi,jpj) )
-         !
-         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
-            ztmsk_pos(:,:) = tmask_i(:,:)                      ! Select <0 and >0 area of erp
-            WHERE( erp < 0._wp )   ztmsk_pos = 0._wp
-            ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:)
-            !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges) 
-            z_fwf     = glob_sum( 'sbcfwb', e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) - snwice_fmass(:,:) ) ) / area
-            !            
-            IF( z_fwf < 0._wp ) THEN         ! spread out over >0 erp area to increase evaporation
-               zsurf_pos = glob_sum( 'sbcfwb', e1e2t(:,:)*ztmsk_pos(:,:) )
-               zsurf_tospread      = zsurf_pos
-               ztmsk_tospread(:,:) = ztmsk_pos(:,:)
-            ELSE                             ! spread out over <0 erp area to increase precipitation
-               zsurf_neg = glob_sum( 'sbcfwb', e1e2t(:,:)*ztmsk_neg(:,:) )  ! Area filled by <0 and >0 erp 
-               zsurf_tospread      = zsurf_neg
-               ztmsk_tospread(:,:) = ztmsk_neg(:,:)
-            ENDIF
-            !
-            zsum_fwf   = glob_sum( 'sbcfwb', e1e2t(:,:) * z_fwf )         ! fwf global mean over <0 or >0 erp area
-!!gm :  zsum_fwf   = z_fwf * area   ???  it is right?  I think so....
-            z_fwf_nsrf =  zsum_fwf / ( zsurf_tospread + rsmall )
-            !                                                  ! weight to respect erp field 2D structure 
-            zsum_erp   = glob_sum( 'sbcfwb', ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) )
-            z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall )
-            !                                                  ! final correction term to apply
-            zerp_cor(:,:) = -1. * z_fwf_nsrf * zsurf_tospread * z_wgt(:,:)
-            !
-!!gm   ===>>>>  lbc_lnk should be useless as all the computation is done over the whole domain !
-            CALL lbc_lnk( 'sbcfwb', zerp_cor, 'T', 1.0_wp )
-            !
-            emp(:,:) = emp(:,:) + zerp_cor(:,:)
-            qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:)  ! account for change to the heat budget due to fw correction
-            erp(:,:) = erp(:,:) + zerp_cor(:,:)
-            ! outputs
-            IF( iom_use('hflx_fwb_cea') )  CALL iom_put( 'hflx_fwb_cea', -zerp_cor(:,:) * rcp * sst_m(:,:) )
-            IF( iom_use('vflx_fwb_cea') )  CALL iom_put( 'vflx_fwb_cea', -zerp_cor(:,:) )
-            !
-            IF( lwp ) THEN                   ! control print
-               IF( z_fwf < 0._wp ) THEN
-                  WRITE(numout,*)'   z_fwf < 0'
-                  WRITE(numout,*)'   SUM(erp+)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv'
-               ELSE
-                  WRITE(numout,*)'   z_fwf >= 0'
-                  WRITE(numout,*)'   SUM(erp-)     = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv'
-               ENDIF
-               WRITE(numout,*)'   SUM(empG)     = ', SUM( z_fwf*e1e2t(:,:) )*1.e-9,' Sv'
-               WRITE(numout,*)'   z_fwf         = ', z_fwf      ,' Kg/m2/s'
-               WRITE(numout,*)'   z_fwf_nsrf    = ', z_fwf_nsrf ,' Kg/m2/s'
-               WRITE(numout,*)'   MIN(zerp_cor) = ', MINVAL(zerp_cor) 
-               WRITE(numout,*)'   MAX(zerp_cor) = ', MAXVAL(zerp_cor) 
-            ENDIF
-         ENDIF
-         DEALLOCATE( ztmsk_neg , ztmsk_pos , ztmsk_tospread , z_wgt , zerp_cor )
-         !
-      CASE ( 4 )                             !==  global mean fwf set to zero (ISOMIP case) ==!
-         !
-         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN
-            z_fwf = glob_sum( 'sbcfwb',  e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) - snwice_fmass(:,:) ) )
-            !
-            ! correction for ice sheet coupling testing (ie remove the excess through the surface)
-            ! test impact on the melt as conservation correction made in depth
-            ! test conservation level as sbcfwb is conserving
-            ! avoid the model to blow up for large ssh drop (isomip OCEAN3 with melt switch off and uniform T/S)
-            IF (ln_isfcpl .AND. ln_isfcpl_cons) THEN
-               z_fwf = z_fwf + glob_sum( 'sbcfwb',  e1e2t(:,:) * risfcpl_cons_ssh(:,:) * rho0 )
-            END IF
-            !
-            z_fwf = z_fwf / area
-            zcoef = z_fwf * rcp
-            emp(:,:) = emp(:,:) - z_fwf              * tmask(:,:,1) ! (Eq. 34 AD2015)
-            qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! (Eq. 35 AD2015) ! use sst_m to avoid generation of any bouyancy fluxes
-            sfx(:,:) = sfx(:,:) + z_fwf * sss_m(:,:) * tmask(:,:,1) ! (Eq. 36 AD2015) ! use sss_m to avoid generation of any bouyancy fluxes
-         ENDIF
-         !
-      CASE DEFAULT                           !==  you should never be there  ==!
-         CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1, 2 or 3' )
-         !
-      END SELECT
-      !
-   END SUBROUTINE sbc_fwb
-
-   !!======================================================================
-END MODULE sbcfwb
diff --git a/tests/ISOMIP+/MY_SRC/tradmp.F90 b/tests/ISOMIP+/MY_SRC/tradmp.F90
deleted file mode 100644
index 05ed5b09..00000000
--- a/tests/ISOMIP+/MY_SRC/tradmp.F90
+++ /dev/null
@@ -1,243 +0,0 @@
-MODULE tradmp
-   !!======================================================================
-   !!                       ***  MODULE  tradmp  ***
-   !! Ocean physics: internal restoring trend on active tracers (T and S)
-   !!======================================================================
-   !! History :  OPA  ! 1991-03  (O. Marti, G. Madec)  Original code
-   !!                 ! 1992-06  (M. Imbard)  doctor norme
-   !!                 ! 1998-07  (M. Imbard, G. Madec) ORCA version
-   !!            7.0  ! 2001-02  (M. Imbard)  add distance to coast, Original code
-   !!            8.1  ! 2001-02  (G. Madec, E. Durand)  cleaning
-   !!  NEMO      1.0  ! 2002-08  (G. Madec, E. Durand)  free form + modules
-   !!            3.2  ! 2009-08  (G. Madec, C. Talandier)  DOCTOR norm for namelist parameter
-   !!            3.3  ! 2010-06  (C. Ethe, G. Madec) merge TRA-TRC
-   !!            3.4  ! 2011-04  (G. Madec, C. Ethe) Merge of dtatem and dtasal + suppression of CPP keys
-   !!            3.6  ! 2015-06  (T. Graham)  read restoring coefficient in a file
-   !!            3.7  ! 2015-10  (G. Madec)  remove useless trends arrays
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   tra_dmp_alloc : allocate tradmp arrays
-   !!   tra_dmp       : update the tracer trend with the internal damping
-   !!   tra_dmp_init  : initialization, namlist read, parameters control
-   !!----------------------------------------------------------------------
-   USE oce            ! ocean: variables
-   USE dom_oce        ! ocean: domain variables
-   USE trd_oce        ! trends: ocean variables
-   USE trdtra         ! trends manager: tracers
-   USE zdf_oce        ! ocean: vertical physics
-   USE phycst         ! physical constants
-   USE dtatsd         ! data: temperature & salinity
-   USE zdfmxl         ! vertical physics: mixed layer depth
-   !
-   USE in_out_manager ! I/O manager
-   USE iom            ! XIOS
-   USE lib_mpp        ! MPP library
-   USE prtctl         ! Print control
-   USE timing         ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   tra_dmp        ! called by step.F90
-   PUBLIC   tra_dmp_init   ! called by nemogcm.F90
-
-   !                                           !!* Namelist namtra_dmp : T & S newtonian damping *
-   LOGICAL            , PUBLIC ::   ln_tradmp   !: internal damping flag
-   INTEGER            , PUBLIC ::   nn_zdmp     !: = 0/1/2 flag for damping in the mixed layer
-   CHARACTER(LEN=200) , PUBLIC ::   cn_resto    !: name of netcdf file containing restoration coefficient field
-   !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   resto    !: restoring coeff. on T and S (s-1)
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-#  include "domzgr_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: tradmp.F90 15574 2021-12-03 19:32:50Z techene $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   INTEGER FUNCTION tra_dmp_alloc()
-      !!----------------------------------------------------------------------
-      !!                ***  FUNCTION tra_dmp_alloc  ***
-      !!----------------------------------------------------------------------
-      ALLOCATE( resto(jpi,jpj,jpk), STAT= tra_dmp_alloc )
-      !
-      CALL mpp_sum ( 'tradmp', tra_dmp_alloc )
-      IF( tra_dmp_alloc > 0 )   CALL ctl_warn('tra_dmp_alloc: allocation of arrays failed')
-      !
-   END FUNCTION tra_dmp_alloc
-
-
-   SUBROUTINE tra_dmp( kt, Kbb, Kmm, pts, Krhs )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE tra_dmp  ***
-      !!
-      !! ** Purpose :   Compute the tracer trend due to a newtonian damping
-      !!      of the tracer field towards given data field and add it to the
-      !!      general tracer trends.
-      !!
-      !! ** Method  :   Newtonian damping towards t_dta and s_dta computed
-      !!      and add to the general tracer trends:
-      !!                     ta = ta + resto * (t_dta - tb)
-      !!                     sa = sa + resto * (s_dta - sb)
-      !!         The trend is computed either throughout the water column
-      !!      (nlmdmp=0) or in area of weak vertical mixing (nlmdmp=1) or
-      !!      below the well mixed layer (nlmdmp=2)
-      !!
-      !! ** Action  : - tsa: tracer trends updated with the damping trend
-      !!----------------------------------------------------------------------
-      INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index
-      INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
-      !
-      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts)     ::  zts_dta
-      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE ::  zwrk
-      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  ztrdts
-      !!----------------------------------------------------------------------
-      !
-      IF( ln_timing )   CALL timing_start('tra_dmp')
-      !
-      IF( l_trdtra .OR. iom_use('hflx_dmp_cea') .OR. iom_use('sflx_dmp_cea') ) THEN   !* Save ta and sa trends
-         ALLOCATE( ztrdts(A2D(nn_hls),jpk,jpts) )
-         DO jn = 1, jpts
-            DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
-               ztrdts(ji,jj,jk,jn) = pts(ji,jj,jk,jn,Krhs)
-            END_3D
-         END DO
-      ENDIF
-      !                           !==  input T-S data at kt  ==!
-      CALL dta_tsd( kt, 'dmp', zts_dta )            ! read and interpolates T-S data at kt
-      !
-      SELECT CASE ( nn_zdmp )     !==  type of damping  ==!
-      !
-      CASE( 0 )                        !*  newtonian damping throughout the water column  *!
-         DO jn = 1, jpts
-            DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-               pts(ji,jj,jk,jn,Krhs) = pts(ji,jj,jk,jn,Krhs)           &
-                  &                  + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jn) - pts(ji,jj,jk,jn,Kbb) )
-            END_3D
-         END DO
-         !
-      CASE ( 1 )                       !*  no damping in the turbocline (avt > 5 cm2/s)  *!
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            IF( avt(ji,jj,jk) <= avt_c ) THEN
-               pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs)   &
-                  &                      + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - pts(ji,jj,jk,jp_tem,Kbb) )
-               pts(ji,jj,jk,jp_sal,Krhs) = pts(ji,jj,jk,jp_sal,Krhs)   &
-                  &                      + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - pts(ji,jj,jk,jp_sal,Kbb) )
-            ENDIF
-         END_3D
-         !
-      CASE ( 2 )                       !*  no damping in the mixed layer   *!
-         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
-            IF( gdept(ji,jj,jk,Kmm) >= hmlp (ji,jj) ) THEN
-               pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs)   &
-                  &                      + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - pts(ji,jj,jk,jp_tem,Kbb) )
-               pts(ji,jj,jk,jp_sal,Krhs) = pts(ji,jj,jk,jp_sal,Krhs)   &
-                  &                      + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - pts(ji,jj,jk,jp_sal,Kbb) )
-            ENDIF
-         END_3D
-         !
-      END SELECT
-      !
-      ! outputs (clem trunk)
-      IF( iom_use('hflx_dmp_cea') .OR. iom_use('sflx_dmp_cea') ) THEN
-         ALLOCATE( zwrk(A2D(nn_hls),jpk) )          ! Needed to handle expressions containing e3t when using key_qco or key_linssh
-         zwrk(:,:,:) = 0._wp
-
-         IF( iom_use('hflx_dmp_cea') ) THEN
-            DO_3D( 0, 0, 0, 0, 1, jpk )
-               zwrk(ji,jj,jk) = ( pts(ji,jj,jk,jp_tem,Krhs) - ztrdts(ji,jj,jk,jp_tem) ) * e3t(ji,jj,jk,Kmm)
-            END_3D
-            CALL iom_put('hflx_dmp_cea', SUM( zwrk(:,:,:), dim=3 ) * rcp * rho0 ) ! W/m2
-         ENDIF
-         IF( iom_use('sflx_dmp_cea') ) THEN
-            DO_3D( 0, 0, 0, 0, 1, jpk )
-               zwrk(ji,jj,jk) = ( pts(ji,jj,jk,jp_sal,Krhs) - ztrdts(ji,jj,jk,jp_sal) ) * e3t(ji,jj,jk,Kmm)
-            END_3D
-            CALL iom_put('sflx_dmp_cea', SUM( zwrk(:,:,:), dim=3 ) * rho0 )       ! g/m2/s
-         ENDIF
-
-         DEALLOCATE( zwrk )
-      ENDIF
-      !
-      IF( l_trdtra )   THEN       ! trend diagnostic
-         ztrdts(:,:,:,:) = pts(:,:,:,:,Krhs) - ztrdts(:,:,:,:)
-         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_dmp, ztrdts(:,:,:,jp_tem) )
-         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_dmp, ztrdts(:,:,:,jp_sal) )
-         DEALLOCATE( ztrdts )
-      ENDIF
-      !                           ! Control print
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' dmp  - Ta: ', mask1=tmask,   &
-         &                                  tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-      !
-      IF( ln_timing )   CALL timing_stop('tra_dmp')
-      !
-   END SUBROUTINE tra_dmp
-
-
-   SUBROUTINE tra_dmp_init
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE tra_dmp_init  ***
-      !!
-      !! ** Purpose :   Initialization for the newtonian damping
-      !!
-      !! ** Method  :   read the namtra_dmp namelist and check the parameters
-      !!----------------------------------------------------------------------
-      INTEGER ::   ios, imask   ! local integers
-      !
-      NAMELIST/namtra_dmp/ ln_tradmp, nn_zdmp, cn_resto
-      !!----------------------------------------------------------------------
-      !
-      READ  ( numnam_ref, namtra_dmp, IOSTAT = ios, ERR = 901)
-901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_dmp in reference namelist' )
-      !
-      READ  ( numnam_cfg, namtra_dmp, IOSTAT = ios, ERR = 902 )
-902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtra_dmp in configuration namelist' )
-      IF(lwm) WRITE ( numond, namtra_dmp )
-      !
-      IF(lwp) THEN                  ! Namelist print
-         WRITE(numout,*)
-         WRITE(numout,*) 'tra_dmp_init : T and S newtonian relaxation'
-         WRITE(numout,*) '~~~~~~~~~~~~'
-         WRITE(numout,*) '   Namelist namtra_dmp : set relaxation parameters'
-         WRITE(numout,*) '      Apply relaxation   or not       ln_tradmp   = ', ln_tradmp
-         WRITE(numout,*) '         mixed layer damping option      nn_zdmp  = ', nn_zdmp
-         WRITE(numout,*) '         Damping file name               cn_resto = ', cn_resto
-         WRITE(numout,*)
-      ENDIF
-      !
-      IF( ln_tradmp ) THEN
-         !                          ! Allocate arrays
-         IF( tra_dmp_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'tra_dmp_init: unable to allocate arrays' )
-         !
-         SELECT CASE (nn_zdmp)      ! Check values of nn_zdmp
-         CASE ( 0 )   ;   IF(lwp) WRITE(numout,*) '   tracer damping as specified by mask'
-         CASE ( 1 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the mixing layer (kz > 5 cm2/s)'
-         CASE ( 2 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the mixed  layer'
-         CASE DEFAULT
-            CALL ctl_stop('tra_dmp_init : wrong value of nn_zdmp')
-         END SELECT
-         !
-         !!TG: Initialisation of dtatsd - Would it be better to have dmpdta routine
-         !    so can damp to something other than intitial conditions files?
-         !!gm: In principle yes. Nevertheless, we can't anticipate demands that have never been formulated.
-         IF( .NOT.ln_tsd_dmp ) THEN
-            IF(lwp) WRITE(numout,*)
-            IF(lwp) WRITE(numout, *)  '   read T-S data not initialized, we force ln_tsd_dmp=T'
-            CALL dta_tsd_init( ld_tradmp=ln_tradmp )        ! forces the initialisation of T-S data
-         ENDIF
-         !                          ! Read in mask from file
-         CALL iom_open ( cn_resto, imask)
-         CALL iom_get  ( imask, jpdom_auto, 'resto', resto )
-         CALL iom_close( imask )
-      ENDIF
-      !
-   END SUBROUTINE tra_dmp_init
-
-   !!======================================================================
-END MODULE tradmp
diff --git a/tests/ISOMIP+/cpp_ISOMIP+.fcm b/tests/ISOMIP+/cpp_ISOMIP+.fcm
index abd9e036..e2ce910a 100644
--- a/tests/ISOMIP+/cpp_ISOMIP+.fcm
+++ b/tests/ISOMIP+/cpp_ISOMIP+.fcm
@@ -1 +1 @@
- bld::tool::fppkeys   key_xios key_qco key_isf 
+ bld::tool::fppkeys   key_xios key_qco key_vco_1d key_isf 
diff --git a/tests/ISOMIP/EXPREF/ISOMIP_mlt.png b/tests/ISOMIP/EXPREF/ISOMIP_mlt.png
deleted file mode 100644
index 5435a75b3ce83568f9458cd51df0209e9b108b83..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 221790
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%0AJzYGiDauL5
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

diff --git a/tests/ISOMIP/EXPREF/ISOMIP_moc.png b/tests/ISOMIP/EXPREF/ISOMIP_moc.png
deleted file mode 100644
index 5afdfbd5c5f22d809056dbdb913beef70447b0bd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 507571
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%0AX-nuGL|=K*d=*j>
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
QL)KC3q~wW+<Ckv#U+H5Ex&QzG

diff --git a/tests/ISOMIP/EXPREF/ISOMIP_psi.png b/tests/ISOMIP/EXPREF/ISOMIP_psi.png
deleted file mode 100644
index 5c46d728c3b6dc012e6ffb669f52687b2abb58cc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 467568
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
Dr9kKs

diff --git a/tests/ISOMIP/EXPREF/README b/tests/ISOMIP/EXPREF/README
deleted file mode 100644
index 06dd5303..00000000
--- a/tests/ISOMIP/EXPREF/README
+++ /dev/null
@@ -1,25 +0,0 @@
-# ISOMIP is a simple TEST_CASE to test the iceshelves in NEMO.
-# no input files are needed (all is prescribed in MY_SRC/usr_def routines
-# for a reference documentation on the ISOMIP test case, see experiement 1 on http://efdl.cims.nyu.edu/project_oisi/isomip/experiments/phase_I/idealized_numerical_models_5.pdf
-
-# default namelist is setup for a 30y run on 32 processors with the minimum output using XIOS in attached mode with single file output
-
-# How to build moc.nc and psi.nc
-   - Download or clone the CDFTOOLS (see https://github.com/meom-group/CDFTOOLS)
-   - Compile all the tools (or at least cdfpsi and cdfmoc) on your cluster (see https://github.com/meom-group/CDFTOOLS#using-cdftools)
-   - if mesh_mask.nc is splitted, you need to rebuild them using the rebuild NEMO tools (see in NEMOGCM/TOOLS) or run 1 (or more) time step on a single processor (nn_itend variable in the namelist). 
-   - set the correct link: ln -s mesh_mask.nc mask.nc ; ln -s mesh_mask.nc mesh_hgr.nc ; ln -s mesh_mask.nc mesh_zgr.nc
-   - run the cdftools : 
-        - cdfmoc ISOMIP_1m_00010101_00301231_grid_V.nc                                       => moc.nc
-        - cdfpsi ISOMIP_1m_00010101_00301231_grid_U.nc ISOMIP_1m_00010101_00301231_grid_V.nc => psi.nc
-
-# How to plt moc/psi and melt (python with netcdf and matplotlib library requiried):
-   - psi.png => python2.7 plot_psi.py -f psi.nc -v sobarstf
-   - moc.png => python2.7 plot_moc.py -f moc.nc -v zomsfglo
-   - mlt.png => python2.7 plot_mlt.py -f ISOMIP_1m_00010101_00301231_grid_T.nc -v sowflisf
-by default the last time frame is plotted.
-
-# location the expected circulation and melt plot after 30y of run:
-   - ISOMIP/EXP00/ISOMIP_psi.png
-   - ISOMIP/EXP00/ISOMIP_moc.png
-   - ISOMIP/EXP00/ISOMIP_mlt.png
diff --git a/tests/ISOMIP/EXPREF/axis_def_nemo.xml b/tests/ISOMIP/EXPREF/axis_def_nemo.xml
deleted file mode 120000
index 6117f35b..00000000
--- a/tests/ISOMIP/EXPREF/axis_def_nemo.xml
+++ /dev/null
@@ -1 +0,0 @@
-../../../cfgs/SHARED/axis_def_nemo.xml
\ No newline at end of file
diff --git a/tests/ISOMIP/EXPREF/context_nemo.xml b/tests/ISOMIP/EXPREF/context_nemo.xml
deleted file mode 100644
index c7598d42..00000000
--- a/tests/ISOMIP/EXPREF/context_nemo.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
- ============================================================================================== 
-    NEMO context
-============================================================================================== 
--->
-<context id="nemo">
-    <!-- $id$ -->
-    <variable_definition>
-       <!-- Year/Month/Day of time origin for NetCDF files; defaults to 1800-01-01 -->
-       <variable id="ref_year"  type="int"> 1900 </variable>
-       <variable id="ref_month" type="int"> 01 </variable>
-       <variable id="ref_day"   type="int"> 01 </variable>
-       <variable id="rho0"      type="float" > 1026.0 </variable>
-       <variable id="cpocean"   type="float" > 3991.86795711963 </variable>
-       <variable id="convSpsu"  type="float" > 0.99530670233846  </variable>
-       <variable id="rhoic"     type="float" > 917.0 </variable>
-       <variable id="rhosn"     type="float" > 330.0 </variable>
-       <variable id="missval"  type="float" > 1.e20 </variable>	       
-    </variable_definition>
-
-<!-- Fields definition -->
-    <field_definition src="./field_def_nemo-oce.xml"/>   <!--  NEMO ocean dynamics                     -->
-
-<!-- Files definition -->
-    <file_definition src="./file_def_nemo-oce.xml"/>     <!--  NEMO ocean dynamics                     -->
-
-<!-- Axis definition -->
-    <axis_definition src="./axis_def_nemo.xml"/>
- 
-<!-- Domain definition -->
-    <domain_definition src="./domain_def_nemo.xml"/>
-
-<!-- Grids definition -->
-    <grid_definition   src="./grid_def_nemo.xml"/>
-  
-
-</context>
diff --git a/tests/ISOMIP/EXPREF/domain_def_nemo.xml b/tests/ISOMIP/EXPREF/domain_def_nemo.xml
deleted file mode 120000
index f344125a..00000000
--- a/tests/ISOMIP/EXPREF/domain_def_nemo.xml
+++ /dev/null
@@ -1 +0,0 @@
-../../../cfgs/SHARED/domain_def_nemo.xml
\ No newline at end of file
diff --git a/tests/ISOMIP/EXPREF/field_def_nemo-oce.xml b/tests/ISOMIP/EXPREF/field_def_nemo-oce.xml
deleted file mode 120000
index ff970681..00000000
--- a/tests/ISOMIP/EXPREF/field_def_nemo-oce.xml
+++ /dev/null
@@ -1 +0,0 @@
-../../../cfgs/SHARED/field_def_nemo-oce.xml
\ No newline at end of file
diff --git a/tests/ISOMIP/EXPREF/file_def_nemo-oce.xml b/tests/ISOMIP/EXPREF/file_def_nemo-oce.xml
deleted file mode 100644
index 77300b42..00000000
--- a/tests/ISOMIP/EXPREF/file_def_nemo-oce.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-    <!-- 
-============================================================================================================
-=                                           output files definition                                        =
-=                                            Define your own files                                         =
-=                                         put the variables you want...                                    =
-============================================================================================================
-    -->
-    
-    <file_definition type="one_file" name="@expname@_@freq@_@startdate@_@enddate@" sync_freq="1d" min_digits="4">
-    
-      <file_group id="1ts" output_freq="1ts"  output_level="10" enabled=".TRUE."/> <!-- 1 time step files -->
-      <file_group id="1h" output_freq="1h"  output_level="10" enabled=".TRUE."/> <!-- 1h files -->
-      <file_group id="2h" output_freq="2h"  output_level="10" enabled=".TRUE."/> <!-- 2h files -->
-      <file_group id="3h" output_freq="3h"  output_level="10" enabled=".TRUE."/> <!-- 3h files -->     
-      <file_group id="4h" output_freq="4h"  output_level="10" enabled=".TRUE."/> <!-- 4h files -->
-      <file_group id="6h" output_freq="6h"  output_level="10" enabled=".TRUE."/> <!-- 6h files -->
-     
-      <file_group id="1d" output_freq="1d"  output_level="10" enabled=".TRUE."/> <!-- 1d files -->
-      <file_group id="3d" output_freq="3d"  output_level="10" enabled=".TRUE."/> <!-- 3d files -->    
-      <file_group id="5d" output_freq="5d"  output_level="10" enabled=".TRUE.">  <!-- 5d files -->  
-
-      <file_group id="1m" output_freq="1mo" output_level="10" enabled=".TRUE."/> <!-- real monthly files -->
-	<file id="file1" output_freq="1mo" name_suffix="_grid_T" description="ocean T grid variables" >
-	  <field field_ref="toce"         name="votemper"  />
-	  <field field_ref="soce"         name="vosaline"  />
-	  <field field_ref="ssh"          name="sossheig"  />
-          <!-- variable for ice shelf -->
-          <field field_ref="fwfisf_cav"       name="sowflisf"  />
-          <field field_ref="isfgammat"    name="sogammat"  />
-          <field field_ref="isfgammas"    name="sogammas"  />
-        </file>
-	<file id="file2" output_freq="1mo" name_suffix="_grid_U" description="ocean U grid variables" >
-          <field field_ref="uoce"         name="vozocrtx"  />
-        </file>
-	<file id="file3" output_freq="1mo" name_suffix="_grid_V" description="ocean V grid variables" >
-          <field field_ref="voce"         name="vomecrty"  /> 
-        </file>
-      </file_group>
-      <file_group id="2m" output_freq="2mo" output_level="10" enabled=".TRUE."/> <!-- real 2m files -->
-      <file_group id="3m" output_freq="3mo" output_level="10" enabled=".TRUE."/> <!-- real 3m files -->
-      <file_group id="4m" output_freq="4mo" output_level="10" enabled=".TRUE."/> <!-- real 4m files -->
-      <file_group id="6m" output_freq="6mo" output_level="10" enabled=".TRUE."/> <!-- real 6m files -->
-      <file_group id="1y"  output_freq="1y" output_level="10" enabled=".TRUE."/> <!-- real yearly files -->
-      <file_group id="2y"  output_freq="2y" output_level="10" enabled=".TRUE."/> <!-- real 2y files -->
-      <file_group id="5y"  output_freq="5y" output_level="10" enabled=".TRUE."/> <!-- real 5y files -->
-      <file_group id="10y" output_freq="10y" output_level="10" enabled=".TRUE."/> <!-- real 10y files -->
-
-   </file_definition>
-
diff --git a/tests/ISOMIP/EXPREF/grid_def_nemo.xml b/tests/ISOMIP/EXPREF/grid_def_nemo.xml
deleted file mode 120000
index 1be74edf..00000000
--- a/tests/ISOMIP/EXPREF/grid_def_nemo.xml
+++ /dev/null
@@ -1 +0,0 @@
-../../../cfgs/SHARED/grid_def_nemo.xml
\ No newline at end of file
diff --git a/tests/ISOMIP/EXPREF/iodef.xml b/tests/ISOMIP/EXPREF/iodef.xml
deleted file mode 100644
index d4be5c1b..00000000
--- a/tests/ISOMIP/EXPREF/iodef.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<simulation>
-
-<!-- ============================================================================================ -->
-<!-- XIOS context                                                                                 -->
-<!-- ============================================================================================ -->
-
-  <context id="xios" >
-
-      <variable_definition>
-
-          <variable id="info_level"                type="int">10</variable>
-          <variable id="using_server"              type="bool">false</variable>
-          <variable id="using_oasis"               type="bool">false</variable>
-          <variable id="oasis_codes_id"            type="string" >oceanx</variable>
-
-      </variable_definition>
-  </context>
-
-<!-- ============================================================================================ -->
-<!-- NEMO  CONTEXT add and suppress the components you need                                       -->
-<!-- ============================================================================================ -->
-
-  <context id="nemo" src="./context_nemo.xml"/>       <!--  NEMO       -->
-
-</simulation>
diff --git a/tests/ISOMIP/EXPREF/namelist_cfg b/tests/ISOMIP/EXPREF/namelist_cfg
deleted file mode 100644
index 2358fa20..00000000
--- a/tests/ISOMIP/EXPREF/namelist_cfg
+++ /dev/null
@@ -1,510 +0,0 @@
-!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-!! NEMO/OCE  Configuration namelist : overwrite default values defined in SHARED/namelist_ref
-!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
-!!                         ISOMIP configuration                       !!
-!!======================================================================
-!!              ***  Domain & Run management namelists  ***           !!
-!!                                                                    !!
-!!   namrun       parameters of the run
-!!   namdom       space and time domain
-!!   namcfg       parameters of the configuration                       (default: user defined GYRE)
-!!   namwad       Wetting and drying                                    (default: OFF)
-!!   namtsd       data: temperature & salinity                          (default: OFF)
-!!   namcrs       coarsened grid (for outputs and/or TOP)               (ln_crs =T)
-!!   namc1d       1D configuration options                              (ln_c1d =T)
-!!   namc1d_dyndmp 1D newtonian damping applied on currents             (ln_c1d =T)
-!!   namc1d_uvd   1D data (currents)                                    (ln_c1d =T)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namrun        !   parameters of the run
-!-----------------------------------------------------------------------
-   cn_exp      =  "ISOMIP" !  experience name
-   nn_it000    =       1   !  first time step
-   nn_itend    =  525600   !  last  time step
-   nn_leapy    =       0   !  Leap year calendar (1) or not (0)
-   ln_clobber  = .true.    !  clobber (overwrite) an existing file
-   nn_istate   =       0   !  output the initial state (1) or not (0)
-   nn_stock    =  99999999 !  frequency of creation of a restart file (modulo referenced to 1)
-   nn_write    =      48   !  frequency of write in the output file   (modulo referenced to nn_it000)
-   nn_istate   =       0   !  output the initial state (1) or not (0)
-/
-!-----------------------------------------------------------------------
-&namusr_def    !   ISOMIP user defined namelist  
-!-----------------------------------------------------------------------
-   ln_zps      = .true.    ! z-partial-step coordinate
-   ln_zco      = .false.   ! z-full-step coordinate
-   ln_sco      = .false.   ! s-coordinate
-   rn_e1deg    =   0.3     !  zonal      grid-spacing (degrees)
-   rn_e2deg    =   0.1     !  meridional grid-spacing (degrees)
-   rn_e3       =   30.     !  vertical resolution
-/
-!-----------------------------------------------------------------------
-&namdom        !   time and space domain
-!-----------------------------------------------------------------------
-   ln_linssh   = .false.   !  =T  linear free surface  ==>>  model level are fixed in time
-   rn_Dt      = 1800.     !  time step for the dynamics (and tracer if nn_acc=0)
-/
-!-----------------------------------------------------------------------
-&namcfg        !   parameters of the configuration                      (default: use namusr_def in namelist_cfg)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namtile        !   parameters of the tiling
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namtsd        !    Temperature & Salinity Data  (init/dmp)             (default: OFF)
-!-----------------------------------------------------------------------
-   
-/
-!-----------------------------------------------------------------------
-&namwad        !   Wetting and Drying (WaD)                             (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namc1d        !   1D configuration options                             (ln_c1d =T default: PAPA station)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namc1d_dyndmp !   U & V newtonian damping                              (ln_c1d =T default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namc1d_uvd    !   data: U & V currents                                 (ln_c1d =T default: OFF)
-!-----------------------------------------------------------------------
-
-/
-
-!!======================================================================
-!!            ***  Surface Boundary Condition namelists  ***          !!
-!!                                                                    !!
-!!   namsbc          surface boundary condition manager                 (default: NO selection)
-!!   namsbc_flx      flux               formulation                     (ln_flx     =T)
-!!   namsbc_blk      Bulk formulae formulation                          (ln_blk     =T)
-!!   namsbc_cpl      CouPLed            formulation                     ("key_oasis3" )
-!!   namsbc_sas      Stand-Alone Surface module                         (SAS_SRC  only)
-!!   namsbc_iif      Ice-IF: use observed ice cover                     (nn_ice = 1   )
-!!   namtra_qsr      penetrative solar radiation                        (ln_traqsr  =T)
-!!   namsbc_ssr      sea surface restoring term (for T and/or S)        (ln_ssr     =T)
-!!   namsbc_rnf      river runoffs                                      (ln_rnf     =T)
-!!   namsbc_apr      Atmospheric Pressure                               (ln_apr_dyn =T)
-!!   namsbc_wave     external fields from wave model                    (ln_wave    =T)
-!!   namberg         iceberg floats                                     (ln_icebergs=T)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namsbc        !   Surface Boundary Condition manager                   (default: NO selection)
-!-----------------------------------------------------------------------
-   nn_fsbc     = 1         !  frequency of SBC module call
-      !                    !  (control sea-ice & iceberg model call)
-   ln_usr      = .true.    !  user defined formulation                  (T => check usrdef_sbc)
-/
-!-----------------------------------------------------------------------
-&namsbc_flx    !   surface boundary condition : flux formulation        (ln_flx =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namsbc_blk    !   namsbc_blk  generic Bulk formula                     (ln_blk =T)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namsbc_cpl    !   coupled ocean/atmosphere model                       ("key_oasis3")
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namsbc_sas    !   Stand-Alone Surface module: ocean data               (SAS_SRC  only)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namsbc_iif    !   Ice-IF : use observed ice cover                      (nn_ice = 1)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namtra_qsr    !   penetrative solar radiation                          (ln_traqsr =T)
-!-----------------------------------------------------------------------
-   
-/
-!-----------------------------------------------------------------------
-&namsbc_ssr    !   surface boundary condition : sea surface restoring   (ln_ssr =T)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namsbc_rnf    !   runoffs                                              (ln_rnf =T)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namsbc_apr    !   Atmospheric pressure used as ocean forcing           (ln_apr_dyn =T)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&namisf       !  Top boundary layer (ISF)                               (default: OFF)
-!-----------------------------------------------------------------------
-   !
-   ! ---------------- ice shelf load -------------------------------
-   !
-   !
-   ! ---------------- ice shelf melt formulation -------------------------------
-   !
-   ln_isf = .true.           ! activate ice shelf module
-      cn_isfdir = './'           ! directory for all ice shelf input file
-      !
-      ! ---------------- cavities opened -------------------------------
-      !
-      ln_isfcav_mlt = .true.    ! ice shelf melting into the cavity (need ln_isfcav = .true. in domain_cfg.nc)
-         cn_isfcav_mlt = '2eq'   ! ice shelf melting formulation (spe/2eq/3eq/oasis)
-         !                       ! spe = fwfisf is read from a forcing field
-         !                       ! 2eq = ISOMIP  like: 2 equations formulation (Hunter et al., 2006)
-         !                       ! 3eq = ISOMIP+ like: 3 equations formulation (Asay-Davis et al., 2015)
-         !                       ! oasis = fwfisf is given by oasis and pattern by file sn_isfcav_fwf
-         !              !  cn_isfcav_mlt = 2eq or 3eq cases:
-         cn_gammablk = 'spe'    ! scheme to compute gammat/s (spe,ad15,hj99)
-         !                       ! ad15 = velocity dependend Gamma (u* * gammat/s)  (Jenkins et al. 2010)
-         !                       ! hj99 = velocity and stability dependent Gamma    (Holland et al. 1999)
-         rn_gammat0  = 1.e-4     ! gammat coefficient used in blk formula
-         rn_gammas0  = 1.e-4     ! gammas coefficient used in blk formula
-         !
-         rn_htbl     =  30.      ! thickness of the top boundary layer    (Losh et al. 2008)
-         !                       ! 0 => thickness of the tbl = thickness of the first wet cell
-         !
-/
-!-----------------------------------------------------------------------
-&namsbc_wave   ! External fields from wave model                        (ln_wave=T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namberg       !   iceberg parameters                                   (default: OFF)
-!-----------------------------------------------------------------------
-
-/
-
-!!======================================================================
-!!               ***  Lateral boundary condition  ***                 !!
-!!                                                                    !!
-!!   namlbc        lateral momentum boundary condition                  (default: NO selection)
-!!   namagrif      agrif nested grid   (read by child model only)       ("key_agrif")
-!!   nam_tide      Tidal forcing                                        (default: OFF)
-!!   nambdy        Unstructured open boundaries                         (default: OFF)
-!!   nambdy_dta    Unstructured open boundaries - external data         (see  nambdy)
-!!   nambdy_tide   tidal forcing at open boundaries                     (default: OFF)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namlbc        !   lateral momentum boundary condition                  (default: NO selection)
-!-----------------------------------------------------------------------
-   rn_shlat    =    0.     !  free slip
-/
-!-----------------------------------------------------------------------
-&namagrif      !  AGRIF zoom                                            ("key_agrif")
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nam_tide      !   tide parameters                                      (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nambdy        !  unstructured open boundaries                          (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nambdy_dta    !  open boundaries - external data                       (see nam_bdy)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&nambdy_tide   !  tidal forcing at open boundaries                      (default: OFF)
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!                ***  Top/Bottom boundary condition  ***             !!
-!!                                                                    !!
-!!   namdrg        top/bottom drag coefficient                          (default: NO selection)
-!!   namdrg_top    top    friction                                      (ln_drg_OFF=F & ln_isfcav=T)
-!!   namdrg_bot    bottom friction                                      (ln_drg_OFF=F)
-!!   nambbc        bottom temperature boundary condition                (default: OFF)
-!!   nambbl        bottom boundary layer scheme                         (default: OFF)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namdrg        !   top/bottom drag coefficient                          (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_drg_OFF = .false.   !  free-slip       : Cd = 0                  (F => fill namdrg_bot
-   ln_lin     = .false.    !      linear  drag: Cd = Cd0 Uc0                   &   namdrg_top)
-   ln_non_lin = .true.     !  non-linear  drag: Cd = Cd0 |U|
-   ln_loglayer = .false.    !  logarithmic drag: Cd = vkarmn/log(z/z0) |U|
-   !
-   ln_drgimp  = .false.    !  implicit top/bottom friction flag
-/
-!-----------------------------------------------------------------------
-&namdrg_top    !   TOP friction                                         (ln_drg_OFF =F & ln_isfcav=T)
-!-----------------------------------------------------------------------
-   rn_Cd0     =  2.5e-3    !  drag coefficient [-]
-   rn_Uc0     =  0.16      !  ref. velocity [m/s] (linear drag=Cd0*Uc0) 
-   rn_Cdmax   =  0.1       !  drag value maximum [-] (logarithmic drag)
-   rn_ke0     =  0.0e-0    !  background kinetic energy  [m2/s2] (non-linear cases)
-   rn_z0      =  3.0e-3    !  roughness [m] (ln_loglayer=T)
-   ln_boost   = .false.    !  =T regional boost of Cd0 ; =F constant
-      rn_boost =  50.          !  local boost factor  [-]
-/
-!-----------------------------------------------------------------------
-&namdrg_bot    !   BOTTOM friction                                      (ln_drg_OFF =F)
-!-----------------------------------------------------------------------
-   rn_Cd0     =  1.e-3    !  drag coefficient [-]
-   rn_Uc0     =  0.4      !  ref. velocity [m/s] (linear drag=Cd0*Uc0) 
-   rn_Cdmax   =  0.1      !  drag value maximum [-] (logarithmic drag)
-   rn_ke0     =  2.5e-3   !  background kinetic energy  [m2/s2] (non-linear cases)
-   rn_z0      =  3.e-3    !  roughness [m] (ln_loglayer=T)
-   ln_boost   = .false.   !  =T regional boost of Cd0 ; =F constant
-      rn_boost =  50.         !  local boost factor  [-]
-/
-!-----------------------------------------------------------------------
-&nambbc        !   bottom temperature boundary condition                (default: OFF)
-!-----------------------------------------------------------------------
-
-/
-!-----------------------------------------------------------------------
-&nambbl        !   bottom boundary layer scheme                         (default: OFF)
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!                        Tracer (T-S) namelists                      !!
-!!                                                                    !!
-!!   nameos        equation of state                                    (default: NO selection)
-!!   namtra_adv    advection scheme                                     (default: NO selection)
-!!   namtra_ldf    lateral diffusion scheme                             (default: NO selection)
-!!   namtra_mle    mixed layer eddy param. (Fox-Kemper param.)          (default: OFF)
-!!   namtra_eiv    eddy induced velocity param.                         (default: OFF)
-!!   namtra_dmp    T & S newtonian damping                              (default: OFF)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&nameos        !   ocean Equation Of Seawater                           (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_eos80    = .true.          !  = Use EOS80 equation of state
-/
-!-----------------------------------------------------------------------
-&namtra_adv    !   advection scheme for tracer                          (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_traadv_fct =  .true.   !  FCT scheme
-      nn_fct_h   =  2               !  =2/4, horizontal 2nd / 4th order 
-      nn_fct_v   =  2               !  =2/4, vertical   2nd / COMPACT 4th order 
-/
-!-----------------------------------------------------------------------
-&namtra_ldf    !   lateral diffusion scheme for tracers                 (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_traldf_lap   =  .true.   !    laplacian operator
-   ln_traldf_hor   =  .true.   !  horizontal (geopotential)
-   !                       !  Coefficients:
-   nn_aht_ijk_t    = 0         !  =  0   constant = 1/2  Ud*Ld   (lap case) 
-      rn_Ud        = 0.02           !  lateral diffusive velocity [m/s]
-      rn_Ld        = 10.e+3         !  lateral diffusive length   [m]
-/
-!-----------------------------------------------------------------------
-&namtra_mle    !   mixed layer eddy parametrisation (Fox-Kemper)       (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namtra_eiv    !   eddy induced velocity param.                         (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namtra_dmp    !   tracer: T & S newtonian damping                      (default: OFF)
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!                      ***  Dynamics namelists  ***                  !!
-!!                                                                    !!
-!!   nam_vvl       vertical coordinate options                          (default: z-star)
-!!   namdyn_adv    formulation of the momentum advection                (default: NO selection)
-!!   namdyn_vor    advection scheme                                     (default: NO selection)
-!!   namdyn_hpg    hydrostatic pressure gradient                        (default: NO selection)
-!!   namdyn_spg    surface pressure gradient                            (default: NO selection)
-!!   namdyn_ldf    lateral diffusion scheme                             (default: NO selection)
-!!   namdta_dyn    offline TOP: dynamics read in files                  (OFF_SRC only)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&nam_vvl       !   vertical coordinate options                          (default: z-star)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namdyn_adv    !   formulation of the momentum advection                (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_dynadv_vec = .true.  !  vector form (T) or flux form (F)
-      nn_dynkeg  = 0          ! scheme for grad(KE): =0   C2  ;  =1   Hollingsworth correction
-/
-!-----------------------------------------------------------------------
-&namdyn_vor    !   Vorticity / Coriolis scheme                          (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_dynvor_ene = .true.  !  energy conserving scheme
-/
-!-----------------------------------------------------------------------
-&namdyn_hpg    !   Hydrostatic pressure gradient option                 (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_hpg_isf  = .true.    !  s-coordinate adapted for isf (standard jacobian formulation)
-/
-!-----------------------------------------------------------------------
-&namdyn_spg    !   surface pressure gradient                            (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_dynspg_ts  = .true.  !  split-explicit free surface
-/
-!-----------------------------------------------------------------------
-&namdyn_ldf    !   lateral diffusion on momentum                        (default: NO selection)
-!-----------------------------------------------------------------------
-   ln_dynldf_lap =  .true.     !    laplacian operator
-   ln_dynldf_lev =  .true.     !  iso-level
-   nn_ahm_ijk_t  = 0           !  = 0  constant = 1/2  Uv*Lv   (lap case) 
-      rn_Uv      = 0.12             !  lateral viscous velocity [m/s]
-      rn_Lv      = 10.e+3           !  lateral viscous length   [m]
-/
-!-----------------------------------------------------------------------
-&namdta_dyn    !   offline ocean input files                            (OFF_SRC only)
-!-----------------------------------------------------------------------
-
-/
-
-!!======================================================================
-!!                     vertical physics namelists                     !!
-!!                                                                    !!
-!!    namzdf        vertical physics manager                            (default: NO selection)
-!!    namzdf_ric    richardson number vertical mixing                   (ln_zdfric=T)
-!!    namzdf_tke    TKE vertical mixing                                 (ln_zdftke=T)
-!!    namzdf_gls    GLS vertical mixing                                 (ln_zdfgls=T)
-!!    namzdf_osm    OSM vertical diffusion                              (ln_zdfosm=T)
-!!    namzdf_iwm    tidal mixing parameterization                       (ln_zdfiwm=T)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namzdf        !   vertical physics manager                             (default: NO selection)
-!-----------------------------------------------------------------------
-   !                       ! type of vertical closure (required)
-   ln_zdfcst   = .true.       !  constant mixing
-   !
-   !                       ! convection
-   ln_zdfevd   = .true.       !  enhanced vertical diffusion
-   rn_evd      =  0.1         ! mixing coefficient [m2/s]
-   !
-   !                       ! coefficients
-   rn_avm0     =   1.e-3      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst)
-   rn_avt0     =   5.e-5      !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst)
-/
-!-----------------------------------------------------------------------
-&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namzdf_gls    !   GLS vertical diffusion                               (ln_zdfgls =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namzdf_osm    !   OSM vertical diffusion                               (ln_zdfosm =T)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namzdf_iwm    !    internal wave-driven mixing parameterization        (ln_zdfiwm =T)
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!                  ***  Diagnostics namelists  ***                   !!
-!!                                                                    !!
-!!   namtrd       dynamics and/or tracer trends                         (default: OFF)
-!!   namhsb       Heat and salt budgets                                 (default: OFF)
-!!   namdiu       Cool skin and warm layer models                       (default: OFF)
-!!   namdiu       Cool skin and warm layer models                       (default: OFF)
-!!   namflo       float parameters                                      (default: OFF)
-!!   nam_diadct   transports through some sections                      (default: OFF)
-!!   nam_dia25h   25h Mean Output                                       (default: OFF)
-!!   namnc4       netcdf4 chunking and compression settings             ("key_netcdf4")
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namtrd        !   trend diagnostics                                    (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namhsb        !  Heat and salt budgets                                 (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namdiu        !   Cool skin and warm layer models                      (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namflo        !   float parameters                                     ("key_float")
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nam_diaharm   !   Harmonic analysis of tidal constituents              ("key_diaharm")
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namdct        ! transports through some sections                       ("key_diadct")
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nam_diatmb    !  Top Middle Bottom Output                              (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nam_dia25h    !  25h Mean Output                                       (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namnc4        !   netcdf4 chunking and compression settings            ("key_netcdf4")
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!               ***  Observation & Assimilation  ***                 !!
-!!                                                                    !!
-!!   namobs       observation and model comparison                      (default: OFF)
-!!   nam_asminc   assimilation increments                               ('key_asminc')
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&namobs        !  observation usage switch                              (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&nam_asminc    !   assimilation increments                              ('key_asminc')
-!-----------------------------------------------------------------------
-/
-
-!!======================================================================
-!!                  ***  Miscellaneous namelists  ***                 !!
-!!                                                                    !!
-!!   nammpp            Massively Parallel Processing
-!!   namctl            Control prints                                   (default: OFF)
-!!   namsto            Stochastic parametrization of EOS                (default: OFF)
-!!======================================================================
-!
-!-----------------------------------------------------------------------
-&nammpp        !   Massively Parallel Processing
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namctl        !   Control prints                                       (default: OFF)
-!-----------------------------------------------------------------------
-/
-!-----------------------------------------------------------------------
-&namsto        ! Stochastic parametrization of EOS                      (default: OFF)
-!-----------------------------------------------------------------------
-/
diff --git a/tests/ISOMIP/EXPREF/namelist_ref b/tests/ISOMIP/EXPREF/namelist_ref
deleted file mode 120000
index 97682863..00000000
--- a/tests/ISOMIP/EXPREF/namelist_ref
+++ /dev/null
@@ -1 +0,0 @@
-../../../cfgs/SHARED/namelist_ref
\ No newline at end of file
diff --git a/tests/ISOMIP/EXPREF/plot_mlt.py b/tests/ISOMIP/EXPREF/plot_mlt.py
deleted file mode 100644
index edb9e04a..00000000
--- a/tests/ISOMIP/EXPREF/plot_mlt.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from netCDF4 import Dataset
-import numpy as np
-from numpy import ma
-import argparse
-import matplotlib.pyplot as plt
-import matplotlib
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-f" , metavar='file_name'   , help="names of input files" , type=str  , nargs="+", required=True )
-parser.add_argument("-v" , metavar='var_name'    , help="variable list"        , type=str  , nargs=1  , required=True )
-args = parser.parse_args()
-
-# read mesh_mask
-ncid   = Dataset('mesh_mask.nc')
-lat2d  = ncid.variables['gphit'    ][  :,:].squeeze()
-lon2d  = ncid.variables['glamt'    ][  :,:].squeeze()
-msk    = ncid.variables['tmaskutil'][0,:,:].squeeze()
-ncid.close()
-
-plt.figure(figsize=np.array([210,210]) / 25.4)
-
-# read psi.nc
-ncid   = Dataset(args.f[0])
-var2d  = ncid.variables[args.v[0]][-1,:,:].squeeze() 
-var2dm = ma.masked_where(msk==0.0,var2d)
-# convert in m/y
-var2dm = var2dm * 86400 * 365 / 1e3
-ncid.close()
- 
-# define colorbar 
-vlevel=np.arange(-1.6,1.8,0.2)
-pcol = plt.contourf(lon2d,lat2d,var2dm,levels=vlevel,extend='both')
-vlevel=np.arange(-1.6,1.8,0.4)
-matplotlib.rcParams['contour.negative_linestyle'] = 'solid'
-plt.contour(lon2d,lat2d,var2dm,levels=vlevel,colors='k')
-plt.grid()
-plt.title('melt rate ISOMIP (m/y)')
-plt.ylabel('Latitude',fontsize=14)
-plt.xlabel('Longitude',fontsize=14)
-cbar = plt.colorbar(pcol, ticks=vlevel)
-cbar.ax.tick_params(labelsize=14)
-
-# save figure
-plt.savefig('mlt.png', format='png', dpi=300)
-
-plt.show()
-
diff --git a/tests/ISOMIP/EXPREF/plot_moc.py b/tests/ISOMIP/EXPREF/plot_moc.py
deleted file mode 100644
index f8fc48e8..00000000
--- a/tests/ISOMIP/EXPREF/plot_moc.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from netCDF4 import Dataset
-import numpy as np
-import argparse
-import matplotlib.pyplot as plt
-
-# read argument
-parser = argparse.ArgumentParser()
-parser.add_argument("-f" , metavar='file_name'   , help="names of input files" , type=str  , nargs=1  , required=True )
-parser.add_argument("-v" , metavar='var_name'    , help="variable list"        , type=str  , nargs=1  , required=True )
-args = parser.parse_args()
-
-# read mesh mask
-ncid  = Dataset('mesh_mask.nc')
-vx2d  = ncid.variables['gphit'  ][0,:,0].squeeze()
-vx2dv = ncid.variables['gphiv'  ][0,:,0].squeeze()
-y2d   = ncid.variables['gdepw_0'][0,:,:,1].squeeze()*-1
-y2dt  = ncid.variables['gdept_0'][0,:,:,1].squeeze()*-1
-msk   = ncid.variables['tmask'  ][0,:,:,1].squeeze()
-ncid.close()
-
-# build x 2d array
-x2d=y2d*0.0
-x2dv=y2d*0.0
-for jk in range(0,y2d.shape[0]):
-   x2d[jk,:]=vx2d[:]
-   x2dv[jk,:]=vx2d[:]
-
-plt.figure(figsize=np.array([210,210]) / 25.4)
-
-# read data and mask it
-ncid   = Dataset(args.f[0])
-var2d  = ncid.variables[args.v[0]][-1,:,:,:].squeeze() 
-var2dm = var2d[:,:]
-var2dm[msk==0] = -1
-ncid.close()
-
-# define colorbar
-vlevel=np.arange(0,0.13,0.01)  
-pcol = plt.contourf(x2d,y2d,var2dm,levels=vlevel)
-plt.clf()
-
-# plot contour
-ax = plt.subplot(1, 1, 1)
-ax.contour(x2dv,y2dt,var2dm,levels=vlevel)
-ax.grid()
-ax.set_title('MOC ISOMIP (Sv)')
-ax.set_ylabel('Depth (m)',fontsize=14)
-ax.set_xlabel('Latitude',fontsize=14)
-
-# plot colorbar
-plt.subplots_adjust(left=0.1,right=0.89, bottom=0.1, top=0.89, wspace=0.1, hspace=0.1)
-cax = plt.axes([0.91, 0.1, 0.02, 0.79])
-cbar= plt.colorbar(pcol, ticks=vlevel, cax=cax)
-cbar.ax.tick_params(labelsize=14)
-
-# save figure
-plt.savefig('moc.png', format='png', dpi=300)
-
-plt.show()
-
diff --git a/tests/ISOMIP/EXPREF/plot_psi.py b/tests/ISOMIP/EXPREF/plot_psi.py
deleted file mode 100644
index 16b615fd..00000000
--- a/tests/ISOMIP/EXPREF/plot_psi.py
+++ /dev/null
@@ -1,52 +0,0 @@
-from netCDF4 import Dataset
-import numpy as np
-from numpy import ma
-import argparse
-import matplotlib.pyplot as plt
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-f" , metavar='file_name'   , help="names of input files" , type=str  , nargs="+", required=True )
-parser.add_argument("-v" , metavar='var_name'    , help="variable list"        , type=str  , nargs=1  , required=True )
-args = parser.parse_args()
-
-# read mesh_mask
-ncid   = Dataset('mesh_mask.nc')
-lat2d  = ncid.variables['gphit'    ][  :,:].squeeze()
-lon2d  = ncid.variables['glamt'    ][  :,:].squeeze()
-msk    = ncid.variables['tmaskutil'][0,:,:].squeeze()
-ncid.close()
-
-plt.figure(figsize=np.array([210,210]) / 25.4)
-
-# read psi.nc
-ncid   = Dataset(args.f[0])
-var2d  = ncid.variables[args.v[0]][-1,:,:].squeeze() 
-var2dm = ma.masked_where(msk==0.0,var2d)
-# convert in Sv
-var2dm = var2dm / 1e6
-ncid.close()
- 
-# define colorbar 
-vlevel=np.arange(0.00,0.36,0.02)
-pcol = plt.contourf(lon2d,lat2d,var2dm,levels=vlevel)
-plt.clf()
-
-# plot contour
-ax = plt.subplot(1, 1, 1)
-ax.contour(lon2d,lat2d,var2dm,levels=vlevel)
-ax.grid()
-ax.set_title('PSI ISOMIP (Sv)')
-ax.set_ylabel('Latitude',fontsize=14)
-ax.set_xlabel('Longitude',fontsize=14)
-
-# plot colorbar
-plt.subplots_adjust(left=0.1,right=0.89, bottom=0.1, top=0.89, wspace=0.1, hspace=0.1)
-cax = plt.axes([0.91, 0.1, 0.02, 0.79])
-cbar= plt.colorbar(pcol, ticks=vlevel, cax=cax)
-cbar.ax.tick_params(labelsize=14)
-
-# save figure
-plt.savefig('psi.png', format='png', dpi=300)
-
-plt.show()
-
diff --git a/tests/ISOMIP/MY_SRC/usrdef_hgr.F90 b/tests/ISOMIP/MY_SRC/usrdef_hgr.F90
deleted file mode 100644
index 95bdd75a..00000000
--- a/tests/ISOMIP/MY_SRC/usrdef_hgr.F90
+++ /dev/null
@@ -1,119 +0,0 @@
-MODULE usrdef_hgr
-   !!======================================================================
-   !!                       ***  MODULE usrdef_hgr   ***
-   !!
-   !!                  ===  LOCK_EXCHANGE configuration  ===
-   !!
-   !! User defined :   mesh and Coriolis parameter of a user configuration
-   !!======================================================================
-   !! History :  NEMO  ! 2016-08  (S. Flavoni, G. Madec)   Original code
-   !!                  ! 2017-02  (P. Mathiot, S. Flavoni) Adapt code to ISOMIP case
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   usr_def_hgr    : initialize the horizontal mesh for ISOMIP configuration
-   !!----------------------------------------------------------------------
-   USE dom_oce
-   USE par_oce         ! ocean space and time domain
-   USE phycst          ! physical constants
-   USE usrdef_nam, ONLY: rn_e1deg, rn_e2deg   ! horizontal resolution in meters
-   !
-   USE in_out_manager  ! I/O manager
-   USE lib_mpp         ! MPP library
-   
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   usr_def_hgr   ! called by domhgr.F90
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: usrdef_hgr.F90 14223 2020-12-19 10:22:45Z smasson $ 
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE usr_def_hgr( plamt , plamu , plamv  , plamf  ,   &   ! geographic position (required)
-      &                    pphit , pphiu , pphiv  , pphif  ,   &   !
-      &                    kff   , pff_f , pff_t  ,            &   ! Coriolis parameter  (if domain not on the sphere)
-      &                    pe1t  , pe1u  , pe1v   , pe1f   ,   &   ! scale factors       (required)
-      &                    pe2t  , pe2u  , pe2v   , pe2f   ,   &   !
-      &                    ke1e2u_v      , pe1e2u , pe1e2v     )   ! u- & v-surfaces (if gridsize reduction is used in strait(s))
-      !!----------------------------------------------------------------------
-      !!                  ***  ROUTINE usr_def_hgr  ***
-      !!
-      !! ** Purpose :   user defined mesh and Coriolis parameter
-      !!
-      !! ** Method  :   set all intent(out) argument to a proper value
-      !!                ISOMIP configuration
-      !!
-      !! ** Action  : - define longitude & latitude of t-, u-, v- and f-points (in degrees) 
-      !!              - define i- & j-scale factors at t-, u-, v- and f-points (in meters)
-      !!              - define u- & v-surfaces (in m2)
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   plamt, plamu, plamv, plamf   ! longitude outputs                     [degrees]
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pphit, pphiu, pphiv, pphif   ! latitude outputs                      [degrees]
-      INTEGER                 , INTENT(out) ::   kff                          ! =1 Coriolis parameter computed here, =0 otherwise
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pff_f, pff_t                 ! Coriolis factor at f-point                [1/s]
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1t, pe1u, pe1v, pe1f       ! i-scale factors                             [m]
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe2t, pe2u, pe2v, pe2f       ! j-scale factors                             [m]
-      INTEGER                 , INTENT(out) ::   ke1e2u_v                     ! =1 u- & v-surfaces computed here, =0 otherwise 
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1e2u, pe1e2v               ! u- & v-surfaces (if reduction in strait)   [m2]
-      !
-      INTEGER  ::   ji, jj   ! dummy loop indices
-      REAL(wp) ::   zfact, zti, zui, zvi, zfi, ztj, zuj, zvj, zfj      ! local scalars
-      !!-------------------------------------------------------------------------------
-      !
-      IF(lwp) THEN
-         WRITE(numout,*)
-         WRITE(numout,*) 'usr_def_hgr : ISOMIP configuration'
-         WRITE(numout,*) '~~~~~~~~~~~'
-         WRITE(numout,*)
-         WRITE(numout,*) '   ===>>  geographical mesh on the sphere with regular grid-spacing'
-         WRITE(numout,*) '          given by rn_e1deg and rn_e2deg'
-      ENDIF
-      !
-      !                       !==  grid point position  ==!   (in degrees)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = rn_e1deg * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = rn_e1deg * (          REAL( mig0(ji)-1 , wp )  )
-         plamv(ji,jj) = plamt(ji,jj)
-         plamf(ji,jj) = plamu(ji,jj)
-         !                       ! latitude   (south coast at lat=-80°)
-         pphit(ji,jj) = rn_e2deg * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  ) - 80._wp
-         pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = rn_e2deg * (          REAL( mjg0(jj)-1 , wp )  ) - 80._wp
-         pphif(ji,jj) = pphiv(ji,jj)
-      END_2D
-      !
-      !                       !==  Horizontal scale factors  ==!   (in meters)
-      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         !                       ! e1   (zonal)
-         pe1t(ji,jj) = ra * rad * COS( rad * pphit(ji,jj) ) * rn_e1deg
-         pe1u(ji,jj) = ra * rad * COS( rad * pphiu(ji,jj) ) * rn_e1deg
-         pe1v(ji,jj) = ra * rad * COS( rad * pphiv(ji,jj) ) * rn_e1deg
-         pe1f(ji,jj) = ra * rad * COS( rad * pphif(ji,jj) ) * rn_e1deg
-         !                       ! e2   (meridional)
-         pe2t(ji,jj) = ra * rad * rn_e2deg
-         pe2u(ji,jj) = ra * rad * rn_e2deg
-         pe2v(ji,jj) = ra * rad * rn_e2deg
-         pe2f(ji,jj) = ra * rad * rn_e2deg
-      END_2D
-      !                             ! NO reduction of grid size in some straits 
-      ke1e2u_v    = 0               !    ==>> u_ & v_surfaces will be computed in dom_ghr routine
-      pe1e2u(:,:) = 0._wp           !    CAUTION: set to zero to avoid error with some compilers that
-      pe1e2v(:,:) = 0._wp           !             require an initialization of INTENT(out) arguments
-      !
-      !
-      !                       !==  Coriolis parameter  ==!
-      kff = 0                       ! Coriolis parameter calculated on the sphere
-      pff_f(:,:) = 0._wp            ! CAUTION: set to zero to avoid error with some compilers that
-      pff_t(:,:) = 0._wp            !             require an initialization of INTENT(out) arguments
-      !
-   END SUBROUTINE usr_def_hgr
-
-   !!======================================================================
-END MODULE usrdef_hgr
diff --git a/tests/ISOMIP/MY_SRC/usrdef_istate.F90 b/tests/ISOMIP/MY_SRC/usrdef_istate.F90
deleted file mode 100644
index 42cf30fd..00000000
--- a/tests/ISOMIP/MY_SRC/usrdef_istate.F90
+++ /dev/null
@@ -1,87 +0,0 @@
-MODULE usrdef_istate
-   !!======================================================================
-   !!                     ***  MODULE usrdef_istate   ***
-   !!
-   !!                  ===  ISOMIP configuration  ===
-   !!
-   !! User defined : set the initial state of a user configuration
-   !!======================================================================
-   !! History :  NEMO ! 2016-11 (S. Flavoni)             Original code
-   !!                 ! 2017-02 (P. Mathiot, S. Flavoni) Adapt code to ISOMIP case
-   !!                 ! 2020-11 (S. Techene, G. Madec) separate tsuv from ssh
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!  usr_def_istate : initial state in Temperature and salinity
-   !!----------------------------------------------------------------------
-   USE par_oce        ! ocean space and time domain
-   USE dom_oce , ONLY : glamt 
-   USE phycst         ! physical constants
-   !
-   USE in_out_manager ! I/O manager
-   USE lib_mpp        ! MPP library
-   
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   usr_def_istate       ! called by istate.F90
-   PUBLIC   usr_def_istate_ssh   ! called by domqco.F90
-
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: usrdef_istate.F90 14053 2020-12-03 13:48:38Z techene $ 
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-  
-   SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE usr_def_istate  ***
-      !! 
-      !! ** Purpose :   Initialization of the dynamics and tracers
-      !!                Here ISOMIP configuration 
-      !!
-      !! ** Method  : - set temperature field
-      !!              - set salinity    field
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask             [m]
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s] 
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s] 
-      !!----------------------------------------------------------------------
-      !
-      IF(lwp) WRITE(numout,*)
-      IF(lwp) WRITE(numout,*) 'usr_def_istate : ISOMIP configuration, analytical definition of initial state'
-      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   Ocean at rest, with a constant salinity and temperature.      '
-      pu  (:,:,:) = 0._wp        ! ocean at rest
-      pv  (:,:,:) = 0._wp
-      !                          ! T & S profiles
-      pts(:,:,:,jp_tem) = - 1.9 * ptmask(:,:,:)          ! ISOMIP configuration : start from constant T+S fields
-      pts(:,:,:,jp_sal) =  34.4 * ptmask(:,:,:)
-      !   
-   END SUBROUTINE usr_def_istate
-
-
-   SUBROUTINE usr_def_istate_ssh( ptmask, pssh )
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE usr_def_istate_ssh  ***
-      !! 
-      !! ** Purpose :   Initialization of ssh
-      !!                Here ISOMIP configuration 
-      !!
-      !! ** Method  :   set ssh to 0
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask   [m]
-      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height   [m]
-      !!----------------------------------------------------------------------
-      !
-      IF(lwp) WRITE(numout,*)
-      IF(lwp) WRITE(numout,*) 'usr_def_istate_ssh : ISOMIP configuration, analytical definition of initial state'
-      !
-      pssh(:,:)   = 0._wp
-      !
-   END SUBROUTINE usr_def_istate_ssh
-
-   !!======================================================================
-END MODULE usrdef_istate
diff --git a/tests/ISOMIP/MY_SRC/usrdef_nam.F90 b/tests/ISOMIP/MY_SRC/usrdef_nam.F90
deleted file mode 100644
index b1063083..00000000
--- a/tests/ISOMIP/MY_SRC/usrdef_nam.F90
+++ /dev/null
@@ -1,108 +0,0 @@
-MODULE usrdef_nam
-   !!======================================================================
-   !!                       ***  MODULE  usrdef_nam  ***
-   !!
-   !!                     ===  ISOMIP configuration  ===
-   !!
-   !! User defined : set the domain characteristics of a user configuration
-   !!======================================================================
-   !! History :  NEMO ! 2016-03  (S. Flavoni, G. Madec)   Original code
-   !!                 ! 2017-02  (P. Mathiot, S. Flavoni) Adapt code to ISOMIP case
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   usr_def_nam   : read user defined namelist and set global domain size
-   !!   usr_def_hgr   : initialize the horizontal mesh 
-   !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
-   USE par_oce        ! ocean space and time domain
-   USE phycst         ! physical constants
-   !
-   USE in_out_manager ! I/O manager
-   USE lib_mpp        ! MPP library
-   USE timing         ! Timing
-   
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   usr_def_nam   ! called by nemogcm.F90
-
-   !                                         !!* namusr_def namelist *!!
-   REAL(wp), PUBLIC ::   rn_e1deg, rn_e2deg   !: horizontal resolution   [degrees]
-   REAL(wp), PUBLIC ::   rn_e3                !: vertical   resolution         [m]
-   
-   REAL(wp), PARAMETER, PUBLIC ::   rbathy = 900._wp   !: depth of the seafloor   [m]
-
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: usrdef_nam.F90 14433 2021-02-11 08:06:49Z smasson $ 
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE usr_def_nam( cd_cfg, kk_cfg, kpi, kpj, kpk, ldIperio, ldJperio, ldNFold, cdNFtype )
-      !!----------------------------------------------------------------------
-      !!                     ***  ROUTINE dom_nam  ***
-      !!                    
-      !! ** Purpose :   read user defined namelist and define the domain size
-      !!
-      !! ** Method  :   read in namusr_def containing all the user specific namelist parameter
-      !!
-      !!                Here ISOMIP configuration
-      !!
-      !! ** input   : - namusr_def namelist found in namelist_cfg
-      !!----------------------------------------------------------------------
-      CHARACTER(len=*), INTENT(out) ::   cd_cfg               ! configuration name
-      INTEGER         , INTENT(out) ::   kk_cfg               ! configuration resolution
-      INTEGER         , INTENT(out) ::   kpi, kpj, kpk        ! global domain sizes
-      LOGICAL         , INTENT(out) ::   ldIperio, ldJperio   ! i- and j- periodicity
-      LOGICAL         , INTENT(out) ::   ldNFold              ! North pole folding
-      CHARACTER(len=1), INTENT(out) ::   cdNFtype             ! Folding type: T or F
-      !
-      INTEGER ::   ios   ! Local integer
-      !!
-      NAMELIST/namusr_def/ ln_zco, ln_zps, ln_sco, rn_e1deg, rn_e2deg, rn_e3
-      !!----------------------------------------------------------------------
-      !
-      READ  ( numnam_cfg, namusr_def, IOSTAT = ios, ERR = 902 )
-902   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namusr_def in configuration namelist' )
-      !
-      IF(lwm)   WRITE( numond, namusr_def )
-      !
-      cd_cfg = 'ISOMIP'           ! name & resolution (not used)
-      kk_cfg = INT( rn_e3 )
-      !
-      ! Global Domain size:  ISOMIP domain is  15° x 10° x 900 m
-      kpi = INT(  15.0  / rn_e1deg ) + 2     ! add 2 for t-point in the east  & west  coasts
-      kpj = INT(  10.0  / rn_e2deg ) + 2     !     -        -           north & south   -
-      kpk = INT( rbathy / rn_e3    ) + 1     ! add 1 for t-point in the seafloor
-      !
-      !                             ! Set the lateral boundary condition of the global domain
-      ldIperio = .FALSE.   ;   ldJperio = .FALSE.   ! ISOMIP configuration : closed domain
-      ldNFold  = .FALSE.   ;   cdNFtype = '-'
-      !
-      !                             ! control print
-      IF(lwp) THEN
-         WRITE(numout,*) '   '
-         WRITE(numout,*) 'usr_def_nam  : read the user defined namelist (namusr_def) in namelist_cfg'
-         WRITE(numout,*) '~~~~~~~~~~~ '
-         WRITE(numout,*) '   Namelist namusr_def : ISOMIP test case'
-         WRITE(numout,*) '      type of vertical coordinate : '
-         WRITE(numout,*) '         z-coordinate flag                     ln_zco   = ', ln_zco
-         WRITE(numout,*) '         z-partial-step coordinate flag        ln_zps   = ', ln_zps
-         WRITE(numout,*) '         s-coordinate flag                     ln_sco   = ', ln_sco
-         WRITE(numout,*) '      resolution'
-         WRITE(numout,*) '         zonal      resolution                 rn_e1deg = ', rn_e1deg, ' degrees'
-         WRITE(numout,*) '         meridional resolution                 rn_e1deg = ', rn_e1deg, ' degrees'
-         WRITE(numout,*) '         vertical   resolution                 rn_e3    = ', rn_e3   , ' meters'
-         WRITE(numout,*) '      ISOMIP domain = 15° x 10° x 900 m'
-         WRITE(numout,*) '         resulting global domain size :        Ni0glo   = ', kpi
-         WRITE(numout,*) '                                               Nj0glo   = ', kpj
-         WRITE(numout,*) '                                               jpkglo   = ', kpk
-         WRITE(numout,*) '   '
-      ENDIF
-      !
-   END SUBROUTINE usr_def_nam
-
-   !!======================================================================
-END MODULE usrdef_nam
diff --git a/tests/ISOMIP/MY_SRC/usrdef_sbc.F90 b/tests/ISOMIP/MY_SRC/usrdef_sbc.F90
deleted file mode 100644
index b3ff303a..00000000
--- a/tests/ISOMIP/MY_SRC/usrdef_sbc.F90
+++ /dev/null
@@ -1,90 +0,0 @@
-MODULE usrdef_sbc
-   !!======================================================================
-   !!                     ***  MODULE  usrdef_sbc  ***
-   !! 
-   !!                  ===  ISOMIP configuration  ===
-   !!
-   !! User defined :   surface forcing of a user configuration
-   !!======================================================================
-   !! History :  4.0   ! 2016-03  (S. Flavoni, G. Madec)   user defined interface
-   !!                  ! 2017-02  (P. Mathiot, S. Flavoni) adapt code to ISOMIP case
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   usr_def_sbc    : user defined surface bounday conditions in ISOMIP case
-   !!----------------------------------------------------------------------
-   USE oce             ! ocean dynamics and tracers
-   USE dom_oce         ! ocean space and time domain
-   USE sbc_oce         ! Surface boundary condition: ocean fields
-   USE sbc_ice         ! Surface boundary condition: ice fields
-   USE phycst          ! physical constants
-   !
-   USE in_out_manager  ! I/O manager
-   USE lib_mpp         ! distribued memory computing library
-   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
-   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   usrdef_sbc_oce      ! routine called in sbcmod module
-   PUBLIC   usrdef_sbc_ice_tau  ! routine called by icestp.F90 for ice dynamics
-   PUBLIC   usrdef_sbc_ice_flx  ! routine called by icestp.F90 for ice thermo
-
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: usrdef_sbc.F90 12377 2020-02-12 14:39:06Z acc $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS
-
-   SUBROUTINE usrdef_sbc_oce( kt, Kbb )
-      !!---------------------------------------------------------------------
-      !!                    ***  ROUTINE usr_def_sbc  ***
-      !!              
-      !! ** Purpose :   provide at each time-step the surface boundary
-      !!              condition, i.e. the momentum, heat and freshwater fluxes.
-      !!
-      !! ** Method  :   all 0 fields, for ISOMIP case
-      !!                CAUTION : never mask the surface stress field !
-      !!
-      !! ** Action  : - set to ZERO all the ocean surface boundary condition, i.e.   
-      !!                   utau, vtau, taum, wndm, qns, qsr, emp, sfx
-      !!
-      !!----------------------------------------------------------------------
-      INTEGER, INTENT(in) ::   kt   ! ocean time step
-      INTEGER, INTENT(in) ::   Kbb  ! ocean time index
-      !!---------------------------------------------------------------------
-      !
-      IF( kt == nit000 ) THEN
-         !
-         IF(lwp) WRITE(numout,*)' usr_sbc : ISOMIP case: NO surface forcing'
-         IF(lwp) WRITE(numout,*)' ~~~~~~~~~~~   utau = vtau = taum = wndm = qns = qsr = emp = sfx = 0'
-         !
-         utau(:,:) = 0._wp
-         vtau(:,:) = 0._wp
-         taum(:,:) = 0._wp
-         wndm(:,:) = 0._wp
-         !
-         emp (:,:) = 0._wp
-         sfx (:,:) = 0._wp
-         qns (:,:) = 0._wp
-         qsr (:,:) = 0._wp
-         !         
-      ENDIF
-      !
-   END SUBROUTINE usrdef_sbc_oce
-
-   SUBROUTINE usrdef_sbc_ice_tau( kt )
-      INTEGER, INTENT(in) ::   kt   ! ocean time step
-   END SUBROUTINE usrdef_sbc_ice_tau
-
-
-   SUBROUTINE usrdef_sbc_ice_flx( kt, phs, phi )
-      INTEGER, INTENT(in) ::   kt   ! ocean time step
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phs    ! snow thickness
-      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phi    ! ice thickness
-   END SUBROUTINE usrdef_sbc_ice_flx
-
-   !!======================================================================
-END MODULE usrdef_sbc
diff --git a/tests/ISOMIP/MY_SRC/usrdef_zgr.F90 b/tests/ISOMIP/MY_SRC/usrdef_zgr.F90
deleted file mode 100644
index 225e1ca0..00000000
--- a/tests/ISOMIP/MY_SRC/usrdef_zgr.F90
+++ /dev/null
@@ -1,236 +0,0 @@
-MODULE usrdef_zgr
-   !!======================================================================
-   !!                     ***  MODULE usrdef_zgr  ***
-   !!
-   !!                       ===  ISOMIP case  ===
-   !!
-   !! user defined :  vertical coordinate system of a user configuration
-   !!======================================================================
-   !! History :  4.0  ! 2016-08  (G. Madec,   S. Flavoni)  Original code
-   !!                 ! 2017-02  (P. Mathiot, S. Flavoni)  Adapt code to ISOMIP case
-   !!----------------------------------------------------------------------
-
-   !!----------------------------------------------------------------------
-   !!   usr_def_zgr   : user defined vertical coordinate system (required)
-   !!       zgr_z1d   : reference 1D z-coordinate 
-   !!---------------------------------------------------------------------
-   USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mj0   , mj1    ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt , gphit  ! ocean space and time domain
-   USE usrdef_nam     ! User defined : namelist variables
-   !
-   USE in_out_manager ! I/O manager
-   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
-   USE lib_mpp        ! distributed memory computing library
-   USE timing         ! Timing
-
-   IMPLICIT NONE
-   PRIVATE
-
-   PUBLIC   usr_def_zgr   ! called by domzgr.F90
-
-   !! * Substitutions
-#  include "do_loop_substitute.h90"
-   !!----------------------------------------------------------------------
-   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
-   !! $Id: usrdef_zgr.F90 13295 2020-07-10 18:24:21Z acc $
-   !! Software governed by the CeCILL license (see ./LICENSE)
-   !!----------------------------------------------------------------------
-CONTAINS             
-
-   SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
-      &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
-      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
-      &                    pe3t  , pe3u  , pe3v , pe3f ,               &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw,                      &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
-      !!---------------------------------------------------------------------
-      !!              ***  ROUTINE usr_def_zgr  ***
-      !!
-      !! ** Purpose :   User defined the vertical coordinates
-      !!
-      !!----------------------------------------------------------------------
-      LOGICAL                   , INTENT(in   ) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags ( read in namusr_def )
-      LOGICAL                   , INTENT(  out) ::   ld_isfcav                   ! under iceshelf cavity flag
-      REAL(wp), DIMENSION(:)    , INTENT(  out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:)    , INTENT(  out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(  out) ::   k_top, k_bot                ! first & last ocean level
-      !
-      INTEGER  ::   ji , jj, jk       ! dummy indices
-      INTEGER  ::   ij0, ij1          ! dummy indices  
-      INTEGER  ::   ik                ! local integers
-      REAL(wp) ::   zfact, z1_jpkm1   ! local scalar
-      REAL(wp) ::   ze3min, zdepth    ! local scalar
-      REAL(wp), DIMENSION(jpi,jpj) ::   zht  , zhu         ! bottom depth
-      REAL(wp), DIMENSION(jpi,jpj) ::   zhisf, zhisfu      ! top depth
-      !!----------------------------------------------------------------------
-      !
-      IF(lwp) WRITE(numout,*)
-      IF(lwp) WRITE(numout,*) 'usr_def_zgr : ISOMIP configuration (z(ps)- or s-coordinate closed box ocean without cavities)'
-      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
-      !
-      !
-      ! type of vertical coordinate
-      ! ---------------------------
-      ! set in usrdef_nam.F90 by reading the namusr_def namelist except for ISF
-      ld_isfcav = .TRUE.       ! ISF Ice Shelves Flag
-      !
-      !
-      ! Build the vertical coordinate system
-      ! ------------------------------------
-      !
-      !                       !==  isfdraft  ==!
-      !
-      zht  (:,:) = rbathy 
-      zhisf(:,:) = 200._wp
-      ij0 = 1   ;   ij1 = 40+nn_hls
-      DO jj = mj0(ij0), mj1(ij1)
-         zhisf(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp
-      END DO
-      !
-      CALL zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! Reference z-coordinate system
-      !
-      !                       !==  top masked level bathymetry  ==!  (all coordinates)
-      !
-      IF ( ld_zps ) THEN      !==  zps-coordinate  ==!   (partial bottom-steps)
-         !
-         ze3min = 0.1_wp * rn_e3
-         IF(lwp) WRITE(numout,*) '   minimum thickness of the partial cells = 10 % of e3 = ', ze3min
-         !
-         !                                !* bottom ocean compute from the depth of grid-points
-         k_bot(:,:) = jpkm1
-         DO jk = jpkm1, 1, -1
-            WHERE( zht(:,:) < pdepw_1d(jk) + ze3min )   k_bot(:,:) = jk-1
-         END DO
-         !                                !* top ocean compute from the depth of grid-points
-         k_top(:,:) = 1                   ! 
-         DO jk = 2, jpkm1
-            zdepth = pdepw_1d(jk+1) - ze3min
-            WHERE( zhisf(:,:) > 0.0 .AND. zhisf(:,:) >= zdepth )   k_top(:,:) = (jk + 1) 
-         END DO
-         !
-         !                                   !* vertical coordinate system
-         DO jk = 1, jpk                      ! initialization to the reference z-coordinate
-            pdept(:,:,jk) = pdept_1d(jk)
-            pdepw(:,:,jk) = pdepw_1d(jk)
-            pe3t (:,:,jk) = pe3t_1d (jk)
-            pe3u (:,:,jk) = pe3t_1d (jk)
-            pe3v (:,:,jk) = pe3t_1d (jk)
-            pe3f (:,:,jk) = pe3t_1d (jk)
-            pe3w (:,:,jk) = pe3w_1d (jk)
-            pe3uw(:,:,jk) = pe3w_1d (jk)
-            pe3vw(:,:,jk) = pe3w_1d (jk)
-         END DO
-         ! top scale factors and depth at T- and W-points
-         DO_2D( 1, 1, 1, 1 )
-            ik = k_top(ji,jj)
-            IF ( ik > 2 ) THEN
-               ! pdeptw at the interface
-               pdepw(ji,jj,ik  ) = MAX( zhisf(ji,jj) , pdepw(ji,jj,ik) )
-               ! e3t in both side of the interface
-               pe3t (ji,jj,ik  ) = pdepw(ji,jj,ik+1) - pdepw(ji,jj,ik)
-               ! pdept in both side of the interface (from previous e3t)
-               pdept(ji,jj,ik  ) = pdepw(ji,jj,ik  ) + pe3t (ji,jj,ik  ) * 0.5_wp
-               pdept(ji,jj,ik-1) = pdepw(ji,jj,ik  ) - pe3t (ji,jj,ik  ) * 0.5_wp
-               ! pe3w on both side of the interface
-               pe3w (ji,jj,ik+1) = pdept(ji,jj,ik+1) - pdept(ji,jj,ik  )
-               pe3w (ji,jj,ik  ) = pdept(ji,jj,ik  ) - pdept(ji,jj,ik-1)
-               ! e3t into the ice shelf
-               pe3t (ji,jj,ik-1) = pdepw(ji,jj,ik  ) - pdepw(ji,jj,ik-1)
-               pe3w (ji,jj,ik-1) = pdept(ji,jj,ik-1) - pdept(ji,jj,ik-2)
-            END IF
-         END_2D
-         ! bottom scale factors and depth at T- and W-points
-         DO_2D( 1, 1, 1, 1 )
-            ik = k_bot(ji,jj)
-            pdepw(ji,jj,ik+1) = MIN( zht(ji,jj) , pdepw_1d(ik+1) )
-            pe3t (ji,jj,ik  ) = pdepw(ji,jj,ik+1) - pdepw(ji,jj,ik)
-            pe3t (ji,jj,ik+1) = pe3t (ji,jj,ik  ) 
-            !
-            pdept(ji,jj,ik  ) = pdepw(ji,jj,ik  ) + pe3t (ji,jj,ik  ) * 0.5_wp
-            pdept(ji,jj,ik+1) = pdepw(ji,jj,ik+1) + pe3t (ji,jj,ik+1) * 0.5_wp
-            pe3w (ji,jj,ik+1) = pdept(ji,jj,ik+1) - pdept(ji,jj,ik)
-         END_2D       
-         !                                   ! bottom scale factors and depth at  U-, V-, UW and VW-points
-         pe3u (:,:,:) = pe3t(:,:,:)
-         pe3uw(:,:,:) = pe3w(:,:,:)
-         DO_3D( 0, 0, 0, 0, 1, jpk )
-         !                                   ! Computed as the minimum of neighbooring scale factors
-            pe3v (ji,jj,jk) = MIN( pe3t(ji,jj,jk), pe3t(ji,jj+1,jk) )
-            pe3vw(ji,jj,jk) = MIN( pe3w(ji,jj,jk), pe3w(ji,jj+1,jk) )
-            pe3f (ji,jj,jk) = pe3v(ji,jj,jk)
-         END_3D
-         CALL lbc_lnk( 'usrdef_zgr', pe3v , 'V', 1._wp )   ;   CALL lbc_lnk( 'usrdef_zgr', pe3vw, 'V', 1._wp )
-         CALL lbc_lnk( 'usrdef_zgr', pe3f , 'F', 1._wp )
-         DO jk = 1, jpk
-            ! set to z-scale factor if zero (i.e. along closed boundaries) because of lbclnk
-            WHERE( pe3u (:,:,jk) == 0._wp )   pe3u (:,:,jk) = pe3t_1d(jk)
-            WHERE( pe3v (:,:,jk) == 0._wp )   pe3v (:,:,jk) = pe3t_1d(jk)
-            WHERE( pe3f (:,:,jk) == 0._wp )   pe3f (:,:,jk) = pe3t_1d(jk)
-            WHERE( pe3uw(:,:,jk) == 0._wp )   pe3uw(:,:,jk) = pe3w_1d(jk)
-            WHERE( pe3vw(:,:,jk) == 0._wp )   pe3vw(:,:,jk) = pe3w_1d(jk)
-         END DO
-         !
-      ENDIF
-      !
-   END SUBROUTINE usr_def_zgr
-
-
-   SUBROUTINE zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! 1D reference vertical coordinate
-      !!----------------------------------------------------------------------
-      !!                   ***  ROUTINE zgr_z1d  ***
-      !!
-      !! ** Purpose :   set the depth of model levels and the resulting 
-      !!      vertical scale factors.
-      !!
-      !! ** Method  :   1D z-coordinate system (use in all type of coordinate)
-      !!       The depth of model levels is set from dep(k), an analytical function:
-      !!                   w-level: depw_1d  = dep(k)
-      !!                   t-level: dept_1d  = dep(k+0.5)
-      !!       The scale factors are the discrete derivative of the depth:
-      !!                   e3w_1d(jk) = dk[ dept_1d ] 
-      !!                   e3t_1d(jk) = dk[ depw_1d ]
-      !!
-      !!            ===    Here constant vertical resolution   ===
-      !!
-      !! ** Action  : - pdept_1d, pdepw_1d : depth of T- and W-point (m)
-      !!              - pe3t_1d , pe3w_1d  : scale factors at T- and W-levels (m)
-      !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:), INTENT(out) ::   pdept_1d, pdepw_1d   ! 1D grid-point depth        [m]
-      REAL(wp), DIMENSION(:), INTENT(out) ::   pe3t_1d , pe3w_1d    ! 1D vertical scale factors  [m]
-      !
-      INTEGER  ::   jk       ! dummy loop indices
-      REAL(wp) ::   zt, zw   ! local scalar
-      !!----------------------------------------------------------------------
-      !
-      IF(lwp) THEN                         ! Parameter print
-         WRITE(numout,*)
-         WRITE(numout,*) '    zgr_z1d : Reference vertical z-coordinates: uniform dz = ', rn_e3
-         WRITE(numout,*) '    ~~~~~~~'
-      ENDIF
-      !
-      ! Reference z-coordinate (depth - scale factor at T- and W-points)   ! Madec & Imbard 1996 function
-      ! ----------------------
-      DO jk = 1, jpk
-         zw = REAL( jk , wp )
-         zt = REAL( jk , wp ) + 0.5_wp
-         pdepw_1d(jk) =    rn_e3 *   REAL( jk-1 , wp )
-         pdept_1d(jk) =    rn_e3 * ( REAL( jk-1 , wp ) + 0.5_wp )
-         pe3w_1d (jk) =    rn_e3
-         pe3t_1d (jk) =    rn_e3
-      END DO
-      !
-      IF(lwp) THEN                        ! control print
-         WRITE(numout,*)
-         WRITE(numout,*) '              Reference 1D z-coordinate depth and scale factors:'
-         WRITE(numout, "(9x,' level  gdept_1d  gdepw_1d  e3t_1d   e3w_1d  ')" )
-         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk )
-      ENDIF
-      !
-   END SUBROUTINE zgr_z1d
-   
-   !!======================================================================
-END MODULE usrdef_zgr
diff --git a/tests/ISOMIP/cpp_ISOMIP.fcm b/tests/ISOMIP/cpp_ISOMIP.fcm
deleted file mode 100644
index 4055ae28..00000000
--- a/tests/ISOMIP/cpp_ISOMIP.fcm
+++ /dev/null
@@ -1 +0,0 @@
- bld::tool::fppkeys   key_xios 
diff --git a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90 b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
index 62a16147..b4cac5c1 100644
--- a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
+++ b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90 b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
index a6b980b7..2c5879eb 100644
--- a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
+++ b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
@@ -14,6 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
+   USE dom_oce        ! 
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -31,14 +32,14 @@ MODULE usrdef_zgr
    !! $Id: usrdef_zgr.F90 14433 2021-02-11 08:06:49Z smasson $
    !! Software governed by the CeCILL license (see ./LICENSE)
    !!----------------------------------------------------------------------
-CONTAINS             
-
+CONTAINS
+   
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
+      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
       &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
-      &                    pe3t  , pe3u  , pe3v , pe3f ,               &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw,                      &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -47,12 +48,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !
       INTEGER  ::   jk   ! dummy indices
       REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
@@ -93,18 +94,19 @@ CONTAINS
       !
       !                                !* bottom ocean compute from the depth of grid-points
       k_bot(:,:) = jpkm1 * k_top(:,:)     ! here use k_top as a land mask
-      !                                !* horizontally uniform coordinate (reference z-co everywhere)
-      DO jk = 1, jpk
-         pdept(:,:,jk) = pdept_1d(jk)
-         pdepw(:,:,jk) = pdepw_1d(jk)
-         pe3t (:,:,jk) = pe3t_1d (jk)
-         pe3u (:,:,jk) = pe3t_1d (jk)
-         pe3v (:,:,jk) = pe3t_1d (jk)
-         pe3f (:,:,jk) = pe3t_1d (jk)
-         pe3w (:,:,jk) = pe3w_1d (jk)
-         pe3uw(:,:,jk) = pe3w_1d (jk)
-         pe3vw(:,:,jk) = pe3w_1d (jk)
-      END DO
+      IF( lk_vco_3d ) THEN          !* horizontally uniform coordinate (reference z-co everywhere)
+         DO jk = 1, jpk
+            pdept(:,:,jk) = pdept_1d(jk)
+            pdepw(:,:,jk) = pdepw_1d(jk)
+            pe3t (:,:,jk) = pe3t_1d (jk)
+            pe3u (:,:,jk) = pe3t_1d (jk)
+            pe3v (:,:,jk) = pe3t_1d (jk)
+            pe3f (:,:,jk) = pe3t_1d (jk)
+            pe3w (:,:,jk) = pe3w_1d (jk)
+            pe3uw(:,:,jk) = pe3w_1d (jk)
+            pe3vw(:,:,jk) = pe3w_1d (jk)
+         END DO
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
diff --git a/tests/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm b/tests/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm
index 8ca0747c..6dc86985 100644
--- a/tests/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm
+++ b/tests/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm
@@ -1 +1 @@
- bld::tool::fppkeys   key_qco key_xios 
+ bld::tool::fppkeys   key_qco key_vco_1d key_xios 
diff --git a/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_cen-ahm1000_cfg b/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_cen-ahm1000_cfg
index 2d3c479e..0e68fd72 100644
--- a/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_cen-ahm1000_cfg
+++ b/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_cen-ahm1000_cfg
@@ -6,9 +6,6 @@
 &namusr_def    !   User defined :   OVERFLOW configuration 
 !-----------------------------------------------------------------------
    !                       !  type of vertical coordinate
-   ln_zco      = .false.      ! z-coordinate
-   ln_zps      = .false.      ! z-partial-step coordinate
-   ln_sco      = .true.       ! s-coordinate   
    rn_dx       =   1000.   !  horizontal resolution   [meters]
    rn_dz       =     20.   !  vertical   resolution   [meters]
 /
diff --git a/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_ubs_cfg b/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_ubs_cfg
index 65a70db0..406cfd5a 100644
--- a/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_ubs_cfg
+++ b/tests/OVERFLOW/EXPREF/namelist_sco_FCT2_flux_ubs_cfg
@@ -5,10 +5,6 @@
 !-----------------------------------------------------------------------
 &namusr_def    !   User defined :   OVERFLOW configuration 
 !-----------------------------------------------------------------------
-   !                       !  type of vertical coordinate
-   ln_zco      = .false.      ! z-coordinate
-   ln_zps      = .false.      ! z-partial-step coordinate
-   ln_sco      = .true.       ! s-coordinate   
    rn_dx       =   1000.   !  horizontal resolution   [meters]
    rn_dz       =     20.   !  vertical   resolution   [meters]
 /
diff --git a/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_cen-ahm1000_cfg b/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_cen-ahm1000_cfg
index 6921fdfa..d28129a0 100644
--- a/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_cen-ahm1000_cfg
+++ b/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_cen-ahm1000_cfg
@@ -5,10 +5,6 @@
 !-----------------------------------------------------------------------
 &namusr_def    !   User defined :   OVERFLOW configuration 
 !-----------------------------------------------------------------------
-   !                       !  type of vertical coordinate
-   ln_zco      = .false.      ! z-coordinate
-   ln_zps      = .false.      ! z-partial-step coordinate
-   ln_sco      = .true.       ! s-coordinate   
    rn_dx       =   1000.   !  horizontal resolution   [meters]
    rn_dz       =     20.   !  vertical   resolution   [meters]
 /
diff --git a/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_ubs_cfg b/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_ubs_cfg
index 91681d5c..080a0bae 100644
--- a/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_ubs_cfg
+++ b/tests/OVERFLOW/EXPREF/namelist_sco_FCT4_flux_ubs_cfg
@@ -5,10 +5,6 @@
 !-----------------------------------------------------------------------
 &namusr_def    !   User defined :   OVERFLOW configuration 
 !-----------------------------------------------------------------------
-   !                       !  type of vertical coordinate
-   ln_zco      = .false.      ! z-coordinate
-   ln_zps      = .false.      ! z-partial-step coordinate
-   ln_sco      = .true.       ! s-coordinate   
    rn_dx       =   1000.   !  horizontal resolution   [meters]
    rn_dz       =     20.   !  vertical   resolution   [meters]
 /
diff --git a/tests/OVERFLOW/EXPREF/namelist_zps_FCT4_flux_ubs_cfg b/tests/OVERFLOW/EXPREF/namelist_zps_FCT4_flux_ubs_cfg
index ebc351fe..5e2dfe46 100644
--- a/tests/OVERFLOW/EXPREF/namelist_zps_FCT4_flux_ubs_cfg
+++ b/tests/OVERFLOW/EXPREF/namelist_zps_FCT4_flux_ubs_cfg
@@ -20,9 +20,6 @@
 &namusr_def    !   User defined :   OVERFLOW configuration 
 !-----------------------------------------------------------------------
    !                       !  type of vertical coordinate
-   ln_zco      = .false.      ! z-coordinate
-   ln_zps      = .true.       ! z-partial-step coordinate
-   ln_sco      = .false.      ! s-coordinate   
    rn_dx       =   1000.   !  horizontal resolution   [meters]
    rn_dz       =     20.   !  vertical   resolution   [meters]
 /
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90 b/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
index 0abf8552..55d8d2a6 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_nam.F90 b/tests/OVERFLOW/MY_SRC/usrdef_nam.F90
index 3e75682a..f430a6c6 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_nam.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_nam.F90
@@ -13,7 +13,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
@@ -58,7 +57,7 @@ CONTAINS
       !
       INTEGER ::   ios   ! Local integer
       !!
-      NAMELIST/namusr_def/ ln_zco, ln_zps, ln_sco, rn_dx, rn_dz
+      NAMELIST/namusr_def/ rn_dx, rn_dz
       !!----------------------------------------------------------------------
       !
       READ  ( numnam_cfg, namusr_def, IOSTAT = ios, ERR = 902 )
@@ -79,10 +78,6 @@ CONTAINS
       WRITE(numout,*) 'usr_def_nam  : read the user defined namelist (namusr_def) in namelist_cfg'
       WRITE(numout,*) '~~~~~~~~~~~ '
       WRITE(numout,*) '   Namelist namusr_def : OVERFLOW test case'
-      WRITE(numout,*) '      type of vertical coordinate : '
-      WRITE(numout,*) '         z-coordinate flag                     ln_zco = ', ln_zco
-      WRITE(numout,*) '         z-partial-step coordinate flag        ln_zps = ', ln_zps
-      WRITE(numout,*) '         s-coordinate flag                     ln_sco = ', ln_sco
       WRITE(numout,*) '      horizontal resolution                    rn_dx  = ', rn_dx, ' meters'
       WRITE(numout,*) '      vertical   resolution                    rn_dz  = ', rn_dz, ' meters'
       WRITE(numout,*) '      OVERFLOW domain = 200 km x 3 grid-points x 2000 m'
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90 b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
index b39e22ab..9a88ea58 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1   ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -38,31 +37,32 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
+      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
       &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
-      &                    pe3t  , pe3u  , pe3v , pe3f ,               &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw,                      &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
       !! ** Purpose :   User defined the vertical coordinates
       !!
       !!----------------------------------------------------------------------
-      LOGICAL                   , INTENT(in   ) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags ( read in namusr_def )
-      LOGICAL                   , INTENT(  out) ::   ld_isfcav                   ! under iceshelf cavity flag
-      REAL(wp), DIMENSION(:)    , INTENT(  out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:)    , INTENT(  out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(  out) ::   k_top, k_bot                ! first & last ocean level
+      LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
+      LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
+      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
+      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !
       INTEGER  ::   ji, jj, jk        ! dummy indices
       INTEGER  ::   ik                ! local integers
       REAL(wp) ::   zfact, z1_jpkm1   ! local scalar
       REAL(wp) ::   ze3min            ! local scalar
       REAL(wp), DIMENSION(jpi,jpj) ::   zht, zhu, z2d   ! 2D workspace
+      REAL(wp), DIMENSION(A2D(nn_hls), jpk) ::   zdepw   ! 3D workspace !!st a mettre en ALLOCATABLE
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -74,7 +74,9 @@ CONTAINS
       ! ---------------------------
       ! already set in usrdef_nam.F90 by reading the namusr_def namelist except for ISF
       ld_isfcav = .FALSE.
-      !
+      ld_zco  = .FALSE.
+      ld_zps  = .FALSE.
+      ld_sco  = .TRUE.
       !
       ! Build the vertical coordinate system
       ! ------------------------------------
@@ -89,19 +91,11 @@ CONTAINS
       zht(:,:) = + (  500. + 0.5 * 1500. * ( 1.0 + tanh( (glamt(:,:) - 40.) / 7. ) )  )
       !
       ! at u-point: averaging zht
-      DO_2D( 0, 0, 0, 0 )
+      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls )
          zhu(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji+1,jj) )
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
-         zhu(ji,2) = zht(ji,2)
-      END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
-         zhu(ji,2) = zht(ji,2)
-      END DO
-      zhu(:,1) = zhu(:,2)
-      zhu(:,3) = zhu(:,2)
       !     
       CALL zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! Reference z-coordinate system
       !
@@ -116,50 +110,91 @@ CONTAINS
       !
       !                              
       !
-      IF ( ld_sco ) THEN      !==  s-coordinate  ==!   (terrain-following coordinate)
+      IF( lk_vco_3d ) THEN      !==  s-coordinate  ==!   (terrain-following coordinate)
          !
-         k_bot(:,:) = jpkm1 * k_top(:,:)  !* bottom ocean = jpk-1 (here use k_top as a land mask)
-         !
-         !                                !* terrain-following coordinate with e3.(k)=cst)
-         !                                !  OVERFLOW case : identical with j-index (T=V, U=F)
-         z1_jpkm1 = 1._wp / REAL( jpkm1 , wp)
-         DO jk = 1, jpk
-            pdept(:,:,jk) = zht(:,:) * z1_jpkm1 * ( REAL( jk   , wp ) - 0.5_wp )
-            pdepw(:,:,jk) = zht(:,:) * z1_jpkm1 * ( REAL( jk-1 , wp )          )
-            pe3t (:,:,jk) = zht(:,:) * z1_jpkm1
-            pe3u (:,:,jk) = zhu(:,:) * z1_jpkm1
-            pe3v (:,:,jk) = zht(:,:) * z1_jpkm1
-            pe3f (:,:,jk) = zhu(:,:) * z1_jpkm1
-            pe3w (:,:,jk) = zht(:,:) * z1_jpkm1
-            pe3uw(:,:,jk) = zhu(:,:) * z1_jpkm1
-            pe3vw(:,:,jk) = zht(:,:) * z1_jpkm1
-         END DO      
+         IF( ld_sco ) THEN
+            !
+            k_bot(:,:) = jpkm1 * k_top(:,:)  !* bottom ocean = jpk-1 (here use k_top as a land mask)
+            !
+            !                                !* terrain-following coordinate with e3.(k)=cst)
+            !                                !  OVERFLOW case : identical with j-index (T=V, U=F)
+            z1_jpkm1 = 1._wp / REAL( jpkm1 , wp)
+            DO jk = 1, jpk
+               pdept(:,:,jk) = zht(:,:) * z1_jpkm1 * ( REAL( jk   , wp ) - 0.5_wp )
+               pdepw(:,:,jk) = zht(:,:) * z1_jpkm1 * ( REAL( jk-1 , wp )          )
+               pe3t (:,:,jk) = zht(:,:) * z1_jpkm1
+               pe3u (:,:,jk) = zhu(:,:) * z1_jpkm1
+               pe3v (:,:,jk) = zht(:,:) * z1_jpkm1
+               pe3f (:,:,jk) = zhu(:,:) * z1_jpkm1
+               pe3w (:,:,jk) = zht(:,:) * z1_jpkm1
+               pe3uw(:,:,jk) = zhu(:,:) * z1_jpkm1
+               pe3vw(:,:,jk) = zht(:,:) * z1_jpkm1
+            END DO
+            !
+         ELSEIF( ld_zco ) THEN
+            k_bot(:,:) = jpkm1 * k_top(:,:)     ! here use k_top as a land mask
+            DO jk = 1, jpkm1
+               WHERE( pdept_1d(jk) < zht(:,:) .AND. zht(:,:) <= pdept_1d(jk+1) )   k_bot(:,:) = jk * k_top(:,:)
+            END DO
+            !         !* horizontally uniform coordinate (reference z-co everywhere)
+            DO jk = 1, jpk
+               pdept(:,:,jk) = pdept_1d(jk)
+               pdepw(:,:,jk) = pdepw_1d(jk)
+               pe3t (:,:,jk) = pe3t_1d (jk)
+               pe3u (:,:,jk) = pe3t_1d (jk)
+               pe3v (:,:,jk) = pe3t_1d (jk)
+               pe3f (:,:,jk) = pe3t_1d (jk)
+               pe3w (:,:,jk) = pe3w_1d (jk)
+               pe3uw(:,:,jk) = pe3w_1d (jk)
+               pe3vw(:,:,jk) = pe3w_1d (jk)
+            END DO
+         ELSEIF( ld_zps ) THEN
+            k_bot(:,:) = jpkm1 * k_top(:,:)     ! here use k_top as a land mask
+            DO jk = 1, jpkm1
+               WHERE( pdept_1d(jk) < zht(:,:) .AND. zht(:,:) <= pdept_1d(jk+1) )   k_bot(:,:) = jk * k_top(:,:)
+            END DO
+            !         !* horizontally uniform coordinate (reference z-co everywhere)
+            DO jk = 1, jpk
+               pdept(:,:,jk) = pdept_1d(jk)
+               pdepw(:,:,jk) = pdepw_1d(jk)
+               pe3w (:,:,jk) = pe3w_1d (jk)
+               pe3uw(:,:,jk) = pe3w_1d (jk)
+               pe3vw(:,:,jk) = pe3w_1d (jk)
+            END DO
+            !
+            DO jk = 1, jpk                      ! initialization to the reference z-coordinate
+               pe3t (:,:,jk) = pe3t_1d (jk)
+               pe3u (:,:,jk) = pe3t_1d (jk)
+               pe3v (:,:,jk) = pe3t_1d (jk)
+               pe3f (:,:,jk) = pe3t_1d (jk)
+            END DO
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               ik = k_bot(ji,jj)
+               zdepw(ji,jj,ik+1) = MIN( zht(ji,jj) , pdepw_1d(ik+1) )
+               pe3t (ji,jj,ik  ) = zdepw(ji,jj,ik+1) - zdepw(ji,jj,ik)
+               pe3t (ji,jj,ik+1) = pe3t (ji,jj,ik  ) 
+            END_2D
+            !                                   ! bottom scale factors and depth at  U-, V-, UW and VW-points
+            !                                   ! usually Computed as the minimum of neighbooring scale factors
+            pe3u (:,:,:) = pe3t(:,:,:)          ! HERE OVERFLOW configuration : 
+            pe3v (:,:,:) = pe3t(:,:,:)          !    e3 increases with i-index and identical with j-index
+            pe3f (:,:,:) = pe3t(:,:,:)          !    so e3 minimum of (i,i+1) points is (i) point in j-direction e3v=e3t and e3f=e3v
+            !                                   !    ==>>  no need of lbc_lnk calls
+         ENDIF
       ENDIF
       !
       !
-      IF ( ld_zco ) THEN      !==  z-coordinate  ==!   (step-like topography)
+      IF( lk_vco_1d ) THEN      !==  z-coordinate  ==!   (step-like topography)
          !
          !                                !* bottom ocean compute from the depth of grid-points
          k_bot(:,:) = jpkm1 * k_top(:,:)     ! here use k_top as a land mask
          DO jk = 1, jpkm1
             WHERE( pdept_1d(jk) < zht(:,:) .AND. zht(:,:) <= pdept_1d(jk+1) )   k_bot(:,:) = jk * k_top(:,:)
          END DO
-         !                                !* horizontally uniform coordinate (reference z-co everywhere)
-         DO jk = 1, jpk
-            pdept(:,:,jk) = pdept_1d(jk)
-            pdepw(:,:,jk) = pdepw_1d(jk)
-            pe3t (:,:,jk) = pe3t_1d (jk)
-            pe3u (:,:,jk) = pe3t_1d (jk)
-            pe3v (:,:,jk) = pe3t_1d (jk)
-            pe3f (:,:,jk) = pe3t_1d (jk)
-            pe3w (:,:,jk) = pe3w_1d (jk)
-            pe3uw(:,:,jk) = pe3w_1d (jk)
-            pe3vw(:,:,jk) = pe3w_1d (jk)
-         END DO
       ENDIF
       !
       !
-      IF ( ld_zps ) THEN      !==  zps-coordinate  ==!   (partial bottom-steps)
+      IF( lk_vco_1d3d ) THEN    !==  zps-coordinate  ==!   (partial bottom-steps)
          !
          ze3min = 0.1_wp * rn_dz
          IF(lwp) WRITE(numout,*) '   minimum thickness of the partial cells = 10 % of e3 = ', ze3min
@@ -171,37 +206,33 @@ CONTAINS
             WHERE( zht(:,:) < pdepw_1d(jk) + ze3min )   k_bot(:,:) = jk-1
          END DO
          !
-         !                                !* vertical coordinate system
-         DO jk = 1, jpk                      ! initialization to the reference z-coordinate
-            pdept(:,:,jk) = pdept_1d(jk)
-            pdepw(:,:,jk) = pdepw_1d(jk)
-            pe3t (:,:,jk) = pe3t_1d (jk)
-            pe3u (:,:,jk) = pe3t_1d (jk)
-            pe3v (:,:,jk) = pe3t_1d (jk)
-            pe3f (:,:,jk) = pe3t_1d (jk)
-            pe3w (:,:,jk) = pe3w_1d (jk)
-            pe3uw(:,:,jk) = pe3w_1d (jk)
-            pe3vw(:,:,jk) = pe3w_1d (jk)
-         END DO
-         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            ik = k_bot(ji,jj)
-            pdepw(ji,jj,ik+1) = MIN( zht(ji,jj) , pdepw_1d(ik+1) )
-            pe3t (ji,jj,ik  ) = pdepw(ji,jj,ik+1) - pdepw(ji,jj,ik)
-            pe3t (ji,jj,ik+1) = pe3t (ji,jj,ik  ) 
-            !
-            pdept(ji,jj,ik  ) = pdepw(ji,jj,ik  ) + pe3t (ji,jj,ik  ) * 0.5_wp
-            pdept(ji,jj,ik+1) = pdepw(ji,jj,ik+1) + pe3t (ji,jj,ik+1) * 0.5_wp
-            pe3w (ji,jj,ik+1) = pdept(ji,jj,ik+1) - pdept(ji,jj,ik)              ! = pe3t (ji,jj,ik  )
-            pe3w (ji,jj,ik  ) = pdept(ji,jj,ik  ) - pdept(ji,jj,ik-1)            ! st caution ik > 1
-         END_2D         
-         !                                   ! bottom scale factors and depth at  U-, V-, UW and VW-points
-         !                                   ! usually Computed as the minimum of neighbooring scale factors
-         pe3u (:,:,:) = pe3t(:,:,:)          ! HERE OVERFLOW configuration : 
-         pe3v (:,:,:) = pe3t(:,:,:)          !    e3 increases with i-index and identical with j-index
-         pe3f (:,:,:) = pe3t(:,:,:)          !    so e3 minimum of (i,i+1) points is (i) point
-         pe3uw(:,:,:) = pe3w(:,:,:)          !    in j-direction e3v=e3t and e3f=e3v
-         pe3vw(:,:,:) = pe3w(:,:,:)          !    ==>>  no need of lbc_lnk calls
-         !      
+         IF( ld_zps ) THEN                !* vertical coordinate system
+            DO jk = 1, jpk                      ! initialization to the reference z-coordinate
+               pe3t (:,:,jk) = pe3t_1d (jk)
+               pe3u (:,:,jk) = pe3t_1d (jk)
+               pe3v (:,:,jk) = pe3t_1d (jk)
+               pe3f (:,:,jk) = pe3t_1d (jk)
+            END DO
+            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+               ik = k_bot(ji,jj)
+               zdepw(ji,jj,ik+1) = MIN( zht(ji,jj) , pdepw_1d(ik+1) )
+               pe3t (ji,jj,ik  ) = zdepw(ji,jj,ik+1) - zdepw(ji,jj,ik)
+               pe3t (ji,jj,ik+1) = pe3t (ji,jj,ik  ) 
+            END_2D
+            !                                   ! bottom scale factors and depth at  U-, V-, UW and VW-points
+            !                                   ! usually Computed as the minimum of neighbooring scale factors
+            pe3u (:,:,:) = pe3t(:,:,:)          ! HERE OVERFLOW configuration : 
+            pe3v (:,:,:) = pe3t(:,:,:)          !    e3 increases with i-index and identical with j-index
+            pe3f (:,:,:) = pe3t(:,:,:)          !    so e3 minimum of (i,i+1) points is (i) point in j-direction e3v=e3t and e3f=e3v
+            !                                   !    ==>>  no need of lbc_lnk calls
+         ELSEIF( ld_zco ) THEN
+            DO jk = 1, jpk                      ! initialization to the reference z-coordinate
+               pe3t (:,:,jk) = pe3t_1d (jk)
+               pe3u (:,:,jk) = pe3t_1d (jk)
+               pe3v (:,:,jk) = pe3t_1d (jk)
+               pe3f (:,:,jk) = pe3t_1d (jk)
+            END DO
+         ENDIF
       ENDIF
       !
    END SUBROUTINE usr_def_zgr
@@ -262,3 +293,4 @@ CONTAINS
    
    !!======================================================================
 END MODULE usrdef_zgr
+
diff --git a/tests/OVERFLOW/cpp_OVERFLOW.fcm b/tests/OVERFLOW/cpp_OVERFLOW.fcm
index ef35582c..9abfe31e 100644
--- a/tests/OVERFLOW/cpp_OVERFLOW.fcm
+++ b/tests/OVERFLOW/cpp_OVERFLOW.fcm
@@ -1 +1 @@
-bld::tool::fppkeys   key_qco key_xios 
+bld::tool::fppkeys   key_qco key_vco_3d key_xios 
diff --git a/tests/STATION_ASF/MY_SRC/icesbc.F90 b/tests/STATION_ASF/MY_SRC/icesbc.F90
index 644ad0cf..b6a19b82 100644
--- a/tests/STATION_ASF/MY_SRC/icesbc.F90
+++ b/tests/STATION_ASF/MY_SRC/icesbc.F90
@@ -75,10 +75,9 @@ CONTAINS
          CALL usrdef_sbc_ice_tau( kt )                 ! user defined formulation
          !
       CASE( jp_blk     )
-         CALL blk_ice_1( sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1),   &
-            &                                      theta_air_zt(:,:), q_air_zt(:,:),   &   ! #LB: known from "sbc_oce" module...
-            &                                      sf(jp_slp )%fnow(:,:,1), u_ice, v_ice, tm_su    ,   &   ! inputs
-            &                                      putaui = utau_ice, pvtaui = vtau_ice            )       ! outputs
+         CALL blk_ice_1( sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1), theta_air_zt(:,:), q_air_zt(:,:), & ! <<== in
+            &            sf(jp_slp )%fnow(:,:,1), tm_su(:,:),                                                & ! <<== in
+            &            putaui=utau_ice(A2D(0)), pvtaui=vtau_ice(A2D(0)) )                                    ! ==>> out
          !        CASE( jp_abl     )    utau_ice & vtau_ice are computed in ablmod
       CASE( jp_purecpl )
          CALL sbc_cpl_ice_tau( utau_ice , vtau_ice )   ! Coupled      formulation
@@ -152,13 +151,13 @@ CONTAINS
             &                sf(jp_slp)%fnow(:,:,1), sf(jp_qlw)%fnow(:,:,1), &
             &                sf(jp_prec)%fnow(:,:,1), sf(jp_snow)%fnow(:,:,1) )
          !
-         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
+         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
          IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
          !                        !    compute conduction flux and surface temperature (as in Jules surface module)
          IF( ln_cndflx .AND. .NOT.ln_cndemulate ) &
             &                     CALL blk_ice_qcn    ( ln_virtual_itd, t_su, t_bo, h_s, h_i )
       CASE ( jp_purecpl )         !--- coupled formulation
-         CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
+         CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
          IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
       END SELECT
 
diff --git a/tests/STATION_ASF/MY_SRC/icestp.F90 b/tests/STATION_ASF/MY_SRC/icestp.F90
index a6ef6521..b0cb0aa0 100644
--- a/tests/STATION_ASF/MY_SRC/icestp.F90
+++ b/tests/STATION_ASF/MY_SRC/icestp.F90
@@ -102,7 +102,7 @@ CONTAINS
       INTEGER, INTENT(in) ::   Kbb, Kmm ! ocean time level indices
       INTEGER, INTENT(in) ::   ksbc     ! flux formulation (user defined, bulk, or Pure Coupled)
       !
-      INTEGER ::   jl   ! dummy loop index
+      INTEGER ::   ji, jj, jl   ! dummy loop index
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('ice_stp')
@@ -116,8 +116,10 @@ CONTAINS
          u_oce(:,:) = ssu_m(:,:)                  ! -- mean surface ocean current
          v_oce(:,:) = ssv_m(:,:)
          !
-         CALL eos_fzp( sss_m(:,:) , t_bo(:,:) )   ! -- freezing temperature [Kelvin] (set to rt0 over land)
-         t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) )
+         CALL eos_fzp( sss_m(:,:), t_bo(:,:), kbnd=0 )   ! -- freezing temperature [Kelvin] (set to rt0 over land)
+         DO_2D( 0, 0, 0, 0 )
+            t_bo(ji,jj) = ( t_bo(ji,jj) + rt0 ) * tmask(ji,jj,1) + rt0 * ( 1._wp - tmask(ji,jj,1) )
+         END_2D
          !
          !
          !------------------------------------------------!
diff --git a/tests/STATION_ASF/MY_SRC/stpctl.F90 b/tests/STATION_ASF/MY_SRC/stpctl.F90
index c51b3504..29ac3941 100644
--- a/tests/STATION_ASF/MY_SRC/stpctl.F90
+++ b/tests/STATION_ASF/MY_SRC/stpctl.F90
@@ -74,8 +74,8 @@ CONTAINS
       IF( nstop > 0 .AND. ngrdstop > -1 )   RETURN   !   stpctl was already called by a child grid
       !
       ll_wrtstp  = ( MOD( kt-nit000, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend )
-      ll_colruns = ll_wrtstp .AND. sn_cfctl%l_runstat .AND. jpnij > 1
-      ll_wrtruns = ( ll_colruns .OR. jpnij == 1 ) .AND. lwm
+      ll_colruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. jpnij > 1
+      ll_wrtruns = sn_cfctl%l_runstat .AND. ll_wrtstp .AND. lwm
       !
       IF( kt == nit000 ) THEN
          !
@@ -121,8 +121,8 @@ CONTAINS
       !
       ll_0oce = .NOT. ANY( llmsk(:,:) )                                         ! no ocean point in the inner domain?
       !
-      zmax(1) = MAXVAL(     taum(:,:)  , mask = llmsk )                         ! max wind stress module
-      zmax(2) = MAXVAL( ABS( qns(:,:) ), mask = llmsk )                         ! max non-solar heat flux
+      zmax(1) = MAXVAL(     taum(:,:)  , mask = llmsk(A2D(0)) )                 ! max wind stress module
+      zmax(2) = MAXVAL( ABS( qns(:,:) ), mask = llmsk(A2D(0)) )                 ! max non-solar heat flux
       zmax(3) = MAXVAL( ABS( emp(:,:) ), mask = llmsk )                         ! max E-P
       zmax(jpvar+1) = REAL( nstop, wp )                                         ! stop indicator
       !
@@ -159,9 +159,9 @@ CONTAINS
             ! first: close the netcdf file, so we can read it
             IF( lwm .AND. kt /= nitend )   istatus = NF90_CLOSE(nrunid)
             ! get global loc on the min/max
-            CALL mpp_maxloc( 'stpctl',    taum(:,:)  , llmsk, zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F
-            CALL mpp_maxloc( 'stpctl',ABS( qns(:,:) ), llmsk, zzz, iloc(1:2,2) )
-            CALL mpp_minloc( 'stpctl',ABS( emp(:,:) ), llmsk, zzz, iloc(1:2,3) )
+            CALL mpp_maxloc( 'stpctl',    taum(:,:)  , llmsk(A2D(0)), zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F
+            CALL mpp_maxloc( 'stpctl',ABS( qns(:,:) ), llmsk(A2D(0)), zzz, iloc(1:2,2) )
+            CALL mpp_minloc( 'stpctl',ABS( emp(:,:) ), llmsk        , zzz, iloc(1:2,3) )
             ! find which subdomain has the max.
             iareamin(:) = jpnij+1   ;   iareamax(:) = 0   ;   iareasum(:) = 0
             DO ji = 1, jptst
@@ -174,11 +174,11 @@ CONTAINS
             CALL mpp_sum( "stpctl", iareasum )         ! sum over the global domain
          ELSE                    ! find local min and max locations:
             ! if we are here, this means that the subdomain contains some oce points -> no need to test the mask used in maxloc
-            iloc(1:2,1) = MAXLOC(     taum(:,:)  , mask = llmsk )
-            iloc(1:2,2) = MAXLOC( ABS( qns(:,:) ), mask = llmsk )
-            iloc(1:2,3) = MINLOC( ABS( emp(:,:) ), mask = llmsk )
+            iloc(1:2,1) = MAXLOC(     taum(:,:)  , mask = llmsk(A2D(0)) )
+            iloc(1:2,2) = MAXLOC( ABS( qns(:,:) ), mask = llmsk(A2D(0)) )
+            iloc(1:2,3) = MINLOC( ABS( emp(:,:) ), mask = llmsk         )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
@@ -196,11 +196,11 @@ CONTAINS
          CALL dia_wri_state( Kmm, 'output.abort' )     ! create an output.abort file
          !
          IF( ll_colruns .OR. jpnij == 1 ) THEN   ! all processes synchronized -> use lwp to print in opened ocean.output files
-            IF(lwp) THEN   ;   CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 )
+            IF(lwp) THEN   ;   CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ctmp4, ' ', ctmp6 )
             ELSE           ;   nstop = MAX(1, nstop)   ! make sure nstop > 0 (automatically done when calling ctl_stop)
             ENDIF
          ELSE                                    ! only mpi subdomains with errors are here -> STOP now
-            CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ctmp4, ctmp5, ' ', ctmp6 )
+            CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ctmp4, ' ', ctmp6 )
          ENDIF
          !
       ENDIF
diff --git a/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90 b/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
index 65d186a5..199dce11 100644
--- a/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
+++ b/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
@@ -13,7 +13,6 @@ MODULE usrdef_hgr
    !!----------------------------------------------------------------------
    !!   usr_def_hgr   : initialize the horizontal mesh
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE c1d      ,  ONLY: rn_lon1d, rn_lat1d ! ocean lon/lat define by namelist
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/STATION_ASF/MY_SRC/usrdef_nam.F90 b/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
index fda9175c..b16e9285 100644
--- a/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
+++ b/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/SWG/EXPREF/file_def_nemo-oce.xml b/tests/SWG/EXPREF/file_def_nemo-oce.xml
index fb16bbbd..3b1c4d50 100644
--- a/tests/SWG/EXPREF/file_def_nemo-oce.xml
+++ b/tests/SWG/EXPREF/file_def_nemo-oce.xml
@@ -27,6 +27,8 @@
           <field field_ref="sKE"          name="sKE"       operation = "instant" />
           <field field_ref="ssh"          name="sossheig"  operation = "instant" />
           <field field_ref="wetdep"       name="hswe_wd"   operation = "instant" />
+          <field field_ref="utau"         name="sozotaux"   operation = "instant"  />
+          <field field_ref="vtau"         name="sometauy"   operation = "instant"  />
         </file>
 
         <file id="file2" name_suffix="_grid_U" description="ocean U grid variables" >
@@ -34,7 +36,6 @@
           <field field_ref="e3u_0"        name="e3u_0"      operation = "instant" />
           <field field_ref="hu"           name="hu"         operation = "instant" />
           <field field_ref="ssu"          name="ssu"        operation = "instant"  />
-          <field field_ref="utau"         name="sozotaux"   operation = "instant"  />
         </file>
 
         <file id="file3" name_suffix="_grid_V" description="ocean V grid variables" >
@@ -42,7 +43,6 @@
           <field field_ref="e3v_0"        name="e3v_0"      operation = "instant" />
           <field field_ref="hv"           name="hv"         operation = "instant" />
           <field field_ref="ssv"          name="ssv"        operation = "instant"  />
-          <field field_ref="vtau"         name="sometauy"   operation = "instant"  />
         </file>
         
         <file id="file5" name_suffix="_grid_F" description="ocean F grid variables" >
diff --git a/tests/SWG/MY_SRC/usrdef_fmask.F90 b/tests/SWG/MY_SRC/usrdef_fmask.F90
index 01418092..6ad45ee1 100644
--- a/tests/SWG/MY_SRC/usrdef_fmask.F90
+++ b/tests/SWG/MY_SRC/usrdef_fmask.F90
@@ -68,22 +68,22 @@ CONTAINS
             !
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ij0 = 101   ;   ij1 = 101           ! Gibraltar strait  : partial slip (pfmsk=0.5)
-            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             ij0 = 102   ;   ij1 = 102
-            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             !
             IF(lwp) WRITE(numout,*) '      Bab el Mandeb '
             ij0 =  87   ;   ij1 =  88           ! Bab el Mandeb : partial slip (pfmsk=1)
-            ii0 = 160   ;   ii1 = 160   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            ii0 = 160   ;   ii1 = 160   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             ij0 =  88   ;   ij1 =  88
-            ii0 = 159   ;   ii1 = 159   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            ii0 = 159   ;   ii1 = 159   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             !
             ! We keep this as an example but it is instable in this case 
             !IF(lwp) WRITE(numout,*) '      Danish straits '
             !         ij0 = 115   ;   ij1 = 115 ! Danish straits  : strong slip (pfmsk > 2)
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !         ij0 = 116   ;   ij1 = 116
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !
          CASE( 1 )                           ! R1 case
             IF(lwp) WRITE(numout,*)
@@ -99,35 +99,35 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '   orca_r1: increase friction near the following straits : '
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ii0 = 282           ;   ii1 = 283        ! Gibraltar Strait 
-            ij0 = 241 - isrow   ;   ij1 = 241 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 241 - isrow   ;   ij1 = 241 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Bhosporus '
             ii0 = 314           ;   ii1 = 315        ! Bhosporus Strait 
-            ij0 = 248 - isrow   ;   ij1 = 248 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 248 - isrow   ;   ij1 = 248 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Makassar (Top) '
             ii0 =  48           ;   ii1 =  48        ! Makassar Strait (Top) 
-            ij0 = 189 - isrow   ;   ij1 = 190 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 189 - isrow   ;   ij1 = 190 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      Lombok '
             ii0 =  44           ;   ii1 =  44        ! Lombok Strait 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Ombai '
             ii0 =  53           ;   ii1 =  53        ! Ombai Strait 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Timor Passage '
             ii0 =  56           ;   ii1 =  56        ! Timor Passage 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      West Halmahera '
             ii0 =  58           ;   ii1 =  58        ! West Halmahera Strait 
-            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      East Halmahera '
             ii0 =  55           ;   ii1 =  55        ! East Halmahera Strait 
-            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
          CASE DEFAULT
             IF(lwp) WRITE(numout,*)
diff --git a/tests/SWG/MY_SRC/usrdef_nam.F90 b/tests/SWG/MY_SRC/usrdef_nam.F90
index 37742d76..fb95a32e 100644
--- a/tests/SWG/MY_SRC/usrdef_nam.F90
+++ b/tests/SWG/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/SWG/MY_SRC/usrdef_sbc.F90 b/tests/SWG/MY_SRC/usrdef_sbc.F90
index a3069954..6283b4a5 100644
--- a/tests/SWG/MY_SRC/usrdef_sbc.F90
+++ b/tests/SWG/MY_SRC/usrdef_sbc.F90
@@ -61,7 +61,7 @@ CONTAINS
       REAL(wp) ::   ztauu, ztauv          ! wind intensity projeted
       REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
       REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
-      REAL(wp) ::   ztx, zty, zmod, zcoef ! temporary variables
+      REAL(wp) ::   zmod, zcoef           ! temporary variables
       !!---------------------------------------------------------------------
 
       ! ---------------------------- !
@@ -86,22 +86,19 @@ CONTAINS
       ztauu =   REAL( rn_tau, wp ) * COS( rn_theta * rad )   ! N.m-2
       ztauv = - REAL( rn_tau, wp ) * SIN( rn_theta * rad )   ! N.m-2
       
+      zcoef = 1. / ( zrhoa * zcdrag ) 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          ! length of the domain : 2000km x 2000km 
-         utau(ji,jj) = - ztauu * COS( rpi * gphiu(ji,jj) / 2000000._wp)
-         vtau(ji,jj) = - ztauv * COS( rpi * gphiv(ji,jj) / 2000000._wp)
+         utau(ji,jj) = - ztauu * COS( rpi * gphit(ji,jj) / 2000000._wp)
+         vtau(ji,jj) = - ztauv * COS( rpi * gphit(ji,jj) / 2000000._wp)
       END_2D
       
       ! module of wind stress and wind speed at T-point
-      zcoef = 1. / ( zrhoa * zcdrag ) 
       DO_2D( 0, 0, 0, 0 )
-         ztx = utau(ji-1,jj  ) + utau(ji,jj) 
-         zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
-         zmod = 0.5 * SQRT( ztx * ztx + zty * zty )
-         taum(ji,jj) = zmod
+         zmod = SQRT( utau(ji,jj) * utau(ji,jj) + vtau(ji,jj) * vtau(ji,jj) )
+         taum(ji,jj) = zmod      
          wndm(ji,jj) = SQRT( zmod * zcoef )
       END_2D
-      CALL lbc_lnk( 'usrdef_sbc', taum(:,:), 'T', 1. , wndm(:,:), 'T', 1. )
       !
    END SUBROUTINE usrdef_sbc_oce
 
diff --git a/tests/SWG/MY_SRC/usrdef_zgr.F90 b/tests/SWG/MY_SRC/usrdef_zgr.F90
index acd295e3..7da49f1f 100644
--- a/tests/SWG/MY_SRC/usrdef_zgr.F90
+++ b/tests/SWG/MY_SRC/usrdef_zgr.F90
@@ -37,14 +37,14 @@ MODULE usrdef_zgr
    !! $Id: usrdef_zgr.F90 10425 2018-12-19 21:54:16Z smasson $
    !! Software governed by the CeCILL license (see ./LICENSE)
    !!----------------------------------------------------------------------
-CONTAINS             
-
+CONTAINS
+   
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
+      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors at t-level
       &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
-      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
-      &                    k_top , k_bot                 )                 ! top & bottom ocean level
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors at w-level
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -53,12 +53,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !
       INTEGER  ::   inum   ! local logical unit
       REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
diff --git a/tests/SWG/cpp_SWG.fcm b/tests/SWG/cpp_SWG.fcm
index 880c4685..38af76f7 100644
--- a/tests/SWG/cpp_SWG.fcm
+++ b/tests/SWG/cpp_SWG.fcm
@@ -1 +1 @@
-bld::tool::fppkeys key_xios key_qco key_RK3
+bld::tool::fppkeys key_xios key_qco key_vco_3d key_RK3
diff --git a/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90 b/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
index 5c9921e4..d8a5d6d8 100644
--- a/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
+++ b/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
@@ -88,8 +88,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )         
-         zti = REAL( mig0(ji)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
+         zti = REAL( mig(ji,0)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
          
          plamt(ji,jj) = rn_dx *   zti
          plamu(ji,jj) = rn_dx * ( zti + 0.5_wp ) 
diff --git a/tests/VORTEX/MY_SRC/usrdef_hgr.F90 b/tests/VORTEX/MY_SRC/usrdef_hgr.F90
index 7721821b..c6d0003e 100644
--- a/tests/VORTEX/MY_SRC/usrdef_hgr.F90
+++ b/tests/VORTEX/MY_SRC/usrdef_hgr.F90
@@ -93,8 +93,8 @@ CONTAINS
       ENDIF
 #endif         
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji)-1, wp )  ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-1, wp )  ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0)-1, wp )  ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-1, wp )  ! start at j=0 in the global grid without halos
          
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti 
diff --git a/tests/VORTEX/MY_SRC/usrdef_zgr.F90 b/tests/VORTEX/MY_SRC/usrdef_zgr.F90
index 6b02fbcb..06c739ed 100644
--- a/tests/VORTEX/MY_SRC/usrdef_zgr.F90
+++ b/tests/VORTEX/MY_SRC/usrdef_zgr.F90
@@ -36,11 +36,11 @@ MODULE usrdef_zgr
 CONTAINS             
 
    SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
+      &                    k_top   , k_bot                        ,    &   ! top & bottom ocean level
       &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
-      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
       &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
-      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
-      &                    k_top  , k_bot    )                             ! top & bottom ocean level
+      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
+      &                    pe3w  , pe3uw , pe3vw                       )   ! vertical scale factors
       !!---------------------------------------------------------------------
       !!              ***  ROUTINE usr_def_zgr  ***
       !!
@@ -49,16 +49,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
       LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
+      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
-      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
-      !
-      INTEGER  ::   inum   ! local logical unit
-      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
-      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), OPTIONAL, INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
@@ -80,11 +76,13 @@ CONTAINS
       !
       CALL zgr_msk_top_bot( k_top , k_bot )                 ! masked top and bottom ocean t-level indices
       !
-      !                                                     ! z-coordinate (3D arrays) from the 1D z-coord.
-      CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
-         &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
-         &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
-         &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      !
+      IF( PRESENT( pe3t ) ) THEN                            ! z-coordinate (3D arrays) from the 1D z-coord.
+         CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
+            &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
+            &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
+            &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
+      ENDIF
       !
    END SUBROUTINE usr_def_zgr
 
diff --git a/tests/VORTEX/cpp_VORTEX.fcm b/tests/VORTEX/cpp_VORTEX.fcm
index 66e62c9b..c3349e81 100644
--- a/tests/VORTEX/cpp_VORTEX.fcm
+++ b/tests/VORTEX/cpp_VORTEX.fcm
@@ -1 +1 @@
- bld::tool::fppkeys key_xios key_agrif key_qco 
+ bld::tool::fppkeys key_xios key_agrif key_qco key_vco_1d 
diff --git a/tests/WAD/EXPREF/file_def_nemo-oce.xml b/tests/WAD/EXPREF/file_def_nemo-oce.xml
index a9c10b7e..90124a63 100644
--- a/tests/WAD/EXPREF/file_def_nemo-oce.xml
+++ b/tests/WAD/EXPREF/file_def_nemo-oce.xml
@@ -69,16 +69,16 @@
 	  <field field_ref="qt"           name="sohefldo"  />
 	  <field field_ref="mldr10_1"     name="somxl010"  />
 	  <field field_ref="mldkz5"       name="somixhgt"  />
+          <field field_ref="utau"         name="sozotaux"  />
+          <field field_ref="vtau"         name="sometauy"  /> 
     </file>
 	
 	<file id="file2" name_suffix="_grid_U" description="ocean U grid variables" >
           <field field_ref="uoce"         name="vozocrtx"  />
-          <field field_ref="utau"         name="sozotaux"  />
     </file>
 	
 	<file id="file3" name_suffix="_grid_V" description="ocean V grid variables" >
           <field field_ref="voce"         name="vomecrty"  /> 
-          <field field_ref="vtau"         name="sometauy"  /> 
     </file>
 	
 	<file id="file4" name_suffix="_grid_W" description="ocean W grid variables" >
diff --git a/tests/WAD/MY_SRC/usrdef_hgr.F90 b/tests/WAD/MY_SRC/usrdef_hgr.F90
index 38cec157..459c26dc 100644
--- a/tests/WAD/MY_SRC/usrdef_hgr.F90
+++ b/tests/WAD/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/WAD/MY_SRC/usrdef_istate.F90 b/tests/WAD/MY_SRC/usrdef_istate.F90
index b34b77c7..36896424 100644
--- a/tests/WAD/MY_SRC/usrdef_istate.F90
+++ b/tests/WAD/MY_SRC/usrdef_istate.F90
@@ -13,8 +13,7 @@ MODULE usrdef_istate
    !!----------------------------------------------------------------------
    !!  usr_def_istate : initial state in Temperature and salinity
    !!----------------------------------------------------------------------
-   USE par_oce        ! ocean space and time domain
-   USE dom_oce , ONLY : mi0, mig, mjg, glamt, gphit, ht_0
+   USE dom_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    USE wet_dry        ! Wetting and drying
    !
@@ -44,7 +43,7 @@ CONTAINS
       !! ** Purpose :   Initialization of the dynamics and tracers
       !!                Here WAD_TEST_CASES configuration 
       !!
-q      !! ** Method  : - set temprature field
+      !! ** Method  : - set temprature field
       !!              - set salinity   field
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
@@ -116,7 +115,7 @@ q      !! ** Method  : - set temprature field
             IF(lwp) WRITE(numout,*) 'usr_def_istate : WAD Parobolic EW channel with gaussian ridge' 
             IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
             !
-            DO ji = mi0(jpiglo/2), mi0(jpiglo)
+            DO ji = mi0(jpiglo/2,nn_hls), mi1(jpiglo,nn_hls)
                pts(ji,:,:,jp_sal) = 30._wp
             END DO
             !
@@ -230,7 +229,7 @@ q      !! ** Method  : - set temprature field
                pssh(ji,:) = ( -2.5_wp + 5.5_wp*(50._wp-glamt(ji,1))/50._wp)*ptmask(ji,:,1)
             END DO
             !
-            DO ji = mi0(jpiglo/2), mi0(jpiglo)
+            DO ji = mi0(jpiglo/2,nn_hls), mi1(jpiglo,nn_hls)
                pssh(ji,:) = -0.1*ptmask(ji,:,1)
             END DO
             !
diff --git a/tests/WAD/MY_SRC/usrdef_zgr.F90 b/tests/WAD/MY_SRC/usrdef_zgr.F90
index eab2b9a3..df9970a0 100644
--- a/tests/WAD/MY_SRC/usrdef_zgr.F90
+++ b/tests/WAD/MY_SRC/usrdef_zgr.F90
@@ -14,7 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z     : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: ht_0, mi0, mi1, mj0, mj1, glamt, gphit         ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    USE wet_dry ,  ONLY: rn_wdmin1, rn_wdmin2, rn_wdld  ! Wetting and drying
    !
@@ -101,10 +101,10 @@ CONTAINS
                  zi = MIN((glamt(ji,1) - 10.0)/40.0, 1.0 )
                  zht(ji,:) = MAX(zbathy*zi, -2.0) 
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                     ! ====================
             CASE ( 2, 3, 8 )                         ! WAD 2 or 3  configuration
                !                                     ! ====================
@@ -117,11 +117,11 @@ CONTAINS
                  zi = MAX(1.0-((glamt(ji,1)-25.0)**2)/484.0, -0.3 )
                  zht(ji,:) = MAX(zbathy*zi, -2.0)
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
                IF( nn_cfg /= 8 ) THEN
-                  zht(:,mj0(1):mj1(1)) = -4._wp
-                  zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+                  zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+                  zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                ENDIF
                !                                     ! ====================
             CASE ( 4 )                               ! WAD 4 configuration
@@ -138,10 +138,10 @@ CONTAINS
                  zht(ji,jj) = MAX(zbathy*zi*zj, -2.0)
                END DO
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(1     ,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 5 )                              ! WAD 5 configuration
                !                                    ! ====================
@@ -168,10 +168,10 @@ CONTAINS
                  ENDIF
                END DO
                !                                    ! ===========================
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 6 )                              ! WAD 6 configuration
                !                                    ! ====================
@@ -185,10 +185,10 @@ CONTAINS
                  zj = 1.075*MAX(EXP(-1.0*((glamt(ji,1)-25.0)**2)/32.0) , 0.0 )
                  zht(ji,:) = MAX(zbathy*(zi-zj), -2.0)
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 7 )                              ! WAD 7 configuration
                !                                    ! ====================
@@ -215,9 +215,9 @@ CONTAINS
                  ENDIF
                END DO
                !                                    ! ===========================
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
             CASE DEFAULT
                !                                    ! ===========================
                WRITE(ctmp1,*) 'WAD test with a ', nn_cfg,' option is not coded'
@@ -234,10 +234,10 @@ CONTAINS
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrounding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
+      DO ji = mi0(     1,nn_hls), mi1(     1,nn_hls)              ! first row of global domain only
          zhu(ji,:) = zht(1,:)
       END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
+       DO ji = mi0(jpiglo,nn_hls), mi1(jpiglo,nn_hls)   ! last  row of global domain only
          zhu(ji,:) = zht(jpi,:)
       END DO
       ! at v-point: averaging zht
@@ -246,10 +246,10 @@ CONTAINS
          zhv(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji,jj+1) )
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhv, 'V', 1. )     ! boundary condition: this mask the surrounding grid-points
-      DO jj = mj0(1), mj1(1)   ! first  row of global domain only
+      DO jj = mj0(     1,nn_hls), mj1(     1,nn_hls)   ! first  row of global domain only
          zhv(:,jj) = zht(:,jj)
       END DO
-      DO jj = mj0(jpjglo), mj1(jpjglo)   ! last  row of global domain only
+      DO jj = mj0(jpjglo,nn_hls), mj1(jpjglo,nn_hls)   ! last  row of global domain only
          zhv(:,jj) = zht(:,jj)
       END DO
       !     
@@ -261,10 +261,10 @@ CONTAINS
       ! no ocean cavities : top ocean level is ONE, except over land
       ! the ocean basin surrounnded by land (1+nn_hls grid-points) set through lbc_lnk call
       z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
-      z2d(mi0(1):mi1(1),:) = 0._wp
-      z2d(mi0(jpiglo):mi1(jpiglo),:) = 0._wp
-      z2d(:,mj0(1):mj1(1)) = 0._wp
-      z2d(:,mj0(jpjglo):mj1(jpjglo)) = 0._wp
+      z2d(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = 0._wp
+      z2d(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = 0._wp
+      z2d(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = 0._wp
+      z2d(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = 0._wp
 
       CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
diff --git a/tools/MISCELLANEOUS/chk_jijj_in_doloops.sh b/tools/MISCELLANEOUS/chk_jijj_in_doloops.sh
new file mode 100755
index 00000000..2664643b
--- /dev/null
+++ b/tools/MISCELLANEOUS/chk_jijj_in_doloops.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+#
+# check if a do loop, starting with DO_2D, DO_3D ou DO ji=, contains (:,:
+# that most probably should be (ji,jj
+#
+set -u
+
+for ff in $( find src -name "*90" ) */*/MY_SRC/*90
+do
+    
+    for ll1 in $( grep -n DO_2D $ff | sed -s "s/:.*//" )
+    do
+	nb=$( sed -n ${ll1},/END_2D/p  $ff | sed -e "s/\!.*//" | grep -c "( *: *, *:" )
+	if [ $nb -ne 0 ]
+	then
+	    echo "----------------------------------------------"
+	    echo
+	    echo "error in DO_2D: $ff $nb"
+	    sed -n ${ll1},/END_2D/p $ff
+	    echo
+	fi
+    done
+    
+    for ll1 in $( grep -n DO_3D $ff | sed -s "s/:.*//" )
+    do
+	nb=$( sed -n ${ll1},/END_3D/p $ff | sed -e "s/\!.*//" | grep -c "( *: *, *:" )
+	if [ $nb -ne 0 ]
+	then
+	    echo "----------------------------------------------"
+	    echo
+	    echo "error in DO_3D: $ff $nb"
+	    sed -n ${ll1},/END_3D/p $ff
+	    echo
+	fi
+    done
+    
+    for ll1 in $( grep -in "DO  *ji *=" $ff | sed -s "s/:.*//" )
+    do
+	nb=$( sed -n ${ll1},/"[eE][nN][dD] *[dD][oO]"/p $ff | sed -e "s/\!.*//" | grep -c "( *: *, *:" )
+	if [ $nb -ne 0 ]
+	then
+	    echo "----------------------------------------------"
+	    echo
+	    echo "error in END DO: $ff $nb"
+	    sed -n ${ll1},/"[eE][nN][dD] *[dD][oO]"/p $ff
+	    echo
+	fi
+    done
+    
+done
+
+
+
+
+
-- 
GitLab