diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index dce2773ea7ba498e2b03bfd5308d23aca1cd5481..6627a8eff08a032e77f4391ecf414a04e710e904 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -11,6 +11,7 @@ ! P. Wautelet 14/08/2020: deduplicate LES_DIACHRO* subroutines ! P. Wautelet 10/2020: restructure subroutines to use tfield_metadata_base type ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro !----------------------------------------------------------------- !####################### MODULE MODE_LES_DIACHRO @@ -888,8 +889,6 @@ integer :: iles_k integer :: iil, iih, ijl, ijh, ikl, ikh ! Cartesian area relatively to the ! entire domain integer :: jk ! Vertical loop counter -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 type(tfield_metadata_base), dimension(:), allocatable :: tzfields !------------------------------------------------------------------------------ @@ -897,8 +896,6 @@ type(tfield_metadata_base), dimension(:), allocatable :: tzfields iles_k = Size( pfield, 1 ) ! 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( ycomment(Size( pfield, 3 )) ) Allocate( ytitle (Size( pfield, 3 )) ) @@ -911,9 +908,6 @@ ijh = nles_current_jsup ikl = nles_levels(1) ikh = nles_levels(iles_k) -ztrajx(:, :, :) = ( iil + iih ) / 2 -ztrajy(:, :, :) = ( ijl + ijh ) / 2 - if ( Present( hsuffixes ) ) then if ( Size( hsuffixes ) /= Size( pfield, 3) ) & call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'wrong size for hsuffixes (' // Trim( tpfield%cmnhname ) // ')' ) @@ -1033,7 +1027,8 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup !tzbudiachro%ccomment = DONE BEFORE - tzbudiachro%ctype = 'SSOL' +! tzbudiachro%ctype = 'SSOL' + tzbudiachro%ctype = 'TLES' !T for trajectory (used in Write_diachro_lfi to add trajectory terms) tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .false. tzbudiachro%lkcompress = .false. @@ -1044,8 +1039,7 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then tzbudiachro%nkl = ikl tzbudiachro%nkh = ikh - call Write_diachro( tpdiafile, tzbudiachro, tzfields, tzdates, zwork6, & - ptrajx = ztrajx, ptrajy = ztrajy, ptrajz = ztrajz ) + call Write_diachro( tpdiafile, tzbudiachro, tzfields, tzdates, zwork6 ) end if !------------------------------------------------------------------------------- diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 769a5f975d06fe465ca345bf928616c827e9a57e..ba125f83c2d990624d67e1e2034a3753a25ee371 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -69,6 +69,7 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON ! P. Wautelet 09/10/2020: bugfix: correction on IPROCZ when not LIMA (condition was wrong) ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -181,9 +182,6 @@ TYPE(FLYER), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! temporal series -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! in t,x,y and z. -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal serie to write REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORKZ6! contains temporal serie @@ -240,9 +238,6 @@ IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (SIZE(TPFLYER%TSRAD)>0) IPROC = IPROC + 1 ! -ALLOCATE (ZTRAJX(1,size(tpflyer%tpdates),1)) -ALLOCATE (ZTRAJY(1,size(tpflyer%tpdates),1)) -ALLOCATE (ZTRAJZ(1,size(tpflyer%tpdates),1)) ALLOCATE (ZWORK6(1,1,1,size(tpflyer%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) @@ -253,12 +248,6 @@ ALLOCATE (YCOMMENTZ(IPROCZ)) ALLOCATE (YTITLEZ (IPROCZ)) ALLOCATE (YUNITZ (IPROCZ)) ALLOCATE (IGRIDZ (IPROCZ)) - -! -ZTRAJX(1,:,1) = TPFLYER%X -ZTRAJY(1,:,1) = TPFLYER%Y -ZTRAJZ(1,:,1) = TPFLYER%Z -! ! IGRID = 1 YGROUP = TPFLYER%TITLE @@ -879,7 +868,6 @@ tzbudiachro%ctype = 'RSPL' ! tzbudiachro%nkh = NOT SET (default values) call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zw6, & - ptrajx = ztrajx, ptrajy = ztrajy, ptrajz = ztrajz, & tpflyer = tpflyer ) deallocate( tzfields ) @@ -920,15 +908,12 @@ call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zwz6, & deallocate( tzfields ) -DEALLOCATE (ZTRAJX) -DEALLOCATE (ZTRAJY) -DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZW6) +DEALLOCATE (ZW6) DEALLOCATE (YCOMMENT) DEALLOCATE (YTITLE ) DEALLOCATE (YUNIT ) DEALLOCATE (IGRID ) -DEALLOCATE (ZWZ6) +DEALLOCATE (ZWZ6) DEALLOCATE (YCOMMENTZ) DEALLOCATE (YTITLEZ ) DEALLOCATE (YUNITZ ) diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index c55511e3bc0e647911039e01a6236cf40cdcbc59..5bde039e5a555bc54433d38fec100851b27d3f46 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -17,8 +17,7 @@ contains ! ################################################################# subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields, & - tpdates, pvar, & - ptrajx, ptrajy, ptrajz, osplit, tpflyer ) + tpdates, pvar, osplit, tpflyer ) ! ################################################################# ! !!**** *WRITE_DIACHRO* - Ecriture d'un enregistrement dans un fichier @@ -85,6 +84,8 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields, & ! P. Wautelet 09/10/2020: use new data type tpfields ! P. Wautelet 08/12/2020: merge budgets terms with different nbutshift in same group variables ! P. Wautelet 03/03/2021: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 11/03/2021: remove ptrajx/y/z optional dummy arguments of Write_diachro +! + get the trajectory data for LFI files differently !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -106,9 +107,6 @@ type(tbudiachrometadata), intent(in) :: tpb class(tfield_metadata_base), dimension(:), intent(in) :: tpfields type(date_time), dimension(:), intent(in) :: tpdates !Used only for LFI files REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJX -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJY -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJZ logical, intent(in), optional :: osplit type(flyer), intent(in), optional :: tpflyer ! @@ -124,12 +122,12 @@ lpack = .false. #ifdef MNH_IOLFI if ( tpdiafile%cformat == 'LFI' .or. tpdiafile%cformat == 'LFICDF4' ) & - call Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, ptrajx, ptrajy, ptrajz ) + call Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, tpflyer ) #endif #ifdef MNH_IOCDF4 if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) & - call Write_diachro_nc4( tpdiafile, tpbudiachro, tpfields, pvar, osplit, tpflyer ) + call Write_diachro_nc4( tpdiafile, tpbudiachro, tpfields, pvar, osplit, tpflyer ) #endif lpack = gpack @@ -138,14 +136,16 @@ end subroutine Write_diachro #ifdef MNH_IOLFI !----------------------------------------------------------------------------- -subroutine Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, & - ptrajx, ptrajy, ptrajz ) +subroutine Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, tpflyer ) +use modd_aircraft_balloon, only: flyer use modd_budget, only: nbumask, nbutshift, nbusubwrite, tbudiachrometadata use modd_field, only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & TYPECHAR, TYPEINT, TYPEREAL, & tfield_metadata_base, tfielddata use modd_io, only: tfiledata +use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & + nles_k, xles_current_z use modd_parameters, only: jphext use modd_time, only: tdtexp, tdtseg use modd_time_n, only: tdtmod @@ -162,9 +162,7 @@ type(tbudiachrometadata), intent(in) :: tpb class(tfield_metadata_base), dimension(:), intent(in) :: tpfields type(date_time), dimension(:), intent(in) :: tpdates real, dimension(:,:,:,:,:,:), intent(in) :: pvar -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJX -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJY -REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJZ +type(flyer), intent(in), optional :: tpflyer integer, parameter :: LFITITLELGT = 100 integer, parameter :: LFIUNITLGT = 100 @@ -189,6 +187,7 @@ integer :: ji INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR real, dimension(:,:), allocatable :: ztimes real, dimension(:,:), allocatable :: zdatime +real, dimension(:,:,:), allocatable :: ztrajz TYPE(TFIELDDATA) :: TZFIELD type(tfiledata) :: tzfile @@ -244,20 +243,32 @@ INTRAJT=SIZE(tpdates) IKTRAJX=0; IKTRAJY=0; IKTRAJZ=0 ITTRAJX=0; ITTRAJY=0; ITTRAJZ=0 INTRAJX=0; INTRAJY=0; INTRAJZ=0 -IF(PRESENT(PTRAJX))THEN - IKTRAJX=SIZE(PTRAJX,1) - ITTRAJX=SIZE(PTRAJX,2) - INTRAJX=SIZE(PTRAJX,3) +IF ( PRESENT( tpflyer ) ) THEN + IKTRAJX = 1 + ITTRAJX = SIZE( tpflyer%x ) + INTRAJX = 1 +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN + IKTRAJX = 1 + ITTRAJX = 1 + INTRAJX = IN ENDIF -IF(PRESENT(PTRAJY))THEN - IKTRAJY=SIZE(PTRAJY,1) - ITTRAJY=SIZE(PTRAJY,2) - INTRAJY=SIZE(PTRAJY,3) +IF ( PRESENT( tpflyer ) ) THEN + IKTRAJY = 1 + ITTRAJY = SIZE( tpflyer%y ) + INTRAJY = 1 +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN + IKTRAJY = 1 + ITTRAJY = 1 + INTRAJY = IN ENDIF -IF(PRESENT(PTRAJZ))THEN - IKTRAJZ=SIZE(PTRAJZ,1) - ITTRAJZ=SIZE(PTRAJZ,2) - INTRAJZ=SIZE(PTRAJZ,3) +IF ( PRESENT( tpflyer ) ) THEN + IKTRAJZ = 1 + ITTRAJZ = SIZE( tpflyer%z ) + INTRAJZ = 1 +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN + IKTRAJZ = IK + ITTRAJZ = 1 + INTRAJZ = IN ENDIF IIMASK=0; IJMASK=0; IKMASK=0; ITMASK=0; INMASK=0; IPMASK=0 @@ -505,7 +516,7 @@ deallocate( ztimes ) ! ! 8eme enregistrement TRAJX ! -IF(PRESENT(PTRAJX))THEN +IF(PRESENT(tpflyer))THEN TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJX' @@ -516,12 +527,38 @@ IF(PRESENT(PTRAJX))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD,PTRAJX) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) ) +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN + TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJX' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = '--' + TZFIELD%CCOMMENT = TRIM(YCOMMENT) + TZFIELD%NGRID = tpfields(1)%ngrid + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .FALSE. + CALL IO_Field_write(tzfile,TZFIELD, Reshape( & + Spread( source = ( nles_current_iinf + nles_current_isup) / 2, dim = 1, ncopies = IN ), & + [1, 1, IN] ) ) ENDIF ! ! 9eme enregistrement TRAJY ! -IF(PRESENT(PTRAJY))THEN +IF(PRESENT(tpflyer))THEN + TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJY' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJY' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = '--' + TZFIELD%CCOMMENT = TRIM(YCOMMENT) + TZFIELD%NGRID = tpfields(1)%ngrid + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .FALSE. + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) ) +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJY' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJY' @@ -532,12 +569,14 @@ IF(PRESENT(PTRAJY))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD,PTRAJY) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( & + Spread( source = ( nles_current_jinf + nles_current_jsup) / 2, dim = 1, ncopies = IN ), & + [1, 1, IN] ) ) ENDIF ! ! 10eme enregistrement TRAJZ ! -IF(PRESENT(PTRAJZ))THEN +IF(PRESENT(tpflyer))THEN TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJZ' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJZ' @@ -548,7 +587,25 @@ IF(PRESENT(PTRAJZ))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD,PTRAJZ) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) ) +ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN + TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJZ' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJZ' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = '--' + TZFIELD%CCOMMENT = TRIM(YCOMMENT) + TZFIELD%NGRID = tpfields(1)%ngrid + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .FALSE. + + Allocate( ztrajz(IK, 1, IN) ) + do jj = 1, IK + ztrajz(jj, :, :) = xles_current_z(jj) + end do + CALL IO_Field_write(tzfile,TZFIELD,ztrajz) + Deallocate( ztrajz ) ENDIF ! ! 11eme enregistrement PDATIME