diff --git a/src/MNH/les_specn.f90 b/src/MNH/les_specn.f90
index d95300068acd362bb731f6c51a9f656b56df3205..9be8e1f806c535837045c3199af39c14bac9815a 100644
--- a/src/MNH/les_specn.f90
+++ b/src/MNH/les_specn.f90
@@ -1,12 +1,31 @@
-!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-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.
 !-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 12/10/2020: restructure Les_diachro_spec subroutine to use tfield_metadata_base type
+!-----------------------------------------------------------------
 !     ######################
       MODULE MODE_LES_SPEC_n
 !     ######################
-!
+
+use modd_field, only: tfield_metadata_base
+
+implicit none
+
+private
+
+public :: Les_spec_n
+
+
+real, dimension(:,:,:,:), allocatable :: xspectrax ! spectra coeffcients for
+real, dimension(:,:,:,:), allocatable :: xspectray ! x and y direction spectra
+
+type(tfield_metadata_base) :: tlesfieldx
+type(tfield_metadata_base) :: tlesfieldy
+
+
 CONTAINS
 !
 !     ######################
@@ -48,27 +67,33 @@ CONTAINS
 !!      Original         07/02/00
 !!                       01/02/01 (D. Gazen) add module MODD_NSV for NSV variable
 !!                       01/04/03 (V. Masson) bug in spectra normalization
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!
+! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CONF
-USE MODD_CONF_n
-USE MODD_GRID_n
-USE MODD_IO,    ONLY: TFILEDATA
-USE MODD_LBC_n, ONLY: CLBCX, CLBCY
-USE MODD_LES
-USE MODD_LES_n
-USE MODD_NSV,   ONLY: NSV
-!
-USE MODE_LES_DIACHRO
-USE MODE_ll
-!
-USE MODI_WRITE_LES_n
-!
+use modd_conf_n, only: luserv, luserc, luseri
+use modd_field,  only: NMNHDIM_COMPLEX, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_SPECTRA_SPEC_NI, &
+                       NMNHDIM_SPECTRA_SPEC_NJ, NMNHDIM_SPECTRA_LEVEL, NMNHDIM_UNUSED,    &
+                       TYPEREAL
+use modd_io,     only: tfiledata
+use modd_lbc_n,  only: clbcx, clbcy
+use modd_les,    only: nspectra_k
+use modd_les_n,  only: nles_times, nspectra_ni, nspectra_nj, &
+                       XCORRi_UU, XCORRi_VV, XCORRi_UV, XCORRi_WU, XCORRi_WV, XCORRi_WW,        &
+                       XCORRi_WTh, XCORRi_WThl, XCORRi_WRv, XCORRi_WRc, XCORRi_WRi, XCORRi_WSv, &
+                       XCORRi_ThTh, XCORRi_ThRv, XCORRi_ThRc, XCORRi_ThRi, XCORRi_ThlThl,       &
+                       XCORRi_ThlRv, XCORRi_ThlRc, XCORRi_ThlRi,                                &
+                       XCORRi_RvRv, XCORRi_RcRc, XCORRi_RiRi, XCORRi_SvSv,                      &
+                       XCORRj_UU, XCORRj_VV, XCORRj_UV, XCORRj_WU, XCORRj_WV, XCORRj_WW,        &
+                       XCORRj_WTh, XCORRj_WThl, XCORRj_WRv, XCORRj_WRc, XCORRj_WRi, XCORRj_WSv, &
+                       XCORRj_ThTh, XCORRj_ThRv, XCORRj_ThRc, XCORRj_ThRi, XCORRj_ThlThl,       &
+                       XCORRj_ThlRv, XCORRj_ThlRc, XCORRj_ThlRi,                                &
+                       XCORRj_RvRv, XCORRj_RcRc, XCORRj_RiRi, XCORRj_SvSv
+
+use modd_nsv,    only: nsv
+
 IMPLICIT NONE
 !
 !
@@ -78,15 +103,10 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 !
 !*      0.2  declaration of local variables
 !
-INTEGER :: JSV       ! scalar loop counter
-!
-CHARACTER(len=5)                      :: YGROUP
-!
-REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSPECTRAX ! spectra coeffcients for
-REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSPECTRAY ! x and y direction spectra
-!
-INTEGER :: ISPECTRA_NI
-INTEGER :: ISPECTRA_NJ
+INTEGER          :: ISPECTRA_NI
+INTEGER          :: ISPECTRA_NJ
+INTEGER          :: JSV         ! scalar loop counter
+CHARACTER(len=5) :: YGROUP
 !-------------------------------------------------------------------------------
 !
 IF (CLBCX(1)=='CYCL') THEN
@@ -101,137 +121,119 @@ ELSE
   ISPECTRA_NJ =  NSPECTRA_NJ - 1
 END IF
 !
-ALLOCATE( ZSPECTRAX(ISPECTRA_NI,2,NSPECTRA_K,NLES_TIMES) )
-ALLOCATE( ZSPECTRAY(ISPECTRA_NJ,2,NSPECTRA_K,NLES_TIMES) )
-!
-!
 !*      1.   (ni,z,t) and (nj,z,t) spectra
 !            -----------------------------
 !
-IF (NSPECTRA_K>0) THEN
-  CALL LES_SPEC('X',XCORRi_UU,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_UU,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"UU   ","U*U     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_VV,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_VV,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"VV   ","V*V     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_WW,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_WW,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"WW   ","W*W     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_UV,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_UV,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"UV   ","U*V     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_WU,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_WU,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"WU   ","W*U     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_WV,    ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_WV,    ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"WV   ","W*V     spectra","m3 s-2",ZSPECTRAX,ZSPECTRAY)
-!
-  CALL LES_SPEC('X',XCORRi_ThTh,  ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_ThTh,  ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"THTH ","Th*Th   spectra","m K2",ZSPECTRAX,ZSPECTRAY)
-!
-  IF (LUSERC) THEN
-    CALL LES_SPEC('X',XCORRi_ThlThl,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThlThl,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"TLTL ","Thl*Thl spectra","m K2",ZSPECTRAX,ZSPECTRAY)
-  END IF
-!
-  CALL LES_SPEC('X',XCORRi_WTh,  ZSPECTRAX)
-  CALL LES_SPEC('Y',XCORRj_WTh,  ZSPECTRAY)
-  CALL LES_DIACHRO_SPEC(TPDIAFILE,"WTH  ","W*Th    spectra","m2 K s-1",ZSPECTRAX,ZSPECTRAY)
-!
-  IF (LUSERC) THEN
-    CALL LES_SPEC('X',XCORRi_WThl,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_WThl,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"WTHL ","W*Thl   spectra","m2 K s-1",ZSPECTRAX,ZSPECTRAY)
-  END IF
-  !
-  IF (LUSERV) THEN
-    CALL LES_SPEC('X',XCORRi_RvRv,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_RvRv,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"RVRV ","rv*rv   spectra","m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_ThRv,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThRv,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"THRV ","th*rv   spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    !
-    IF (LUSERC) THEN
-      CALL LES_SPEC('X',XCORRi_ThlRv,  ZSPECTRAX)
-      CALL LES_SPEC('Y',XCORRj_ThlRv,  ZSPECTRAY)
-      CALL LES_DIACHRO_SPEC(TPDIAFILE,"TLRV ","thl*rv  spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    END IF
-    !
-    CALL LES_SPEC('X',XCORRi_WRv,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_WRv,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"WRV ","W*rv     spectra","m K s-1",ZSPECTRAX,ZSPECTRAY)
-  END IF
-  IF (LUSERC) THEN
-    CALL LES_SPEC('X',XCORRi_RcRc,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_RcRc,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"RCRC ","rc*rc   spectra","m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_ThRc,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThRc,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"THRC ","th*rc   spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_ThlRc,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThlRc,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"TLRC ","thl*rc  spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_WRc,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_WRc,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"WRC ","W*rc     spectra","m K s-1",ZSPECTRAX,ZSPECTRAY)
-  END IF
-  IF (LUSERI) THEN
-    CALL LES_SPEC('X',XCORRi_RiRi,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_RiRi,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"RIRI ","ri*ri   spectra","m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_ThRi,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThRi,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"THRI ","th*ri   spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_ThlRi,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_ThlRi,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"TLRI ","thl*ri  spectra","K m",ZSPECTRAX,ZSPECTRAY)
-    !
-    CALL LES_SPEC('X',XCORRi_WRi,  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_WRi,  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,"WRI ","W*ri     spectra","m K s-1",ZSPECTRAX,ZSPECTRAY)
-  END IF
-  DO JSV=1,NSV
-    WRITE (YGROUP,FMT="(A2,I3.3)") "SS",JSV
-    CALL LES_SPEC('X',XCORRi_SvSv(:,:,:,JSV),  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_SvSv(:,:,:,JSV),  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,YGROUP,"Sv*Sv    spectra","m",ZSPECTRAX,ZSPECTRAY)
-  END DO
-  DO JSV=1,NSV
-    WRITE (YGROUP,FMT="(A2,I3.3)") "WS",JSV
-    CALL LES_SPEC('X',XCORRi_WSv(:,:,:,JSV),  ZSPECTRAX)
-    CALL LES_SPEC('Y',XCORRj_WSv(:,:,:,JSV),  ZSPECTRAY)
-    CALL LES_DIACHRO_SPEC(TPDIAFILE,YGROUP,"W*Sv    spectra","m2 s-1",ZSPECTRAX,ZSPECTRAY)
-  END DO
-END IF
-!
-DEALLOCATE( ZSPECTRAX )
-DEALLOCATE( ZSPECTRAY )
+if ( nspectra_k > 0 ) then
+  allocate( xspectrax(ispectra_ni, 2, nspectra_k, nles_times) )
+  allocate( xspectray(ispectra_nj, 2, nspectra_k, nles_times) )
+
+  tlesfieldx%clongname = ''
+  tlesfieldx%ngrid     = 0
+  tlesfieldx%ntype     = TYPEREAL
+  tlesfieldx%ndims     = 4
+  tlesfieldx%ndimlist(1)  = NMNHDIM_SPECTRA_SPEC_NI
+  tlesfieldx%ndimlist(2)  = NMNHDIM_COMPLEX
+  tlesfieldx%ndimlist(3)  = NMNHDIM_SPECTRA_LEVEL
+  tlesfieldx%ndimlist(4)  = NMNHDIM_BUDGET_LES_TIME
+  tlesfieldx%ndimlist(5:) = NMNHDIM_UNUSED
+
+  tlesfieldy = tlesfieldx
+  tlesfieldy%ndimlist(1)  = NMNHDIM_SPECTRA_SPEC_NJ
+
+  call Les_specn_write_one_field( tpdiafile, XCORRi_UU, XCORRj_UU, 'UU', 'U*U     spectra', 'm3 s-2' )
+  call Les_specn_write_one_field( tpdiafile, XCORRi_VV, XCORRj_VV, 'VV', 'V*V     spectra', 'm3 s-2' )
+  call Les_specn_write_one_field( tpdiafile, XCORRi_WW, XCORRj_WW, 'WW', 'W*W     spectra', 'm3 s-2' )
+  call Les_specn_write_one_field( tpdiafile, XCORRi_UV, XCORRj_UV, 'UV', 'U*V     spectra', 'm3 s-2' )
+  call Les_specn_write_one_field( tpdiafile, XCORRi_WU, XCORRj_WU, 'WU', 'W*U     spectra', 'm3 s-2' )
+  call Les_specn_write_one_field( tpdiafile, XCORRi_WV, XCORRj_WV, 'WV', 'W*V     spectra', 'm3 s-2' )
+
+  call Les_specn_write_one_field( tpdiafile, XCORRi_ThTh, XCORRj_ThTh, 'THTH', 'Th*Th   spectra', 'm K2' )
+  if ( luserc ) then
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThlThl, XCORRj_ThlThl, 'TLTL', 'Thl*Thl spectra', 'm K2' )
+  end if
+
+  call Les_specn_write_one_field( tpdiafile, XCORRi_WTh, XCORRj_WTh, 'WTH',  'W*Th    spectra', 'm2 K s-1' )
+  if ( luserc ) then
+    call Les_specn_write_one_field( tpdiafile, XCORRi_WThl, XCORRj_WThl, 'WTHL', 'W*Thl   spectra', 'm2 K s-1' )
+  end if
+
+  if ( luserv ) then
+    call Les_specn_write_one_field( tpdiafile, XCORRi_RvRv, XCORRj_RvRv, 'RVRV', 'rv*rv   spectra', 'm' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThRv, XCORRj_ThRv, 'THRV', 'th*rv   spectra', 'K m' )
+    if ( luserc ) then
+      call Les_specn_write_one_field( tpdiafile, XCORRi_ThlRv, XCORRj_ThlRv, 'TLRV', 'thl*rv  spectra', 'K m' )
+    end if
+    call Les_specn_write_one_field( tpdiafile, XCORRi_WRv,  XCORRj_WRv,  'WRV',  'W*rv    spectra', 'm K s-1' )
+  end if
+
+  if ( luserc ) then
+    call Les_specn_write_one_field( tpdiafile, XCORRi_RcRc,  XCORRj_RcRc,  'RCRC', 'rc*rc   spectra', 'm' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThRc,  XCORRj_ThRc,  'THRC', 'th*rc   spectra', 'K m' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThlRc, XCORRj_ThlRc, 'TLRC', 'thl*rc  spectra', 'K m' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_WRc,   XCORRj_WRc,   'WRC',  'W*rc    spectra', 'm K s-1' )
+  end if
+
+  if ( luseri ) then
+    call Les_specn_write_one_field( tpdiafile, XCORRi_RiRi,  XCORRj_RiRi,  'RIRI', 'ri*ri   spectra', 'm' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThRi,  XCORRj_ThRi,  'THRI', 'th*ri   spectra', 'K m' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_ThlRi, XCORRj_ThlRi, 'TLRI', 'thl*ri  spectra', 'K m' )
+    call Les_specn_write_one_field( tpdiafile, XCORRi_WRi,   XCORRj_WRi,   'WRI',  'W*ri    spectra', 'm K s-1' )
+  end if
+
+  do jsv = 1, nsv
+    Write( ygroup, fmt = "( a2, i3.3 )" ) "SS", jsv
+    call Les_specn_write_one_field( tpdiafile, XCORRi_SvSv(:,:,:,JSV), XCORRj_SvSv(:,:,:,JSV), ygroup, 'Sv*Sv   spectra','m' )
+  end do
+
+  do jsv = 1, nsv
+    Write( ygroup, fmt = "( a2, i3.3 )" ) "WS", jsv
+    call Les_specn_write_one_field( tpdiafile, XCORRi_WSv(:,:,:,JSV), XCORRj_WSv(:,:,:,JSV), ygroup, 'W*Sv    spectra','m2 s-1' )
+  end do
+
+  deallocate( xspectrax )
+  deallocate( xspectray )
+end if
+
+END SUBROUTINE LES_SPEC_n
 !
 !------------------------------------------------------------------------------
-!
-CONTAINS
-!
+
+subroutine  Les_specn_write_one_field( tpdiafile, zcorri, zcorrj, ymnhname, ycomment, yunits )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro_spec
+
+type(tfiledata),          intent(in) :: tpdiafile ! file to write
+real, dimension(:,:,:),   intent(in) :: zcorri    ! 2 pts correlation data
+real, dimension(:,:,:),   intent(in) :: zcorrj    ! 2 pts correlation data
+character(len=*),         intent(in) :: ymnhname
+character(len=*),         intent(in) :: ycomment
+character(len=*),         intent(in) :: yunits
+
+call Les_spec('X', zcorri, xspectrax)
+call Les_spec('Y', zcorrj, xspectray)
+
+tlesfieldx%cmnhname = ymnhname
+tlesfieldx%ccomment = ycomment
+tlesfieldx%cunits   = yunits
+
+tlesfieldy%cmnhname = tlesfieldx%cmnhname
+tlesfieldy%ccomment = tlesfieldx%ccomment
+tlesfieldy%cunits   = tlesfieldx%cunits
+
+call Les_diachro_spec( tpdiafile, tlesfieldx, tlesfieldy, xspectrax, xspectray )
+
+end subroutine Les_specn_write_one_field
+
 !------------------------------------------------------------------------------
 !
 SUBROUTINE LES_SPEC(HDIR,ZCORR,ZSPECTRA)
 !
-USE MODD_CST
+use modd_conf,   only: l2d
+use modd_cst,    only: xpi
+use modd_grid_n, only: xxhat, xyhat
 !
 CHARACTER(len=1),         INTENT(IN)  :: HDIR        ! direction of spectra
 REAL, DIMENSION(:,:,:),   INTENT(IN)  :: ZCORR       ! 2 pts correlation data
@@ -290,7 +292,5 @@ ZSPECTRA(:,:,:,:) = ZSPECTRA(:,:,:,:) / (2.*XPI*ZDX*(INK/2))
 END SUBROUTINE LES_SPEC
 !
 !------------------------------------------------------------------------------
-!
-END SUBROUTINE LES_SPEC_n
 
 END MODULE MODE_LES_SPEC_n
diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index 8b387678a8f611eb016ceb8e673e23203e533731..06cd58de4404a31bff4e439a2bc1b3938a901477 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.f90
@@ -9,6 +9,7 @@
 !  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
+!  P. Wautelet 12/10/2020: restructure subroutines to use tfield_metadata_base type
 !-----------------------------------------------------------------
 !#######################
 MODULE MODE_LES_DIACHRO
@@ -23,7 +24,7 @@ implicit none
 
 private
 
-public :: LES_DIACHRO, LES_DIACHRO_2PT, LES_DIACHRO_MASKS, LES_DIACHRO_SPEC, &
+public :: LES_DIACHRO, LES_DIACHRO_2PT, LES_DIACHRO_MASKS, Les_diachro_spec, &
           LES_DIACHRO_SURF, LES_DIACHRO_SURF_SV, LES_DIACHRO_SV, LES_DIACHRO_SV_MASKS
 
 CONTAINS
@@ -1000,207 +1001,160 @@ deallocate( tzdates )
 !-------------------------------------------------------------------------------
 END SUBROUTINE LES_DIACHRO_2PT
 !------------------------------------------------------------------------------
-!#####################################################################
-SUBROUTINE LES_DIACHRO_SPEC(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PSPECTRAX,PSPECTRAY)
-!#####################################################################
+!#################################################################################
+subroutine Les_diachro_spec( tpdiafile, tpfieldx, tpfieldy, pspectrax, pspectray )
+!#################################################################################
 !
 !* Modification 01/04/03 (V. Masson) safer use of ZWORK6 with loops
 !
 !
-USE MODD_CONF
-use modd_field,         only: NMNHDIM_UNKNOWN, tfield_metadata_base, TYPEREAL
-USE MODD_GRID
-USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_LES
+use modd_conf,  only: l2d
+use modd_field, only: tfield_metadata_base
+use modd_io,    only: tfiledata
+
+implicit none
+
+type(tfiledata),                      intent(in) :: tpdiafile! file to write
+type(tfield_metadata_base),           intent(in) :: tpfieldx ! metadata of field pfieldx
+type(tfield_metadata_base),           intent(in) :: tpfieldy ! metadata of field pfieldy
+real,             dimension(:,:,:,:), intent(in) :: pspectrax! spectra in x
+real,             dimension(:,:,:,:), intent(in) :: pspectray! and y directions
+
+                 call Les_diachro_spec_1D_intern( tpdiafile, tpfieldx, 'X', pspectrax )
+if ( .not. l2d ) call Les_diachro_spec_1D_intern( tpdiafile, tpfieldy, 'Y', pspectray )
+
+end subroutine Les_diachro_spec
+
+
+!##########################################################################
+subroutine Les_diachro_spec_1D_intern( tpdiafile, tpfield, hdir, pspectra )
+!##########################################################################
+
+use modd_field,         only: NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, &
+                              NMNHMAXDIMS, tfield_metadata_base
+use modd_io,            only: tfiledata
+use modd_les,           only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, &
+                              nles_current_times, nspectra_k, &
+                              xles_current_domegax, xles_current_domegay
+use modd_les_n,         only: xles_dates
 use modd_type_date,     only: date_time
 
 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=*),                     INTENT(IN) :: HCOMMENT ! comment string
-CHARACTER(LEN=*),                     INTENT(IN) :: HUNIT    ! physical unit
-REAL,             DIMENSION(:,:,:,:), INTENT(IN) :: PSPECTRAX! spectra in x
-REAL,             DIMENSION(:,:,:,:), INTENT(IN) :: PSPECTRAY! and y directions
-!
-!*      0.2  declaration of local variables for diachro
-!
-!
-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(:,:,:,:,:,:), allocatable :: ZWORK6 ! contains physical field
 
-!
-INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH  ! cartesian area relatively to the
-!                                        ! entire domain
-!
-CHARACTER(len=6) :: YSTRING
-INTEGER          :: JT       ! time counter
-INTEGER          :: JK       ! level counter
-type(date_time), dimension(:), allocatable :: tzdates
-type(tfield_metadata_base) :: tzfield
-!
-!-------------------------------------------------------------------------------
+implicit none
+
+type(tfiledata),             intent(in) :: tpdiafile ! file to write
+type(tfield_metadata_base),  intent(in) :: tpfield   ! metadata of field pfield
+character,                   intent(in) :: hdir
+real, dimension(:,:,:,:),    intent(in) :: pspectra
+
+character(len=10)                                    :: ygroup   ! group title
+character(len=100)                                   :: ycomment ! comment string
+character(len=6)                                     :: ystring
+integer                                              :: iresp    ! return code
+integer                                              :: iil, iih, ijl, ijh, ikl, ikh  !cartesian area relative to the entire domain
+integer                                              :: ji
+integer                                              :: jt       ! time counter
+integer                                              :: jk       ! level counter
+real,            dimension(:,:,:,:,:,:), allocatable :: zwork6   ! physical field
+type(date_time), dimension(:),           allocatable :: tzdates
+type(tfield_metadata_base)                           :: tzfield
+
+if ( hdir /= 'X' .and. hdir /= 'Y' ) &
+  call Print_msg( NVERB_FATAL, 'BUD', 'Les_diachro_spec_1D_intern', 'invalid hdir' // hdir )
 !
 !*      1.0  Initialization of diachro variables for LES (z,t) profiles
 !            ----------------------------------------------------------
-!
-IGRID(:)=1
-!
-YUNIT (:) = HUNIT
-!
-IKL=1
-IKH=NSPECTRA_K
+allocate( tzdates( nles_current_times ) )
+tzdates(:) = xles_dates(:)
+
+ikl = 1
+ikh = nspectra_k
+
+!Copy all fields from tpfield
+tzfield = tpfield
 !
 !*      2.0  Writing of the profile
 !            ----------------------
-!* spectra in X direction
-!
-ALLOCATE(ZWORK6(SIZE(PSPECTRAX,1),1,NSPECTRA_K,NLES_CURRENT_TIMES,2,1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-tzdates(:) = xles_dates(:)
-!
-IIL = NLES_CURRENT_IINF
-IIH = NLES_CURRENT_ISUP
-IJL = 1
-IJH = 1
-!
-DO JT=1,SIZE(PSPECTRAX,4)
-  DO JK=1,SIZE(PSPECTRAX,3)
-    ZWORK6(:,1,JK,JT,1,1) = PSPECTRAX (:,1,JK,JT)
-    ZWORK6(:,1,JK,JT,2,1) = PSPECTRAX (:,2,JK,JT)
-  END DO
-END DO
-!
-YGROUP    = 'SI_'//HGROUP
-YTITLE(:) = YGROUP
-WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAX )
-YCOMMENT(:) = " DOMEGAX="//YSTRING//' '//HCOMMENT
-!
-!
-tzfield%cmnhname  = ytitle(1)
-tzfield%cstdname  = ''
-tzfield%clongname = ytitle(1)
-tzfield%cunits    = yunit(1)
-tzfield%ccomment  = ycomment(1)
-tzfield%ngrid     = igrid(1)
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 6
-tzfield%ndimlist(:) = NMNHDIM_UNKNOWN
 
-call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                  &
-                    zwork6,                                                           &
-                    oicp = .false., ojcp = .false., okcp = .false.,                   &
-                    kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh  )
-!
-!
-!* time average
-!
-IRESP=0
-CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-YGROUP    = 'T_'//YGROUP
-!
-if ( iresp == 0 ) then
-  tzfield%cmnhname  = ytitle(1)
-  tzfield%cstdname  = ''
-  tzfield%clongname = ytitle(1)
-  tzfield%cunits    = yunit(1)
-  tzfield%ccomment  = ycomment(1)
-  tzfield%ngrid     = igrid(1)
-  tzfield%ntype     = TYPEREAL
-  tzfield%ndims     = 6
-  tzfield%ndimlist(:) = NMNHDIM_UNKNOWN
+if ( hdir == 'X' ) then
+  Allocate( zwork6(Size( pspectra, 1 ), 1, nspectra_k, nles_current_times, 2, 1) )
 
-  call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                  &
-                      zwork6,                                                           &
-                      oicp = .false., ojcp = .false., okcp = .false.,                   &
-                      kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh  )
-end if
+  iil = nles_current_iinf
+  iih = nles_current_isup
+  ijl = 1
+  ijh = 1
 
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
-!* spectra in Y direction
-!
+  do jt = 1, Size( pspectra, 4 )
+    do jk = 1, Size( pspectra, 3 )
+      zwork6(:, 1, jk, jt, 1, 1) = pspectra (:, 1, jk, jt)
+      zwork6(:, 1, jk, jt, 2, 1) = pspectra (:, 2, jk, jt)
+    end do
+  end do
 
-IF (L2D) RETURN
-!
-ALLOCATE(ZWORK6(1,SIZE(PSPECTRAY,1),NSPECTRA_K,NLES_CURRENT_TIMES,2,1))
-allocate( tzdates( NLES_CURRENT_TIMES ) )
-!
-tzdates(:) = xles_dates(:)
-!
-IIL = 1
-IIH = 1
-IJL = NLES_CURRENT_JINF
-IJH = NLES_CURRENT_JSUP
-!
-DO JT=1,SIZE(PSPECTRAY,4)
-  DO JK=1,SIZE(PSPECTRAY,3)
-    ZWORK6(1,:,JK,JT,1,1) = PSPECTRAY (:,1,JK,JT)
-    ZWORK6(1,:,JK,JT,2,1) = PSPECTRAY (:,2,JK,JT)
-  END DO
-END DO
-!
-YGROUP    = 'SJ_'//HGROUP
-YTITLE(:) = YGROUP
-WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAY )
-YCOMMENT(:) = " DOMEGAY="//YSTRING//' '//HCOMMENT
-!
-tzfield%cmnhname  = ytitle(1)
-tzfield%cstdname  = ''
-tzfield%clongname = ytitle(1)
-tzfield%cunits    = yunit(1)
-tzfield%ccomment  = ycomment(1)
-tzfield%ngrid     = igrid(1)
-tzfield%ntype     = TYPEREAL
-tzfield%ndims     = 6
-tzfield%ndimlist(:) = NMNHDIM_UNKNOWN
+  tzfield%ndimlist(6:) = NMNHDIM_UNUSED
+  tzfield%ndimlist(5)  = tpfield%ndimlist(2)
+  tzfield%ndimlist(4)  = tpfield%ndimlist(4)
+  tzfield%ndimlist(3)  = tpfield%ndimlist(3)
+  tzfield%ndimlist(2)  = NMNHDIM_UNUSED
+  tzfield%ndimlist(1)  = tpfield%ndimlist(1)
 
-call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                  &
-                    zwork6,                                                           &
-                    oicp = .false., ojcp = .false., okcp = .false.,                   &
-                    kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh  )
-!
+  ygroup    = 'SI_' // tpfield%cmnhname
+  Write( ystring, fmt = "( i6.6 )" ) Nint( xles_current_domegax )
+  ycomment(:) = " DOMEGAX=" // ystring // ' ' // tpfield%ccomment
+else
+  Allocate( zwork6( 1, Size( pspectra, 1 ), nspectra_k, nles_current_times, 2, 1 ) )
+
+  iil = 1
+  iih = 1
+  ijl = nles_current_jinf
+  ijh = nles_current_jsup
+
+  do jt = 1, Size( pspectra, 4 )
+    do jk = 1, Size( pspectra, 3 )
+      zwork6(1, :, jk, jt, 1, 1) = pspectra (:, 1, jk, jt)
+      zwork6(1, :, jk, jt, 2, 1) = pspectra (:, 2, jk, jt)
+    end do
+  end do
+
+  tzfield%ndimlist(6:) = NMNHDIM_UNUSED
+  tzfield%ndimlist(5)  = tpfield%ndimlist(2)
+  tzfield%ndimlist(4)  = tpfield%ndimlist(4)
+  tzfield%ndimlist(3)  = tpfield%ndimlist(3)
+  tzfield%ndimlist(2)  = tpfield%ndimlist(1)
+  tzfield%ndimlist(1)  = NMNHDIM_UNUSED
+
+  ygroup    = 'SJ_' // tpfield%cmnhname
+  Write( ystring, fmt = "( i6.6 )" ) Nint( xles_current_domegay )
+  ycomment(:) = " DOMEGAY=" // ystring // ' ' // tpfield%ccomment
+end if
+
+tzfield%cmnhname  = ygroup
+tzfield%clongname = ygroup
+tzfield%ccomment  = ycomment(:)
+
+call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                 &
+                    zwork6,                                                          &
+                    oicp = .false., ojcp = .false., okcp = .false.,                  &
+                    kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh )
 !
 !* time average
 !
-CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP )
-YGROUP    = 'T_'//YGROUP
-!
+iresp = 0
+call Les_time_avg( zwork6, tzdates, iresp )
+ygroup = 'T_' // ygroup
+do ji = 1, NMNHMAXDIMS
+  if ( tzfield%ndimlist(ji) == NMNHDIM_BUDGET_LES_TIME ) tzfield%ndimlist(ji) = NMNHDIM_BUDGET_LES_AVG_TIME
+end do
+
 if ( iresp == 0 ) then
-  tzfield%cmnhname  = ytitle(1)
-  tzfield%cstdname  = ''
-  tzfield%clongname = ytitle(1)
-  tzfield%cunits    = yunit(1)
-  tzfield%ccomment  = ycomment(1)
-  tzfield%ngrid     = igrid(1)
-  tzfield%ntype     = TYPEREAL
-  tzfield%ndims     = 6
-  tzfield%ndimlist(:) = NMNHDIM_UNKNOWN
+  call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                 &
+                      zwork6,                                                          &
+                      oicp = .false., ojcp = .false., okcp = .false.,                  &
+                      kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh )
+endif
 
-  call Write_diachro( tpdiafile, [ tzfield ], ygroup, "SPXY", tzdates,                  &
-                      zwork6,                                                           &
-                      oicp = .false., ojcp = .false., okcp = .false.,                   &
-                      kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh  )
-end if
-!
-DEALLOCATE(ZWORK6)
-deallocate( tzdates )
-!
-!-------------------------------------------------------------------------------
-END SUBROUTINE LES_DIACHRO_SPEC
+end subroutine Les_diachro_spec_1D_intern
 
 !-------------------------------------------------------------------------------
 END MODULE MODE_LES_DIACHRO