diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 15cfb6000adeeb91ea986732c6800c90ecacbfc2..7c6ab01e07c975eb91d692cbe0585808c6dee924 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -87,21 +87,11 @@ subroutine Write_diachro( tpdiafile, tpfields, hgroup, htype, & !* 0. DECLARATIONS ! ------------ ! -use modd_budget use modd_conf, only: lpack -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_field, only: tfield_metadata_base 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_msg ! @@ -124,6 +114,80 @@ REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PTR ! !* 0.1 Local variables ! --------------- +logical :: gicp, gjcp, gkcp +logical :: gpack +!------------------------------------------------------------------------------ + +call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro', 'called' ) + +if ( present( oicp ) ) then + gicp = oicp +else + gicp = .false. +end if + +if ( present( ojcp ) ) then + gjcp = ojcp +else + gjcp = .false. +end if + +if ( present( okcp ) ) then + gkcp = okcp +else + gkcp = .false. +end if + +gpack = lpack +lpack = .false. + +if ( tpdiafile%cformat == 'LFI' .or. tpdiafile%cformat == 'LFICDF4' ) & + call Write_diachro_lfi( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, gicp, gjcp, gkcp, kil, kih, kjl, kjh, kkl, kkh, & + ptrajx, ptrajy, ptrajz ) + +#ifdef MNH_IOCDF4 +if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) & + call Write_diachro_nc4( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, gicp, gjcp, gkcp, kil, kih, kjl, kjh, kkl, kkh ) +#endif + +call Menu_diachro( tpdiafile, hgroup ) +lpack = gpack + +end subroutine Write_diachro + +!----------------------------------------------------------------------------- +subroutine Write_diachro_lfi( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, oicp, ojcp, okcp, kil, kih, kjl, kjh, kkl, kkh, & + ptrajx, ptrajy, ptrajz ) + +use modd_budget, only: nbumask, nbuwrnb +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_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_msg +use mode_tools_ll, only: Get_globaldims_ll + + +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) :: 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 + integer, parameter :: LFITITLELGT = 100 integer, parameter :: LFIUNITLGT = 100 integer, parameter :: LFICOMMENTLGT = 100 @@ -143,40 +207,23 @@ INTEGER :: ICOMPX, ICOMPY, ICOMPZ INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain integer :: ji INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR -logical :: gicp, gjcp, gkcp -LOGICAL :: GPACK real, dimension(:,:), allocatable :: ztimes real, dimension(:,:), allocatable :: zdatime -TYPE(TFIELDDATA) :: TZFIELD -!------------------------------------------------------------------------------ - -call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro', 'called' ) +TYPE(TFIELDDATA) :: TZFIELD +type(tfiledata) :: tzfile -if ( present( oicp ) ) then - gicp = oicp -else - gicp = .false. -end if +call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro_lfi', 'called' ) -if ( present( ojcp ) ) then - gjcp = ojcp -else - gjcp = .false. -end if +tzfile = tpdiafile -if ( present( okcp ) ) then - gkcp = okcp -else - gkcp = .false. -end if +!Write only in LFI files +tzfile%cformat = 'LFI' -GPACK=LPACK -LPACK=.FALSE. YCOMMENT='NOTHING' -! + II = SIZE(PVAR,1) IJ = SIZE(PVAR,2) -IF(HTYPE == 'CART' .AND. .NOT. GICP .AND. .NOT. GJCP) THEN +IF(HTYPE == 'CART' .AND. .NOT. OICP .AND. .NOT. OJCP) THEN !for parallel execution, PVAR is distributed on several proc II=KIH-KIL+1 IJ=KJH-KJL+1 @@ -225,23 +272,22 @@ ILENUNITE = LFIUNITLGT ILENCOMMENT = LFICOMMENTLGT ICOMPX=0; ICOMPY=0; ICOMPZ=0 -IF ( GICP ) THEN +IF ( OICP ) THEN ICOMPX = 1 ELSE ICOMPX = 0 ENDIF -IF ( GJCP ) THEN +IF ( OJCP ) THEN ICOMPY = 1 ELSE ICOMPY = 0 ENDIF -IF ( GKCP ) THEN +IF ( OKCP ) THEN ICOMPZ=1 ELSE ICOMPZ = 0 ENDIF ! -! ! 1er enregistrement TYPE ! TZFIELD%CMNHNAME = TRIM(HGROUP)//'.TYPE' @@ -254,7 +300,7 @@ TZFIELD%NGRID = tpfields(1)%ngrid TZFIELD%NTYPE = TYPECHAR TZFIELD%NDIMS = 0 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,HTYPE) +CALL IO_Field_write(tzfile,TZFIELD,HTYPE) ! ! 2eme enregistrement DIMENSIONS des MATRICES et LONGUEUR des TABLEAUX de CARACTERES et FLAGS de COMPRESSION sur les DIFFERENTS AXES ! @@ -299,7 +345,7 @@ SELECT CASE(HTYPE) ITABCHAR(29)=IIMASK; ITABCHAR(30)=IJMASK ITABCHAR(31)=IKMASK; ITABCHAR(32)=ITMASK ITABCHAR(33)=INMASK; ITABCHAR(34)=IPMASK - CALL IO_Field_write(TPDIAFILE,TZFIELD,ITABCHAR) + CALL IO_Field_write(tzfile,TZFIELD,ITABCHAR) DEALLOCATE(ITABCHAR) CASE DEFAULT ILENG = 25 @@ -317,7 +363,7 @@ SELECT CASE(HTYPE) ITABCHAR(20)=IIMASK; ITABCHAR(21)=IJMASK ITABCHAR(22)=IKMASK; ITABCHAR(23)=ITMASK ITABCHAR(24)=INMASK; ITABCHAR(25)=IPMASK - CALL IO_Field_write(TPDIAFILE,TZFIELD,ITABCHAR) + CALL IO_Field_write(tzfile,TZFIELD,ITABCHAR) DEALLOCATE(ITABCHAR) END SELECT ! @@ -335,7 +381,7 @@ TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. allocate( ytitles( ip ) ) ytitles(:) = tpfields(1 : ip)%cmnhname -CALL IO_Field_write(TPDIAFILE,TZFIELD,ytitles(:)) +CALL IO_Field_write(tzfile,TZFIELD,ytitles(:)) deallocate( ytitles ) ! ! 4eme enregistrement UNITE @@ -352,7 +398,7 @@ TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. allocate( yunits( ip ) ) yunits(:) = tpfields(1 : ip)%cunits -CALL IO_Field_write(TPDIAFILE,TZFIELD,yunits(:)) +CALL IO_Field_write(tzfile,TZFIELD,yunits(:)) deallocate( yunits ) ! ! 5eme enregistrement COMMENT @@ -369,7 +415,7 @@ TZFIELD%NDIMS = 1 TZFIELD%LTIMEDEP = .FALSE. allocate( ycomments( ip ) ) ycomments(:) = tpfields(1 : ip)%ccomment -CALL IO_Field_write(TPDIAFILE,TZFIELD,ycomments(:)) +CALL IO_Field_write(tzfile,TZFIELD,ycomments(:)) deallocate( ycomments ) ! ! 6eme enregistrement PVAR @@ -395,7 +441,7 @@ DO J = 1,IP ELSE IF(J >= 100 .AND. J < 1000) THEN WRITE(YJ,'(I3)')J ENDIF - IF(HTYPE == 'CART' .AND. .NOT. GICP .AND. .NOT. GJCP) THEN + IF(HTYPE == 'CART' .AND. .NOT. oicp .AND. .NOT. ojcp) THEN TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -407,7 +453,7 @@ DO J = 1,IP TZFIELD%NDIMS = 5 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write_BOX(TPDIAFILE,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), & + CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), & KIL+JPHEXT,KIH+JPHEXT,KJL+JPHEXT,KJH+JPHEXT) ELSE TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ @@ -421,7 +467,7 @@ DO J = 1,IP TZFIELD%NDIMS = 5 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPDIAFILE,TZFIELD,PVAR(:,:,:,:,:,J)) + CALL IO_Field_write(tzfile,TZFIELD,PVAR(:,:,:,:,:,J)) ENDIF tzfield%ndimlist(:) = NMNHDIM_UNKNOWN ENDDO @@ -454,7 +500,7 @@ do ji=1,size(tpdates) call Datetime_distance( tdtexp, tpdates(ji ), ztimes(ji, 1 ) ) end do -call IO_Field_write( tpdiafile, tzfield, ztimes ) +call IO_Field_write( tzfile, tzfield, ztimes ) !Reset ndimlist tzfield%ndimlist(:) = NMNHDIM_UNKNOWN @@ -477,7 +523,7 @@ IF(PRESENT(PTRAJX))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPDIAFILE,TZFIELD,PTRAJX) + CALL IO_Field_write(tzfile,TZFIELD,PTRAJX) ENDIF ! ! 9eme enregistrement TRAJY @@ -493,7 +539,7 @@ IF(PRESENT(PTRAJY))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPDIAFILE,TZFIELD,PTRAJY) + CALL IO_Field_write(tzfile,TZFIELD,PTRAJY) ENDIF ! ! 10eme enregistrement TRAJZ @@ -509,7 +555,7 @@ IF(PRESENT(PTRAJZ))THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPDIAFILE,TZFIELD,PTRAJZ) + CALL IO_Field_write(tzfile,TZFIELD,PTRAJZ) ENDIF ! ! 11eme enregistrement PDATIME @@ -545,20 +591,11 @@ zdatime(14, : ) = tpdates(:)%tdate%month zdatime(15, : ) = tpdates(:)%tdate%day zdatime(16, : ) = tpdates(:)%time -call IO_Field_write( tpdiafile, tzfield, zdatime ) +call IO_Field_write( tzfile, tzfield, zdatime ) deallocate( zdatime ) -! -#ifdef MNH_IOCDF4 -if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) & - call Write_diachro_nc4( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, gicp, gjcp, gkcp, kil, kih, kjl, kjh, kkl, kkh ) -#endif - -CALL MENU_DIACHRO(TPDIAFILE,HGROUP) -LPACK=GPACK - -end subroutine Write_diachro +end subroutine Write_diachro_lfi !----------------------------------------------------------------------------- #ifdef MNH_IOCDF4 subroutine Write_diachro_nc4( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, oicp, ojcp, okcp, kil, kih, kjl, kjh, kkl, kkh )