From 1796c1d191556e095364152d2a55aa85e6d10e92 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 22 Sep 2022 10:43:45 +0200
Subject: [PATCH] Philippe 22/09/2022: add XXHAT_ll, XYHAT_ll, XHATM_ll and
 XYHATM_ll and use them

---
 src/LIB/SURCOUCHE/src/mode_field.f90        |  60 ++++++-
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  36 +++--
 src/MNH/fun.f90                             |  34 +---
 src/MNH/ibm_idealrp.f90                     |  15 +-
 src/MNH/ini_les_cart_maskn.f90              |  25 +--
 src/MNH/ini_lesn.f90                        |  24 +--
 src/MNH/ini_modeln.f90                      |   5 +-
 src/MNH/ini_spectren.f90                    |   1 +
 src/MNH/modd_gridn.f90                      |   7 +-
 src/MNH/modd_shadowsn.f90                   |  19 +--
 src/MNH/prep_ideal_case.f90                 |  12 +-
 src/MNH/read_hgridn.f90                     |   4 +-
 src/MNH/read_ver_grid.f90                   |   4 +-
 src/MNH/set_grid.f90                        | 166 ++++++++++++--------
 src/MNH/set_perturb.f90                     |  21 +--
 src/MNH/spawn_grid2.f90                     |  15 +-
 src/MNH/spawn_model2.f90                    |   1 +
 src/MNH/surf_solar_shadows.f90              |  11 +-
 src/MNH/turb_ver_thermo_flux.f90            |  16 --
 19 files changed, 252 insertions(+), 224 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 71eefd211..4e444469a 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -468,7 +468,7 @@ call Add_field2list( TFIELDDATA( &
   CLONGNAME  = 'XHATM',          &
   CUNITS     = 'm',              &
   CDIR       = 'XX',             &
-  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass point', &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass points', &
   NGRID      = 1,                &
   NTYPE      = TYPEREAL,         &
   NDIMS      = 1,                &
@@ -480,7 +480,7 @@ call Add_field2list( TFIELDDATA( &
   CLONGNAME  = 'YHATM',          &
   CUNITS     = 'm',              &
   CDIR       = 'YY',             &
-  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass point', &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass points', &
   NGRID      = 1,                &
   NTYPE      = TYPEREAL,         &
   NDIMS      = 1,                &
@@ -780,6 +780,58 @@ call Add_field2list( TFIELDDATA( &
   NDIMS      = 2,                &
   LTIMEDEP   = .FALSE.           ) )
 
+!Note: do not use XHAT_ll in I/O (use XHAT instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHAT_ll',        &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHAT_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane (all domain)', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use YHAT_ll in I/O (use YHAT instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHAT_ll',        &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHAT_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane (all domain)', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use XHATM_ll in I/O (use XHATM instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'XHATM_ll',        &
+  CSTDNAME   = 'projection_x_coordinate', &
+  CLONGNAME  = 'XHATL_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'XX',             &
+  CCOMMENT   = 'Position x in the conformal or cartesian plane at mass points (all domain)', &
+  NGRID      = 2,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
+!Note: do not use YHATM_ll in I/O (use YHATM instead)
+call Add_field2list( TFIELDDATA( &
+  CMNHNAME   = 'YHATM_ll',        &
+  CSTDNAME   = 'projection_y_coordinate', &
+  CLONGNAME  = 'YHATM_ll',        &
+  CUNITS     = 'm',              &
+  CDIR       = 'YY',             &
+  CCOMMENT   = 'Position y in the conformal or cartesian plane at mass points (all domain)', &
+  NGRID      = 3,                &
+  NTYPE      = TYPEREAL,         &
+  NDIMS      = 1,                &
+  LTIMEDEP   = .FALSE.           ) )
+
 call Add_field2list( TFIELDDATA(   &
   CMNHNAME   = 'ZS',               &
   CSTDNAME   = 'surface_altitude', &
@@ -3673,6 +3725,10 @@ call Goto_model_1field( 'SINSLOPE', kfrom, kto, XSINSLOPE )
 call Goto_model_1field( 'MAP',      kfrom, kto, XMAP )
 call Goto_model_1field( 'LAT',      kfrom, kto, XLAT )
 call Goto_model_1field( 'LON',      kfrom, kto, XLON )
+call Goto_model_1field( 'XHAT_ll',  kfrom, kto, XXHAT_ll  )
+call Goto_model_1field( 'YHAT_ll',  kfrom, kto, XYHAT_ll  )
+call Goto_model_1field( 'XHATM_ll', kfrom, kto, XXHATM_ll )
+call Goto_model_1field( 'YHATM_ll', kfrom, kto, XYHATM_ll )
 !
 ! MODD_TIME_n variables
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 65ffbdc8e..43a779e3e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1450,7 +1450,7 @@ use modd_field,      only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, N
                            NMNHDIM_PROFILER_TIME, NMNHDIM_STATION_TIME,                                    &
                            tfieldlist
 use modd_grid,       only: xlatori, xlonori
-use modd_grid_n,     only: lsleve, xxhat, xxhatm, xyhat, xyhatm, xzhat, xzhatm
+use modd_grid_n,     only: lsleve, xxhat, xxhatm, xyhat, xyhatm, xzhat, xzhatm, xxhat_ll, xyhat_ll, xxhatm_ll, xyhatm_ll
 use modd_les,        only: cles_level_type, cspectra_level_type, nlesn_iinf, nlesn_isup, nlesn_jinf, nlesn_jsup, &
                            nles_k, nles_levels, nspectra_k, nspectra_levels,                                     &
                            xles_altitudes, xspectra_altitudes
@@ -1494,9 +1494,9 @@ type(tdimnc),                    pointer              :: tzdim_ni, tzdim_nj, tzd
 type(date_time), dimension(:),            allocatable :: tzdates
 type(date_time), dimension(:,:),          allocatable :: tzdates_bound
 
+real, dimension(:),   pointer :: zxhat_glob,  zyhat_glob
+real, dimension(:),   pointer :: zxhatm_glob, zyhatm_glob
 !These variables are save: they are populated once for the master Z-split file and freed after the last file has been written
-real, dimension(:),   pointer, save :: zxhat_glob  => null(), zyhat_glob  => null()
-real, dimension(:),   pointer, save :: zxhatm_glob => null(), zyhatm_glob => null()
 real, dimension(:,:), pointer, save :: zlatm_glob  => null(), zlonm_glob  => null()
 real, dimension(:,:), pointer, save :: zlatu_glob  => null(), zlonu_glob  => null()
 real, dimension(:,:), pointer, save :: zlatv_glob  => null(), zlonv_glob  => null()
@@ -1511,6 +1511,10 @@ zzhat  => null()
 zxhatm => null()
 zyhatm => null()
 zzhatm => null()
+zxhat_glob  => null()
+zyhat_glob  => null()
+zxhatm_glob => null()
+zyhatm_glob => null()
 
 gchangemodel = .false.
 
@@ -1538,6 +1542,14 @@ if ( tpfile%nmodel > 0 ) then
   zzhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
   call Find_field_id_from_mnhname( 'ZHATM', iid, iresp )
   zzhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'XHAT_ll', iid, iresp )
+  zxhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'YHAT_ll', iid, iresp )
+  zyhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'XHATM_ll', iid, iresp )
+  zxhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
+  call Find_field_id_from_mnhname( 'YHATM_ll', iid, iresp )
+  zyhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data
   call Find_field_id_from_mnhname( 'SLEVE', iid, iresp )
   gsleve => tfieldlist(iid)%tfield_l0d(tpfile%nmodel)%data
 
@@ -1553,6 +1565,10 @@ else
   zxhatm => xxhatm
   zyhatm => xyhatm
   zzhatm => xzhatm
+  zxhat_glob  => xxhat_ll
+  zyhat_glob  => xyhat_ll
+  zxhatm_glob => xxhatm_ll
+  zyhatm_glob => xyhatm_ll
   gsleve => lsleve
 end if
 
@@ -1581,14 +1597,6 @@ else
   tzdim_nj_v => Null()
 end if
 
-!If the file is a Z-split subfile, coordinates are already collected
-if ( .not. Associated( tpfile%tmainfile ) ) then
-  call Gather_hor_coord1d( 'X', zxhat,  zxhat_glob  )
-  call Gather_hor_coord1d( 'X', zxhatm, zxhatm_glob )
-  call Gather_hor_coord1d( 'Y', zyhat,  zyhat_glob  )
-  call Gather_hor_coord1d( 'Y', zyhatm, zyhatm_glob )
-end if
-
 call Write_hor_coord1d( tzdim_ni,   'x-dimension of the grid', &
                         trim(ystdnameprefix)//'_x_coordinate',               'X', 0.,   jphext, jphext, zxhatm_glob )
 call Write_hor_coord1d( tzdim_nj,   'y-dimension of the grid', &
@@ -1602,7 +1610,6 @@ call Write_hor_coord1d( tzdim_ni_v, 'x-dimension of the grid at v location', &
 call Write_hor_coord1d( tzdim_nj_v, 'y-dimension of the grid at v location', &
                         trim(ystdnameprefix)//'_y_coordinate_at_v_location', 'Y', -0.5, jphext, 0,      zyhat_glob  )
 
-!The z?hat*_glob were allocated in Gather_hor_coord1d calls
 !Deallocate only if it is a non Z-split file or the last Z-split subfile
 gdealloc = .false.
 if ( Associated( tpfile%tmainfile ) ) then
@@ -1867,13 +1874,14 @@ if ( tpfile%lmaster ) then
 
 end if
 
-if ( gdealloc ) deallocate( zxhat_glob, zxhatm_glob, zyhat_glob, zyhatm_glob )
 
 if ( gchangemodel ) call Go_tomodel_ll( imi, iresp )
 
 
 contains
 
+#if 0
+!Not used anymore
 subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob )
   use mode_allocbuffer_ll, only: Allocbuffer_ll
   use mode_gather_ll,      only: Gather_xxfield
@@ -1917,7 +1925,9 @@ subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob )
   !PW: TODO: broadcast only to subfile writers
   if ( tpfile%nsubfiles_ioz > 0 ) &
     call MPI_BCAST( pcoords_glob, size( pcoords_glob ), MNHREAL_MPI, tpfile%nmaster_rank - 1,  tpfile%nmpicomm, ierr )
+
 end subroutine Gather_hor_coord1d
+#endif
 
 
 subroutine Gather_hor_coord2d( px, py, plat_glob, plon_glob )
diff --git a/src/MNH/fun.f90 b/src/MNH/fun.f90
index 64c54caa6..85100a77b 100644
--- a/src/MNH/fun.f90
+++ b/src/MNH/fun.f90
@@ -88,7 +88,6 @@ END MODULE MODI_FUN
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -110,7 +109,6 @@ INTEGER :: JJ ,JK  ! Loop index
 INTEGER :: IINFO_ll, IJU_ll  ! parallel variables
 REAL    :: ZWIDTHY ! Width of the jet along the y direction
 REAL    :: ZWIDTHZ ! Width of the jet along the z direction
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll
 !
 !-------------------------------------------------------------------------------
 !
@@ -120,18 +118,15 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll
 IJU_ll=NJMAX_ll+2*JPHEXT
 IJ0=IJU_ll/2
 IK0=KKU/2
-ALLOCATE(ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll)
-ZWIDTHY =ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0)
+ZWIDTHY =XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0)
 ZWIDTHZ =PZHAT(IK0+KKU/5)-PZHAT(IK0)
 DO JJ = 1,KJU-1
   DO JK = 1,KKU
     FUNUYZ(JJ,JK) = 1./COSH(                   &
-     (( XYHATM(JJ)-ZYHAT_ll(IJ0))/ZWIDTHY) **2 &
+     (( XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTHY) **2 &
     +(( PZHAT(JK) -   PZHAT(IK0))/ZWIDTHZ) **2 )
   END DO
 END DO
-DEALLOCATE(ZYHAT_ll)
 FUNUYZ(KJU,:)=2.*FUNUYZ(KJU-1,:)-FUNUYZ(KJU-2,:) !simple extrapolation  
                                                  !for the last point
 !
@@ -189,7 +184,6 @@ END FUNCTION FUNUYZ
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
-USE MODE_GATHER_ll
 !
 !
 IMPLICIT NONE
@@ -206,18 +200,15 @@ INTEGER :: IJ0      ! Jet center
 INTEGER :: JJ       ! Loop index
 INTEGER :: IINFO_ll, IJU_ll  ! parallel variables
 REAL    :: ZWIDTH   ! Width of the jet
-REAL, DIMENSION(:), ALLOCATABLE ::  ZYHAT_ll
 !-------------------------------------------------------------------------------
 !
 !*	 1.     COMPUTE FUNUY
 !	        -------------
 IJU_ll=NJMAX_ll+2*JPHEXT
 IJ0=IJU_ll/2
-ALLOCATE(ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll)
-ZWIDTH=ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0)
+ZWIDTH=XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0)
 DO JJ = 1,KJU-1
- FUNUY(JJ) = 1./COSH((XYHATM(JJ)-ZYHAT_ll(IJ0))/ZWIDTH)
+ FUNUY(JJ) = 1./COSH((XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTH)
 END DO
 FUNUY(KJU)=2.*FUNUY(KJU-1)-FUNUY(KJU-2) !simple extrapolation for the last point
 !
@@ -276,7 +267,6 @@ END FUNCTION FUNUY
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -298,7 +288,6 @@ INTEGER :: JI,JK     ! Loop index
 INTEGER :: IINFO_ll, IIU_ll  ! parallel variables
 REAL    :: ZWIDTHX ! Width of the jet along the x direction
 REAL    :: ZWIDTHZ ! Width of the jet along the z direction
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 !
 !-------------------------------------------------------------------------------
 !
@@ -308,14 +297,12 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 IIU_ll=NIMAX_ll+2*JPHEXT
 II0=IIU_ll/2
 IK0=KKU/2
-ALLOCATE(ZXHAT_ll(IIU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll)
-ZWIDTHX=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0)
+ZWIDTHX=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0)
 ZWIDTHZ=PZHAT(IK0+KKU/5)-PZHAT(IK0)
 DO JI = 1,KIU-1
   DO JK = 1,KKU
     FUNVXZ(JI,JK) = 1./COSH(                  &
-     (( XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTHX)**2 &
+     (( XXHATM(JI)-XXHAT_ll(II0))/ZWIDTHX)**2 &
     +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 )
   END DO
 END DO
@@ -372,7 +359,6 @@ END FUNCTION FUNVXZ
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_GATHER_ll
 USE MODD_GRID_n
 USE MODD_DIM_n
 USE MODD_PARAMETERS
@@ -392,20 +378,16 @@ INTEGER :: II0   ! Jet center
 INTEGER :: JI    ! Loop index
 INTEGER :: IINFO_ll, IIU_ll  ! parallel variables
 REAL    :: ZWIDTH ! Width of the jet
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll
 !-------------------------------------------------------------------------------
 !
 !*	 1.     COMPUTE FUNUY
 !	        -------------
 IIU_ll=NIMAX_ll+2*JPHEXT
 II0=IIU_ll/2
-ALLOCATE(ZXHAT_ll(IIU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll)
-ZWIDTH=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0)
+ZWIDTH=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0)
 DO JI = 1,KIU
- FUNVX(JI)=1./COSH((XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTH)
+ FUNVX(JI)=1./COSH((XXHATM(JI)-XXHAT_ll(II0))/ZWIDTH)
 END DO
-DEALLOCATE(ZXHAT_ll)
 !-------------------------------------------------------------------------------
 !
 END FUNCTION FUNVX
diff --git a/src/MNH/ibm_idealrp.f90 b/src/MNH/ibm_idealrp.f90
index a67bb5fd2..3c2a0c77d 100644
--- a/src/MNH/ibm_idealrp.f90
+++ b/src/MNH/ibm_idealrp.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2019-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -68,12 +68,11 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   USE MODE_POS
   USE MODE_ll
   USE MODE_IO
-  USE MODE_GATHER_ll
   !
   ! declaration
   USE MODD_IBM_PARAM_n
   USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX
-  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ
+  USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT, XXHAT_ll, XYHAT_ll, XZZ
   USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
   !
   ! interface
@@ -105,7 +104,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   REAL, ALLOCATABLE                   :: ZDIST_SUR6,ZDIST_REF0                            
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATM,ZYHATM,ZZHATM                      ! mesh location (mass nodes)
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATC,ZYHATC,ZZHATC                      ! mesh location (cell nodes)
-  REAL, DIMENSION(:)    , ALLOCATABLE :: ZXHAT_ll,ZYHAT_ll
   CHARACTER(LEN=1)                    :: YPOS
   INTEGER                             :: NRESP
   !
@@ -140,14 +138,10 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   !     ----------------
   ! 
   CALL GET_GLOBALDIMS_ll(IIU_ll,IJU_ll)
-  ALLOCATE(ZXHAT_ll(IIU_ll+ 2 * JPHEXT))
-  ALLOCATE(ZYHAT_ll(IJU_ll+ 2 * JPHEXT))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP)
   ZDELTX = abs((PIBM_XYZ(KNUMB_OBS,1)-PIBM_XYZ(KNUMB_OBS,2))/ & 
-       ((ZXHAT_ll(IIU_ll+2)-ZXHAT_ll(2))/(IIU_ll*1.)))
+       ((XXHAT_ll(IIU_ll+2)-XXHAT_ll(2))/(IIU_ll*1.)))
   ZDELTY = abs((PIBM_XYZ(KNUMB_OBS,3)-PIBM_XYZ(KNUMB_OBS,4))/ & 
-       ((ZYHAT_ll(IJU_ll+2)-ZYHAT_ll(2))/(IJU_ll*1.)))  
+       ((XYHAT_ll(IJU_ll+2)-XYHAT_ll(2))/(IJU_ll*1.)))
   ZDELTZ = abs((PIBM_XYZ(KNUMB_OBS,5)-PIBM_XYZ(KNUMB_OBS,6))/ &
        ((XZHAT(IKU)-XZHAT(2))/(IKU*1.-2.)))
   !      
@@ -301,7 +295,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI)
   !     -----------------------
   !
   DEALLOCATE(ZXHATC,ZYHATC,ZZHATC)
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
   DEALLOCATE(ZTEST_XMIN,ZTEST_XMAX,ZTEST_YMIN,ZTEST_YMAX,ZTEST_ZMIN,ZTEST_ZMAX)
   DEALLOCATE(ZPOSI_XYZ0,ZPOSI_XYZ1,ZPOSI_XYZ2)
   DEALLOCATE(ZDIST_SUR0,ZDIST_SUR1,ZDIST_SUR2,ZDIST_SUR3,ZDIST_SUR4,ZDIST_SUR5,ZDIST_SUR6,ZDIST_REF0)
diff --git a/src/MNH/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90
index a3e9c7840..822d41581 100644
--- a/src/MNH/ini_les_cart_maskn.f90
+++ b/src/MNH/ini_les_cart_maskn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -93,9 +93,6 @@ INTEGER,            INTENT(OUT) :: KLES_JSUP !
 !       0.2  declaration of local variables
 !
 !
-INTEGER :: IIMAX_ll  ! total physical father domain I size
-INTEGER :: IJMAX_ll  ! total physical father domain J size
-!
 INTEGER :: IIB_ll    ! son domain index
 INTEGER :: IIE_ll    ! son domain index
 INTEGER :: IJB_ll    ! son domain index
@@ -103,12 +100,12 @@ INTEGER :: IJE_ll    ! son domain index
 !
 INTEGER :: JI, JJ    ! loop counters
 !
-REAL    :: ZX, ZY    ! coordinates of msak boundaries
+REAL    :: ZX, ZY    ! coordinates of mask boundaries
 !
-INTEGER :: IINFO_ll, IRESP
+INTEGER :: IINFO_ll
 !
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll !
+REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates
+REAL, DIMENSION(:), POINTER :: ZYHAT_ll !
 INTEGER :: IMI
 !
 IMI = GET_CURRENT_MODEL_INDEX()
@@ -118,11 +115,8 @@ IMI = GET_CURRENT_MODEL_INDEX()
 !            --------------------------
 !
 CALL GO_TOMODEL_ll(IMI, IINFO_ll)
-CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) 
-ALLOCATE(ZXHAT_ll(IIMAX_ll+ 2 * JPHEXT))
-ALLOCATE(ZYHAT_ll(IJMAX_ll+ 2 * JPHEXT))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
+ZXHAT_ll => XXHAT_ll
+ZYHAT_ll => XYHAT_ll
 !
 CALL GO_TOMODEL_ll(KMI, IINFO_ll)
 !
@@ -208,9 +202,6 @@ ELSE
 END IF
 !
 !-------------------------------------------------------------------------------
-DEALLOCATE(ZXHAT_ll)
-DEALLOCATE(ZYHAT_ll)
-!-------------------------------------------------------------------------------
 !
   CONTAINS
 !
@@ -219,8 +210,6 @@ DEALLOCATE(ZYHAT_ll)
     KLES_ISUP=IIE_ll-JPHEXT
     KLES_JINF=IJB_ll-JPHEXT
     KLES_JSUP=IJE_ll-JPHEXT
-    DEALLOCATE(ZXHAT_ll)
-    DEALLOCATE(ZYHAT_ll)
   END SUBROUTINE MASK_OVER_ALL_DOMAIN
 !
 END SUBROUTINE INI_LES_CART_MASK_n   
diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90
index 84f90dba5..0b565244c 100644
--- a/src/MNH/ini_lesn.f90
+++ b/src/MNH/ini_lesn.f90
@@ -46,8 +46,6 @@
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODE_ll
-USE MODE_GATHER_ll
 USE MODE_MSG
 USE MODE_MODELN_HANDLER
 !
@@ -90,25 +88,20 @@ IMPLICIT NONE
 !      
 INTEGER :: ILUOUT, IRESP
 INTEGER :: JI,JJ, JK ! loop counters
-INTEGER :: IIU_ll    ! total domain I size
-INTEGER :: IJU_ll    ! total domain J size
-INTEGER :: IIMAX_ll  ! total physical domain I size
-INTEGER :: IJMAX_ll  ! total physical domain J size
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra
 !
 !
-REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates
-REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll !
+REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates
+REAL, DIMENSION(:), POINTER :: ZYHAT_ll !
 INTEGER :: IMI
 !
 !-------------------------------------------------------------------------------
 IMI = GET_CURRENT_MODEL_INDEX()
 !
-CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
-IIU_ll = IIMAX_ll+2*JPHEXT
-IJU_ll = IJMAX_ll+2*JPHEXT
+ZXHAT_ll => NULL()
+ZYHAT_ll => NULL()
 !
 ILUOUT = TLUOUT%NLU
 !
@@ -208,19 +201,14 @@ IF (IMI==1) THEN
 !  -----------------------------------------------------
 !
 ELSE
-  ALLOCATE(ZXHAT_ll(IIU_ll))
-  ALLOCATE(ZYHAT_ll(IJU_ll))
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
+  ZXHAT_ll => XXHAT_ll !Use current (IMI) model XXHAT_ll
+  ZYHAT_ll => XYHAT_ll
 !
   CALL GOTO_MODEL(NDAD(IMI))
   CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll,          &
                          NLESn_IINF(IMI),NLESn_JINF(IMI), &
                          NLESn_ISUP(IMI),NLESn_JSUP(IMI)  )
   CALL GOTO_MODEL(IMI)
-! 
-  DEALLOCATE(ZXHAT_ll)
-  DEALLOCATE(ZYHAT_ll)
 END IF
 !
 !* in non cyclic boundary conditions, limitiation of masks due to u and v grids
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 9a4aed5cd..258172aeb 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1859,6 +1859,7 @@ CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
                XTSTEP, XSEGLEN,                                                &
                XLONORI, XLATORI, XLON, XLAT,                                   &
                XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                       &
                XHAT_BOUND, XHATM_BOUND,                                        &
                XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE,                   &
                XLEN1, XLEN2, XZSMT, ZJ,                                        &
@@ -2263,15 +2264,11 @@ IF (CRAD   /= 'NONE') THEN
   IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM)
   CALL SURF_SOLAR_GEOM    (XZS, XZS_XY)
   !
-  ALLOCATE(XXHAT_ll                 (IIU_ll))
-  ALLOCATE(XYHAT_ll                 (IJU_ll))
   ALLOCATE(XZS_ll                   (IIU_ll,IJU_ll))
   ALLOCATE(XZS_XY_ll                (IIU_ll,IJU_ll))
   !
   CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP)
   CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,XXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,XYHAT_ll,IRESP)
   XZS_MAX_ll=MAXVAL(XZS_ll)
 ELSE
   XAZIM       = XPI
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 29b2679f0..b6e605ecc 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -689,6 +689,7 @@ CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
                XTSTEP, XSEGLEN,                                                &
                XLONORI, XLATORI, XLON, XLAT,                                   &
                XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                       &
                XHAT_BOUND, XHATM_BOUND,                                        &
                XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE,                   &
                XLEN1, XLEN2, XZSMT, ZJ,                                        &
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 1f0c5d895..c5fcc566b 100644
--- a/src/MNH/modd_gridn.f90
+++ b/src/MNH/modd_gridn.f90
@@ -36,7 +36,8 @@
 !  V. Ducrocq  13/08/98: //: add XLATOR_ll and XLONOR_ll
 !  V. Masson      11/2004: supress XLATOR, XLONOR, XLATOR_ll, XLONOR_ll
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet    09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND and XHATM_BOUND
+!  P. Wautelet    09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND, XHATM_BOUND,
+!                          XXHAT_ll, XYHAT_ll, XXHATM_ll and XYHATM_ll
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -88,5 +89,9 @@ REAL,                  POINTER  :: XLEN2=>NULL()             ! Decay scale for s
 REAL, DIMENSION(:,:),  POINTER  :: XZSMT=>NULL()             ! smooth orography for SLEVE coordinate
 REAL, DIMENSION(:),    POINTER :: XHAT_BOUND  => NULL() ! Boundaries of global domain at u and v points
 REAL, DIMENSION(:),    POINTER :: XHATM_BOUND => NULL() ! Boundaries of global domain at mass points
+REAL, DIMENSION(:),    POINTER :: XXHAT_ll  => NULL()   ! Position x in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),    POINTER :: XYHAT_ll  => NULL()   ! Position y in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),    POINTER :: XXHATM_ll => NULL()   ! Position x in the conformal or cartesian plane at mass points (all domain)
+REAL, DIMENSION(:),    POINTER :: XYHATM_ll => NULL()   ! Position y in the conformal or cartesian plane (all domain) at mass points
 
 END MODULE MODD_GRID_n
diff --git a/src/MNH/modd_shadowsn.f90 b/src/MNH/modd_shadowsn.f90
index b2ca81707..ebb1372e4 100644
--- a/src/MNH/modd_shadowsn.f90
+++ b/src/MNH/modd_shadowsn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2012-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 modd 2006/11/23 17:28:44
-!-----------------------------------------------------------------
 !      ########################
        MODULE MODD_SHADOWS_n
 !      ########################
@@ -34,7 +29,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original      04/2012
-!!
+!  P. Wautelet 22/09/2022: remove XXHAT_ll and XYHAT_ll (now in modd_grid_n)
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -52,8 +47,6 @@ TYPE SHADOWS_t
   REAL, DIMENSION(:,:),         POINTER :: XZS_XY=>NULL()     !  orography at vort. points
   REAL, DIMENSION(:,:),         POINTER :: XZS_ll=>NULL()     !  orography at mass points (all domain)
   REAL, DIMENSION(:,:),         POINTER :: XZS_XY_ll=>NULL()  !  orography at vort. points (all domain)
-  REAL, DIMENSION(:),           POINTER :: XXHAT_ll=>NULL()   !  X coordinate (all domain)
-  REAL, DIMENSION(:),           POINTER :: XYHAT_ll=>NULL()   !  Y coordinate (all domain)
 !
 !
 END TYPE SHADOWS_t
@@ -64,8 +57,6 @@ REAL, POINTER :: XZS_MAX_ll=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_XY=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_ll=>NULL()
 REAL, DIMENSION(:,:),   POINTER :: XZS_XY_ll=>NULL()
-REAL, DIMENSION(:),     POINTER :: XXHAT_ll=>NULL()
-REAL, DIMENSION(:),     POINTER :: XYHAT_ll=>NULL()
 
 CONTAINS
 
@@ -76,16 +67,12 @@ INTEGER, INTENT(IN) :: KFROM, KTO
 SHADOWS_MODEL(KFROM)%XZS_XY=>XZS_XY
 SHADOWS_MODEL(KFROM)%XZS_ll=>XZS_ll
 SHADOWS_MODEL(KFROM)%XZS_XY_ll=>XZS_XY_ll
-SHADOWS_MODEL(KFROM)%XXHAT_ll=>XXHAT_ll
-SHADOWS_MODEL(KFROM)%XYHAT_ll=>XYHAT_ll
 !
 ! Current model is set to model KTO
 XZS_MAX_ll=>SHADOWS_MODEL(KTO)%XZS_MAX_ll
 XZS_XY=>SHADOWS_MODEL(KTO)%XZS_XY
 XZS_ll=>SHADOWS_MODEL(KTO)%XZS_ll
 XZS_XY_ll=>SHADOWS_MODEL(KTO)%XZS_XY_ll
-XXHAT_ll=>SHADOWS_MODEL(KTO)%XXHAT_ll
-XYHAT_ll=>SHADOWS_MODEL(KTO)%XYHAT_ll
 
 END SUBROUTINE SHADOWS_GOTO_MODEL
 
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index b4faa5ac1..d16492d7a 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -379,7 +379,7 @@ USE MODE_ll
 USE MODE_MODELN_HANDLER
 use mode_field,            only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars
 USE MODE_MSG
-USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS
+USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
 !
 USE MODI_DEFAULT_DESFM_n    ! Interface modules
 USE MODI_DEFAULT_EXPRE
@@ -552,7 +552,6 @@ INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
 INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
 INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
 INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY
-REAL, DIMENSION(:),   ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,&
                                       ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, &
@@ -1286,7 +1285,7 @@ ELSE
   CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
+  CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
 
 END IF
 !
@@ -1455,12 +1454,9 @@ IF (CTYPELOC =='LATLON' ) THEN
   END IF 
 END IF  
 !
-ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !//
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !//
 IF (CTYPELOC /= 'IJGRID') THEN                                               
-  NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:)))
-  NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:)))
+  NILOC = MINLOC(ABS(XXHATLOC-XXHAT_ll(:)))
+  NJLOC = MINLOC(ABS(XYHATLOC-XYHAT_ll(:)))
 END IF
 !
 IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index cfccf88ba..1ac466b48 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -93,7 +93,7 @@ USE MODE_IO,            only: IO_Pack_set
 USE MODE_IO_FIELD_READ, only: IO_Field_read
 USE MODE_MSG
 USE MODE_MODELN_HANDLER
-USE MODE_SET_GRID,       only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS
+USE MODE_SET_GRID,       only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
 use MODE_TOOLS_ll,       only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll
 !
 IMPLICIT NONE
@@ -259,7 +259,7 @@ IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) )
 CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
 
 ! Collect global domain boundaries
-CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND )
+CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
 
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index a00d7a30a..44665594e 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -111,7 +111,7 @@ USE MODD_PARAMETERS
 !
 USE MODE_MSG
 USE MODE_POS
-USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_VERGRID_BOUNDS
+USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_GLOB_VERGRID
 !
 USE MODI_DEFAULT_SLEVE
 !
@@ -332,7 +332,7 @@ XZTOP = XZHAT(IKU)
 CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
+CALL STORE_GLOB_VERGRID( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND )
 
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index e2d28d064..4ecfdf897 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -19,7 +19,7 @@ PUBLIC :: SET_GRID
 
 PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS
 
-PUBLIC :: STORE_GRID_BOUNDS, STORE_HORGRID_BOUNDS, STORE_VERGRID_BOUNDS
+PUBLIC :: STORE_GLOB_GRID, STORE_GLOB_HORGRID, STORE_GLOB_VERGRID
 
 CONTAINS
 
@@ -29,6 +29,7 @@ CONTAINS
                            PTSTEP, PSEGLEN,                               &
                            PLONORI, PLATORI, PLON, PLAT,                  &
                            PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM,  &
+                           PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,      &
                            PHAT_BOUND, PHATM_BOUND,                       &
                            PMAP, PZS, PZZ, PZHAT, PZHATM, PZTOP, OSLEVE,  &
                            PLEN1, PLEN2, PZSMT, PJ,                       &
@@ -207,6 +208,10 @@ REAL, DIMENSION(:),     INTENT(OUT) :: PDXHAT    ! horizontal stretching in x
 REAL, DIMENSION(:),     INTENT(OUT) :: PDYHAT    ! horizontal stretching in y
 REAL, DIMENSION(:),     INTENT(OUT) :: PXHATM    ! Position x in the conformal plane or on the cartesian plane at mass points
 REAL, DIMENSION(:),     INTENT(OUT) :: PYHATM    ! Position y in the conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
 REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
 REAL, DIMENSION(:),     POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
@@ -353,7 +358,8 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM )
 
 ! Collect global domain boundaries
-CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                      &
+                        PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
 IF (LCARTESIAN) THEN
   CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ)
@@ -517,7 +523,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GRID_1DIR( HDIR, PHAT, PHATM, PHAT_ll, PHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
   USE MODD_GRID_n
   USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT, XNEGUNDEF
@@ -531,19 +537,17 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
   CHARACTER(LEN=1),            INTENT(IN)    :: HDIR        ! Direction ('X', 'Y' or 'Z')
   REAL, DIMENSION(:), TARGET,  INTENT(IN)    :: PHAT        ! Position x, y or z in the conformal or cartesian plane
   REAL, DIMENSION(:), TARGET,  INTENT(IN)    :: PHATM       ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_ll    ! id at mass points
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 
   INTEGER                     :: IERR
-  LOGICAL                     :: GALLOC, GALLOCM
-  REAL, DIMENSION(:), POINTER :: ZHAT_GLOB
-  REAL, DIMENSION(:), POINTER :: ZHATM_GLOB
+  LOGICAL                     :: GALLOC, GALLOCM !Remark: do not deallocate (PHAT_ll/PHATM_ll may be used outside this subroutine)
 
   GALLOC  = .FALSE.
   GALLOCM = .FALSE.
 
-  ZHAT_GLOB  => NULL()
-  ZHATM_GLOB => NULL()
 
   IF ( .NOT. ASSOCIATED( PHAT_BOUND ) ) THEN
     ALLOCATE( PHAT_BOUND(NHAT_BOUND_SIZE) )
@@ -557,93 +561,112 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND )
 
   SELECT CASE (HDIR)
     CASE ( 'X' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'XX', GALLOC  )
-      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM )
-      CALL GATHERALL_FIELD_ll( 'XX', PHAT,  ZHAT_GLOB,  IERR )
-      CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR )
+      IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHAT_ll,  PHAT,  'XX', GALLOC )
+        CALL GATHERALL_FIELD_ll( 'XX', PHAT,  PHAT_ll,  IERR )
+      END IF
+      IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'XX', GALLOCM )
+        CALL GATHERALL_FIELD_ll( 'XX', PHATM, PHATM_ll, IERR )
+      END IF
 
       ! Global boundaries on u points
-      PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NEXTE_XMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_XMIN) = PHAT_ll( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
 
       ! Global boundaries on m points
-      PHATM_BOUND(NEXTE_XMIN) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 )
-      PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
+      PHATM_BOUND(NEXTE_XMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_XMIN) = PHATM_ll( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT )
 
     CASE ( 'Y' )
-      CALL ALLOCBUFFER_ll( ZHAT_GLOB,  PHAT,  'YY', GALLOC  )
-      CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM )
-      CALL GATHERALL_FIELD_ll( 'YY', PHAT,  ZHAT_GLOB,  IERR )
-      CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR )
+      IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHAT_ll,  PHAT,  'YY', GALLOC )
+        CALL GATHERALL_FIELD_ll( 'YY', PHAT,  PHAT_ll,  IERR )
+      END IF
+      IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN
+        CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'YY', GALLOCM )
+        CALL GATHERALL_FIELD_ll( 'YY', PHATM, PHATM_ll, IERR )
+      END IF
 
       ! Global boundaries on v points
-      PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 )
-      PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NEXTE_YMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_YMIN) = PHAT_ll( JPHEXT + 1 )
+      PHAT_BOUND(NPHYS_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
 
       ! Global boundaries on m points
-      PHATM_BOUND(NEXTE_YMIN) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 )
-      PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT )
+      PHATM_BOUND(NEXTE_YMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_YMIN) = PHATM_ll( JPHEXT + 1 )
+      PHATM_BOUND(NPHYS_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT )
 
     CASE ( 'Z' )
-      ZHAT_GLOB  => PHAT
-      ZHATM_GLOB => PHATM
+      PHAT_ll  => PHAT
+      PHATM_ll => PHATM
 
       ! Global boundaries on w points
-      PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 )
-      PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
-      PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 )
-      PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) )
+      PHAT_BOUND(NEXTE_ZMIN) = PHAT_ll( 1 )
+      PHAT_BOUND(NEXTE_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
+      PHAT_BOUND(NPHYS_ZMIN) = PHAT_ll( JPVEXT + 1 )
+      PHAT_BOUND(NPHYS_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) )
 
       ! Global boundaries on m points
-      PHATM_BOUND(NEXTE_ZMIN) = ZHATM_GLOB( 1 )
-      PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) )
-      PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 )
-      PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT )
+      PHATM_BOUND(NEXTE_ZMIN) = PHATM_ll( 1 )
+      PHATM_BOUND(NEXTE_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) )
+      PHATM_BOUND(NPHYS_ZMIN) = PHATM_ll( JPVEXT + 1 )
+      PHATM_BOUND(NPHYS_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPVEXT )
 
     CASE DEFAULT
-      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' )
+      CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR', 'invalid direction (valid: X, Y or Z)' )
 
   END SELECT
 
-  IF ( GALLOC  ) DEALLOCATE( ZHAT_GLOB  )
-  IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB )
-
-END SUBROUTINE STORE_GRID_1DIR_BOUNDS
+END SUBROUTINE STORE_GRID_1DIR
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                        &
+                              PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
-  REAL, DIMENSION(:),              INTENT(IN)    :: PXHAT       ! Position x in the conformal or cartesian plane
-  REAL, DIMENSION(:),              INTENT(IN)    :: PYHAT       ! Position y in the conformal or cartesian plane
-  REAL, DIMENSION(:),              INTENT(IN)    :: PZHAT       ! Position y in the conformal or cartesian plane
-  REAL, DIMENSION(:),              INTENT(IN)    :: PXHATM      ! idem at mass points
-  REAL, DIMENSION(:),              INTENT(IN)    :: PYHATM      ! idem at mass points
-  REAL, DIMENSION(:),              INTENT(IN)    :: PZHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHAT       ! Position x in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHAT       ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHAT       ! Position y in the conformal or cartesian plane
+  REAL, DIMENSION(:),          INTENT(IN)    :: PXHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PYHATM      ! idem at mass points
+  REAL, DIMENSION(:),          INTENT(IN)    :: PZHATM      ! idem at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll    ! id at mass points
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll
+  REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll
 
-END SUBROUTINE STORE_GRID_BOUNDS
+  PZHAT_DUMMY_ll  => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+  CALL STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM, PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+
+  PZHAT_DUMMY_ll => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+END SUBROUTINE STORE_GLOB_GRID
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM,                                     &
+                                 PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
@@ -651,18 +674,22 @@ SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM
   REAL, DIMENSION(:),          INTENT(IN)    :: PYHAT       ! Position y in the conformal or cartesian plane
   REAL, DIMENSION(:),          INTENT(IN)    :: PXHATM      ! idem at mass points
   REAL, DIMENSION(:),          INTENT(IN)    :: PYHATM      ! idem at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll     ! Position x, y or z in the conformal or cartesian plane (all domain)
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll    ! id at mass points
+  REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll    ! id at mass points
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND )
-  CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR( 'X', PXHAT, PXHATM, PXHAT_ll, PXHATM_ll, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GRID_1DIR( 'Y', PYHAT, PYHATM, PYHAT_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
-END SUBROUTINE STORE_HORGRID_BOUNDS
+END SUBROUTINE STORE_GLOB_HORGRID
 !-----------------------------------------------------------------
 
 
 !-----------------------------------------------------------------
-SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+SUBROUTINE STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
 
   IMPLICIT NONE
 
@@ -671,9 +698,18 @@ SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
   REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 
-  CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll
+  REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll
+
+  PZHAT_DUMMY_ll  => NULL()
+  PZHATM_DUMMY_ll => NULL()
+
+  CALL STORE_GRID_1DIR( 'Z', PZHAT, PZHATM, PZHAT_DUMMY_ll, PZHATM_DUMMY_ll, PHAT_BOUND, PHATM_BOUND )
+
+  PZHAT_DUMMY_ll => NULL()
+  PZHATM_DUMMY_ll => NULL()
 
-END SUBROUTINE STORE_VERGRID_BOUNDS
+END SUBROUTINE STORE_GLOB_VERGRID
 !-----------------------------------------------------------------
 
 
diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90
index 7e9e43687..7c4ea5e2e 100644
--- a/src/MNH/set_perturb.f90
+++ b/src/MNH/set_perturb.f90
@@ -164,10 +164,6 @@ REAL,DIMENSION(:,:),ALLOCATABLE :: ZCY_ll,ZSY_ll  ! and y directions
 REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZT    ! temperature
 REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZHU   ! rel. humidity
 !
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
-                                                 ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
-                                                 ! plane (array on the complete domain)
 INTEGER :: IIU_ll,IJU_ll ! horizontal,vertical size of the extended global domain 
 INTEGER :: IIB_ll,IJB_ll ! global coordinate of the physical global domain 
 INTEGER :: IIE_ll,IJE_ll ! 
@@ -241,9 +237,6 @@ IJE=IJU-JPHEXT
 !
 IIU_ll=NIMAX_ll+2*JPHEXT
 IJU_ll=NJMAX_ll+2*JPHEXT
-ALLOCATE(ZXHAT_ll(IIU_ll),ZYHAT_ll(IJU_ll))
-CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
 !  
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IIB_ll=1+JPHEXT
@@ -269,8 +262,8 @@ SELECT CASE(CPERT_KIND)
   CASE('TH')
     ZDIST(:,:,:) = 2.
 ! C grid shift
-    ZCENTERX=(ZXHAT_ll(2)+ZXHAT_ll(IIU_ll))*0.5
-    ZCENTERY=(ZYHAT_ll(2)+ZYHAT_ll(IJU_ll))*0.5
+    ZCENTERX=(XXHAT_ll(2)+XXHAT_ll(IIU_ll))*0.5
+    ZCENTERY=(XYHAT_ll(2)+XYHAT_ll(IJU_ll))*0.5
 !
     DO JK =IKB,IKE
       DO JJ = IJB,IJE
@@ -339,8 +332,8 @@ SELECT CASE(CPERT_KIND)
 !
     DO JI = 1,IIU_ll
       DO JJ = 1,IJU_ll
-        ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((ZYHAT_ll(JJ)-ZYHAT_ll(IJ0))/XRADY)**2)       &
-                             * COS(2.*XPI/XRADX*ZXHAT_ll(JI))
+        ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((XYHAT_ll(JJ)-XYHAT_ll(IJ0))/XRADY)**2)       &
+                             * COS(2.*XPI/XRADX*XXHAT_ll(JI))
       END DO
     END DO
 !
@@ -348,8 +341,8 @@ SELECT CASE(CPERT_KIND)
 !
     DO JI = 1,IIU_ll
       DO JJ = IJMIN,IJMAX
-        ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-ZYHAT_ll(JJ+1)+ZYHAT_ll(JJ) )
-        ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( ZXHAT_ll(JI+1)-ZXHAT_ll(JI) )
+        ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-XYHAT_ll(JJ+1)+XYHAT_ll(JJ) )
+        ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( XXHAT_ll(JI+1)-XXHAT_ll(JI) )
       END DO
     END DO
 !
@@ -558,8 +551,6 @@ SELECT CASE(CPERT_KIND)
 !
 END SELECT
 !
-DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
-!
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE SET_PERTURB 
diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90
index 332519faa..8521be04d 100644
--- a/src/MNH/spawn_grid2.f90
+++ b/src/MNH/spawn_grid2.f90
@@ -11,6 +11,7 @@ INTERFACE
 !
      SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
                              PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,                    &
                              PHAT_BOUND, PHATM_BOUND,                                     &
                              PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
                              PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
@@ -30,6 +31,10 @@ REAL, DIMENSION(:),   INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
                                      ! conformal plane or on the cartesian plane
 REAL, DIMENSION(:),   INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the
                                      ! conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
 REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
 REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL,                 INTENT(OUT)   :: PZTOP             ! model top (m)
@@ -54,6 +59,7 @@ END MODULE MODI_SPAWN_GRID2
 !    ######################################################################################
      SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO,                &
                              PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, &
+                             PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll,                    &
                              PHAT_BOUND, PHATM_BOUND,                                     &
                              PZTOP, OSLEVE, PLEN1, PLEN2,                                 &
                              PZS, PZSMT, PZS_LS, PZSMT_LS,                                &
@@ -171,7 +177,7 @@ USE MODD_BIKHARDT_n
 USE MODD_VAR_ll
 use mode_bikhardt
 USE MODE_ll
-USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GRID_BOUNDS
+USE MODE_SET_GRID,   only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_GRID
 USE MODE_TIME
 USE MODE_GRIDPROJ
 !
@@ -196,6 +202,10 @@ REAL, DIMENSION(:),   INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the
                                      ! conformal plane or on the cartesian plane
 REAL, DIMENSION(:),   INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the
                                      ! conformal plane or on the cartesian plane at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHAT_ll    ! Position x, y or z in the conformal or cartesian plane (all domain)
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PXHATM_ll   ! id at mass points
+REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PYHATM_ll   ! id at mass points
 REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHAT_BOUND  ! Boundaries of global domain in the conformal or cartesian plane
 REAL, DIMENSION(:),   POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points
 REAL,                 INTENT(OUT)   :: PZTOP             ! model top (m)
@@ -464,7 +474,8 @@ PLEN2    = XLEN21
   CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM )
 
   ! Collect global domain boundaries
-  CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND )
+  CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM,                      &
+                        PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND )
 
 !!$=======
 !!$  IXSIZE1=SIZE(XXHAT1)
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index fe3baed67..85a2ed746 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -1061,6 +1061,7 @@ ENDIF
 XZS=0.
 CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO,                  &
                   XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, &
+                  XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                      &
                   XHAT_BOUND, XHATM_BOUND,                                       &
                   XZTOP, LSLEVE, XLEN1, XLEN2,                                   &
                   XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR                   )
diff --git a/src/MNH/surf_solar_shadows.f90 b/src/MNH/surf_solar_shadows.f90
index 0a3eaabb7..7d13e34b0 100644
--- a/src/MNH/surf_solar_shadows.f90
+++ b/src/MNH/surf_solar_shadows.f90
@@ -76,13 +76,14 @@ END MODULE MODI_SURF_SOLAR_SHADOWS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_ll
 !
-USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT
-USE MODD_CST,        ONLY : XPI, XRADIUS
 USE MODD_CONF,       ONLY : LCARTESIAN
-USE MODD_SHADOWS_n,  ONLY : XZS_ll, XZS_XY_ll, XXHAT_ll, &
-                            XYHAT_ll, XZS_MAX_ll, XZS_MAX_ll
+USE MODD_CST,        ONLY : XPI, XRADIUS
+USE MODD_GRID_n,     ONLY : XXHAT_ll, XYHAT_ll
+USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT
+USE MODD_SHADOWS_n,  ONLY : XZS_ll, XZS_XY_ll, XZS_MAX_ll, XZS_MAX_ll
+!
+USE MODE_ll
 !
 IMPLICIT NONE
 !
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index 596d78c00..0febd151f 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -372,7 +372,6 @@ USE MODE_PRANDTL
 !
 USE MODI_SECOND_MNH
 USE MODE_ll
-USE MODE_GATHER_ll
 !
 IMPLICIT NONE
 !
@@ -494,12 +493,6 @@ INTEGER                    :: IIB,IJB       ! Lower bounds of the physical
 INTEGER                    :: IIE,IJE       ! Upper bounds of the physical
                                             ! sub-domain in x and y directions
 !
-REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
-                                                 ! plane (array on the complete domain)
-REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
-                                                 ! plane (array on the complete domain)
-!
-!
 CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
 CHARACTER (LEN=LEN_HREC)  :: YRECFM       ! Name of the desired field in LFIFM file
 !
@@ -535,12 +528,6 @@ IJU=SIZE(PTHLM,2)
 ! 
 IF (LOCEAN .AND. LDEEPOC) THEN
   !*       COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
-  ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT))
-  !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 )
-  !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc
-  !                                     L0_subproc as referenced in the full domain 1
-  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
-  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
   CALL GET_DIM_EXT_ll('B',IIU,IJU)
   CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
   DO JJ = IJB,IJE
@@ -1103,9 +1090,6 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN
   END IF
 !
 END IF !end of <w Rc>
-IF (LOCEAN.AND.LDEEPOC) THEN
-  DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
-END IF
 !
 !----------------------------------------------------------------------------
 END SUBROUTINE TURB_VER_THERMO_FLUX
-- 
GitLab