diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index 4c91d1ebaf870b6a8299a25f63adffdaf327997f..2cfcdbfb111abe82d7b3c1851032f10c5b663adf 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2020 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.
@@ -8,6 +8,7 @@
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 20/09/2019: rewrite normalization of LES budgets
+!  P. Wautelet 14/08/2020: deduplicate LES_DIACHRO* subroutines
 !-----------------------------------------------------------------
 !#######################
 MODULE MODE_LES_DIACHRO
@@ -87,14 +88,14 @@ if ( kpower == 0 ) return
 !normalization is not possible if some values are zero
 do jsv = 1, size( ples_norm, 2 )
   if ( any( ples_norm(:, jsv ) == 0. ) ) then
-    pa_norm(:, :, :, jsv) = xundef
+    pa_norm(:, :, :, jsv) = XUNDEF
     cycle
   end if
 
   do jp = 1, size( pa_norm, 3 )
     do jt = 1, nles_current_times
       do jk = 1, nles_k
-        if ( pa_norm(jk, jt, jp, jsv) /= xundef ) &
+        if ( pa_norm(jk, jt, jp, jsv) /= XUNDEF ) &
             pa_norm(jk, jt,jp, jsv ) = pa_norm(jk, jt, jp, jsv ) * ples_norm(jt, jsv )**( -kpower )
       end do
     end do
@@ -246,7 +247,7 @@ do ji = 1, inunits
 end do
 
 if ( ikg > 1 .and. ipowers(NNORM_KG ) /= 0 ) &
-  call Print_msg( NVERB_ERROR, 'IO', 'LES_NORM_4D', 'if kg appears more than one time, it should be admimensional' )
+  call Print_msg( NVERB_ERROR, 'IO', 'LES_NORM_4D', 'if kg appears more than one time, it should be adimensional' )
 
 if ( ikg > 2 ) &
   call Print_msg( NVERB_ERROR, 'IO', 'LES_NORM_4D', 'kg should not appear more than 2 times' )
@@ -273,151 +274,6 @@ END SUBROUTINE LES_NORM_4D
 !
 !------------------------------------------------------------------------------
 !
-!     ###################################################
-      SUBROUTINE LES_NORM_3D(HUNIT, PA_LES, PA_NORM, OSV)
-!     ###################################################
-!
-!
-!!****  *LES_NORM* normalizes a field according to the chosen normalization
-!!
-!!    PURPOSE
-!!    -------
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      V. Masson
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original         30/10/00
-!!
-!! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
-!
-IMPLICIT NONE
-!
-!*      0.1  declarations of arguments
-!
-CHARACTER(LEN=*),          INTENT(IN)  :: HUNIT   ! physical unit of field
-REAL,    DIMENSION(:,:,:), INTENT(IN)  :: PA_LES  ! field
-!
-REAL,    DIMENSION(:,:,:), INTENT(OUT) :: PA_NORM ! normalized field
-LOGICAL, OPTIONAL,         INTENT(IN)  :: OSV     ! flag for scalar variables
-!
-!       0.2  declaration of local variables
-!
-REAL,    DIMENSION(:,:,:,:), ALLOCATABLE :: ZA_LES
-REAL,    DIMENSION(:,:,:,:), ALLOCATABLE :: ZA_NORM
-!
-INTEGER :: JSV
-!------------------------------------------------------------------------------
-!
-IF (PRESENT(OSV)) THEN
-  IF (OSV) THEN
-    ALLOCATE(ZA_LES (SIZE(PA_LES,1),SIZE(PA_LES,2),1,SIZE(PA_LES,3)))
-    ALLOCATE(ZA_NORM(SIZE(PA_LES,1),SIZE(PA_LES,2),1,SIZE(PA_LES,3)))
-    DO JSV=1,SIZE(PA_LES,3)
-      ZA_LES (:,:,1,JSV) = PA_LES(:,:,JSV)
-    END DO
-    CALL LES_NORM_4D(HUNIT, ZA_LES, ZA_NORM, OSV)
-    DO JSV=1,SIZE(PA_LES,3)
-      PA_NORM(:,:,JSV) = ZA_NORM(:,:,1,JSV)
-    END DO
-  ELSE
-    ALLOCATE(ZA_LES (SIZE(PA_LES,1),SIZE(PA_LES,2),SIZE(PA_LES,3),1))
-    ALLOCATE(ZA_NORM(SIZE(PA_LES,1),SIZE(PA_LES,2),SIZE(PA_LES,3),1))
-    ZA_LES (:,:,:,1) = PA_LES(:,:,:)
-    CALL LES_NORM_4D(HUNIT, ZA_LES, ZA_NORM, OSV)
-    PA_NORM(:,:,:) = ZA_NORM(:,:,:,1)
-  END IF
-ELSE
-  ALLOCATE(ZA_LES (SIZE(PA_LES,1),SIZE(PA_LES,2),SIZE(PA_LES,3),1))
-  ALLOCATE(ZA_NORM(SIZE(PA_LES,1),SIZE(PA_LES,2),SIZE(PA_LES,3),1))
-  ZA_LES (:,:,:,1) = PA_LES(:,:,:)
-  CALL LES_NORM_4D(HUNIT, ZA_LES, ZA_NORM)
-  PA_NORM(:,:,:) = ZA_NORM(:,:,:,1)
-END IF
-!
-DEALLOCATE(ZA_LES)
-DEALLOCATE(ZA_NORM)
-!
-END SUBROUTINE LES_NORM_3D
-!
-!     ##############################################
-      SUBROUTINE LES_NORM_2D(HUNIT, PA_LES, PA_NORM)
-!     ##############################################
-!
-!
-!!****  *LES_NORM* normalizes a field according to the chosen normalization
-!!
-!!    PURPOSE
-!!    -------
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!      V. Masson
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original         30/10/00
-!!
-!! --------------------------------------------------------------------------
-!       
-!*      0. DECLARATIONS
-!          ------------
-!
-!
-IMPLICIT NONE
-!
-!*      0.1  declarations of arguments
-!
-CHARACTER(LEN=*),        INTENT(IN)  :: HUNIT   ! physical unit of field
-REAL,    DIMENSION(:,:), INTENT(IN)  :: PA_LES  ! field
-!
-REAL,    DIMENSION(:,:), INTENT(OUT) :: PA_NORM ! normalized field
-!
-!       0.2  declaration of local variables
-!
-REAL,    DIMENSION(:,:,:,:), ALLOCATABLE :: ZA_LES
-REAL,    DIMENSION(:,:,:,:), ALLOCATABLE :: ZA_NORM
-!
-!------------------------------------------------------------------------------
-!
-ALLOCATE(ZA_LES  (SIZE(PA_LES,1),SIZE(PA_LES,2),1,1))
-ALLOCATE(ZA_NORM (SIZE(PA_LES,1),SIZE(PA_LES,2),1,1))
-!
-ZA_LES (:,:,1,1) = PA_LES(:,:)
-CALL LES_NORM_4D(HUNIT, ZA_LES, ZA_NORM)
-PA_NORM(:,:) = ZA_NORM(:,:,1,1)
-!
-DEALLOCATE(ZA_LES)
-DEALLOCATE(ZA_NORM)
-!
-END SUBROUTINE LES_NORM_2D
-!
-!------------------------------------------------------------------------------
-!
 !###################################
 SUBROUTINE LES_Z_NORM(OAVG,PTRAJZ,PWORK6)
 !###################################
@@ -563,7 +419,7 @@ use mode_datetime,  only: Datetime_correctdate
 !
 IMPLICIT NONE
 !
-REAL, DIMENSION(:,:,:,:,:,:), POINTER     :: PWORK6 ! contains physical field
+REAL, DIMENSION(:,:,:,:,:,:), allocatable     :: PWORK6 ! contains physical field
 type(date_time), dimension(:), allocatable, intent(inout) :: tpdates
 INTEGER,                      INTENT(OUT) :: KRESP  ! return code (0 is OK)
 !------------------------------------------------------------------------------
@@ -652,19 +508,171 @@ END SUBROUTINE LES_TIME_AVG
 !------------------------------------------------------------------------------
 !
 !########################################################
-SUBROUTINE LES_DIACHRO(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG)
+subroutine Les_diachro_gen(tpdiafile,hgroup,hcomment,hunit,pfield,havg, htitle, osurf, osv )
 !########################################################
-!
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
+
+use modd_io,            only: tfiledata
+use modd_les,           only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, nles_current_times, &
+                              nles_k, nles_levels, xles_current_z, xles_temp_mean_start, xles_temp_mean_end
+use modd_parameters,    only: XUNDEF
 use modd_type_date,     only: date_time
 
-USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO
+use mode_write_diachro, only: Write_diachro
+
+implicit none
 !
+!*      0.1  Declarations of arguments
+!
+type(tfiledata),                                intent(in) :: tpdiafile ! File to write
+character(len=*),                               intent(in) :: hgroup    ! Group title
+character(len=*), dimension(:),                 intent(in) :: hcomment  ! Comment string
+character(len=*),                               intent(in) :: hunit     ! Physical unit
+real,             dimension(:,:,:,:),           intent(in) :: pfield    ! Data array
+character(len=1),                               intent(in) :: havg      ! Flag to compute avg.
+character(len=*), dimension(:),       optional, intent(in) :: htitle    ! Title
+logical,                              optional, intent(in) :: osurf     ! Flag to know if pfield is a surface variable
+logical,                              optional, intent(in) :: osv       ! Flag for scalar variables
+!
+!*      0.2  Declaration of local variables for diachro
+!
+character(len=10)                                       :: ygroup                        ! Group title
+character(len=100), dimension(:),           allocatable :: ycomment                      ! Comment string
+character(len=100), dimension(:),           allocatable :: ytitle                        ! Title
+character(len=100), dimension(:),           allocatable :: yunit                         ! Physical unit
+integer                                                 :: iresp                         ! Return code
+integer                                                 :: iles_k                        ! Number of vertical levels
+integer                                                 :: iil, iih, ijl, ijh, ikl, ikh  ! Cartesian area relatively to the
+                                                                                         ! entire domain
+integer                                                 :: jk                            ! Vertical loop counter
+integer                                                 :: jp                            ! Process loop counter
+integer                                                 :: jsv                           ! Scalar loop counter
+integer,            dimension(:),           allocatable :: igrid                         ! Grid indicator
+logical                                                 :: gavg                          ! Flag to compute time averagings
+logical                                                 :: gnorm                         ! Flag to compute normalizations
+logical                                                 :: gsurf                         ! Flag for surface variables
+logical                                                 :: gsv                           ! Flag for scalar variables
+real,               dimension(:,:,:),       allocatable :: ztrajx                        ! Localization of the temporal
+real,               dimension(:,:,:),       allocatable :: ztrajy                        ! series in x,y and z. remark:
+real,               dimension(:,:,:),       allocatable :: ztrajz                        ! x and y are not used for LES
+real,               dimension(size(pfield,1),size(pfield,2),size(pfield,3),size(pfield,4))    &
+                                                        :: zfield                        ! Normalized field
+real,               dimension(:,:,:,:,:,:), allocatable :: zwork6                        ! Contains physical field
+type(date_time),    dimension(:),           allocatable :: tzdates
+!------------------------------------------------------------------------------
+
+if ( present( osurf ) .and. present ( htitle ) ) then
+  call Print_msg( NVERB_ERROR, 'BUD', 'LES_DIACHRO_gen', &
+                  'unexpected: osurf and htitle simultaneously present (not yet validated)' )
+end if
+
+if ( present( osurf ) ) then
+  gsurf = osurf
+else
+  gsurf = .false.
+end if
+
+if ( present( osv ) ) then
+  gsv = osv
+else
+  gsv = .false.
+end if
+
+if ( gsurf ) then
+  iles_k = 1
+else
+  iles_k = nles_k
+end if
+
+gavg  = ( havg == 'A' .or. havg == 'H' )
+gnorm = ( havg == 'E' .or. havg == 'H' )
+
+if ( gavg .and. ( xles_temp_mean_start == XUNDEF .or. xles_temp_mean_end == XUNDEF ) ) return
+
+if ( gnorm ) then
+  if ( gsurf) then
+    return
+  else
+    call Les_norm_4d( hunit, pfield, zfield, gsv )
+  end if
+else
+  zfield(:, :, :, :) = pfield(:, :, :, :)
+end if
+
+! Initialization of diachro variables for les (z,t) profiles
+allocate( ztrajx( 1,      1, size( pfield, 4 ) ) )
+allocate( ztrajy( 1,      1, size( pfield, 4 ) ) )
+allocate( ztrajz( iles_k, 1, size( pfield, 4 ) ) )
+allocate( zwork6( 1, 1, iles_k, nles_current_times, size( pfield, 4 ), size( pfield, 3 ) ) )
+allocate( igrid   ( size( pfield, 3 ) ) )
+allocate( ycomment( size( pfield, 3 ) ) )
+allocate( ytitle  ( size( pfield, 3 ) ) )
+allocate( yunit   ( size( pfield, 3 ) ) )
+allocate( tzdates( nles_current_times ) )
+
+iil = nles_current_iinf
+iih = nles_current_isup
+ijl = nles_current_jinf
+ijh = nles_current_jsup
+ikl = nles_levels(1)
+ikh = nles_levels(iles_k)
+
+ztrajx(:, :, :) = ( iil + iih ) / 2
+ztrajy(:, :, :) = ( ijl + ijh ) / 2
+do jk = 1, iles_k
+  ztrajz(jk, :, :) = xles_current_z(jk)
+end do
+
+igrid(:) = 1
+ycomment(:) = hcomment(:)
+yunit(:)    = hunit(:)
+ygroup      = hgroup
+
+do jsv = 1, size( pfield, 4 )
+  do jp = 1, size( pfield, 3 )
+    zwork6(1, 1, :, :, jsv, jp) = zfield (:, :, jp, jsv)
+  end do
+end do
+
+tzdates(:) = xles_dates(:)
+
+! Normalization of vertical dimension
+if ( gnorm ) then
+  if ( hunit(1:1) /= ' ') yunit = '1'
+  call Les_z_norm( gavg, ztrajz, zwork6 )
+end if
+
+! Time average
+iresp = 0
+if ( gavg ) call Les_time_avg( zwork6, tzdates, iresp )
+
+if ( havg /= ' ' )  ygroup = havg // '_' // ygroup
+if ( present( htitle ) ) then
+  ytitle(:) = ygroup // htitle(:)
+else
+  if ( gsurf ) then
+    ytitle(1) = hgroup
+  else
+    ytitle(1) = ygroup
+  end if
+end if
+
+! Write the profile
+if ( iresp==0 .and. ( gsurf .or. any( zwork6 /= xundef ) ) ) &
+  call write_diachro( tpdiafile, tluout0, ygroup, "ssol", igrid, tzdates,               &
+                      zwork6, ytitle, yunit, ycomment,                                  &
+                      oicp = .false., ojcp = .false., okcp = .false.,                   &
+                      kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh, &
+                      ptrajx = ztrajx, ptrajy = ztrajy, ptrajz = ztrajz                 )
+
+!-------------------------------------------------------------------------------
+end subroutine Les_diachro_gen
+!------------------------------------------------------------------------------
+!########################################################
+SUBROUTINE LES_DIACHRO(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG)
+!########################################################
+
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),      INTENT(IN)       :: TPDIAFILE! file to write
@@ -673,125 +681,19 @@ CHARACTER(LEN=*),     INTENT(IN)       :: HCOMMENT ! comment string
 CHARACTER(LEN=*),     INTENT(IN)       :: HUNIT    ! physical unit
 REAL, DIMENSION(:,:), INTENT(IN)       :: PFIELD
 CHARACTER(LEN=1),     INTENT(IN)       :: HAVG     ! flag to compute avg.
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-!
-INTEGER, DIMENSION(1)                  :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                     :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(1)       :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(1)       :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(1)       :: YUNIT    ! physical unit
-!
-REAL,    DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2))    &
-                                       :: ZFIELD     ! normalized field
-INTEGER                                :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER  :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-INTEGER :: JK                            ! vertical loop counter
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!
-!-------------------------------------------------------------------------------
-!
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
-!
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
-!
-ZFIELD=PFIELD
-IF (GNORM) CALL LES_NORM_2D(HUNIT, PFIELD, ZFIELD)
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,1))
-ALLOCATE (ZTRAJY(1,1,1))
-ALLOCATE (ZTRAJZ(NLES_K,1,1))
-!
-ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,1,1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(NLES_K)
-DO JK=1,NLES_K
-  ZTRAJZ(JK,1,1) = XLES_CURRENT_Z(JK)
-END DO
-IGRID(1)=1
-YCOMMENT(1) = HCOMMENT
-!
-YUNIT (1) = HUNIT
-YGROUP    = HGROUP
-!
-ZWORK6(1,1,:,:,1,1) = ZFIELD (:,:)
-tzdates(:) = xles_dates(:)
-!
-!* normalization of vertical dimension
-!
-IF (GNORM) THEN
-  IF (HUNIT(1:1)/=' ') YUNIT='-'
-  CALL LES_Z_NORM(GAVG,ZTRAJZ,ZWORK6)
-END IF
-!
-!* time average
-!
-IRESP = 0
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE(1) = YGROUP
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE (ZWORK6)
-deallocate( tzdates )
-!
+
+call Les_diachro_gen( tpdiafile, hgroup, [ hcomment ], hunit, &
+                      reshape( pfield, [ size( pfield, 1), size( pfield, 2), 1, 1 ] ), havg )
+
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO
 !-------------------------------------------------------------------------------
 !###########################################################
 SUBROUTINE LES_DIACHRO_SV(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG)
 !###########################################################
-!
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
-use modd_type_date,     only: date_time
 
-USE MODE_WRITE_DIACHRO
-!
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),        INTENT(IN)       :: TPDIAFILE! file to write
@@ -800,252 +702,44 @@ CHARACTER(LEN=*),       INTENT(IN)       :: HCOMMENT ! comment string
 CHARACTER(LEN=*),       INTENT(IN)       :: HUNIT    ! physical unit
 REAL, DIMENSION(:,:,:), INTENT(IN)       :: PFIELD
 CHARACTER(LEN=1),       INTENT(IN)       :: HAVG     ! flag to compute avg.
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-!
-INTEGER, DIMENSION(1)                  :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                     :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(1)       :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(1)       :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(1)       :: YUNIT    ! physical unit
-REAL,    DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))    &
-                                       :: ZFIELD     ! normalized field
-INTEGER                                :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER  :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-INTEGER :: JK                            ! vertical loop counter
-INTEGER :: JSV                           ! scalar loop counter
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!
+
+call Les_diachro_gen( tpdiafile, hgroup, [ hcomment ], hunit,                                            &
+                      reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), 1, size( pfield, 3 ) ] ), &
+                      havg, osv = .true. )
+
+!-------------------------------------------------------------------------------
+END SUBROUTINE LES_DIACHRO_SV
 !-------------------------------------------------------------------------------
+!#####################################################################
+SUBROUTINE LES_DIACHRO_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG)
+!#####################################################################
+
+IMPLICIT NONE
 !
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
+!*      0.1  declarations of arguments
 !
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
+TYPE(TFILEDATA),                    INTENT(IN) :: TPDIAFILE! file to write
+CHARACTER(LEN=*),                   INTENT(IN) :: HGROUP   ! group title
+CHARACTER(LEN=*), DIMENSION(:),     INTENT(IN) :: HTITLE   ! title
+CHARACTER(LEN=*), DIMENSION(:),     INTENT(IN) :: HCOMMENT ! comment string
+CHARACTER(LEN=*),                   INTENT(IN) :: HUNIT    ! physical unit
+REAL,             DIMENSION(:,:,:), INTENT(IN) :: PFIELD
+CHARACTER(LEN=1),                   INTENT(IN) :: HAVG     ! flag to compute avg.
+
+call Les_diachro_gen( tpdiafile, hgroup, hcomment, hunit,                                                &
+                      reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), size( pfield, 3 ), 1 ] ), &
+                      havg, htitle = htitle )
+
+!-------------------------------------------------------------------------------
+END SUBROUTINE LES_DIACHRO_MASKS
+!-------------------------------------------------------------------------------
+!########################################################################
+SUBROUTINE LES_DIACHRO_SV_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG)
+!########################################################################
+
+IMPLICIT NONE
 !
-ZFIELD=PFIELD
-IF (GNORM) CALL LES_NORM_3D(HUNIT, PFIELD, ZFIELD, .TRUE.)
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,3)))
-ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,3)))
-ALLOCATE (ZTRAJZ(NLES_K,1,SIZE(PFIELD,3)))
-ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,SIZE(PFIELD,3),1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(NLES_K)
-DO JK=1,NLES_K
-  ZTRAJZ(JK,:,:) = XLES_CURRENT_Z(JK)
-END DO
-IGRID(1)=1
-YCOMMENT(1) = HCOMMENT
-!
-YUNIT (1) = HUNIT
-YGROUP    = HGROUP
-!
-ZWORK6(1,1,:,:,:,1) = ZFIELD (:,:,:)
-tzdates(:) = xles_dates(:)
-!
-IF (GNORM) THEN
-  IF (HUNIT(1:1)/=' ') YUNIT='-'
-  CALL LES_Z_NORM(GAVG,ZTRAJZ,ZWORK6)
-END IF
-!
-!* time average
-!
-IRESP = 0
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE(1) = YGROUP
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-!
-IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
-!-------------------------------------------------------------------------------
-END SUBROUTINE LES_DIACHRO_SV
-!-------------------------------------------------------------------------------
-!#####################################################################
-SUBROUTINE LES_DIACHRO_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG)
-!#####################################################################
-!
-USE MODD_GRID
-USE MODD_IO, ONLY: TFILEDATA
-USE MODD_LES
-use modd_type_date,     only: date_time
-
-USE MODE_WRITE_DIACHRO
-!
-IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
-!
-TYPE(TFILEDATA),                    INTENT(IN) :: TPDIAFILE! file to write
-CHARACTER(LEN=*),                   INTENT(IN) :: HGROUP   ! group title
-CHARACTER(LEN=*), DIMENSION(:),     INTENT(IN) :: HTITLE   ! title
-CHARACTER(LEN=*), DIMENSION(:),     INTENT(IN) :: HCOMMENT ! comment string
-CHARACTER(LEN=*),                   INTENT(IN) :: HUNIT    ! physical unit
-REAL,             DIMENSION(:,:,:), INTENT(IN) :: PFIELD
-CHARACTER(LEN=1),                   INTENT(IN) :: HAVG     ! flag to compute avg.
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-!
-INTEGER,            DIMENSION(SIZE(PFIELD,3)) :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                            :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YUNIT    ! physical unit
-REAL,    DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))    &
-                                              :: ZFIELD     ! normalized field
-INTEGER                                       :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER         :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-INTEGER :: JK                            ! vertical loop counter
-INTEGER :: JMASK                         ! Mask loop counter
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!
-!-------------------------------------------------------------------------------
-!
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
-!
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
-!
-ZFIELD=PFIELD
-IF (GNORM) CALL LES_NORM_3D(HUNIT, PFIELD, ZFIELD)
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,1))
-ALLOCATE (ZTRAJY(1,1,1))
-ALLOCATE (ZTRAJZ(NLES_K,1,1))
-ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,1,SIZE(PFIELD,3)))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(NLES_K)
-DO JK=1,NLES_K
-  ZTRAJZ(JK,:,1) = XLES_CURRENT_Z(JK)
-END DO
-!
-IGRID(:)=1
-!
-YCOMMENT(:) = HCOMMENT(:)
-YUNIT   (:) = HUNIT
-YGROUP      = HGROUP
-!
-ZWORK6(1,1,:,:,1,:) = ZFIELD (:,:,:)
-tzdates(:) = xles_dates(:)
-!
-IF (GNORM) THEN
-  IF (HUNIT(1:1)/=' ') YUNIT='-'
-  CALL LES_Z_NORM(GAVG,ZTRAJZ,ZWORK6)
-END IF
-!
-!
-!* time average
-!
-IRESP = 0
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE  (:) = YGROUP//HTITLE(:)
-!
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
-!-------------------------------------------------------------------------------
-END SUBROUTINE LES_DIACHRO_MASKS
-!-------------------------------------------------------------------------------
-!########################################################################
-SUBROUTINE LES_DIACHRO_SV_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG)
-!########################################################################
-!
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
-use modd_type_date,     only: date_time
-
-USE MODE_WRITE_DIACHRO
-!
-IMPLICIT NONE
-!
-!
-!*      0.1  declarations of arguments
+!*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),                      INTENT(IN) :: TPDIAFILE! file to write
 CHARACTER(LEN=*),                     INTENT(IN) :: HGROUP   ! group title
@@ -1054,114 +748,10 @@ CHARACTER(LEN=*), DIMENSION(:),       INTENT(IN) :: HCOMMENT ! comment string
 CHARACTER(LEN=*),                     INTENT(IN) :: HUNIT    ! physical unit
 REAL,             DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD
 CHARACTER(LEN=1),                     INTENT(IN) :: HAVG     ! flag to compute avg.
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-!
-INTEGER,            DIMENSION(SIZE(PFIELD,3)) :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                            :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(SIZE(PFIELD,3)) :: YUNIT    ! physical unit
-REAL, DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),SIZE(PFIELD,4))&
-                                              :: ZFIELD   ! normalized field
-INTEGER                                       :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER         :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-INTEGER :: JK                            ! vertical loop counter
-INTEGER :: JP                            ! process loop counter
-INTEGER :: JSV                           ! scalar loop counter
-INTEGER :: JMASK                         ! mask loop counter
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!
-!-------------------------------------------------------------------------------
-!
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
-!
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
-!
-ZFIELD=PFIELD
-IF (GNORM) CALL LES_NORM_4D(HUNIT, PFIELD, ZFIELD, .TRUE.)
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,4)))
-ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,4)))
-ALLOCATE (ZTRAJZ(NLES_K,1,SIZE(PFIELD,4)))
-ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,SIZE(PFIELD,4),SIZE(PFIELD,3)))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(NLES_K)
-DO JK=1,NLES_K
-  ZTRAJZ(JK,:,:) = XLES_CURRENT_Z(JK)
-END DO
-IGRID(:)=1
-!
-YCOMMENT(:) = HCOMMENT(:)
-YUNIT   (:) = HUNIT
-YGROUP      = HGROUP
-!
-!
-DO JSV=1,SIZE(PFIELD,4)
-  DO JP=1,SIZE(PFIELD,3)
-    ZWORK6(1,1,:,:,JSV,JP) = ZFIELD (:,:,JP,JSV)
-  END DO
-END DO
-tzdates(:) = xles_dates(:)
-!
-IF (GNORM) THEN
-  IF (HUNIT(1:1)/=' ') YUNIT='-'
-  CALL LES_Z_NORM(GAVG,ZTRAJZ,ZWORK6)
-END IF
-!n
-!
-!* time average
-!
-IRESP = 0
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE  (:) = YGROUP//HTITLE(:)
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-!
-IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
+
+call Les_diachro_gen( tpdiafile, hgroup, hcomment, hunit, pfield, &
+                      havg, htitle = htitle, osv = .true.)
+
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO_SV_MASKS
 !-------------------------------------------------------------------------------
@@ -1169,17 +759,9 @@ END SUBROUTINE LES_DIACHRO_SV_MASKS
 !#############################################################
 SUBROUTINE LES_DIACHRO_SURF(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG)
 !#############################################################
-!
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
-use modd_type_date,     only: date_time
 
-USE MODE_WRITE_DIACHRO
-!
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),      INTENT(IN)       :: TPDIAFILE! file to write
@@ -1188,111 +770,19 @@ CHARACTER(LEN=*),     INTENT(IN)       :: HCOMMENT ! comment string
 CHARACTER(LEN=*),     INTENT(IN)       :: HUNIT    ! physical unit
 REAL, DIMENSION(:),   INTENT(IN)       :: PFIELD
 CHARACTER(LEN=1),     INTENT(IN)       :: HAVG     ! flag to compute avg.
-!
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-!
-INTEGER, DIMENSION(1)                  :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                     :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(1)       :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(1)       :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(1)       :: YUNIT    ! physical unit
-INTEGER                                :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER  :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!-------------------------------------------------------------------------------
-!
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
-!
 
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
-!
-IF (GNORM) RETURN
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,1))
-ALLOCATE (ZTRAJY(1,1,1))
-ALLOCATE (ZTRAJZ(1,1,1))
-ALLOCATE(ZWORK6(1,1,1,NLES_CURRENT_TIMES,1,1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(1)
-ZTRAJZ(1,1,1) = XLES_CURRENT_Z(1)
-IGRID(1)=1
-YCOMMENT(1) = HCOMMENT
-!
-YUNIT (1) = HUNIT
-YGROUP    = HGROUP
-!
-ZWORK6(1,1,1,:,1,1) = PFIELD (:)
-tzdates(:) = xles_dates(:)
-!
-!* time average
-!
-IRESP = 0
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE(1) = HGROUP
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-IF (IRESP==0) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
+call Les_diachro_gen( tpdiafile, hgroup, [ hcomment ], hunit, &
+                      reshape( pfield, [ 1, size( pfield, 1 ), 1, 1 ] ), havg, osurf = .true. )
+
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO_SURF
 !-------------------------------------------------------------------------------
 !################################################################
 SUBROUTINE LES_DIACHRO_SURF_SV(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG)
 !################################################################
-!
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
-use modd_type_date,     only: date_time
 
-USE MODE_WRITE_DIACHRO
-!
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
 TYPE(TFILEDATA),        INTENT(IN)       :: TPDIAFILE! file to write
@@ -1301,92 +791,11 @@ CHARACTER(LEN=*),       INTENT(IN)       :: HCOMMENT ! comment string
 CHARACTER(LEN=*),       INTENT(IN)       :: HUNIT    ! physical unit
 REAL, DIMENSION(:,:),   INTENT(IN)       :: PFIELD
 CHARACTER(LEN=1),       INTENT(IN)       :: HAVG     ! flag to compute avg.
-!
-!*      0.2  declaration of local variables for diachro
-!
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark:
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES
-INTEGER, DIMENSION(1)                  :: IGRID    ! grid indicator
-CHARACTER(LEN= 10)                     :: YGROUP   ! group title
-CHARACTER(LEN=100), DIMENSION(1)       :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(1)       :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(1)       :: YUNIT    ! physical unit
-INTEGER                                :: IRESP    ! return code
-!
-REAL, DIMENSION(:,:,:,:,:,:), POINTER  :: ZWORK6 ! contains physical field
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-!
-LOGICAL :: GAVG                          ! flag to compute time averagings
-LOGICAL :: GNORM                         ! flag to compute normalizations
-type(date_time), dimension(:), allocatable :: tzdates
-!-------------------------------------------------------------------------------
-!
-GAVG =(HAVG=='A' .OR. HAVG=='H')
-GNORM=(HAVG=='E' .OR. HAVG=='H')
-!
-IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) RETURN
-!
-IF (GNORM) RETURN
-!
-!*      1.0  Initialization of diachro variables for LES (z,t) profiles
-!            ----------------------------------------------------------
-!
-ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,2)))
-ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,2)))
-ALLOCATE (ZTRAJZ(1,1,SIZE(PFIELD,2)))
-ALLOCATE(ZWORK6(1,1,1,NLES_CURRENT_TIMES,SIZE(PFIELD,2),1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-ZTRAJX(:,:,:) = (IIL+IIH)/2
-ZTRAJY(:,:,:) = (IJL+IJH)/2
-IKL=NLES_LEVELS(1)
-IKH=NLES_LEVELS(1)
-ZTRAJZ(1,1,:) = XLES_CURRENT_Z(1)
-IGRID(1)=1
-YCOMMENT(1) = HCOMMENT
-!
-YUNIT (1) = HUNIT
-YGROUP    = HGROUP
-!
-IRESP = 0
-ZWORK6(1,1,1,:,:,1) = PFIELD (:,:)
-tzdates(:) = xles_dates(:)
-!
-!* time average
-!
-IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-!
-!
-IF (HAVG/=' ')  YGROUP=HAVG//'_'//YGROUP
-YTITLE(1) = HGROUP
-!
-!*      2.0  Writing of the profile
-!            ----------------------
-!
-IF (IRESP==0) &
-CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates,               &
-                    ZWORK6, YTITLE, YUNIT, YCOMMENT,                                  &
-                    OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE.,                   &
-                    KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, &
-                    PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ                 )
-!
-!
-!*      3.0  Deallocations
-!            -------------
-!
-DEALLOCATE (ZTRAJX)
-DEALLOCATE (ZTRAJY)
-DEALLOCATE (ZTRAJZ)
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
+
+call Les_diachro_gen( tpdiafile, hgroup, [ hcomment ], hunit,                            &
+                      reshape( pfield, [ 1, size( pfield, 1 ), 1, size( pfield, 2 ) ] ), &
+                      havg, osurf = .true., osv = .true. )
+
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO_SURF_SV
 !-------------------------------------------------------------------------------
@@ -1432,7 +841,7 @@ INTEGER                          :: JT       ! time counter
 INTEGER                          :: JK       ! level counter
 INTEGER                          :: IRESP    ! return code
 !
-REAL, DIMENSION(:,:,:,:,:,:), POINTER :: ZWORK6 ! contains physical field
+REAL, DIMENSION(:,:,:,:,:,:), allocatable :: ZWORK6 ! contains physical field
 !
 INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
 !                                        ! entire domain
@@ -1546,7 +955,6 @@ deallocate( tzdates )
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO_2PT
 !------------------------------------------------------------------------------
-!
 !#####################################################################
 SUBROUTINE LES_DIACHRO_SPEC(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PSPECTRAX,PSPECTRAY)
 !#####################################################################
@@ -1584,7 +992,7 @@ CHARACTER(LEN=100), DIMENSION(1) :: YTITLE   ! title
 CHARACTER(LEN=100), DIMENSION(1) :: YUNIT    ! physical unit
 INTEGER                          :: IRESP    ! return code
 !
-REAL, DIMENSION(:,:,:,:,:,:), POINTER     :: ZWORK6 ! contains physical field
+REAL, DIMENSION(:,:,:,:,:,:), allocatable :: ZWORK6 ! contains physical field
 
 !
 INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the