diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index 0918a7266e0e3b1bf0fa36fac9c79f13e6b239ce..8b387678a8f611eb016ceb8e673e23203e533731 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -512,9 +512,10 @@ END SUBROUTINE LES_TIME_AVG !------------------------------------------------------------------------------ ! !######################################################## -subroutine Les_diachro_gen(tpdiafile,hgroup,hcomment,hunit,pfield,havg, htitle, osurf, osv ) +subroutine Les_diachro_gen(tpdiafile, hgroup, hcomment, hunit, pfield, havg, htitle, osurf, osv ) !######################################################## +use modd_field, only: NMNHDIM_UNKNOWN, tfield_metadata_base, TYPEREAL 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 @@ -562,6 +563,7 @@ real, dimension(size(pfield,1),size(pfield,2),size(pfield,3),size( :: zfield ! Normalized field real, dimension(:,:,:,:,:,:), allocatable :: zwork6 ! Contains physical field type(date_time), dimension(:), allocatable :: tzdates +type(tfield_metadata_base), dimension(:), allocatable :: tzfields !------------------------------------------------------------------------------ if ( present( osurf ) .and. present ( htitle ) ) then @@ -661,12 +663,29 @@ else end if ! Write the profile -if ( iresp==0 .and. ( gsurf .or. any( zwork6 /= xundef ) ) ) & - call write_diachro( tpdiafile, 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 ) +if ( iresp==0 .and. ( gsurf .or. any( zwork6 /= xundef ) ) ) then + allocate( tzfields( Size( pfield, 3 ) ) ) + + tzfields(:)%cmnhname = ytitle(:) + tzfields(:)%cstdname = '' + tzfields(:)%clongname = ytitle(:) + tzfields(:)%cunits = yunit(:) + tzfields(:)%ccomment = ycomment(:) + tzfields(:)%ngrid = igrid + tzfields(:)%ntype = TYPEREAL + tzfields(:)%ndims = 6 + do jp = 1, Size( tzfields ) + tzfields(jp)%ndimlist(:) = NMNHDIM_UNKNOWN + end do + + call Write_diachro( tpdiafile, tzfields, ygroup, "SSOL", tzdates, & + zwork6, & + oicp = .false., ojcp = .false., okcp = .false., & + kil = iil, kih = iih, kjl = ijl, kjh = ijh, kkl = ikl, kkh = ikh, & + ptrajx = ztrajx, ptrajy = ztrajy, ptrajz = ztrajz ) + + deallocate( tzfields ) +end if !------------------------------------------------------------------------------- end subroutine Les_diachro_gen @@ -803,6 +822,7 @@ call Les_diachro_gen( tpdiafile, hgroup, [ hcomment ], hunit, !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SURF_SV !------------------------------------------------------------------------------- + !##################################################################### SUBROUTINE LES_DIACHRO_2PT(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELDX,PFIELDY,HAVG) !##################################################################### @@ -811,12 +831,13 @@ SUBROUTINE LES_DIACHRO_2PT(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELDX,PFIELDY,HAVG) ! ! 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_type_date, only: date_time -USE MODE_WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE ! @@ -839,8 +860,6 @@ 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(PFIELDX,1),SIZE(PFIELDX,2)) :: ZAVG_FIELDX -REAL, DIMENSION(SIZE(PFIELDY,1),SIZE(PFIELDY,2)) :: ZAVG_FIELDY INTEGER :: JT ! time counter INTEGER :: JK ! level counter INTEGER :: IRESP ! return code @@ -854,6 +873,7 @@ CHARACTER(len=6) :: YSTRING ! LOGICAL :: GAVG ! flag to compute time averagings type(date_time), dimension(:), allocatable :: tzdates +type(tfield_metadata_base) :: tzfield !------------------------------------------------------------------------------- ! IF (HAVG/=' '.AND. HAVG/='A') RETURN @@ -906,11 +926,22 @@ END IF !* 2.0 Writing of the profile ! ---------------------- ! -IF (IRESP==0) & -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 ) +end if ! ! deallocate( tzdates ) @@ -948,10 +979,20 @@ IF (GAVG) THEN YGROUP = 'T_'//YGROUP END IF ! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 ) ! DEALLOCATE(ZWORK6) deallocate( tzdates ) @@ -967,12 +1008,13 @@ SUBROUTINE LES_DIACHRO_SPEC(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PSPECTRAX,PSPECTRAY) ! ! 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_type_date, only: date_time -USE MODE_WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE ! @@ -1006,6 +1048,7 @@ CHARACTER(len=6) :: YSTRING INTEGER :: JT ! time counter INTEGER :: JK ! level counter type(date_time), dimension(:), allocatable :: tzdates +type(tfield_metadata_base) :: tzfield ! !------------------------------------------------------------------------------- ! @@ -1046,10 +1089,20 @@ WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAX ) YCOMMENT(:) = " DOMEGAX="//YSTRING//' '//HCOMMENT ! ! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 @@ -1058,11 +1111,23 @@ IRESP=0 CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP ! -IF (IRESP==0) & -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 ) +end if + DEALLOCATE(ZWORK6) deallocate( tzdates ) ! @@ -1093,10 +1158,20 @@ YTITLE(:) = YGROUP WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAY ) YCOMMENT(:) = " DOMEGAY="//YSTRING//' '//HCOMMENT ! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 @@ -1104,11 +1179,22 @@ CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP ! -IF (IRESP==0) & -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "SPXY", IGRID, tzdates, & - ZWORK6, YTITLE, YUNIT, YCOMMENT, & - OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & - KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) +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 ) +end if ! DEALLOCATE(ZWORK6) deallocate( tzdates ) diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index af24818337d91b9961abf47ad23d5591d29a0106..a5bb3358805c939f552579461d4e5a0595e7b002 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -62,11 +62,12 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON !! aircraft, ballon and profiler !! Oct 2016 : G.Delautier LIMA !! August 2016 (M.Leriche) Add mass concentration of aerosol species -!! 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 ! P. Wautelet 29/01/2019: bug: moved an instruction later (to prevent access to a not allocated array) ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 02/10/2020: bugfix: YGROUP/YGROUPZ were too small ! 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 ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,7 +102,7 @@ USE MODD_PARAM_LIMA , ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM USE MODE_MODELN_HANDLER USE MODE_DUST_PSD USE MODE_AERO_PSD -USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE ! @@ -170,7 +171,10 @@ CONTAINS !---------------------------------------------------------------------------- ! SUBROUTINE FLYER_DIACHRO(TPFLYER) -! + +use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, & + tfield_metadata_base, TYPEREAL + TYPE(FLYER), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro @@ -208,6 +212,7 @@ INTEGER :: IKU, IK CHARACTER(LEN=2) :: INDICE INTEGER :: I INTEGER :: JLOOP +type(tfield_metadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! @@ -839,14 +844,52 @@ ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ)) ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ) DEALLOCATE(ZWORKZ6) ! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "RSPL", IGRID, tpflyer%tpdates, & - ZW6, YTITLE(:), YUNIT(:), YCOMMENT(:), & - PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) -! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUPZ, "CART", IGRIDZ, tpflyer%tpdates, & - ZWZ6, YTITLEZ(:), YUNITZ(:), YCOMMENTZ(:), & - OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & - KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = IKU ) +allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ytitle(1 : jproc) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ytitle(1 : jproc) +tzfields(:)%cunits = yunit(1 : jproc) +tzfields(:)%ccomment = ycomment(1 : jproc) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 2 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(4) = NMNHDIM_FLYER_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_FLYER_PROC + +call Write_diachro( tpdiafile, tzfields, ygroup, "RSPL", tpflyer%tpdates, & + zw6, & + ptrajx = ztrajx, ptrajy = ztrajy, ptrajz = ztrajz ) + +deallocate( tzfields ) + +allocate( tzfields( jprocz ) ) + +tzfields(:)%cmnhname = ytitlez(1 : jprocz) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ytitlez(1 : jprocz) +tzfields(:)%cunits = yunitz(1 : jprocz) +tzfields(:)%ccomment = ycommentz(1 : jprocz) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 3 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_LEVEL +tzfields(:)%ndimlist(4) = NMNHDIM_FLYER_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_FLYER_PROC + +call Write_diachro( tpdiafile, tzfields, ygroupz, "CART", tpflyer%tpdates, & + zwz6, & + oicp = .true., ojcp = .true., okcp = .false., & + kil = 1, kih = 1, kjl = 1, kjh = 1, kkl = 1, kkh = iku ) + +deallocate( tzfields ) DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index a160a54bbfd57809e09d83e3adf0197281a5af24..69158b6704d97cbc351845a4e3cfbaa8c28a1744 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -30,6 +30,7 @@ ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 14/10/2019: complete restructuration and deduplication of code ! P. Wautelet 10/03/2020: use the new data structures and subroutines for budgets +! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields !----------------------------------------------------------------- !####################### @@ -353,6 +354,12 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p nbumask, nbuwrnb, & tburhodata, & NBUDGET_RHO, NBUDGET_U, NBUDGET_V, NBUDGET_W + use modd_field, only: NMNHDIM_BUDGET_CART_NI, NMNHDIM_BUDGET_CART_NJ, NMNHDIM_BUDGET_CART_NI_U, & + NMNHDIM_BUDGET_CART_NJ_U, NMNHDIM_BUDGET_CART_NI_V, NMNHDIM_BUDGET_CART_NJ_V, & + NMNHDIM_BUDGET_CART_LEVEL, NMNHDIM_BUDGET_CART_LEVEL_W, & + NMNHDIM_BUDGET_MASK_LEVEL, NMNHDIM_BUDGET_MASK_LEVEL_W, & + NMNHDIM_BUDGET_MASK_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, & + NMNHDIM_UNUSED, NMNHDIM_UNKNOWN use modd_io, only: tfiledata use modd_lunit_n, only: tluout use modd_parameters, only: XNEGUNDEF @@ -373,12 +380,9 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p logical, intent(in) :: knocompress ! compression for the cart option real, dimension(:,:,:,:,:,:), allocatable, intent(out) :: prhodjn - character(len=4) :: ybutype - character(len=9) :: ygroup_name ! group name - character(len=99), dimension(:), allocatable :: ybucomment ! comment - character(len=100), dimension(:), allocatable :: yworkcomment ! comment - character(len=100), dimension(:), allocatable :: yworkunit ! comment - integer, dimension(:), allocatable :: iworkgrid ! grid label + character(len=4) :: ybutype + character(len=9) :: ygroup_name + type(tburhodata) :: tzfield call Print_msg( NVERB_DEBUG, 'BUD', 'Store_one_budget_rho', 'called for '//trim( tprhodj%cmnhname ) ) @@ -387,36 +391,28 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p ! pburhodj storage select case ( cbutype ) case( 'CART', 'SKIP' ) + !Set to CART for all processes even if has no data(='SKIP') + !Necessary to do the call and the collective write later (if knocompress) ybutype = 'CART' - if ( knocompress ) then - allocate( prhodjn(nbuimax, nbujmax, nbukmax, 1, 1, 1) ) ! local budget of RHODJU - prhodjn(:, :, :, 1, 1, 1) = tprhodj%xdata(:, :, :) - else - allocate( prhodjn(nbuimax_ll, nbujmax_ll, nbukmax, 1, 1, 1) ) ! global budget of RhodjU - prhodjn(:,:,:,1,1,1)=End_cart_compress( tprhodj%xdata(:,:,:) ) - end if + if ( knocompress ) then + allocate( prhodjn(nbuimax, nbujmax, nbukmax, 1, 1, 1) ) ! local budget of RHODJU + prhodjn(:, :, :, 1, 1, 1) = tprhodj%xdata(:, :, :) + else + allocate( prhodjn(nbuimax_ll, nbujmax_ll, nbukmax, 1, 1, 1) ) ! global budget of RhodjU + prhodjn(:,:,:,1,1,1)=End_cart_compress( tprhodj%xdata(:,:,:) ) + end if case('MASK') ybutype = 'MASK' - allocate( prhodjn(1, 1, nbukmax, nbuwrnb, nbumask, 1) ) - prhodjn(1, 1, :, :, :, 1) = End_mask_compress( tprhodj%xdata(:, :, :) ) - where ( prhodjn(1, 1, :, :, :, 1) <= 0. ) - prhodjn(1, 1, :, :, :, 1) = XNEGUNDEF - end where + allocate( prhodjn(1, 1, nbukmax, nbuwrnb, nbumask, 1) ) + prhodjn(1, 1, :, :, :, 1) = End_mask_compress( tprhodj%xdata(:, :, :) ) + where ( prhodjn(1, 1, :, :, :, 1) <= 0. ) + prhodjn(1, 1, :, :, :, 1) = XNEGUNDEF + end where case default call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget_rho', 'unknown CBUTYPE' ) end select - allocate( ybucomment(1) ) - allocate( yworkunit(1) ) - allocate( yworkcomment(1) ) - allocate( iworkgrid(1) ) - - ybucomment(1) = tprhodj%cmnhname - yworkunit(1) = tprhodj%cunits - yworkcomment(1) = tprhodj%ccomment - iworkgrid(1) = tprhodj%ngrid - select case( kp ) case( NBUDGET_RHO ) write( ygroup_name, fmt = "('RJS__',I4.4)" ) nbutshift @@ -434,12 +430,76 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget_rho', 'unknown budget type' ) end select - call Write_diachro( tpdiafile, ygroup_name, ybutype, iworkgrid, & - tpdates, prhodjn, ybucomment, & - yworkunit, yworkcomment, & + !Copy all fields from tprhodj + tzfield = tprhodj + + !Modify metadata coming from tprhodj%tgroups + !ndims and ndimlist are adapted for Write_diachro + if ( tzfield%ngrid < 1 .or. tzfield%ngrid > 4 ) & + call Print_msg( NVERB_FATAL, 'BUD', 'Store_one_budget_rho', 'invalid grid' ) + + if ( ybutype == 'CART' ) then + if ( .not. lbu_icp ) then + select case ( tzfield%ngrid ) + case ( 1, 4 ) + tzfield%ndimlist(1) = NMNHDIM_BUDGET_CART_NI + case ( 2 ) + tzfield%ndimlist(1) = NMNHDIM_BUDGET_CART_NI_U + case ( 3 ) + tzfield%ndimlist(1) = NMNHDIM_BUDGET_CART_NI_V + end select + else + tzfield%ndims = tzfield%ndims - 1 + tzfield%ndimlist(1) = NMNHDIM_UNUSED + end if + + if ( .not. lbu_jcp ) then + select case ( tzfield%ngrid ) + case ( 1, 4 ) + tzfield%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ + case ( 2 ) + tzfield%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ_U + case ( 3 ) + tzfield%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ_V + end select + else + tzfield%ndims = tzfield%ndims - 1 + tzfield%ndimlist(2) = NMNHDIM_UNUSED + end if + + if ( .not. lbu_kcp ) then + select case ( tzfield%ngrid ) + case ( 1, 2, 3 ) + tzfield%ndimlist(3) = NMNHDIM_BUDGET_CART_LEVEL + case ( 4 ) + tzfield%ndimlist(3) = NMNHDIM_BUDGET_CART_LEVEL_W + end select + else + tzfield%ndims = tzfield%ndims - 1 + tzfield%ndimlist(3) = NMNHDIM_UNUSED + end if + tzfield%ndimlist(4:) = NMNHDIM_UNUSED + + else if ( ybutype == 'MASK' ) then + tzfield%ndimlist(1) = NMNHDIM_UNUSED + tzfield%ndimlist(2) = NMNHDIM_UNUSED + select case ( tzfield%ngrid ) + case ( 1, 2, 3 ) + tzfield%ndimlist(3) = NMNHDIM_BUDGET_MASK_LEVEL + case ( 4 ) + tzfield%ndimlist(3) = NMNHDIM_BUDGET_MASK_LEVEL_W + end select + tzfield%ndimlist(4) = NMNHDIM_BUDGET_MASK_TIME + tzfield%ndimlist(5) = NMNHDIM_BUDGET_MASK_NBUMASK + tzfield%ndimlist(6) = NMNHDIM_UNUSED + + else + tzfield%ndimlist(:) = NMNHDIM_UNKNOWN + end if + + call Write_diachro( tpdiafile, [ tzfield ], ygroup_name, ybutype, tpdates, prhodjn, & oicp = lbu_icp, ojcp = lbu_jcp, okcp = lbu_kcp, & kil = nbuil, kih = nbuih, kjl = nbujl, kjh = nbujh, kkl = nbukl, kkh = nbukh ) - deallocate( ybucomment, yworkunit, yworkcomment, iworkgrid ) end subroutine Store_one_budget_rho @@ -452,7 +512,14 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, nbumask, nbuwrnb, & NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, & NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & - tbudgetdata + tbudgetdata, tbugroupdata + use modd_field, only: NMNHDIM_BUDGET_CART_NI, NMNHDIM_BUDGET_CART_NJ, NMNHDIM_BUDGET_CART_NI_U, & + NMNHDIM_BUDGET_CART_NJ_U, NMNHDIM_BUDGET_CART_NI_V, NMNHDIM_BUDGET_CART_NJ_V, & + NMNHDIM_BUDGET_CART_LEVEL, NMNHDIM_BUDGET_CART_LEVEL_W, & + NMNHDIM_BUDGET_MASK_LEVEL, NMNHDIM_BUDGET_MASK_LEVEL_W, & + NMNHDIM_BUDGET_MASK_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, & + NMNHDIM_BUDGET_NGROUPS, NMNHDIM_UNUSED, NMNHDIM_UNKNOWN, & + TYPEREAL use modd_io, only: tfiledata use modd_lunit_n, only: tluout use modd_parameters, only: NBUNAMELGTMAX @@ -475,16 +542,12 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, character(len=4) :: ybutype character(len=9) :: ygroup_name - character(len=NBUNAMELGTMAX), dimension(:), allocatable :: ytitles - character(len=100), dimension(:), allocatable :: yworkcomment - character(len=100), dimension(:), allocatable :: yworkunit integer :: igroups integer :: jproc integer :: jsv - integer :: jt - integer, dimension(:), allocatable :: iworkgrid ! grid label real, dimension(:), allocatable :: zconvert ! unit conversion coefficient real, dimension(:,:,:,:,:,:), allocatable :: zworkt + type(tbugroupdata), dimension(:), allocatable :: tzfields call Print_msg( NVERB_DEBUG, 'BUD', 'Store_one_budget', 'called for '//trim( tpbudget%cname ) ) @@ -512,27 +575,27 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, select case ( cbutype ) case( 'CART', 'SKIP' ) ybutype = 'CART' - if ( knocompress ) then - allocate( zworkt(nbuimax, nbujmax, nbukmax, 1, 1, igroups ) ) ! local budget of ru - do jproc = 1, igroups - zworkt(:, :, :, 1, 1, jproc) = tpbudget%tgroups(jproc)%xdata(:, :, :) & - * zconvert(jproc) / prhodjn(:, :, :, 1, 1, 1) - end do - else - allocate( zworkt(nbuimax_ll, nbujmax_ll, nbukmax, 1, 1, igroups ) ) ! global budget of ru - - do jproc = 1, igroups - zworkt(:, :, :, 1, 1, jproc) = End_cart_compress( tpbudget%tgroups(jproc)%xdata(:, :, :) ) - zworkt(:, :, :, 1, 1, jproc) = zworkt(:, :, :, 1, 1, jproc) * zconvert(jproc) / prhodjn(:, :, :, 1, 1, 1) - end do - endif - case('MASK') - ybutype = 'MASK' - allocate( zworkt(1, 1, nbukmax, nbuwrnb, nbumask, igroups ) ) + if ( knocompress ) then + allocate( zworkt(nbuimax, nbujmax, nbukmax, 1, 1, igroups ) ) ! local budget of ru do jproc = 1, igroups - zworkt(1, 1, :, :, :, jproc) = End_mask_compress( tpbudget%tgroups(jproc)%xdata(:, :, :) ) & - * zconvert(jproc) / prhodjn(1, 1, :, :, :, 1) + zworkt(:, :, :, 1, 1, jproc) = tpbudget%tgroups(jproc)%xdata(:, :, :) & + * zconvert(jproc) / prhodjn(:, :, :, 1, 1, 1) end do + else + allocate( zworkt(nbuimax_ll, nbujmax_ll, nbukmax, 1, 1, igroups ) ) ! global budget of ru + + do jproc = 1, igroups + zworkt(:, :, :, 1, 1, jproc) = End_cart_compress( tpbudget%tgroups(jproc)%xdata(:, :, :) ) + zworkt(:, :, :, 1, 1, jproc) = zworkt(:, :, :, 1, 1, jproc) * zconvert(jproc) / prhodjn(:, :, :, 1, 1, 1) + end do + endif + case('MASK') + ybutype = 'MASK' + allocate( zworkt(1, 1, nbukmax, nbuwrnb, nbumask, igroups ) ) + do jproc = 1, igroups + zworkt(1, 1, :, :, :, jproc) = End_mask_compress( tpbudget%tgroups(jproc)%xdata(:, :, :) ) & + * zconvert(jproc) / prhodjn(1, 1, :, :, :, 1) + end do case default call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget', 'unknown CBUTYPE' ) @@ -540,15 +603,6 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, deallocate(zconvert) - allocate( ytitles( igroups ) ) - allocate( yworkunit( igroups ) ) - allocate( yworkcomment( igroups ) ) - allocate( iworkgrid( igroups ) ) - - yworkunit(:) = tpbudget%tgroups(:)%cunits - yworkcomment(:) = tpbudget%tgroups(:)%ccomment - iworkgrid(:) = tpbudget%tgroups(:)%ngrid - select case( tpbudget%nid ) case ( NBUDGET_U ) write( ygroup_name, fmt = "('UU___',I4.4)" ) nbutshift @@ -588,28 +642,91 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, case ( NBUDGET_SV1 : ) jsv = tpbudget%nid - NBUDGET_SV1 + 1 -! yworkunit(:) = 's-1' ; yworkunit(1:3) = ' ' -! DO JT = 1, igroups -! WRITE(yworkcomment(JT),FMT="('Budget of SVx=',I3.3)") jsv -! END DO write( ygroup_name, fmt = "('SV',I3.3,I4.4)") jsv, nbutshift case default call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget', 'unknown budget type' ) end select + allocate( tzfields( igroups ) ) + + !Copy all fields from tpbudget%tgroups + tzfields(:) = tpbudget%tgroups(:) + + !Modify metadata coming from tpbudget%tgroups + !ndims and ndimlist are adapted for Write_diachro do jproc = 1, igroups - ytitles(jproc) = trim( tpbudget%tgroups(jproc)%cmnhname ) + tzfields(jproc)%ndims = 4 + + if ( tzfields(jproc)%ngrid < 1 .or. tzfields(jproc)%ngrid > 4 ) & + call Print_msg( NVERB_FATAL, 'BUD', 'Store_one_budget_rho', 'invalid grid' ) + + if ( ybutype == 'CART' ) then + if ( .not. lbu_icp ) then + select case ( tzfields(jproc)%ngrid ) + case ( 1, 4 ) + tzfields(jproc)%ndimlist(1) = NMNHDIM_BUDGET_CART_NI + case ( 2 ) + tzfields(jproc)%ndimlist(1) = NMNHDIM_BUDGET_CART_NI_U + case ( 3 ) + tzfields(jproc)%ndimlist(1) = NMNHDIM_BUDGET_CART_NI_V + end select + else + tzfields(jproc)%ndims = tzfields(jproc)%ndims - 1 + tzfields(jproc)%ndimlist(1) = NMNHDIM_UNUSED + end if + + if ( .not. lbu_jcp ) then + select case ( tzfields(jproc)%ngrid ) + case ( 1, 4 ) + tzfields(jproc)%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ + case ( 2 ) + tzfields(jproc)%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ_U + case ( 3 ) + tzfields(jproc)%ndimlist(2) = NMNHDIM_BUDGET_CART_NJ_V + end select + else + tzfields(jproc)%ndims = tzfields(jproc)%ndims - 1 + tzfields(jproc)%ndimlist(2) = NMNHDIM_UNUSED + end if + + if ( .not. lbu_kcp ) then + select case ( tzfields(jproc)%ngrid ) + case ( 1, 2, 3 ) + tzfields(jproc)%ndimlist(3) = NMNHDIM_BUDGET_CART_LEVEL + case ( 4 ) + tzfields(jproc)%ndimlist(3) = NMNHDIM_BUDGET_CART_LEVEL_W + end select + else + tzfields(jproc)%ndims = tzfields(jproc)%ndims - 1 + tzfields(jproc)%ndimlist(3) = NMNHDIM_UNUSED + end if + tzfields(jproc)%ndimlist(4) = NMNHDIM_UNUSED + tzfields(jproc)%ndimlist(5) = NMNHDIM_UNUSED + tzfields(jproc)%ndimlist(6) = NMNHDIM_BUDGET_NGROUPS + + else if ( ybutype == 'MASK' ) then + tzfields(jproc)%ndimlist(1) = NMNHDIM_UNUSED + tzfields(jproc)%ndimlist(2) = NMNHDIM_UNUSED + select case ( tzfields(jproc)%ngrid ) + case ( 1, 2, 3 ) + tzfields(jproc)%ndimlist(3) = NMNHDIM_BUDGET_MASK_LEVEL + case ( 4 ) + tzfields(jproc)%ndimlist(3) = NMNHDIM_BUDGET_MASK_LEVEL_W + end select + tzfields(jproc)%ndimlist(4) = NMNHDIM_BUDGET_MASK_TIME + tzfields(jproc)%ndimlist(5) = NMNHDIM_BUDGET_MASK_NBUMASK + tzfields(jproc)%ndimlist(6) = NMNHDIM_BUDGET_NGROUPS + + else + tzfields(jproc)%ndimlist(:) = NMNHDIM_UNKNOWN + end if end do - call Write_diachro( tpdiafile, ygroup_name, ybutype, iworkgrid, & - tpdates, zworkt, ytitles, & - yworkunit, yworkcomment, & + call Write_diachro( tpdiafile, tzfields, ygroup_name, ybutype, tpdates, zworkt, & oicp = lbu_icp, ojcp = lbu_jcp, okcp = lbu_kcp, & kil = nbuil, kih = nbuih, kjl = nbujl, kjh = nbujh, kkl = nbukl, kkh = nbukh ) - deallocate( zworkt, yworkunit, yworkcomment, iworkgrid ) - end subroutine Store_one_budget end module mode_write_budget diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 7c7bc53f7478198810296bbfa01f2a414f842704..a2fe6cec6fcd0cb8f5e653b98c7ee237b5a20bda 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -12,26 +12,27 @@ private public :: Write_diachro contains -! ################################################################# - SUBROUTINE WRITE_DIACHRO(TPDIAFILE,HGROUP,HTYPE, & - KGRID, tpdates, PVAR, & - HTITRE,HUNITE,HCOMMENT,OICP,OJCP,OKCP,KIL,KIH,KJL,KJH,KKL,KKH, & - PTRAJX,PTRAJY,PTRAJZ ) -! ################################################################# + +! ######################################################################### +subroutine Write_diachro( tpdiafile, tpfields, hgroup, htype, & + tpdates, pvar, & + oicp, ojcp, okcp, kil, kih, kjl, kjh, kkl, kkh, & + ptrajx, ptrajy, ptrajz ) +! ######################################################################### ! !!**** *WRITE_DIACHRO* - Ecriture d'un enregistrement dans un fichier !! diachronique (de nom de base HGROUP) !! !! PURPOSE !! ------- -! +! ! !!** METHOD !! ------ !! En fait pour un groupe donne HGROUP, on ecrit systematiquement ! plusieurs enregistrements : ! - 1: HGROUP.TYPE (type d'informations a enregistrer) -! - 2: HGROUP.DIM (dimensions de toutes les matrices a +! - 2: HGROUP.DIM (dimensions de toutes les matrices a ! enregistrer) ! - 3: HGROUP.TITRE (Nom des processus) ! - 4: HGROUP.UNITE (Unites pour chaque processus) @@ -64,13 +65,13 @@ contains !! Original 08/01/96 !! Updated PM !! Modification (N. Asencio) 18/06/99 : the two first dimensions of PMASK -!! are linked to the horizontal grid, FMWRIT is called with 'XY' argument. -!! In standard configuration of the budgets, the mask is written once +!! are linked to the horizontal grid, FMWRIT is called with 'XY' argument. +!! In standard configuration of the budgets, the mask is written once !! outside this routine with FMWRIT call. Its record name is 'MASK_nnnn.MASK' !! So optional PMASK is not used . !! Modification (J. Duron) 24/06/99 : add logical GPACK to disable the pack option, !! add the initialization of the dimensions of -!! MASK array in MASK case with write outside the +!! MASK array in MASK case with write outside the !! routine. !! J.Escobar 02/10/2015 modif for JPHEXT(JPVEXT) variable !! D.Gazen+ G.Delautier 06/2016 modif for ncl files @@ -80,48 +81,58 @@ contains ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 13/09/2019: remove never used PMASK optional dummy-argument ! P. Wautelet 28/08/2020: remove TPLUOUTDIA dummy argument +! P. Wautelet 09/10/2020: use new data type tpfields !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_BUDGET +use modd_budget use modd_conf, only: lpack -use modd_field, only: tfielddata, TYPECHAR, TYPEDATE, TYPEINT, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPHEXT +use modd_field, only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_BUDGET_LES_MASK, NMNHDIM_FLYER_TIME, & + NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & + TYPECHAR, TYPEDATE, TYPEINT, TYPEREAL, & + tfield_metadata_base, tfielddata +use modd_io, only: tfiledata +use modd_parameters, only: jphext use modd_time, only: tdtexp, tdtseg use modd_time_n, only: tdtmod use modd_type_date, only: date_time ! use mode_datetime, only: Datetime_distance -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_box -USE MODE_ll -use mode_menu_diachro, only: MENU_DIACHRO +use mode_io_field_write, only: IO_Field_write, IO_Field_write_box +use mode_ll +use mode_menu_diachro, only: Menu_diachro use mode_msg ! IMPLICIT NONE ! !* 0.1 Dummy arguments ! --------------- -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write -CHARACTER(LEN=*), INTENT(IN) :: HGROUP, HTYPE -INTEGER,DIMENSION(:), INTENT(IN) :: KGRID -type(date_time), dimension(:), intent(in) :: tpdates -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR -CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HTITRE, HUNITE, HCOMMENT -LOGICAL, INTENT(IN),OPTIONAL :: OICP, OJCP, OKCP -INTEGER, INTENT(IN),OPTIONAL :: KIL, KIH -INTEGER, INTENT(IN),OPTIONAL :: KJL, KJH -INTEGER, INTENT(IN),OPTIONAL :: KKL, KKH -REAL,DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PTRAJX -REAL,DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PTRAJY -REAL,DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PTRAJZ +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write +class(tfield_metadata_base), dimension(:), intent(in) :: tpfields +CHARACTER(LEN=*), INTENT(IN) :: HGROUP, HTYPE +type(date_time), dimension(:), intent(in) :: tpdates +REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR +LOGICAL, INTENT(IN), OPTIONAL :: OICP, OJCP, OKCP +INTEGER, INTENT(IN), OPTIONAL :: KIL, KIH +INTEGER, INTENT(IN), OPTIONAL :: KJL, KJH +INTEGER, INTENT(IN), OPTIONAL :: KKL, KKH +REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJX +REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJY +REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTRAJZ ! !* 0.1 Local variables ! --------------- +integer, parameter :: LFITITLELGT = 100 +integer, parameter :: LFIUNITLGT = 100 +integer, parameter :: LFICOMMENTLGT = 100 + CHARACTER(LEN=20) :: YCOMMENT CHARACTER(LEN=3) :: YJ +character(len=LFITITLELGT), dimension(:), allocatable :: ytitles !Used to respect LFI fileformat +character(len=LFIUNITLGT), dimension(:), allocatable :: yunits !Used to respect LFI fileformat +character(len=LFICOMMENTLGT), dimension(:), allocatable :: ycomments !Used to respect LFI fileformat INTEGER :: ILENG, ILENTITRE, ILENUNITE, ILENCOMMENT INTEGER :: II, IJ, IK, IT, IN, IP, J, JJ INTEGER :: INTRAJT, IKTRAJX, IKTRAJY, IKTRAJZ @@ -209,9 +220,9 @@ IF(HTYPE == 'MASK')THEN IPMASK=1 ENDIF -ILENTITRE = LEN(HTITRE) -ILENUNITE = LEN(HUNITE) -ILENCOMMENT = LEN(HCOMMENT) +ILENTITRE = LFITITLELGT +ILENUNITE = LFIUNITLGT +ILENCOMMENT = LFICOMMENTLGT ICOMPX=0; ICOMPY=0; ICOMPZ=0 IF ( GICP ) THEN @@ -239,7 +250,7 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.TYPE' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPECHAR TZFIELD%NDIMS = 0 TZFIELD%LTIMEDEP = .FALSE. @@ -253,12 +264,17 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.DIM' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEINT TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. SELECT CASE(HTYPE) CASE('CART','MASK','SPXY') + if ( .not. Present( kil ) .or. .not. Present( kih ) .or. .not. Present( kjl ) .or. .not. Present( kjh ) & + .or. .not. Present( kkl ) .or. .not. Present( kkh ) ) then + call Print_msg( NVERB_FATAL, 'IO', 'Write_diachro', & + 'kil, kih, kjl, kjh, kkl or kkh not provided for variable ' // Trim( tpfields(1)%cmnhname ) ) + end if ILENG = 34 ALLOCATE(ITABCHAR(ILENG)) ITABCHAR(1)=ILENTITRE; ITABCHAR(2)=ILENUNITE @@ -286,7 +302,7 @@ SELECT CASE(HTYPE) CALL IO_Field_write(TPDIAFILE,TZFIELD,ITABCHAR) DEALLOCATE(ITABCHAR) CASE DEFAULT - ILENG = 25 + ILENG = 25 ALLOCATE(ITABCHAR(ILENG)) ITABCHAR(1)=ILENTITRE; ITABCHAR(2)=ILENUNITE ITABCHAR(3)=ILENCOMMENT; ITABCHAR(4)=II @@ -313,11 +329,14 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.TITRE' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPECHAR TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,HTITRE(1:IP)) +allocate( ytitles( ip ) ) +ytitles(:) = tpfields(1 : ip)%cmnhname +CALL IO_Field_write(TPDIAFILE,TZFIELD,ytitles(:)) +deallocate( ytitles ) ! ! 4eme enregistrement UNITE ! @@ -327,11 +346,14 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.UNITE' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPECHAR TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,HUNITE(1:IP)) +allocate( yunits( ip ) ) +yunits(:) = tpfields(1 : ip)%cunits +CALL IO_Field_write(TPDIAFILE,TZFIELD,yunits(:)) +deallocate( yunits ) ! ! 5eme enregistrement COMMENT ! @@ -341,53 +363,67 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.COMMENT' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPECHAR TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,HCOMMENT(1:IP)) +allocate( ycomments( ip ) ) +ycomments(:) = tpfields(1 : ip)%ccomment +CALL IO_Field_write(TPDIAFILE,TZFIELD,ycomments(:)) +deallocate( ycomments ) ! ! 6eme enregistrement PVAR ! -! Dans la mesure ou cette matrice risque d'etre tres volumineuse, on ecrira un +! Dans la mesure ou cette matrice risque d'etre tres volumineuse, on ecrira un ! enregistrement par processus -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! -!ocl scalar -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! DO J = 1,IP + if ( All( tpfields(1)%ndimlist(:) /= NMNHDIM_UNKNOWN ) ) then + tzfield%ndimlist(1:5) = tpfields(j)%ndimlist(1:5) + do jj = 1, 5 + if ( tzfield%ndimlist(jj) == NMNHDIM_UNUSED ) then + tzfield%ndimlist(jj) = NMNHDIM_ONE + end if + end do + if ( tzfield%ndimlist(4) == NMNHDIM_FLYER_TIME ) tzfield%ndimlist(4) = NMNHDIM_NOTLISTED + tzfield%ndimlist(6:) = NMNHDIM_UNUSED + end if + YJ = ' ' IF(J < 10)WRITE(YJ,'(I1)')J ; YJ = ADJUSTL(YJ) - IF(J >= 10 .AND. J < 100) THEN + IF(J >= 10 .AND. J < 100) THEN WRITE(YJ,'(I2)')J ; YJ = ADJUSTL(YJ) - ELSE IF(J >= 100 .AND. J < 1000) THEN + ELSE IF(J >= 100 .AND. J < 1000) THEN WRITE(YJ,'(I3)')J ENDIF IF(HTYPE == 'CART' .AND. .NOT. GICP .AND. .NOT. GJCP) THEN TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = TRIM(HUNITE(J)) + TZFIELD%CUNITS = tpfields(j)%cunits TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(HTITRE(J))//' - '//TRIM(HCOMMENT(J))//' ('//TRIM(HUNITE(J))//')' - TZFIELD%NGRID = KGRID(J) + TZFIELD%CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')' + TZFIELD%NGRID = tpfields(j)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 5 TZFIELD%LTIMEDEP = .FALSE. + CALL IO_Field_write_BOX(TPDIAFILE,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), & KIL+JPHEXT,KIH+JPHEXT,KJL+JPHEXT,KJH+JPHEXT) ELSE TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = TRIM(HUNITE(J)) + TZFIELD%CUNITS = tpfields(j)%cunits TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(HTITRE(J))//' - '//TRIM(HCOMMENT(J))//' ('//TRIM(HUNITE(J))//')' - TZFIELD%NGRID = KGRID(J) + TZFIELD%CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')' + TZFIELD%NGRID = tpfields(j)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 5 TZFIELD%LTIMEDEP = .FALSE. + CALL IO_Field_write(TPDIAFILE,TZFIELD,PVAR(:,:,:,:,:,J)) ENDIF + tzfield%ndimlist(:) = NMNHDIM_UNKNOWN ENDDO ! ! 7eme enregistrement TRAJT @@ -398,11 +434,19 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.TRAJT' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .FALSE. +!NMNHDIM_FLYER_TIME excluded because created only in netCDF/HDF groups (local to each flyer) +if ( tpfields(1)%ndimlist(4) /= NMNHDIM_UNKNOWN .and. tpfields(1)%ndimlist(4) /= NMNHDIM_UNUSED & + .and. tpfields(1)%ndimlist(4) /= NMNHDIM_FLYER_TIME ) then + tzfield%ndimlist(1) = tpfields(1)%ndimlist(4) + tzfield%ndimlist(2) = NMNHDIM_ONE + tzfield%ndimlist(3:) = NMNHDIM_UNUSED +end if + !Reconstitute old diachro format allocate( ztimes( size( tpdates ), 1 ) ) @@ -412,6 +456,9 @@ end do call IO_Field_write( tpdiafile, tzfield, ztimes ) +!Reset ndimlist +tzfield%ndimlist(:) = NMNHDIM_UNKNOWN + deallocate( ztimes ) ! ! Dans certains cas @@ -426,7 +473,7 @@ IF(PRESENT(PTRAJX))THEN TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = KGRID(1) + TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. @@ -442,7 +489,7 @@ IF(PRESENT(PTRAJY))THEN TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = KGRID(1) + TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. @@ -458,7 +505,7 @@ IF(PRESENT(PTRAJZ))THEN TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = KGRID(1) + TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. @@ -473,7 +520,7 @@ TZFIELD%CLONGNAME = TRIM(HGROUP)//'.DATIM' TZFIELD%CUNITS = '' TZFIELD%CDIR = '--' TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = KGRID(1) +TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .FALSE. @@ -506,10 +553,6 @@ CALL MENU_DIACHRO(TPDIAFILE,HGROUP) LPACK=GPACK !----------------------------------------------------------------------------- ! -!* 2. EXITS -! ----- -! -RETURN -END SUBROUTINE WRITE_DIACHRO +END SUBROUTINE Write_diachro end module mode_write_diachro diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 95c97354b7dd5411c5eb4b17a39a513ea2f2ee6e..de4e25a89016d1e640308e6371b3f69aef8094e4 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -56,12 +56,12 @@ END MODULE MODI_WRITE_PROFILER_n !! MODIFICATIONS !! ------------- !! Original 15/02/2002 -!! 2016 : G.DELAUTIER : LIMA -!! Oct, 2016 (C.Lac) Add visibility diagnostics for fog -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! J. Escobar : 16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1) +! G. Delautier 2016: LIMA +! C. Lac 10/2016: add visibility diagnostics for fog +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! J. Escobar 16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1) ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! +! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -89,7 +89,7 @@ USE MODD_PARAM_n, ONLY: CRAD ! USE MODE_AERO_PSD USE MODE_DUST_PSD -USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES @@ -124,7 +124,10 @@ CONTAINS ! !---------------------------------------------------------------------------- SUBROUTINE PROFILER_DIACHRO_n(TPROFILER,II) -! + +use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & + tfield_metadata_base, TYPEREAL + TYPE(PROFILER), INTENT(IN) :: TPROFILER INTEGER, INTENT(IN) :: II ! @@ -148,6 +151,7 @@ INTEGER :: JSV ! loop counter INTEGER :: IKU, IK ! loop counter CHARACTER(LEN=2) :: INDICE INTEGER :: I +type(tfield_metadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! @@ -628,10 +632,29 @@ ALLOCATE (ZW6(1,1,IKU,size(tprofiler%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "CART", IGRID(:JPROC), tprofiler%tpdates, & - ZW6, YTITLE(:JPROC), YUNIT(:JPROC), YCOMMENT(:JPROC), & - OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & - KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = IKU ) +allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ytitle(1 : jproc) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ytitle(1 : jproc) +tzfields(:)%cunits = yunit(1 : jproc) +tzfields(:)%ccomment = ycomment(1 : jproc) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 3 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_LEVEL +tzfields(:)%ndimlist(4) = NMNHDIM_PROFILER_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_PROFILER_PROC + +call Write_diachro( tpdiafile, tzfields, ygroup, "CART", tprofiler%tpdates, & + zw6, & + oicp = .true., ojcp = .true., okcp = .false., & + kil = 1, kih = 1, kjl = 1, kjh = 1, kkl = 1, kkh = iku ) + +deallocate( tzfields ) DEALLOCATE (ZW6 ) DEALLOCATE (YCOMMENT) diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index 2cac51fbb3d2557f695985d09bb92ac8216d29d2..84f4a2b4382a9d3c244dd332738e1e059ad4e830 100644 --- a/src/MNH/write_seriesn.f90 +++ b/src/MNH/write_seriesn.f90 @@ -56,20 +56,24 @@ END MODULE MODI_WRITE_SERIES_n !! MODIFICATIONS !! ------------- !! Original 4/03/2002 -!! Modification 7/01/2013 Add key for netcdf writing -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! P.Wautelet: 11/07/2016 : removed MNH_NCWRIT define -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! 07/01/2013: add key for netCDF writing +! J. Escobar 15/09/2015: WENO5 & JPHEXT <> 1 +! P. Wautelet 11/07/2016: removed MNH_NCWRIT define +! 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 09/10/2020: Write_diachro: use new datatype tpfields !------------------------------------------------------------------------------- ! ! !* 0. Declaration ! -------------- ! -USE MODD_IO, ONLY: NGEN_VERB, TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT +use modd_field, only: NMNHDIM_NI, NMNHDIM_NI_U, & + NMNHDIM_SERIES_LEVEL, NMNHDIM_SERIES_LEVEL_W, NMNHDIM_SERIES_TIME, NMNHDIM_SERIES_PROC, & + NMNHDIM_UNUSED, & + tfield_metadata_base, TYPEREAL +USE MODD_IO, ONLY: NGEN_VERB, TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS USE MODD_SERIES USE MODD_SERIES_n @@ -77,7 +81,7 @@ USE MODD_SERIES_n USE MODE_GATHER_ll USE MODE_ll USE MODE_MSG -USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE ! @@ -109,8 +113,8 @@ INTEGER :: IRESP ! Return code of FM-routines INTEGER :: INFO_ll ! Return code of FM-routines INTEGER :: ISER,INAV REAL :: ZSIZEHB -LOGICAL :: GICP,GJCP,GKCP ! compression flags along the 3 directions CHARACTER(LEN=100) :: YMSG +type(tfield_metadata_base), dimension(:), allocatable :: tzfields !---------------------------------------------------------------------------- ! !* 1. INITIALIZATION @@ -235,12 +239,29 @@ ENDIF ! !* 2.3 Write in diachro file ! -GICP=.TRUE. ; GJCP=.TRUE. ; GKCP=.TRUE. -CALL WRITE_DIACHRO( TPDIAFILE, 'TSERIES', 'CART', NSGRIDD1, tpsdates(1:nsnbstept), & - XSSERIES1(1:1,1:1,1:1,1:NSNBSTEPT,:,:), & - CSTITLE1(:), CSUNIT1(:), CSCOMMENT1(:), & - OICP = GICP, OJCP = GJCP, OKCP = GKCP, & - KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) +allocate( tzfields( nstemp_serie1 ) ) + +tzfields(:)%cmnhname = cstitle1(:) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = cstitle1(:) +tzfields(:)%cunits = csunit1(:) +tzfields(:)%ccomment = cscomment1(:) +tzfields(:)%ngrid = nsgridd1(:) +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 2 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(4) = NMNHDIM_SERIES_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_SERIES_PROC + +call Write_diachro( tpdiafile, tzfields, 'TSERIES', 'CART', tpsdates(1:nsnbstept), & + xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,:), & + oicp = .true., ojcp = .true., okcp = .true., & + kil = 1, kih = 1, kjl = 1, kjh = 1, kkl = 1, kkh = 1 ) + +deallocate( tzfields ) ! !---------------------------------------------------------------------------- ! @@ -289,12 +310,38 @@ DEALLOCATE(ZVAR3D) ! !* 3.2 Write in diachro file ! -GICP=.TRUE. ; GJCP=.TRUE. ; GKCP=.FALSE. -CALL WRITE_DIACHRO( TPDIAFILE, 'ZTSERIES', 'CART', NSGRIDD2, tpsdates(1:nsnbstept), & - XSSERIES2(1:1,1:1,1:IKMAX,1:NSNBSTEPT,:,:), & - CSTITLE2(:), CSUNIT2(:), CSCOMMENT2(:), & - OICP = GICP, OJCP = GJCP, OKCP = GKCP, & - KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = IKB, KKH = IKE ) +allocate( tzfields( nstemp_serie2 ) ) + +tzfields(:)%cmnhname = cstitle2(:) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = cstitle2(:) +tzfields(:)%cunits = csunit2(:) +tzfields(:)%ccomment = cscomment2(:) +tzfields(:)%ngrid = nsgridd2(:) +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 3 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +do ji = 1, nstemp_serie2 + if ( nsgridd2(ji) == 1 ) then + tzfields(ji)%ndimlist(3) = NMNHDIM_SERIES_LEVEL + else if ( nsgridd2(ji) == 4 ) then + tzfields(ji)%ndimlist(3) = NMNHDIM_SERIES_LEVEL_W + else + call Print_msg( NVERB_ERROR, 'IO', 'Write_series_n', 'invalid nsgridd2' ) + tzfields(ji)%ndimlist(3) = NMNHDIM_SERIES_LEVEL + end if +end do +tzfields(:)%ndimlist(4) = NMNHDIM_SERIES_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_SERIES_PROC + +call Write_diachro( tpdiafile, tzfields, 'ZTSERIES', 'CART', tpsdates(1:nsnbstept), & + xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,:), & + oicp = .true., ojcp = .true., okcp = .false., & + kil = 1, kih = 1, kjl = 1, kjh = 1, kkl = ikb, kkh = ike ) + +deallocate( tzfields ) ! !---------------------------------------------------------------------------- ! @@ -347,12 +394,38 @@ DO JS=1,NBJSLICE DO JT=1, NSTEMP_SERIE3 YSTITLE3S(JT)=ADJUSTL(ADJUSTR(CSTITLE3(JT))//'Y'//YSL//'-'//YSH) END DO - GICP=.FALSE. ; GJCP=.TRUE. ; GKCP=.TRUE. - CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, 'CART', NSGRIDD3, tpsdates(1:nsnbstept), & - ZSERIES3_ll(1:IIU_ll,1:1,1:1,1:NSNBSTEPT,1:1,ISB1:ISB2), & - YSTITLE3S(:), CSUNIT3(:), CSCOMMENT3(:), & - OICP = GICP, OJCP = GJCP, OKCP = GKCP, & - KIL = 1, KIH = IIU_ll, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) + allocate( tzfields( isb2 - isb1 + 1 ) ) + + tzfields(:)%cmnhname = ystitle3s(:) + tzfields(:)%cstdname = '' + tzfields(:)%clongname = ystitle3s(:) + tzfields(:)%cunits = csunit3(:) + tzfields(:)%ccomment = cscomment3(:) + tzfields(:)%ngrid = nsgridd3(:) + tzfields(:)%ntype = TYPEREAL + tzfields(:)%ndims = 3 + do ji = 1, isb2 - isb1 + 1 + if ( nsgridd3(ji) == 1 .or. nsgridd3(ji) == 4 ) then + tzfields(ji)%ndimlist(1) = NMNHDIM_NI + else if ( nsgridd3(ji) == 2 ) then + tzfields(ji)%ndimlist(1) = NMNHDIM_NI_U + else + call Print_msg( NVERB_ERROR, 'IO', 'Write_series_n', 'invalid nsgridd3' ) + tzfields(ji)%ndimlist(1) = NMNHDIM_NI + end if + end do + tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED + tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED + tzfields(:)%ndimlist(4) = NMNHDIM_SERIES_TIME + tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED + tzfields(:)%ndimlist(6) = NMNHDIM_SERIES_PROC + + call Write_diachro( tpdiafile, tzfields, ygroup, 'CART', tpsdates(1:nsnbstept), & + zseries3_ll(1:iiu_ll, 1:1, 1:1, 1:nsnbstept, 1:1, isb1:isb2), & + oicp = .false., ojcp = .true., okcp = .true., & + kil = 1, kih = iiu_ll, kjl = 1, kjh = 1, kkl = 1, kkh = 1 ) + + deallocate( tzfields ) END DO DEALLOCATE(ZVAR3D,ZWORK2D,ZSERIES3_ll) ! diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index b419ef542e07585325c2821da1744f9a61426a92..23f3d72bcc6f9a993f0a4b3f588c29da28f61c7f 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -58,7 +58,7 @@ END MODULE MODI_WRITE_STATION_n !! Original 15/02/2002 !! Philippe 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 09/10/2020: Write_diachro: use new datatype tpfields ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -88,7 +88,7 @@ USE MODD_STATION_n USE MODE_AERO_PSD USE MODE_DUST_PSD USE MODE_SALT_PSD -USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO +use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE ! @@ -120,7 +120,10 @@ CONTAINS ! !---------------------------------------------------------------------------- SUBROUTINE STATION_DIACHRO_n(TSTATION,II) -! + +use modd_field, only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, & + tfield_metadata_base, TYPEREAL + TYPE(STATION), INTENT(IN) :: TSTATION INTEGER, INTENT(IN) :: II ! @@ -138,12 +141,13 @@ CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE ! title CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT ! physical unit ! -!!! do not forget to incremente the IPROC value if you add diagnostic !!! +!!! do not forget to increment the IPROC value if you add diagnostic !!! INTEGER :: IPROC ! number of variables records -!!! do not forget to incremente the IPROC value if you add diagnostic !!! +!!! do not forget to increment the JPROC value if you add diagnostic !!! INTEGER :: JPROC ! loop counter INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter +type(tfield_metadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- IF (TSTATION%X(II)==XUNDEF) RETURN @@ -711,11 +715,30 @@ ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) ! -CALL WRITE_DIACHRO( TPDIAFILE, YGROUP, "CART", IGRID, tstation%tpdates, & - ZW6(:,:,:,:,:,:), YTITLE(:), YUNIT(:), YCOMMENT(:), & - OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & - KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) -! +allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ytitle(1 : jproc) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ytitle(1 : jproc) +tzfields(:)%cunits = yunit(1 : jproc) +tzfields(:)%ccomment = ycomment(1 : jproc) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 2 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(4) = NMNHDIM_STATION_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_STATION_PROC + +call Write_diachro( tpdiafile, tzfields, ygroup, "CART", tstation%tpdates, & + zw6, & + oicp = .true., ojcp = .true., okcp = .false., & + kil = 1, kih = 1, kjl = 1, kjh = 1, kkl = 1, kkh = 1 ) + +deallocate( tzfields ) + DEALLOCATE (ZW6) DEALLOCATE (YCOMMENT) DEALLOCATE (YTITLE )